1.冯诺依曼体系结构
在讲解进程之前,要先知道什么是冯诺伊曼体系结构。冯诺依曼体系结构是如今最主流的体系结构,所有的硬件可以分为5大单元,单元之间存在交互。
运算器和控制器就是cpu,运算器就是帮助计算机做运算的,控制器就是控制硬件之间的交互。
输入设备最常见的就是键盘,话筒,鼠标.....
输出设备最常见的就是声卡,显示屏,磁盘......
当然有些设备既做输入,也做输出.......
存储器指的就是内存,内存有个特点就是掉电易失,就是说没电了数据容易丢失。
但是磁盘就是永久性存储介质,即使没电数据也会在,是个输入或者输出设备。
关于冯诺依曼,必须强调几点:
这里的存储器指的是内存。
不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
一句话,所有设备都只能直接和内存打交道。
各个设备之间是独立的,但是通过电路,各个设备又是连接起来的,目的是为了设备之间的数据流动。
数据的流动就是从这个设备拷贝到另外一个设备,那么拷贝的速度快慢就决定了计算机效率的快慢。
那么输入设备和输出设备之间存在一个cpu来快速计算不就可以了吗?为什么要使用存储器来减慢速度呢?因为存储器的造价,效率,单体容量都是适中的的。而输入和输出设备的速度太慢了,如果直接将数据交给cpu的话,又太快了,那么数据一交给cpu,cpu一下子就计算完成了,那么整体的效率也就变慢了。那么此时存储器就很重要了,可以调和这个效率,输入设备将数据给存储器,存储器将数据交给cpu计算,然后将计算好的数据返回给存储器,再由存储器交给输出设备。
那么这样做的话不就是增加了拷贝数据的次数吗?怎么会变得更快呢?那么在cpu计算数据1的时候,数据2已经通过输入设备加载到了存储器,这就是预加载,在cpu计算数据2的时候,数据1已经被存放在了存储器,输出设备需要的时候就直接从存储器拿,这就是缓存,通过预加载和缓存就能提高计算机的效率。
正是因为冯诺依曼这种体系结构引入了内存,将效率问题转化成了软件问题,使得内存快慢决定计算机的快慢,让大家能使用效率不错i的计算机。
2.操作系统(Operator System)
2.1概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库, shell程序等等)
2.2设计OS的目的
与硬件交互,管理所有的软硬件资源
为用户程序(应用程序)提供一个良好的执行环境
os是怎么管理硬件的呢?每一款硬件设备都有对应的厂商,每家厂商都会为硬件设计软件,也就是驱动程序来管理硬件,所以os只需要管理硬件对应的驱动程序就行了。
管理硬件资源是手段,为的是为用户提供良好的执行环境,那么用户想要使用硬件设备的时候,就直接去访问os吗?不是的,os内有大量的数据,如果给用户直接访问的话,就不安全,所以用户需要使用系统调用的接口来调用os,防止用户直接访问os,提高了安全性。
scanf和printf都使用了硬件设备,那么这两个函数的底层一定封装了系统调用,只有这样才能通过系统调用来使用硬件设备,用户不能直接跳过系统调用接口来调用os,也不能跳过os来使用硬件设备。
2.3定位
在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的“搞管理”的软件.
2.4总结
计算机管理硬件
1. 描述起来,用struct结构体
2. 组织起来,用链表或其他高效的数据结构
3.系统调用和库函数概念
在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
4.进程
4.1基本概念
课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。
我们平时写的程序会存放在哪里呢?大家都知道程序是二进制文件,那么就存放在磁盘中, 磁盘就是硬件设备。那么当我们运行起来这个文件,根据冯诺依曼体系结构,这个文件会先加载到内存中,然后再被cpu进行计算。
我们在使用计算机的时候,可以同时启动很多个程序,那么就代表着内存中可以加载很多个文件,那么os就需要对这些加载到内存的文件进行管理,那么os怎么进行管理呢?先描述,在组织。
4.2描述进程-PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct
4.2.1task_struct-PCB的一种
在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
4.2.2task_ struct内容分类
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。 优先级: 相对于其他进程的优先级。 程序计数器: 程序中即将被执行的下一条指令的地址。内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
那么有了PCB之后os就认识了这些程序,因为PCB描述了这些程序的属性。那么os管理进程就变成了管理PCB的链表。
4.3组织进程
可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。
4.4查看进程
进程的信息可以通过 /proc 系统文件夹查看
如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹
大多数进程信息同样可以使用top和ps这些用户级工具来获取
当我编译下面这段代码生成可执行程序时,再将它运行起来,就有了一个进程,那么我们怎么知道有一个进程了呢?
使用下面这段指令,就能查到这个可执行程序对应的进程,第二行就是对应的进程。
那么第三行是什么呢?grep这个指令执行起来后也会变成一个进程,所以第三行是grep这个指令执行后所产生的进程。所以可以得出一个结论:几乎所有独立的指令,都是一个程序,执行后都会变成进程!
需要注意的是进程是有生命的,如果进程结束了就查不到了,所以我们可以使用do-while的指令查看到进程从开始到结束的全过程。
今天的分享到这里就结束了,感谢大家的阅读!