Linux进程管理--进程概念_谈谈的linux进程管理理解(2)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以点击这里获取!

}    
return 0;                                                                                                   

}


我们来运行一下这个程序,要观察进程还需要再开出一个窗口来输入命令,查看进程。



> 
> ps ajx|head -1 && ps axj |grep “mytest”
> 
> 
> 


使用该命令我们就可以查看当前的进程了。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/33ba6d2072cb4b9ea31ff80296011175.png)  
 这一行显示的就是当前进程的各种属性,当然这并不完全。上面一行就是属性的名称(也就是要写入task\_struct中的内容),至于下面一行,由于grep指令也会创建一个进程,所以我们可以先不用考虑它。  
 如果我们将程序Ctrl C结束掉,此时再查看进程,我们发现该进程已经没有了:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/cb00be4dc7be4d0d8d67b59a8b090a50.png)


### (2)/proc查看


![在这里插入图片描述](https://img-blog.csdnimg.cn/23a63744dd2f4ec0b799789f17a88696.png)  
 我们还可以在proc系统文件夹中通过查找进程码来进行进程查看,此时即显示该进程的信息,其中exe表示的是当前正在执行谁,cwd表示的是当前工作目录,其实这也就是为什么我们使用C语言进行创建文件,默认路径就是当前路径的原因,它会通过cwd读取当前路径再创建文件。


## 3.PCB


从上一节中,我们了解了操作系统的管理方式是:先描述,再组织。其中先描述指的是将信息存入结构体中,再组织指的是将这些  
 结构体以一定的数据结构进行链接起来。  
 放到进程上来说,其中存放进程信息的结构体叫做:进程控制块,简称**PCB**(process control blog),PCB就是操作系统对进程的先描述的体现。  
 注意,PCB是一个总称,在Linux系统下的PCB是一个名为task\_struct的结构体(Linux是使用C语言写的)。也就是说在Linux系统下,每创建一个进程就会建立一个task\_struct结构体来存储该进程的基本信息。  
 这有点类似shell和bash两者之间的关系。


## 4.进程和程序之间的关系


我们所说的程序通常是指可执行程序,它本质上就是一个文件,当我们要运行这个程序的时候,我们会将其加载到内存中:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3f3c80ce6a1d4e55b236b44c0f7f7ecc.png)  
 在加载到内存中之后,操作系统会为该程序建立一个PCB来存储该程序中的信息,PCB与程序的总体就称为进程。  
 进程=程序文件内容+与进程相关的数据结构(PCB)  
 即用红色部分圈起来的整体。  
 操作系统对进程的管理不是直接对程序文件进行操作,而是通过PCB(管理者与被管理者不接触的原则)进行管理,因此PCB中一定存在找到该程序文件的信息,**程序文件包括程序代码和数据**。  
 在内存中不可能只存在一个进程,不同进程的**PCB**操作系统使用一定的数据结构连接起来,这就是**再组织**的过程,注意连接的是PCB而不是程序文件。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b18e19ebef03432a80577ce80c722842.png)


## 5.Linux下(PCB)task\_struct中的内容


### (1)PID和PPID


PID表示的是当前进程的编号,PPID表示的是当前进程的父进程的编号。  
 我们可以使用getpid()和getppid()两个函数来打印当前进程的编号,还拿之前的代码进行举例:



#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
{
printf(“pid:%d ppid:%d\n”,getpid(),getppid());
sleep(2);
}
return 0;
}


然后运行这个程序,我们可以观察到它的进程和它的父进程的编号:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4ba2ac9833ec4aa8912b7c56d3429760.png)  
 分别是900和26326,那么它的父进程到底是谁呢?  
 我们可以在另一个界面查看一下:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1bf07edb414f4b359427078fae43c588.png)  
 我们发现父进程就是bash。同时我们还需要知道一个结论。  
 在命令行执行的命令其实也是进程它们的父进程都是bash。


### (2)状态


