进程的创建
建立PCB
分配存储空间
加载程序
入就绪链
在Unix系统中:
pid = fork()创建一个子进程(父进程的复制品)
execl(prog, args)加载并执行一个新的程序
进程的撤销
去配资源
撤销PCB
通知父进程
在Unix系统中:
exit() vs.kill
进入操作系统判断结束
除初始进程外,其他进程都由父进程创建,并形成了进程家族
Unix
pid = fork()
创建子进程,子进程是父进程的复制品,子进程与父进程并发执行
返回值:pid
子进程返回0,父进程返回子进程的编号
execl(prog, args)加载并执行一个新的程序,覆盖原来的程序
prog: 执行的程序
args:程序执行的参数,最后以0结束
exit(status) :进程自我结束
进程自我结束,通知父进程,唤醒父进程
系统做善后处理:收回存储程序,撤销PCB
status:子进程结束时的状态
pid = wait(&status)
如果没有结束子进程,父进程等待,有结束的子进程,直接返回
参数status为子进程exit(status)的参数子进程结束时的状态,返回值是终止子进程的编号
fork() 创建子进程
PCB分为两个数据结构,一个是proc结构,包含着常用信息,常驻内存,一个是user结构,可以随进程进入外存
执行到fork(),将父进程复制到子进程中,但是p_pid(进程编号)&&p_ppid(父进程编号)需要改变
程序代码理解:
首先PCB包含两部分内容,一部分是proc结构,另一部分是user结构proc结果常驻在内存中,包含着进程id,父进程id等信息。
然后执行pid = fork() 创建一个新的子进程,将父进程中的信息复制到子进程中,父进程pid返回不是0执行父进程代码,子进程pid是0 执行子进程代码
子进程执行父进程中原来有的execl(“P”,0)程序为P,无参数,需要有参数结尾标志0,然后P程序覆盖掉原来的程序,执行完毕后有exit(status),父进程(根据情况)wait(&s),子进程结束,返回值为子进程编号