每个进程都有非负的整型表示唯一的进程ID。
进程是一个数据结构变量,有多少个进程,就有多少个PCB。
几个典型进程的ID及其类型和功能:
ID 进程名 中文名 类型 作用
0 swapper 交换进程 系统进程 它是内核的一部分,不执行磁盘上的程序,是调度进程。
1 init init进程 用户进程 永不停止,启动系统,读取系统初始化的文件。
一些常用的进程标识符:
pid 当前进程ID
ppid 当前父进程ID
uid 实际用户ID
euid 有效用户ID
gid 实际组ID
egid 有效组ID
进程状态:
运行状态:注意这并不意味着进程一定正在运行,它表明进程要么在运行中要么在运行队列中。
睡眠状态(可中断睡眠):进程正在等待事件的完成。
磁盘休眠状态(不可中断睡眠):这个状态的进程通常会等待IO的结束。
暂停状态:可以通过SIGSTOP暂停进程,通过SIGCONT使进程继续运行。
僵尸状态:当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵死进程。僵死进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
死亡状态:是内核中的do_exit()函数返回的状态。
进程优先级:
进程cpu资源分配就是指进程的优先权,优先级高的进程有优先执行权利。
要了解进程的优先级必须掌握两个重要的标识符:
PRI:代表进程可被执行的优先级,其值越小越早被执行。
NI:代表当前进程的nice值。
这两个标识符之间的关系为:PRI(new)=PRI(old)+ nice,当nice值为负的时候,那么进程的优先级值将会变小,即其优先级会变高,则越快被执行。需注意,进程的nice值不是进程的优先级,但nice值会修改进程的优先级。
进程创建:
fork():父进程在调用fork创建子进程时会把自己的环境变量表也复制给子进程,环境变量定义了进程的运行环境。
在终端创建的进程的父进程都是bash,fork函数创建的是当前进程的子进程,有两个返回值,分别返回0和子进程的pid。
子进程和父进程不可以共享数据(存储位置),可以共享代码。
execve():使用execve()创建一个新进程,系统调用会销毁所有的内存段去重建一个新的内存段,还需要一个可执行文件或脚本作为参数。
fork(),execve()创建的进程都是运行进程的子进程。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
本文出自 “hah-yn” 博客,请务必保留此出处http://hah11yn.blog.51cto.com/10879860/1794703
原文地址:http://hah11yn.blog.51cto.com/10879860/1794703