状态包括:任务状态,退出代码,退出信号等。  
 这里只对退出码来进行说明,该部分比较重要,需要篇幅较大,在之后的内容再来提及。  
 我们在写C语言和C++程序的时候,最后是不是都要有一个返回值呢?在大部分情况下,返回值是0,即return 0,其实这个0就是该程序的退出码。  
 如果让我们的程序返回100呢?那么这个程序的退出码就是100。



int main()
{
return 100;
}


我们可以通过:



> 
> echo $?
> 
> 
> 


指令来查看程序退出码:  
 该命令查看的退出码是离该命令最近的进程的退出码。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c1fe3e5ad8884d5e905f066dc669abb5.png)


### (3)优先级


CPU的资源是有限的,而进程有多个,这就存在谁先使用CPU谁后使用CPU的问题。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b25b596b49c04beba4b3a45514b3cd9c.png)  
 优先级指的是该进程相对于其他进程的优先级。然后通过优先级队列来按顺序使用CPU资源。注意优先级队列的元素不是程序而是程序的PCB。通过PCB可以找到该程序。  
 即不同进程执行的顺序,注意优先级决定的先后问题,而之前所说的权限指的是能与不能的问题。


### (4)程序计数器


程序中即将被执行的下一条指令的地址。  
 当程序文件被加载到CPU中之后,程序需要被一条一条的执行,CPU有一个pc寄存器,其中存放的就是下一条指令的地址。  
 从而使得程序可以一步一步正常运行下去。它也显示在我们的PCB中。


### (5)内存指针


可以理解为,根据PCB中的内存指针可以帮我们找到程序的代码和数据,即程序文件在内存的位置。


### (6)I/O状态信息


进程可能会对外存进行操作,比如一个C语言程序可以进行文件的读写,I/O状态信息存入的就是该进程可以访问的外部设备的信息。


### (7)记账信息


记账信息,即该进程处理时间总和,使用的时钟数总和,时间限制,记账号等等。从而保证各个进程公平地分配CPU的资源。


### (8)上下文数据


我们知道,进程在由CPU执行的时候是按一定顺序的,有优先级队列来控制执行的顺序。  
 在CPU中有一组存放临时数据的存储单元,我们称之为寄存器,当进程加载到CPU中之后,寄存器会保存正在运行的程序的临时数据。  
 有了寄存器的概念,下面我们来讨论上下文数据这一概念:  
 我们发现,虽然有优先级队列来规定进程的执行顺序,但是在我们自己的电脑中,为什么可以同时运行多个进程呢?  
 其本质是通过CPU的快速切换完成的。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/992e3d3d85944ee7bc474b8b1426eb68.png)  
 这才是操作系统控制CPU处理进程的方式,让第一个进程(对应PCB1)在CPU中运行一段时间(并没有运行结束),然后将其放在优先级队列的队尾,然后CPU处理第二个进程,处理一段时间后(没执行完),将第二个进程再放到队尾,依次类推。  
 其中处理的一段时间,我们称之为:**时间片**。时间片通常很短,因此我们感觉的就是多个进程在同时执行。  
 那么问题又出现了,当进程1在CPU中每一次执行之后是会产生临时数据的,存放在寄存器中,之后进程二占用CPU,此时由于寄存器只有一套,那么进程二产生的临时数据就会对寄存器中的内容进行刷新。当进程1再来占用CPU的时候之前产生的临时数据没了?那怎么确定进程1执行到哪里了呢?  
 此时才引出了我们的主角:**上下文数据**。它会保存进程每一次在CPU执行之后得到的临时数据,存放在PCB中,当又一次轮到该进程使用CPU的时候,上下文数据会直接导入到寄存器中,从而控制进程的执行进度。  
 同时,通过上下文数据,我们也可以感受到进程是被切换的。


### (9)其他信息


还有好多信息这里不一一列举了。



### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/84b317c2b021cce01c8073be1ee8ed70.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/4665970b25af0e9a9f8335870d216dde.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值