计算机操作系统
软件学院计算机课程
实 验 报 告 册
课程名称 计算机操作系统 实验学期 2011 年至 2012 年 第 2 学期
学生所在院(系) 软件学院
年级 11软件 专业班级 软工(1) 班
学生姓名 朱水云 学号 1115114034
指导教师 陈自刚
实验最终成绩
软件学院实验室制
2012 年 4 月
计算机操作系统
实验报告( 一 )
实验名称:进程管理
实验时间:2012年4月11号
实验性质
应用性
设计性
综合性
计算机操作系统
5
,观察运行结果,并思考 6,退出中断并写出实验报告 调试过程:根据编译提示的错误进行修改 四、实验结果: 实验结果: 1,进程的创建运行结果:acb 2,进程的控制<程序一>运行结果: parent…. son… grandchild… grandchild… 或 grandchild …son …grandchild …son …parent
进程的控制<程序二>运行结果: 3,软中断运行结果: (1) child process2 is killed by praent; child process1 is killed by prent; prent process is killed; (2) 4,进程的管道通信运行结果: 延迟 5 秒后显示: child1 process is sending message!第 3 页 共 10 页
计算机操作系统
再延迟 5 秒: child2 process is sending message!
五、疑难与小结: 疑难与小结: 1,进程创建分析:从进程执行并发来看,输出 abc 的排列都是有可能的。 原因:fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是 一定是顺序的,所以输出 abc 的排列都是有可能的。 2,进程的控制分析: <程序一>由于函数 printf()输出的字符串之间不会被中断, 因此,每个字符串内部的字符顺序输出时不 变。但是 , 由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随 着执行的不同而发生变化。这与打印单字符的结果相同。 <程序二>因为上述程序执行时,lockf(1,1,0)锁定标准输出设备,lockf(1,0,0)解锁标准输出设备,在 lockf(1,1,0)与 lockf(1,0,0)中间的 for 循环输出不会被中断,加锁与不加锁效果不相同。 3,软中断分析:不做任何操作等待五秒钟父进程回在子进程县推出后退出,并打印退出的顺序;或者点 击 ctrl+C 后程序退出并打印退出的顺序。 4,进程的管道通信分析:连接一个读进程和一个写进程实现他们之间通信的一个共享
六、主要算法和程序清单 1,进程的创建 #include<stdio.h> main() { int p1,p2; if(p1=fork()) /*子进程创建成功*/ putchar('b'); else { if(p2=fork()) /*子进程创建成功*/ putchar('c'); else putchar('a'); /*父进程执行*/ } } 2,<程序一>进程的控制 #include<stdio.h> main() { int p1,p2,i; if(p1=fork()) { for(i=0;i<500;i++) printf("parent%d\n",i); wait(0); /* 保证在子进程终止前,父进程不会终止*/ exit(0); } else第 4 页 共 10 页
计算机操作系统
{ if(p2=fork()) { for(i=0;i<500;i++) printf("son %d\n",i); wait(0); /* 保证在子进程终止前,父进程不会终止*/ exit(0); /*向父进程信号 0 且该进程推出*/ } else { for(i=0;i<500;i++) printf(“grandchild %d\n",i); exit(0); } } } <程序二>#include<stdio.h> main() { int p1,p2,i; if(p1=fork()) { lockf(1,1,0); for(i=0;i<500;i++) printf("parent %d\n",i); lockf(1,0,0); wait(0); /* 保证在子进程终止前,父进程不会终止*/ exit(0); } else { if(p2=fork()) { lockf(1,1,0); for(i=0;i<500;i++) printf("son %d\n",i); lockf(1,0
,0); wait(0); /* 保证在子进程终止前,父进程不会终止*/ exit(0); } else { lockf(1,1,0); for(i=0;i<500;i++)第 5 页 共 10 页
计算机操作系统
printf("daughter %d\n",i); lockf(1,0,0); exit(0); } } } 3,软中断通讯程序流程图及程序如下:
程序: (1)#include<stdio.h> #include<signal.h> #include<unistd.h> void waiting(),stop(),alarming(); int wait_mark; main() { int p1,p2; if(p1=fork()) { if(p2=fork())
/*创建子进程 p1*/ /*创建子进程 p2*/第 6 页 共 10 页
计算机操作系统
{ wait_mark=1; signal(SIGINT,stop); /*接收到^c 信号,转 stop*/ signal(SIGALRM,alarming);/*接受 SIGALRM waiting(); kill(p1,16); kill(p2,17); /*向 p1 发软中断信号 16*/ /*向 p2 发软中断信号 17*/
wait(0); /*同步*/ wait(0); printf("parent process is killed!\n"); exit(0); } else { wait_mark=1; signal(17,stop); signal(SIGINT,SIG_IGN); /*忽略 ^c 信号*/ while (wait_mark!=0); lockf(1,1,0); printf("child process2 is killed by parent!\n"); lockf(1,0,0); exit(0); } } else { wait_mark=1; signal(16,stop); signal(SIGINT,SIG_IGN); /*忽略^c 信号*/ while (wait_mark!=0) lockf(1,1,0); printf("child process1 is killed by parent!\n"); lockf(1,0,0); exit(0); } } void waiting() { sleep(5); if (wait_mark!=0) kill(getpid(),SIGALRM); } void alarming()第 7 页 共 10 页
计算机操作系统
{ wait_mark=0;} void stop() { wait_mark=0;}
(2)#include<stdio.h> #include<signal.h> #include<unistd.h> int pid1,pid2; int EndFlag=0; int pf1=0; int pf2=0; void IntDelete() { kill(pid1,16); kill(pid2,17); } void Int1() { printf("child process 1 is killed !by parent\n"); exit(0); } void Int2() { printf("child process 2 is killed !by parent\n"); exit(0); } main() { int exitpid; if(pid1=fork()) { if(pid2=fork()) { signal(SIGINT,IntDelete); waitpid(-1,&exitpid,0); waitpid(-1,&exitpid,0); printf("parent process is killed\n"); exit(0); } else { signal(SIGINT,SIG_IGN); signal(17,Int2); pause();第 8 页 共 10 页
计算机操作系统
} } else { signal(SIGINT,SIG_IGN); signal(16,Int1); pause(); } } 4,进程的管道通信: #include <unistd.h> #include <signal.h> #include <stdio.h> int pid1,pid2; main( ) { int fd[2]; char outpipe[100],inpipe[100]; pipe(fd); /*创建一个管道*/ while ((pid1=fork( ))==-1); if(pid1==0) { lockf(fd[1],1,0); sprintf(outpipe,"child 1 process is sending message!"); /*把串放入数组 outpipe 中*/ write(fd[1],outpipe,50); /*向管道写长为 50 字节的串*/ sleep(5); /*自我阻塞 5 秒*/ lockf(fd[1],0,0); exit(0); } else { while((pid2=fork( ))==-1); if(pid2==0) { lockf(fd[1],1,0); /*互斥*/ sprintf(outpipe,"child 2 process is sending message!"); write(fd[1],outpipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else {第 9 页 共 10 页
计算机操作系统
wait(0); read(fd[0],inpipe,50); printf("%s\n",inpipe); wait(0); read(fd[0],inpipe,50); printf("%s\n",inpipe); exit(0); } } }
/*同步*/ /*从管道中读长为 50 字节的串*/
第 10 页 共 10 页