第七章进程控制 控制进程上下文的系统调用包括三类: 1、与存储相关的 fork exec brk 2、与同步相关的 exit wait signal kill 3、与属性相关的 setpgrp setuid 1
第七章 进程控制 控制进程上下文的系统调用包括三类: 1、与存储相关的 fork exec brk 2、与同步相关的 exit wait signal kill 3、与属性相关的 setpgrp setuid 1
7.1创建进程fork pid fork() fok算法主要完成以下操作: 1、检查系统资源,为新进程在核心进程表proc表中分配一 个空表项。 2、为子进程分配一个唯一的进程标识数PD,确认用户的总 进程数没有超限。 3、拷贝父进程的上下文到子进程中,包括真正用户标识号 、有效用户标识号、进程组号、调度优先权等。初始化子进 程中的相关参数,如初始优先权数、初始CPU使用时间、计 时域等。调整文件的引用计数等。 4、增加与该进程相关的file表项和活动inode表项的引用计 数。 5、对父进程返回子进程的进程号;对子进程则返回0。 2
7.1 创建进程 fork pid = fork( ) fork算法主要完成以下操作: 1、检查系统资源,为新进程在核心进程表proc表中分配一 个空表项。 2、为子进程分配一个唯一的进程标识数PID,确认用户的总 进程数没有超限。 3、拷贝父进程的上下文到子进程中,包括真正用户标识号 、有效用户标识号、进程组号、调度优先权等。初始化子进 程中的相关参数,如初始优先权数、初始CPU使用时间、计 时域等。调整文件的引用计数等。 4、增加与该进程相关的file表项和活动inode表项的引用计 数。 5、对父进程返回子进程的进程号;对子进程则返回0。 2
算法fork 输入:无 输出:对父进程是子进程的PID 对子进程是0 f 检查可用的核心资源(如内外存空间、页表等); 取一个空闲的进程表项和唯一的PID号; 检查用户没有过多的运行进程; 将子进程的状态设为“创建”状态; 将父进程的进程表项中的数据拷贝到子进程的进程表项中; 当前目录的索引节点和改变的根目录的引用计数加一; 系统打开文件表中相关表项的引用计数加一; 在内存中作父进程上下文的拷贝(包括u区、正文、数据、堆栈); 3
算法 fork 输入:无 输出:对父进程是子进程的PID 对子进程是0 { 检查可用的核心资源(如内外存空间、页表等); 取一个空闲的进程表项和唯一的PID号; 检查用户没有过多的运行进程; 将子进程的状态设为“创建”状态; 将父进程的进程表项中的数据拷贝到子进程的进程表项中; 当前目录的索引节点和改变的根目录的引用计数加一; 系统打开文件表中相关表项的引用计数加一; 在内存中作父进程上下文的拷贝(包括u区、正文、数据、堆栈); 3
算法fork(续) 在子进程的系统级上下文中压入虚设的系统级上下文层 :虚设的上下文层中含有使子进程能够识别自己的数据, * 并使子进程被调度时从这里开始 *1 f(正在执行的进程是父进程) 将子进程的状态设置为“就绪”状态; return(子进程的PID);从系统态到用户态*/ ese体当前正在执行的进程是子进程*/ { 初始化u区的计时域; return(0);休从系统态返回到用户态*I 3 4
算法 fork (续) 在子进程的系统级上下文中压入虚设的系统级上下文层 /* 虚设的上下文层中含有使子进程能够识别自己的数据, * 并使子进程被调度时从这里开始 */ if (正在执行的进程是父进程) { 将子进程的状态设置为“就绪”状态; return(子进程的PID); /* 从系统态到用户态 */ } else /* 当前正在执行的进程是子进程 */ { 初始化u区的计时域; return(0); /* 从系统态返回到用户态 */ } } 4
实例1:双进程文件拷贝 main(int argc,*argv[] { 两个进程共享读指针和写指 fdrd open(argv[1],O_RDONLY); 针,但运行的结果并不能保证新 fdwt create(argv[2],0666); 文件中的内容与老文件中的完全 fork)片 *父子进程执行下面相同的代码*/ 相同,这取决于父子两个进程的 rdwrt(); 调度顺序。 exit(0); 一多进程环境下的数据一 } 致性问题。 rdwrt() { for(;; { if(read(fdrd,&c,1)!=1) return; write(fdwt,&c,1)月 } 5
main(int argc, *argv[ ]) { fdrd = open(argv[1], O_RDONLY); fdwt = create(argv[2], 0666); fork( ); /* 父子进程执行下面相同的代码 */ rdwrt( ); exit(0); } rdwrt( ) { for(; ;) { if(read(fdrd, &c, 1) != 1) return; write(fdwt, &c, 1); } } 实例1:双进程文件拷贝 两个进程共享读指针和写指 针,但运行的结果并不能保证新 文件中的内容与老文件中的完全 相同,这取决于父子两个进程的 调度顺序。 —— 多进程环境下的数据一 致性问题。 5