Linux_进程

进程的概念
从用户角度:进程是程序的一次动态执行过程
从操作系统角度看:
1.进程是操作系统分配内存,CPU时间片等系统资源的基本单位。
2.每个进程有自己独立的地址空间和进程状态
3.进程是分配资源的最小单位

进程是程序的一次执行过程,需要保存进程的现场信息,这些信息需要一个数据结构来保存,在C语言中用结构体PCB(process control block)。

进程和程序的区别
1.进程是动态的,程序是静态的
2.进程是短暂的,程序是永久的
3.进程有PCB结构
4.一个进程只能对应一个程序,一个程序可以对应多个进程。

PCB
一个PCB保存一个进程(链表模式)

Linux 对应的PCB数据结构:task_struct
进程标识符
进程状态
进程优先级
各种时间信息
进程间的通信
内存的使用情况
寄存器

进程标识符
操作系统会给每个进程分配一个独一无二的编号
编号的范围[2 - cat/proc/sys/kernel/pid_max]
0 内核进程
0号进程启动1号进程 init
swap 分区

创建进程的一般过程
1.给新建进程分配一个进程标识符,在内核中创建PCB
2.复制父进程的环境
3.给子进程分配资源,栈,堆,代码,数据…
4.复制父进程的地址空间内容到子进程的地址空间
5.将进程置为就绪态,放到就绪队列

僵死进程&&孤儿进程
僵死进程
用fork()创建一个子进程,当父进程还没终止,子进程先终止,当时父进程并没有等待接收子进程终止的信号,则子进程占用的资源不会被释放,但是子进程已经终止了,成为一个僵死进程,一直占用系统资源,有危害。
孤儿进程
当父进程先终止,子进程后终止,子进程就会成为孤儿进程,被1号进程init回收,父进程就变成了init。
内核中init被编写成:每当有进程终止时,都会查看所有进程状态,看终止进程是否有子进程,有则回收该所有子进程,并且都会调用wait()函数回收该终止进程。
所以子进程能被init回收,当进程终止,也会接收信号,释放终止进程占用的资源,防止产生僵死进程。

僵死进程产生条件,只有在父进程还没终止,且没等待子进程终止,子进程先终止便成为了僵死进程。

猜你喜欢

转载自blog.csdn.net/cute_shuai/article/details/80164715