进程概念
进程基本概念
进程:站在操作系统的角度,进程就是一个运行中程序的描述—PCB,Linux下的PCB实际上是内核的一种结构体struct task_sturct{…}。
进程是资源分配的独立单位。
进程如何描述一个运行中的程序:
- 内存指针
- 程序计数器:保存程序中即将被执行的下一条指令的地址。
- 上下文数据
- 标识符PID
- I/O状态信息
- 优先级:决定进程CPU资源的优先分配权。为了让操作系统运行的更加良好。
- 记账信息:处理器时间总和。
CPU的分时机制:每个程序在CPU上运行都有一个时间片。
时间片:程序在CPU上运行的这段时间,运行完毕则调度切换。
查看进程
方法一:进程信息可以通过 /proc 系统文件夹查看。
方法二:指令
- ps -ef指令:查看所有进程信息。
- ps -aux指令:更详细信息。cpu、内存、虚拟内存、物理内存使用率。
- tty指令:查看终端
获取调用进程ID: getpid()
创建进程
pid_t fork(void)
通过复制调用进程创建一个子进程,子进程因为拷贝了父进程PCB里的很多数据,因此与父进程内存指针以及程序计数器都相同,所以运行的代码以及运行的位置都一样。
返回值有三种:
- -1:创建子进程失败。
- 等于0:对于子进程,返回值都是0。
- 大于0:对于父进程,返回的都是子进程的pid。
fork创建出来的子进程,父子进程代码共享,数据独有。
进程状态
- 运行态R:运行、就绪时。
- 可中断休眠状态s:意味进程在等待事件完成。
- 不可终端休眠状态D:通常这个状态进程会等待IO结束。
- 停止状态T:不做任何事,也不休眠。ctrl+z
- 死亡状态X
- 追踪状态Z
- 僵死状态:进程已经退出,但是资源没有完全释放。
kill无法杀死,可用kill -9强杀。
僵死状态
- 当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死进程。
- 僵死进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
产生原因:子进程先于父进程退出,为了保存退出原因,资源没有被完全释放,这是通知父进程去获取子进程退出原因,再释放子进程资源:如果父进程并未关注子进程退出状态,子进程就会成为僵尸进程。
危害;资源泄漏。
避免:进程等待。
处理:退出父进程。
孤儿进程
原因:父进程先于子进程退出
结果:子进程运行在后台孤儿,被1号init进程领养。
孤儿进程退出不会变成僵尸进程。
守护进程/精灵进程:特殊的孤儿进程(在孤儿进程的基础上,脱离终端,脱离登录会话)(通常运行在后台默默工作,)