Linux系统编程 ---- 进程/进程控制

Linux进程


进程是程序的一个执行实例,正在执行的程序等。 在内核的角度看 : 担当分配系统资源(CPU时间,内存)的实体。


一、PCB(进程控制块)

PCB (process control block)

进程的信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。是一个C语言的结构体 task_struct



task_struct 内容

在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。


  • 标示符:描述本进程的唯一标示符,用来区别其他进程。状态:任务状态,退出代码,退出信号等。

  • 优先级:相对于其他进程的优先级。

  • 程序计数器:程序中即将被执行的下一条指令的地址。

  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

  • 上下文数据:进程执行时处理器的寄存器中的数据。

  • l/O状态信息:包括显示的I/O请求,分配给进程的l/o设备和被进程使用的文件列表。

  • 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。·其他信息




二、查看进程

Linux 中,万物皆文件,/proc 文件夹下就存储的进程信息。 可以用ps 或 top命令查看进程信息。

在这里插入图片描述


使用系统调用接口获取PID

在这里插入图片描述
在这里插入图片描述



通过fork创建进程

fork是一个系统调用接口,通过它创建一个子进程。

  • fork有两个返回值,它为子进程返回0,为父进程返回子进程的pid。
  • 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

fork创建的子进程和父进程共享一份用户代码,而用户数据都是独立私有的,所有进程都有独立性,例如多开几个QQ,一个崩溃了不会影响其他进程。
在这里插入图片描述

父进程和子进程的执行顺序是不确定的。
在这里插入图片描述


fork为子进程返回0,为父进程返回子进程pid,通过fork不同的返回值使两个执行流进行不同的操作,这就是并发。
在这里插入图片描述
在这里插入图片描述



三、进程状态

在Linux内核中,进程一共有以下几种状态。

在这里插入图片描述

  • R(runing) : 运行,并不是正在运行的进程才处于运行态,只要处于运行队列中的进程都是R状态。

  • S (sleeping) :浅度休眠,这种状态可以被外部信号唤醒。

  • D (disk sleep) :深度休眠,这种状态的进程操作系统也无法杀死,例如往硬盘写入数据时,此进程就处于D状态。

  • T (stopped) : 例如用kill -19 6198 命令停止 pid为6198的进程。
    在这里插入图片描述
    在这里插入图片描述
    (还可以通过kill -18 使进程继续运行)

  • t (tracing stop) : 程序在debug时,程序执行到断点处此时就处于 t 状态。

  • Z (zombie) : 僵死状态(Zombies),是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
    僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
    所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

  • X (dead) : 进程一处于这个状态,操作系统就立即回收该进程资源。


僵尸进程的危害

进程的退出状态必须一直被维持下去,因为他要告知其进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态,操作系统还需要继续维护该进程的PCB,就会造成内存泄露。



孤儿进程

父进程如果提前退出子进程还在运行,那么子进程就会成为孤儿进程,孤儿进程会被pid为1 (init进程)的进程领养,如果子进程进入Z状态那么回收工作也就由 init 进程执行。



无法被kill的进程

处于D状态的进程和僵尸进程,是无法被杀死的。




进程优先级

  • PRI∶代表这个进程可被执行的优先级,其值越小越早被执行
  • Nl︰代表这个进程的nice值

linux中的进程优先级由 priority值 和 nice 值确定,数值越小,优先级越高。

在这里插入图片描述


PRI & NI


PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先居顺序,此值越小进程的优先级别越高
那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRl(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值
nice其取值范围是-20至19,一共40个级别。

需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
可以理解nice值是进程优先级的修正修正数据



查看进程优先级命令 top

在这里插入图片描述

在top界面,输入r ,再输入pid,此时就可以修改nice值,-20 ~ 19



四、进程管理


wait 函数

在这里插入图片描述

调用wait()函数的进程会挂起(阻塞),直到它的一个子进程退出或收到一个不能被忽视的信号时才被唤醒(相当于继续往下执行)。
若调用进程没有子进程,该函数立即返回;若它的子进程已经结束,该函数同样会立即返回,并且会回收那个早已结束进程的资源。
所以,wait()函数的主要功能为回收已经结束子进程的资源。
如果参数status的值不是NULL,wait()就会把子进程退出时的状态取出并存入其中,这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的。
这个退出信息在一个int 中包含了多个字段,直接使用这个值是没有意义的,我们需要用宏定义取出其中的每个字段。

fffff



waitpid

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

necesse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值