文章目录
- 1.windows和linux中的进程
- 2.先描述
- 3.在组织
- 4.具体的Linux系统是如何做的?
- 1.基本概念
- 2.描述进程-PCB
- 3.task_struct和PCB的关系
- 4.task_struct内容分类
- 5.linux具体如何做的?
- 6.查看进程
1.windows和linux中的进程
一个已经加载到内存的程序,叫做进程
进程也叫做任务
比如在windows中,这个任务管理器就可以看到进程
而在linux中,我们使用
ps axj
就可以看到我们的进程了
2.先描述
我们先使用如下代码
如下所示,就可以查看到进程了
在这个过程中,我们的这个可执行程序就会从磁盘中加载到内存中,然后经过CPU,最终输出到显示器上。
这个加载到内存中的程序就是一个进程
像我们电脑的操作系统开机的时候也一样,开机的时候,就是操作系统加载到内存的时候。这也是进程
这些加载到内存,其实就是将这些二进制数据(代码和一些数据)从磁盘中搬到内存中
如下图所示,当一个程序要运行的时候,他需要先将这些二进制文件从磁盘中搬到操作系统中。
但是常识告诉我们,一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程
所以说,操作系统必须将这些进程给管理起来
那么应该如何管理进程呢?
当然还是先描述,在组织
所以任何一个进程,在加载到内存的时候,形成真正的进程时,操作系统要先创建描述进程属性的结构体对象----PCB(process ctrl block 进程控制块)
这就是类似于人是怎么样辨别认识一个事情或者对象的
当然是都是通过属性认识的。
当属性够多,这一堆属性的集合,就是目标对象
这个PCB就是进程属性的集合
而在C语言中,我们可以用struct结构体来描述这个集合。
这个结构体里面就有进程编号、进程的状态、优先级、相关的指针信息…等等信息
然后根据进程的PCB属性,就可以为该进程创建对应的PCB对象了
不过我们的操作系统除了创建一个PCB对象之外,还要去将代码和数据加载到内存中
就好比我们现在是一个学生,那么PCB就是我们的档案,代码和数据就是我们本人。只有当这两部分都在学校的时候,我们才是这个学校的学生。
所以描述进程的PCB的结构体和该进程的代码和数据合起来才称作进程
所以所谓的进程 = 内核PCB数据结构对象 + 你自己的代码和数据
内核PCB数据结构对象是描述你这个进程的的所有的属性值
所以操作系统要做管理的时候,不需要对我们自己做出管理,只需要对我们这个内核PCB数据结构对象做出管理即可
这个PCB对象里面是有相关的指针信息的,所以可以通过这个PCB对象直接找到我们的
上面这个过程就是一个进程的描述的过程,即先描述
3.在组织
可是我们操作系统经常要持续很多个进程的。所以这就需要组织起来了,从而达到对我们的进程做出管理
为了能够将这些数据组织起来,所以我们可以在每一个PCB对象中加上一个相应的指针,用来找到下一个PCB对象,即如同链表的结构
所以在操作系统中,对于进程的管理,就变成了对于这个单链表的增删查改了
这个PCB就好比我们每个人的简历一样,在我们找工作的时候,HR都是直接对我们的简历做出管理的。当我们投递简历以后,我们会看到在排队中,这个排队就指的是这个PCB在排队。而不是我们本人在排队
4.具体的Linux系统是如何做的?
1.基本概念
课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体
2.描述进程-PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
3.task_struct和PCB的关系
task_struct 是PCB具体的一种
在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构类型(自定义类型),它会被装载到RAM(内存)里并且包含着进程的信息
4.task_struct内容分类
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
5.linux具体如何做的?
在linux中PCB 就是task_struct 结构体,里面包含进程的所有属性
Linux中如何组织进程呢?,linux内核中,最基本的组织进程task_struct的方式,是采用双向链表的
不过要注意的是,有可能这个task_struct既是属于一个双链表,又是属于一个队列的。他是比较复杂的
6.查看进程
我们在前面所演示这个命令就是一个查看进程的命令
ps ajx | head -1 && ps ajx | grep myprocess
如下所示,我们可以看到两个进程了
前面两个是这个可执行程序由于跑了两份,所以的两份进程。
下面的第三个进程是grep本身的进程,因为它本身也带有myprocess,所以就把它自己的进程过滤出来了。而之前的那些指令的进程早就已经结束了,所以不会显示出来。这里是因为正好grep执行的时候把他自己给过滤出来了
注意看
注意这个ID值,虽然这两个程序是一样的,但是他们的ID是不一样的,虽然将同一个程序执行了两遍,但是它还是两个进程,因为他们创建了两个不同的PCB
除了上面这种方法还有这样一种方法
ls /proc
这个是linux系统中比较重要的,也比较奇怪的一个目录
它在关机的时候数据就全没了,在开机的时候就又会创建这个目录文件
这个其实因为因为操作系统用文件系统的方式把内存当中的文件,包括进程全部可视化出来了
它这上面的数据都是内存级的
我们可以来证明一下
我们先关掉一个进程
当我们再次使用这个
ls /proc
这个指令的时候
对于这些蓝色的数字,我们知道它一定是目录,而对于黑色的我们先不管
而这些蓝色的数字就是当前进程的PID,所以在创建进程的时候,操作系统会创建一个与PID一样名字的文件夹,这个目录里面保存这个进程的大部分属性
我们可以通过这个找到我们这个进程的目录
然后我们可以查看一下这里面的内容
如果我们将我们这个进程之间结束掉,那么我们这里就用这种方法找不到这个进程了,这个目录就自动删除了
如果我们重启一个进程,那么就又出来了
不过这个PID也被改变了。
所以说每一个程序结束以后在重新启动,PID就会变化了,所以他是系统当中动态运行的相关信息。
我们可以进入到它里面就可以看到这个东西,这就足以证明这个就是我们的这个可执行程序的进程
对于这个cwd,就是我们当前进程的工作目录(current work dir)
对于这个cwd,这个是很有用的
比如说当我们使用touch命令创建一个test.c文件的时候,它是如何找到当前的目录呢?
就是进程启动的时候已经记录了当前的目录。所以才找到的
就好比我们之前的文件操作的时候,为什么文件可以创建在当前目录呢?
就是因为进程有这个cwd,记录了当前工作目录,所以可以直接拼接上去。这就是当前路径