【Linux】进程的概念,简单操作,pcb,,进程状态,僵尸进程

进程概念

对于操作系统来说,进程就是一个程序运行的描述,用于操作系统进行程序的调度运行管理。
实际上对于系统来说,进程就是pcb–进程控制块。

pcb–进程控制块

一个程序运行的同台描述,叫做该程序的pcb进程控制块,在Linux下是一个task_struct结构体。
pcb保存进程在内存中的位置,以及进程运行的指令地址,可以看作程序的运行描述。
要运行哪个程序,操作系统就找到对应程序的pcb,取出程序运行的所需信息加载到cpu上开始运行。

pcb内包含的描述信息

内存指针,上下文数据,程序计数器,进程ID-pid,IO信息,进程优先级,进程状态,记账信息…

进程的简单操作

fork函数

在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。

#include <unistd.h>
pid_t fork(void);
返回值:子进程中返回0,父进程返回子进程id,出错返回-1
进程调用fork,当控制转移到内核中的fork代码后,内核做:
■分配新的内存块和内核数据结构给子进程
■将父进程部分数据结构内容拷贝至子进程
■添加子进程到系统进程列表当中
■fork返回,开始调度器调度

常规用法:
■一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求。
■一个进程要执行一个不同的程序。例如子进程从fork返回后调用exec函数。
fork调用失败的原因:
■系统中有太多的进程
■实际用户的进程数超过了限制

创建进程

进程就是一个pcb,是一个task_struct结构体(仅在Linux中),创建一个进程就是创建一个task_struct结构体。
pid_t fork(void)–创建进程的接口–通过复制调用这个接口的进程(父进程),创建一个新的进程(子进程)
fork()函数:对于父进程,它会返回创建的子进程的pid;对于子进程,它会返回0

图示:
在这里插入图片描述
在这里插入图片描述
pid3586为父进程
pid3587为子进程

ps指令

ps:查看 Linux 中当前运行的进程的命令。能列出系统中运行的进程,包括进程号、命令、CPU使用量、内存使用量等
ps -a : 列出所有运行中/激活进程
ps -ef |grep : 列出需要进程
ps -aux : 显示进程更详细的信息,包括:如USER, PID, %CPU(cpu占用率), %MEM(内存占用率),程序运行时间,操作指令等

Linux下的进程状态

运行态(R):正在运行或者轮转到时间片就可以立即运行
可中断休眠态(S):可以被中断的休眠状态(满足唤醒条件,或者休眠被打断就进入运行态)
不可中断休眠态(D):不可以被中断的休眠状态(只有满足唤醒条件之后才可以进入运行态)
停止态(T):程序停止运行状态(依然可以被调度,但是什么都不做)
死亡态(X):这个状态只是一个返回状态,不会在任务列表里看见它
僵尸态(Z):进程已经退出,但是该进程的资源还没有完全释放,等待处理的一种状态

僵尸进程

僵尸进程:处于僵尸态的进程,是一种已经退出了,但是资源没有完全释放的进程
产生原因:子进程先于父进程退出,但是父进程并未注意到子进程的退出,因此系统未完全释放子进程的资源,这个子进程进入僵尸态。 子进程退出之后,在pcb中保存了自己的退出返回值,在父进程没有关注处理的情况下,pcb资源是不会被释放的。
危害:资源泄露(pcb所占用资源无法回收),资源占用(一个用户可以创建的进程数量是有限的)
解决方案:

处理:退出父进程
避免:进程等待

孤儿进程

孤儿进程:父进程先于子进程退出,子进程就会成为孤儿进程,运行在后台,父进程成为1号进程(指init进程,即孤儿进程会被init进程接管),退出后由1号进程回收资源
注:在centos7中1号进程改名为systemd进程

猜你喜欢

转载自blog.csdn.net/weixin_43962381/article/details/114703507