您的位置:首页 > 其它

进程的基本概念

2019-03-10 11:13 21 查看

进程:运行或加载在内存上的程序(程序的一个实例化,一次执行过程)
程序:存储在内存上的一个可执行的二进制文件
操作系统为每个进程维护一个PCB,通过PCB/进程控制块(底层是一个结构体,包含的、进行属性)对一个进程实体进行间接操作,而不是直接控制。系统通过双向链表来管理所有的PCB.
进程实体:程序被加载在内存上的内容。
僵死进程:1、每一个程序都对应一个进程,在进程结束的时候,进程的实体会被销毁,而此时的进程的PCB不会销毁,对于一个进程的实体销毁而进程的PCB没有被释放的进程叫做僵死进程;
2、子进程执行结束而父进程没有结束,但父进程没有处理子进程的退出状态。
处理僵死进程的方式:
1)让父进程结束,使子进程变为孤儿进程,移交给init,init会处理僵死进程;
2)让父进程处理子进程的退出状态;(每个子进程结束时都会发送一个SIGCHLD的信号的父进程)

父进程处理子进程的退出状态的方法:
1)调用wait(int *reval)方法这是一个阻塞运行的方法,返回值为子进程的pid,reval是子进程的退出状态码。父进程会一则直等待子进程的退出状态而不会执行其他操作。
2)当子进程发送SIGCHID信号给父进程的时候,调用signal(SIGCHLD,SIG_IGN);表示父进程知道子进程已经结束,但父进程忽略这个信号,实质已经处理了,只是处理的方案是忽略,和系统默认的不处理是不一样的。这是操作系统已经知道父进程对子进程的态度,所以不再维护子进程,将子进程的PCB销毁。

操作系统在子进程结束时没有立即销毁子进程的PCB的原因是:操作系统不知道该子进程是否已经对父进程或用户已经没有用了所以他维护这个PCB,让子进程发送一个信号格给父进程,让父进程来处理,如果父进程忽略这个信号表示这个子进程已经没有用了,这时操作系统会立即销毁这个PCB,节省空间。

父子进程之间的资源共享:
在fork之后,子进程往往会跟着执行exec系列函数,所以进程的创建过程采用写时拷贝技术:fork之后父子进程共享内存空间(除了栈区,因为每个进程都会有自己独立的栈区,在进程开始的时候会自动开辟栈帧),内核将这些空间置为只读,如果父子进程任何一个进程试图修改某个数据,操作系统会以也为单位将修改的数据所在的页拷贝出来。
而父子进程的PCB是以浅拷贝的方式进行的,所以open函数的返回值是进程的文件表数组的下标,文件表里面存储的是struct file的结构体的地址,是一个指针数组。因为是浅拷贝所以父子进程的PCB的存储的值都是简单的拷贝了地址值,所以他们他们指向的struct file结构体是一样的,所以共用这个结构体体里面的内容。因此他们对文件的读取是相互影响的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: