Linux ---- 进程

Linux进程


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

文章目录


一、PCB(进程控制块)

PCB (process control block)

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



task_struct 内容

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


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

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

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

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

  • 上下文数据:进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。

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

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




二、查看进程

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

Linux ---- 进程


使用系统调用接口获取PID

Linux ---- 进程
Linux ---- 进程



通过fork创建进程

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

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

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

父进程和子进程的执行顺序是不确定的。
Linux ---- 进程


fork为子进程返回0,为父进程返回子进程pid,通过fork不同的返回值使两个执行流进行不同的操作,这就是并发。
Linux ---- 进程
Linux ---- 进程



三、进程状态

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

Linux ---- 进程

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

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

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

  • T (stopped) : 例如用kill -19 6198 命令停止 pid为6198的进程。
    Linux ---- 进程
    Linux ---- 进程
    (还可以通过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 值确定,数值越小,优先级越高。

Linux ---- 进程


PRI & NI


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

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

上一篇:仿超级人脉app开发系统源码搭建


下一篇:配置拦截器的放行路径