“神秘”的PCB
PCB是什么?
PCB
是一个进程控制块。他是一个结构体,里面包含了各种描述进程的信息。当然它也有很多名字,在windows
系统下它叫PCB
,但是在Linux
系统下它又叫做task_struct
,在μC
实时操作系统下它又叫OS_TCB
。但是不管它叫什么,他都是一个用来描述进程的结构体。通常,我们把这种结构体统称为PCB。
PCB里面都有什么?(这里用Linux系统下的task_struct举例)
下面只列出常用的内容。
- 标识符(PID):这是描述进程的唯一标识符。这个标识符在所有进程中是独一无二的,这也就是区别进程的方法。每个进程都有一个不一样的
PID
。 - 状态:任务状态,退出代码,退出信号等。
- 就绪状态(R):当进程进入就绪状态,他就会被调度器调度。但是,进入就绪状态的进程可能正在运行,也可能正在等待被调度。所以不能说进入就绪状态的进程都在运行。
- 睡眠状态(S):一般就是等待一个事件的执行结束,如果之间写过的代码里面有
sleep(1)
就表示让进程进入睡眠状态1秒。 - 磁盘休眠状态(D):这个状态下的进程不可以被唤醒。一般进入这个状态的时候,进程都是在密集的进程IO操作的时候。比如说
Linux
下程序执行完(发生错误),这时候进程就会吐core dump
文件,这个时候就不可以打断它,所以处于深度睡眠状态的进程不可以被唤醒。 - 停止状态(T):可以用过发送
SIGSTOP
信号给进程来停止进程。这个被暂停的进程可以通过发送SIGCONT
信号让进程继续运行。 - 跟踪状态(t):这个状态一般就是在调试的时候会出现。比如用
gdb
调试一个程序的时候,这个时候进程会处于跟踪状态。 - 死亡状态(X):表示进程已经结束。这个状态没办法看到,只在
Linux
源码上存在。 - 僵尸状态(Z):僵尸进程,就是子进程结束之后,等待父进程回收信息时的状态。(上一篇博客有细说什么是僵尸进程,不懂的童鞋可以去看看)
- 优先级:相对于其他进程的优先级。
- CPU资源分配的先后顺序,就是进程的优先级。
- 优先级高的进程有优先执行的权利。配置进程的优先级对改善系统性能很有用。
- 还可以把进程运行到指定CPU上,把不重要的进程安排到某个CPU上,可以改善系统整体性能。
- 在
Linux
资源管理系中用PRI
表示。 NI
表示进程的nice值,是优先级的修正数值。共有从-20 ~ 19 的 40个级别。- 优先级 = PRI + NI
- 在
Linux
系统下调整进程的优先级,就是调整nice值。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
- 上下文数据:进程执行时处理器的寄存器中的数据。
- 上下文数据有什么作用?
- 首先
Linux
系统下不是一个进程从头到尾一直执行的,它会产生进程间切换。但是如果你直接切换,没有保存数据的话,下次再给原进程切换回来的时候,系统怎么知道这个原进程原来执行到哪里了。总不能从头开始吧。所以,每当进程间切换的时候,操作系统就会把当前CPU内的数据(寄存器和PC指针)放到内存中,当进程被切换回来的时候,会恢复上下文内容,继续刚才的行为。
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和进程使用的文件列表。
- 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 比如每个进程在CPU上执行了多长时间。
- 其他…