题目:操作系统——进程实验
姓名:郑兆涵
学校:烟台大学
专业:计算机科学与技术(嵌入式方向)
班级:计146-2
学号:201458506230
目录:
一、设计目的、意义
二、设计分析
三、方案分析
四、功能模块实现
1 进程创建
2 进程的控制
3 软中断通信
4 进程的管道通信
5 消息的创建,发送和接收
6 共享存储区的创建,附接和断接
五、最终结果分析
1 进程的创建
2 进程的控制
3 软中断通信
4 进程的管道通信
5 消息的创建,发送和接收
6 共享存储区的创建,附接和断接
六 设计体会
附录
1 进程的创建
2进程的控制
3 软中断通信
4进程的管道通信
5消息的创建,发送和接收
6 共享存储区的创建,附接和断接
一、设计目的、意义
(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质。
(3)分析进程竞争资源现象,学习解决进程互斥的方法。
(4)了解Linux系统中进程通信的基本原理。
(5)Linux系统的进程通信机构 (IPC) 允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉Linux支持的消息通讯机制及信息量机制。
二、设计分析
(1)进程的创建
编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”.
(2)进程的控制
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话.如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥.
(3)①编写一段程序,使其现实进程的软中断通信。要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child Processll is Killed by Parent!
Child Processl2 is Killed by Parent!
父进程等待两个子进程终止后,输出如下的信息后终止
Parent Process is Killed!
②在上面的程序中增加语句signal (SIGNAL, SIG-IGN) 和signal (SIGQUIT, SIG-IGN).
(4)进程的管道通信
编制一段程序,实现进程的管理通信。使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道中写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。
(5)消息的创建,发送和接收。
使用系统调用msgget (), msgsnd (), msgrev (), 及msgctl () 编制一长度为1k的消息的发送和接收程序。①为了便于操作和观察结果,用一个 程序为“引子”,先后fork( )两个子进程,SERVER和CLIENT,进行通信.②SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER 。SERVER每接收到一个消息后显示一句“(server)received”。③CLIENT端使用Key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,既是 SERVER端需要的结束信号。CLIENT每发送一条消息显示一句“(client)sent”。④父进程在 SERVER和 CLIENT均退出后结束。
(6)共享存储区的创建、附接和段接。
①为了便于操作 和观察结果,用一个 程序为“引子”,先后fork( )两个子进程,SERVER和CLIENT,进行通信。
②SERVER端建立一个KEY为75的共享区,并将第一个字节置为-1.作为数据空的标志.等待其他进程发来的消息.当该字节的值发生变化时,表示收到了该消息,进行处理.然后再次把它 的值设为-1.如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER.SERVER每接 收到一次数据后显示”(server)received”.
③CLIENT端建立一个为75的共享区,当共享取得第一个字节为-1时, Server端空闲,可发送 请求. CLIENT 随即填入9到0.期间等待Server端再次空闲.进行完这些操作后, CLIENT 退出. CLIENT每发送一次数据后显示”(client)sent”.
④父进程在SERVER和CLIENT均退出后结束.
(7)比较上述(5),(6)两种消息通信机制中数据传输的时间。
三、方案分析
(3)软中断通信流程图:
(4)进程的管道通信:
四、功能模块实现(部分代码实现)
(1)进程的创建
if(p1=fork()) /*子进程创建成功*/ putchar('b'); else { if(p2=fork()) /*子进程创建成功*/ putchar('c'); else putchar('a'); /*父进程执行*/ }
|
(2)进程的控制
if(p1=fork()) { for(i=0;i<500;i++) printf("parent%d\n",i); wait(0); /* 保证在子进程终止前,父进程不会终止*/ exit(0); } else { 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); |