1.什么是管理?
那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?
很简单,先把进程描述起来,再把进程组织起来!
我们拿大学为例子
- 最典型的管理者——校长
- 最典型的被管理者——学生
1.我们平时见得到校长吗?见不到——管理者和被管理者是不需要见面的
2. 这个就引出一个新的问题,管理者在不见被管理者的情况下,如何做好的管理?
- 我们在学校就清楚,我们考试考了多少分,旷了多少节课,个人信息,校长想看都能看到
- 就算校长来见我们,也是为了获取我们更多的信息
- 所以只要校长有足够多的我们的信息,不见面都可以对我们进行有效的管理
- 管理的本质就是:通过对数据的管理,达到对人的管理
3.管理者和被管理者面都不见,管理者怎么拿到被管理者的数据呢?
- 我们还是拿校长和学生为例
- 校长是通过老师,辅导员来获取学生的数据
4.拿老师和辅导员是不是管理者?
- 不是,因为老师和辅导员只是在执行他们该做的东西,所以他们不是真正的管理者
- 他们更多的是执行者
- 校长相当于操作系统,老师,辅导员相当于驱动程序,学生相当于被管理的软硬件资源
- 这样子就理解了操作系统怎么管理底层的软硬件资源了
5.操作系统怎么管理软硬件资源?——先描述,后组织
- 操作系统只需要获取对应的软硬件资源的状态数据即可,获取状态数据的这个过程是通过驱动程序来执行的
- 虽然每个学生的信息都不同,但是他们都有下面这些属性——电话,姓名,身高,体重,成绩,籍贯......
- 校长可以通过一个结构体来记录这些属性,这样子学生的属性不就被描述起来了吗!!!——这个有点像面向对象编程里的抽象啊
struct student { char name[20]; int number[20]; ... struct student*next; };
- 这样子我们就可以使用一个结构体对象来记录一个学生的信息,每个学生都带有一个指向下一个学生的结构体指针,这样子就很好管理了
- 这样子校长对学生的管理工作就变成了对链表的增删查改
- 校长找成绩最高的同学,只需要不断遍历链表即可
- 上面这个把学生描述成结构体的过程叫做描述的过程
- 将每个学生结构体通过结构体指针链接成一条链表的过程叫做组织的过程
我们的软硬件资源被操作系统管理,操作系统通过软硬件的数据对它进行管理,可是软硬件资源的数据太大,那么操作系统很难做管理
但是每一种设备都有共同的属性,我们描述清楚设备的属性,然后通过一定方法组织起来
这样子,操作系统对软硬件的管理就变成了对数据结构的管理
管理的核心理念
- 操作系统管理软硬件资源时,必须先描述起来,再组织
- 在操作系统中,我们管理对象,最终都可以转变为对某种数据结构的增删查改——这个一般叫建模
描述事物的方法:c语言的struct,c++的类等
组织方式:依赖于某种数据结构
这个咋这么像面向对象编程的抽象!!!c++的类,STL容器!!!这个直接给了我们提供了这样一种描述事物的方式,这样子就能完成对事物的统一管理
理解了管理的概念,我们就会知道
- 操作系统中注定存在大量的数据结构
linux操作系统是c语言写的,c语言只能用结构体来描述对象,所以linux只能用struct来描述对象
2.c/c++库函数调用和系统调用的关系
我们用c语言编写了一个程序,在屏幕打印一个hello world,但是在但是屏幕是硬件,硬件是受操作系统管理,操作系统不信息任何人,所以操作系统肯定封装了一个c语言函数调用接口
所以他们是上下层的调用和被调用的关系,库函数在上,系统调用在下
3.进程
- 进程:一个已经加载到内存的程序
- 进程:正在运行的程序
- 进程:任务
我们可以查看linux的进程
widows里面也有进程
事实上
进程就是内核PCB数据结构对象+你自己的代码和数据
3.1.PCB
我们知道一个操作系统可以同时进行多个进程
程序要运行的话,就得先把相关数据加载到内存中,等待cpu运行产生进程,那么加载进内存该如何管理呢?操作系统需要直接面向加载到内存中的代码嘛?
答案是不需要。
我们可以先把进程类比上面的学生,先描述进程,再把它们组织起来
任何一个进程,在加载到内存的时候,形成真正的进程的时候,操作系统,要先创建描述进程的结构体对象——PCB(process control block),也就是进程控制块
3.1.1.理解PCB的本质
人是怎么样辨别认识一个事物或者对象?
- 都是通过属性认识的
举个例子,叫你自我介绍,你基本都是在讲你的属性——名字,兴趣,才能,成就,籍贯等等
当属性的集合够多的时候,你就能知道这个对应的是什么了
比如,它是一个人,他是中国最顶级的动作明星,他是男生,他演过《十二生肖》
我们就很容易得知这个人就是成龙
同样的我们描述进程,就是把进程足够多的属性描述起来,多到只有一个进程与之匹配,那么我们就能将这堆足够多的属性集合来描述进程,这个集合就是PCB,linux操作系统是c语言写的,c语言只能用结构体来描述对象,所以linux只能用struct来描述对象,所以PCB就是一个结构体
这个也是面向对象编程的核心理念
3.1.2.PCB的历程/作用
- 进程创建时,操作系统先为它新建一个PCB,该结构之后常驻内存,任意时刻都可以存取,并在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志。
- 进程执行时,系统通过其 PCB 了解进程的现行状态信息,以便操作系统对其进行控制和管理;进程结束时,系统收回其PCB,该进程随之消亡。
3.在进程的整个生命期中,系统总是通过PCB对进程进行控制的,亦即系统唯有通过进程的PCB才能感知到该进程的存在。
- 当操作系统欲调度某进程运行时,要从该进程的 PCB 中查出其现行状态及优先级;
- 在调度到某进程后,要根据其PCB 中所保存的处理机状态信息,设置该进程恢复运行的现场,并根据其PCB中的程序和数据的内存始址,找到其程序和数据;
- 进程在运行过程中,当需要和与之合作的进程实现同步、通信或访问文件时,也需要访问 PCB;
- 当进程由于某种原因而暂停运行时,又需将其断点的处理机环境保存在PCB中。
3.2.PCB的组织方式
在一个系统中,通常存在着许多进程的PCB,有的处于就绪态,有的处于阻塞态,而且阻塞的原因各不相同。操作系统怎么管理这么多进程呢?
为了方便进程的调度和管理,需要将各进程的PCB用适当的方法组织起来。
这样子对进程的管理就变成了对数据结构的增删查改
目前有下面几种组织方式
- 1.线性表方式:不论进程的状态如何,将所有的PCB连续地存放在内存的系统区。这种方式适用于系统中进程数目不多的情况,不适合频繁的进程调度
- 2.索引表方式:该方式是线性表方式的改进,系统按照进程的状态分别建立就绪索引表、阻塞索引表等。其中进程阻塞可能由于I/O请求、申请缓冲区失败、等待解锁、获取数据失败等原因造成,将其组成一张表忽略了进程的优先级,不利于进程的唤醒。
- 3.链接表方式:系统按照进程的状态将进程的PCB组成队列,从而形成就绪队列、阻塞队列、运行队列等。
3.3程序段
程序段就是能被进程调度程序调度到CPU执行的程序代码段。
3.4数据段
一个进程的数据段,可以是进程对应程序加工处理的原始数据,也可以是程序执行时候产生的中间或最终结果。
4.Linux是怎么取管理进程的?
- 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct 。
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)⾥里并且包含着进程的信息。
4.1.task_ struct内容分类
实际上这个结构体的成员非常多,我们只列举最主要的
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
4.3.组织进程
可以在内核源代码里找到它。
所有运行在系统里的进程都以task_struct双向链表的形式存在内核里。
4.4.查看进程
(1)进程信息可以通过 /porc系统文件夹查看,具体查看那个进程,需要得知其标识符(PID)。
看到以下有很多的数字还是蓝标的,数字就是PID,蓝标说明这是个目录,
比如接下来我想看看PID为1的进程信息。
这个信息查看的不够详细,所以可以带上 -l选项查看详细信息
(2)用ps工具来查看
关于ps工具,咱们只需要记住,只查看自己的bash进程选项为 -l
,查看系统所有运行的进程选项为aux
,这个不加-
。
这里可以看到,标识符PID展示出来了,还有一个PPID,这是父进程的PID,我们惊奇的发现,下面的ps指令的PPID是上面bash的PID。
命令行上的命令的父进程基本上都是bash。