Linux---浅谈进程PCB

2019-07-14 06:51发布

在说PCB是什么之前,我们先了解一下进程到底是什么。它和程序又有什么区别?
程序:二进制可执行文件,是一个机器代码指令和数据的集合,存储在硬盘里,是一个静态的实体。 //指令+数据
进程:是操作系统对一个正在运行的程序的一种抽象,将二进制可执行文件加载到内存里。 //指令+数据+PCB
那么PCB到底是什么呢? 对于多道程序系统来说,其内存中可能存在着多个进程,为了方便管理这些进程,操作系统内核为每个进程都建立了一个结构体来保存与其相关的信息。这个结构体就是PCB,也就是进程控制块,它是进程实体的一部分,存在于进程的高1G空间。
Linux系统是采用链式方式来组织PCB的,对于不同的状态建立起一个进程队列。在Linux内核中,使用一个名为task_struct的结构体来描述PCB.
task_struct结构体包含了以下内容:
这里写图片描述
1.进程标识符
每个进程都有进程标识符、用户标识符、组标识符,那怎样才能识别不同的进程呢?其实,每个进程都有一个唯一标识自己的Id,即PID。它相当于人的身份证号一样,通过身份证号可以唯一的确定一个人,同样的,根据PID可以唯一标识一个进程。PID是内核提供给用户程序的接口,用户通过PID对进程发号施令。PID是32位无符号整数,它被顺序编号。新创建的进程PID通常是前一个进程的PID加1.然而,为了与16位硬件平台的Linux系统保持兼容,在LInux允许最大PID为32767,当内核在系统上创建第32768个进程时,就必须重新使用已闲置的PID。
2.进程状态
指明了当前进程的状态,作为进程调度和对换时时的依据。
kernel源代码里定义了进程的如下状态:
· R 运行状态(running):表明进程要么是在运行中要么是在运行队列里。
· S 睡眠状态(sleeping):意味着进程在等待事件完成,有时叫做可中断睡眠。
· D磁盘休眠状态(Disk sleep):不可中断睡眠状态,在这个状态进程通常会等待I/O的结束。
· T 停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程。这个暂停的进程可以通过发送SIGCONT信号让进程继续运行。
· X 死亡状态(dead):只是一个返回状态,不会在任务列表里看到。
· Z 僵尸状态(zombie):当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸状态。僵尸进城会以终止状态保持在进程表中,会一直等待父进程读取退出状态信息。
3.进程优先级
用于描述进程使用处理机优先级别的一个整数,优先级高的进程先获得处理机资源。
4.程序计数器
用于保存程序中即将被执行的下一条指令的地址。
5.内存指针
包括程序代码和进程相关数据的指针,还有和其他进程共享内存块的指针。
6.上下文数据
进程执行时处理器的寄存器中的数据。当进程暂停时,处理机状态必须保存到task_struct结构体中,当该进程被重新调度再次运行时再从中恢复上次运行时的环境,即恢复寄存器和堆栈的值。
7.I/O状态信息
包括显式的I/O请求、分配给进程的I/O设备(例如:磁带驱动器)和被进程使用的文件列表等。
8.审计信息
可以包括处理器时间总和、使用的时钟数总和、时间限制、审计号等。