第3章作业3.2试比较进程和程序的区别。答:(1)进程是一个动态概念,而程序则是一个静态概念。程序是指令的有序集合,没有任何执行的含义。而进程则强调执行过程,它动态地被创建,并被调度执行后消亡;(2)进程具有并发特征,而程序没有;(3)进程是竞争计算机系统资源的基本单位,从而其并发性受到系统自己的制约。这里制约就是对进程独立性和异步性;(4)不同的进程可以包含同一程序,只要该程序所对应的数据集不同。3.3我们说程序的并发执行将导致最终结果失去封闭性。这话对所有的程序都成立吗?试距离说明。答:并非对所有的程序都成立。如:Beginlocalx;x=10;print(x);End上述程序中x是内部变量,不可能被外部程序访问,因此这段程序的运行不会手外部环境影响。3.7并发进程间的制约有哪2种?引起制约的原因是什么?答:并发进程间的制约有两种:直接制约和间接制约。直接制约是由并发进程互相共享对方的私有资源所引起的。间接制约是由竞争公有资源引起的。3.8什么是进程间的互斥?什么是进程间的同步?答:进程间的互斥是指:一组并发进程中的一个或多个程序段,因共享某一共有资源而导致它们必须以一个不许交叉执行的单位执行,集不允许两个以上的共享该资源的并发进程同时进入临界区。进程间的同步是指:异步环境下的一组并发进程阴直接制约互相发送消息二进行合作、互相等待,是个进程按一定的速度执行的过程。3.13编写一个程序使用系统调用fork生成三个子进程,并使用系统调用pipe创建一管道,使得这3个子进程和父进程公用同一条管道进行信息通信。答:main(){intr,i,P1,P2,fd[2];charbuf[50],s[50];pipe(fd);while((P1=fork())==-1);if(P1==0){lockf(fd[1],1,0);sprintf(buf,childprocessP1issendingmessages!\n);printf(childprocessP1!\n);write(fd[1],buf,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{while((P2=fork())==-1);if(P2==0){lockf(fd[1],1,0);sprintf(buf,childprocessP2issendingmessages!\n);printf(childprocessP2!\n);write(fd[1],buf,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{while((P3=fork())==-1);if(P3==0){lockf(fd[1],1,0);sprintf(buf,childprocessP3issendingmessages!\n);printf(childprocessP3!\n);write(fd[1],buf,50);sleep(5);lockf(fd[1],0,0);exit(0);}wait(0);if(r=read(fd[0],s,50)==-1)printf(can'treadpipe\n);elseprintf(%s\n,s);wait(0);if(r=read(fd[0],s,50)==-1)printf(can'treadpipe\n);elseprintf(%s\n,s);wait(0);if(r=read(fd[0],s,50)==-1)printf(can'treadpipe\n);elseprintf(%s\n,s);exit(0);}}}3.14设有5个哲学家,共享一张放有五把椅子的桌子,每人分得一把椅子。但是桌子上总共只有5支筷子,在每人两边分开各放一支。哲学家们在肚子饥饿时才试图分两次从两边拾起筷子就餐。条件:(1)只有拿到两只筷子时,哲学家才能吃饭;(2)如果筷子已在他人手上,则该哲学家必须等待到他人吃完之后才能拿到筷子;(3)任一哲学家在自己未拿到两只筷子吃饭之前,绝不放下自己手中的筷子。试:(1)描述一个保证不会出现两个邻座同时要求吃饭的通信算法。(2)描述一个既没有两邻座同时吃饭,又没有人饿死(永远拿不到筷子)的算法。(3)在什么情况下,5个哲学家全部吃不上饭。答:(1)设信号量c[0]~c[4],初始值均为1,分别表示I号筷子被拿(I=0,1,2,3,4)send(I):第一个哲学家要吃饭BeginP(c[I]);P(c[I+1mod5]);Eat;V(c[I+1mod5]);V(c[I]);End;该过程能保证两邻座不同时吃饭,但会出现5个哲学家一人拿一支筷子,谁也吃不上饭的死锁情况。(2)解决的思路如下:让奇数号的哲学家先取右手边的筷子,让偶数号的哲学家先取左手边的筷子。这样,任何一个哲学家拿到一只筷子以后,就已经组织了他邻座的一个哲学家吃饭的企图,除非某个哲学家一支吃下去,否则不会有人会饿死。send(I)BeginifImod2==0then{P(c[I],P(c[I+1]mod5))Eat;V(c[I],V(c[I+1]mod5))}else{P(c[I+1mod5])P(c[I])EatV(c[I+1mod5])V(c[I])}End(3)在循环等待的情况下,5个哲学家全部吃不上饭。有两个进程P1,P2,他们分别执行下面的程序体,其中total是两个进程都能访问的共享变量,初始值为0,count是每个进程的私有变量。假设两个进程并发执行,并可自由交叉,则两个进程都执行完后,total可能得到的最小值为:P1{intcount;for(count=1;count=50;count++)total=total+1;}P2{intcount;for(count=1;count=50;count++)total=total+2;}答:total可能得到的最小值为:3。第4章作业4.2试述作业调度的主要功能。答:作业调度的主要功能是:按一定得原则对外存输入井上的大量后备作业进行选择,给选出的作业分配内存、输入输出设备等必要的资源,并建立相应的进程,是改作业的相关进程获得竞争处理机的权利。另外,当作业执行完毕时,还负责回收系统资源。4.4进程调度的功能有哪些?答:进程调度的功能有:(1)记录系统中所有进程的执行情况;(2)选择占有处理机的进程;(3)进行进程上下文切换。4.5进程调度的时机有哪几种?答:进程调度的时机有:(1)正在执行的进程执行完毕。这时,如果不选择新的就绪进程执行,将浪费处理机资源;(2)执行中进程自己调用阻塞原语将自己阻塞起来进入睡眠等待状态;(3)执行中进程调用了P原语,从而因资源不足而被阻塞;或调用了V原语操作激活了等待资源的进程队列;(4)执行中进程提出I/O请求后被阻塞;(5)在分时系统中时间片已经用完;(6)在执行完系统调用,在系统程序返回用户进程时,可认为系统进程执行完毕,从而可调度选择一新的用户进程执行;以上都是在CPU执行不可剥夺方式下所引起进程调度的原因。在CPU执行方式是剥夺时,还有:(7)就绪队列中的某进程的优先级变得高于当前执行进程的优先级,从而也将引发进程调度。4.6假设有4到作业,它们的提交时刻及执行时间由下表给出:作业号提交时刻/小时执行时间/小时110:002210:201310:400.5410:500.3计算在单道程序环境下,采用先来先服务调度算法和最短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。答:假设所有作业都已经到达,则(1)先来先服务调度算法:顺序开始时间结束时间执行时间等待时间110:0012:0020210:2013:0011.67310:4013:300.52.33410:5013:480.32.67T=0.25*(2+2.67+2.83+2.97)=0.25*10.47=2.6175(h)W=0.25*(4+0+1.67/1+2.33/0.5+2.67/0.3)=0.25*19.23=4.8075(h)(2)最短作业优先调度算法:顺序开始时间结束时间执行时间等待时间410:5011:080.30310:4011:380.50.47210:2012:3811.30110:0014:3822.63T=0.25*(0.3+0.97+2.30+4.63)=0.25*8.2=2.04(h)W=0.25*(4+0+0.47/0.5+1.30/1+2.63/2)=0.25*7.555=1.88875(h)