目录
🎓进程的概念
那什么是进程呢,我们该如何理解它呢?如果我们打开电脑的任务管理:
展示了当前正在运行的进程,那大家看这其实就是我们当前打开的程序
结论:我们以前任何启动并运行程序的行为,都是由操作系统帮助我们将程序转化为进程,来完成特定的任务。
那说到底进程到底是什么呢?
那我们平时自己写好的可执行程序,我们知道它本质其实就是一个二进制文件嘛
那我们运行这个可执行程序,首先它被载入内存,其实就是把可执行程序里面的代码和数据加载到内存。
1.那此时它就变成一个进程了嘛?
- 只将磁盘中的可执行程序加载到内存中,就如同这个学校中的保安,他在学校里,他就是学校的一名学生了嘛?——当然不是
- 那同样的,一个可执行程序或应用程序被加载到内存里面,他就变成了被操作系统管理的进程了吗?——也不是
那一个人如何才算你们学校的学生呢?
- 只有在学校中自己所有信息在学生管理系统中存在,并且这个人在学校中才能称之为这个学校中的学生。
2.我们可能同时运行多个程序
那他们都要加载到内存里,就好比学校里面有好多学生,那学校肯定要对这么多学生进行一个良好的管理。
那同样的,操作系统也要对加载到内存的多个进程进行管理。
那如何进行管理呢?
很简单,还是我们之前说的——先描述,再组织
🎓进程描述—PCB
- 人是通过属性认识的,当属性足够多,这一对属性的集合就是目标对象
- 描述进程——多个属性合起来
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
可执行程序其实就是一个文件嘛,而文件的话我们说过文件=内容+属性
那程序运行载入到内存里面的指令和数据这毫无疑问肯定是文件的内容。
然后呢我们有提到每个进程操作系统都会创建一个PCB来描述进程,可以理解为PCB就是进程的属性集合。任何一个进程,在加载到内存中的时候,形成真正的进程时,操作系统要先创建描述进程的结构体对象——PCB(process ctrl block进程控制块)____进程属性的集合
所以:我们每运行一个程序,除了要把它对应的指令和数据加载到内存,操作系统还会为它创建一个PCB来记录和管理进程信息
那操作系统要管理这么多的进程,就可以把所有进程的PCB用一个数据结构比如链表管理起来(再组织)
那此后操作系统对于进程的管理就变成了对组织PCB的数据结构的管理。
一个程序被加载到内存,他就是进程了吗?
不是的
进程包括了程序加载到内存中的指令和数据,以及内核中与之关联的进程控制块(PCB)
进程的概念:
进程=PCB+代码和数据
- PCB:不仅仅是将代码和数据加载到内存中,而且操作系统描述进程内的进程控制块,把该进程的进程编号,进程状态,优先级填充哦号,形成一个PCB,所以PCB结构体是由操作系统自己形成的。(描述进程的所有属性值)
- 代码和数据:磁盘中可执行程序加载到内存中
进程=内核PCB数据结构对象+你自己代码和数据
🎈task_struct-PCB的一种
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
🎈task_ struct内容分类
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
可以在内核源代码里找到它,所有运行在系统里的进程都以task_struct链表的形式存在内核里。
🎓查看进程
那如何查看进程呢?
首先,我们先来写一个代码和makefile:
编辑一下myprocess.c
保存退出
vim makefile写一下:
make生成可执行程序myprocess
那我们
./
执行这个可执行程序,操作系统就会把它加载到内存,同时为他建立PCB(在Linux上是task_struct),然后它就变成了进程.
那我们如何查看这个进程呢?
让这个进程继续跑着,我们再打开一个渠道
然后我们输入一条命令
就可以看到我们刚才运行起来的进程
简单解释一下这条命令(这里的命令我们后面会讲)ps axj | head -1 && ps axj | grep myprocess
这是是逻辑与连接了两条命令,首先ps axj可以显示当前系统中所有进程的详细信息,但是我们不想看所有的,所以管道连接head -1就是去只显示ps axj展示出来的所有信息的第一行(即那个表头信息),然后&&后面又连接一条指令,其实就是过滤取出关键字myprocess对应的进程信息
那然后我们再打开一个渠道
也把这个程序运行起来
然后
我们就观察到俩个了
🎈查看显示信息PID
我们看到有个PID,就是我们上面提到的进程的唯一标识符。
它们两个是不一样的,所以它们两个是不同的两个进程,虽然是同一个可执行程序运行生成的。
那除了上面查看进程的方式,还有其它方法:
我们还可以通过 /proc 系统文件夹查看进程信息
proc其实就是process的缩写嘛
/proc 目录是 Linux 系统中的一个特殊目录,提供了有关当前运行进程和内核状态的信息。
需要注意的是,它跟普通的文件不一样,它不是一个真正的文件系统,而是通过内核在内存中维护的一个虚拟文件系统。只有当操作系统启动的时候,它才会存在,并不存在于磁盘上。
但是这里我们好像没有看到process。
这里的很多数字代表什么呢?
这里的数字就是PCB
PID改变,每个进程在系统运行期间终止后,重新启动,操作系统给它分配的PID标识符大概率是变化,不会与上次的PID相同
就比如你进入大学之后学号是23开头,然后退学重新复读一年,进入大学之后,你的学号开头是24开头的。
这些数字其实是特定进程的PID,我们是能找到上面我们两个process进程的PID的
这些数字是蓝色的,我们知道蓝色表示它是一个目录/文件夹。
所以:
一个进程被创建好,操作系统会自动在proc目录下创建一个以新增进程的PID命名的文件夹
我们可以进去看看
这里面有很多内容,这些内容其实就是当前进程的相关属性信息
这些东西大多我们还看不懂,但是
大家看这两个,不就是对应程序的路径吗。
那就是我们前面说的进程的属性跟文件的属性也稍微有一点关系
我们当前是在proc里面这个进程PID对应的这个目录里面的,上面说了PID对应的目录是进程创建的时候才会在proc目录下新增的。,那如果我们把对应的进程终止(CTRL+c)掉
在想查看这个目录的内容就不行了,上一级我们也回不去了。
因为进程终止,操作系统就会在proc目录下把这个进程PID对应的目录及其里面的内容删除掉。所以proc目录里面的内容是动态变化的。
我们另外会发现,当我们创建文件时,默认在当前目录下找文件
这是为什么呢?
因为从上面进入特定PID目录中,在进程中,进程在启动中,就已经记录下了这个文件所处的目录。
现在我们在myrpocess.c文件中
我们就可以看到在当前目录下出现log.txt文件
在fopen一个文件,参数是fopen("log.txt","w");
但是在进程层面上,默认把cwd路径拼接到log.txt前面,所以创建这个文件时,就在这个启动进程的当前路径中。
所以默认创建文件,都是在当前目录下创建,这是进程的概念。
太怕犯错与犯错无异