实验题目-进程管理和进程通信_第1页
实验题目-进程管理和进程通信_第2页
实验题目-进程管理和进程通信_第3页
实验题目-进程管理和进程通信_第4页
实验题目-进程管理和进程通信_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.实验题目:进程管理及进程通信姓名学号实验日期2016/10/12实验环境:VMware Workstation中的Ubuntu 64位操作系统。实验目的:利用Linux提供的系统调用设计程序,加深对进程概念的理解。体会系统进程调度的方法和效果。了解进程之间的通信方式以及各种通信方式的使用。实验内容:用vi 编写使用系统调用的C 语言程序。操作过程及结果:实验1:编写程序。显示进程的有关标识进程标识、组标识、用户标识等。经过5 秒钟后,执行另一个程序,最后按用户指示如:Y/N结束操作。结果:实验2:编写程序。实现父进程创建一个子进程。体会子进程与父进程分别获得不同返回值,进而执行不同的程序段的

2、方法。结果:思考:子进程是如何产生的?又是如何结束的?子进程被创建后它的运行环境是怎样建立的?答:是由父进程用fork函数创建形成的,通过exit函数自我结束,子进程被创建后核心将其分配一个进程表项和进程标识符,检查同时运行的进程数目,并且拷贝进程表项的数据,由子进程继承父进程所有文件。实验3:编写程序。父进程通过循环语句创建若干子进程。探讨进程的家族树以及子进程继承父进程的资源的关系。结果:思考: 画出进程的家族树。子进程的运行环境是怎样建立的?反复运行此程序看会有什么情况?解释一下。 修改程序,使运行结果呈单分支结构,即每个父进程只产生一个子进程。画出进程树,解释该程序。答1:反复运行,子

3、进程的编号在不断变化,但是初始的父进程的编号不会变,因为:父进程始终是该程序在虚拟机操作系统下的进程号,但是子进程是该父进程创建的子进程不断增加而得的,子进程的编号应该是顺序递增的。答2: #include #include sys/types.h #include main int i, pid; for i=1; i if pid=fork break; 实验4:编写程序。使用fork和exec等系统调用创建三个子进程。子进程分别启动不同程序,并结束。反复执行该程序,观察运行结果,结束的先后,看是否有不同次序。结果:思考:子进程运行其它程序后,进程运行环境怎样变化的?反复运行此程序看会有什

4、么情况?解释一下。答:子进程运行其他程序后,这个进程就完全被新程序代替。由于并没有产生新进程所以进程标识号不改变,除此之外的旧进程的其他信息,代码段,数据段,栈段等均被新程序的信息所代替。新程序从自己的main函数开始进行。反复运行此程序发现结束的先后次序是不可预知的,每次运行结果不一样。原因是当每个子进程运行其他程序时,他们的结束随着其他程序的结束而结束,所以结束的先后次序在改变。实验5:编写程序。验证子进程继承父进程的程序、数据等资源。如用父、子进程修改公共变量和私有变量的处理结果;父、子进程的程序区和数据区的位置。结果:思考:子进程被创建后,对父进程的运行环境有影响吗?解释一下。答:子进

5、程被创建后,对父进程的运行环境无影响,因为当子进程在运行时,他有自己的代码段和数据段,这些都可以作修改,但是父进程的代码段和数据段是不会随着子进程数据段和代码段的改变而改变。实验6:复习管道通信概念,编写一个程序。父进程创建两个子进程,父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息,体现通信效果。结果:思考:什么是管道?进程如何利用它进行通信的?解释一下实现方法。修改睡眠时机、睡眠长度,看看会有什么变化。请解释。加锁、解锁起什么作用?不用它行吗?答1:管道:是指能够连接一个写进程和一个读进程、并允许它们以生产者-消费者方式进行通信的一个共享文件,又称为pipe文件。由于写进程

6、从管道的入端将数据写入管道,而读进程则从管道的出端读出数据。进程利用管道进行通信:将索引结点中的直接地址项作为一个循环队列来管理,为它设置一个读指针,一个写指针,按先进先出的顺序读写。在该例中,利用fd2这个数组来确定读写替换。执行进程1时,lockf使得管道写入端加锁,这样就可以进行写入了,write; /*信息写入管道*/ lockf; /*管道写入端解锁*/这样其他进程就能继续进行读写操作了。然后执行进程2的写入,过程同上。最后父进程的进行读,read。读写之间、写和写之间也是互斥的,多以会加锁。答2: 修改1号子进程的睡眠时间长度修改为20s后,等待了较长时间,然后出现了下面的结果:2

7、号子进程先执行了,然后父进程执行。原因应该是:父进程进行wait等待子进程,由于2号子进程的睡眠时间短,于是就先执行完了2号子进程的内容,然后才第二次wait时才执行1号子进程,最后父进程结尾。答3:加锁解锁的作用:为了使得读、写进程能够互斥的访问pipe文件,每逢继承访问pipe文件前,都需检查该索引节点是否已经上锁,若已经锁住,进程便睡眠等待;否则,将索引节点上锁,然后再进行读、写操作,操作结束后又将该索引节点解锁,并唤醒因该节点上锁而睡眠的进程。这样就能实现了读、写之间的互斥操作,每次只能有一个进程进行访问pipe文件。实验7:编程验证:实现父子进程通过管道进行通信。进一步编程,验证子进

8、程结束,由父进程执行撤消进程的操作。测试父进程先于子进程结束时,系统如何处理孤儿进程的。只要在父进程后加上wait函数,然后打印子进程已经结束,一旦子进程结束,父进程撤销进程。当父进程先于子进程终止时.所有子进程的父进程改变为init进程称为进程由init进程领养。实验8:编写两个程序,一个是服务者程序,一个是客户程序。执行两个进程之间通过消息机制通信。消息标识MSGKEY 可用常量定义,以便双方都可以利用。客户将自己的进程标识pid通过消息机制发送给服务者进程。服务者进程收到消息后,将自己的进程号和父进程号发送给客户,然后返回。客户收到后显示服务者的pid 和ppid,结束。结果:思考:想一

9、下服务者程序和客户程序的通信还有什么方法可以实现?解释一下你的设想,有兴趣试一试吗。答:还可以通过管道操作。或者用信号量机制来实现。信号量是一个整形计数器,用来控制多个进程对共享资源的访问。或者通过消息队列信号机制,通过向消息队列发送信息、接收信息来实现进程间的通信。实验9:编程实现软中断信号通信。父进程设定软中断信号处理程序,向子进程发软中断信号。子进程收到信号后执行相应处理程序。结果:思考:这就是软中断信号处理,有点儿明白了吧?讨论一下它与硬中断有什么区别?看来还挺管用,好好利用它。答:软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的。软中断是由程序调用发生的,而硬中断是由外设引

10、发的。实验10:用信号量机制编写一个解决生产者消费者问题的程序。研究并讨论:1. 讨论Linux 系统进程运行的机制和特点,系统通过什么来管理进程?系统通过进程控制块PCB来管理进程。PCB主要分为四部分:1进程表项,2U区,3系统区表,4进程区表。2.C语言中是如何使用Linux 提供的功能的?用程序及运行结果举例说明。Linux 系统的一种用户接口是程序员用的编程接口,即系统调用。系统调用的目的是使用户可以使用操作系统提供的有关进程控制、文件系统、输入输出系统、设备管理、通信及存储管理等方面的功能,而不必涉及系统内部结构和硬件细节,大大减少用户程序设计和编程难度。Linux 的系统调用以标

11、准实用子程序形式提供给用户在编程中使用。一般使用系统调用应注意以下三点:1函数所在的头文件2函数调用格式,包括参数格式、类型。3返回值格式、类型。例如:程序:在该程序中调用了系统程序date.#include mainexeclpdate,date,0;return;结果如下:3.什么是进程?如何产生的?举例说明。答: 进程实体是程序段、相关的数据段和PCB三部分构成的实体。进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。进程的产生:进程是由创建而产生的,即使进程实体运行时而产生的。例如:父进程通过fork程序创建一个子进程。4.进程控制如何实现的?举例说明。答:进程控制一般

12、由OS的内核中的原语来实现的。例如:用完了I/O设备的进程调用原语weakup,将等待该事件的进程唤醒。5.进程通信方式各有什么特点?用程序及运行结果举例说明。答:通信方式有:1共享存储器系统:相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。2消息传递系统:源程序可以直接或间接地将消息传送给目标进程。3管道通信系统:能够连接一个写进程和一个读进程、并允许它们以生产者-消费者方式 进行通信的一个共享文件,又称为pipe文件。由于写进程从管道的入端将数据写入管道,而读进程则从管道的出端读出数据。6.管道通信如何实现?该通信方式可以用在何处?答:实现:1互斥,即当一个进

13、程正在对pipe执行读/写操作时其它进程必须等待;2同步,指当写输入进程把一定数量的数据写入pipe时,便去睡眠等待,知道读输出进程取走数据后,再把它唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后,才将之唤醒;3确定对方是否存在,只有确定了对方已存在时,才能进行通信。用法:用于链接一个读进程和一个写进程以实现它们之间的通信的一个共享文件。7.什么是软中断?软中断信号通信如何实现?答:每个信号读对应一个正整数常量,代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某一场时间。每个进程在运行时,都要通过信号量机制来检查是否有信号到达。若有,便中断正在执

14、行的程序,转向与该信号对应的处理程序,以完成对该事件的处理,处理结束后再返回到原来的断电继续执行。实质上,信号机制是对中断机制的一种模拟。体会:在本次实验中,我利用Linux提供的系统调用设计程序,加深了对进程概念的理解,也体会到了系统进程调度的方法和效果,还了解了进程之间的通信方式以及各种通信方式的使用。虽然在实验的过程中遇到很多困难,但是还好有张涛老师的悉心指点和网上资料的帮助,使我能渡过难关,圆满完成本次实验,在此也向他们说一声感谢。附录:源程序1、#include #include #include #include int mainprintfprocess id:%dn,getpi

15、d;printfprocess group id:%dn,getpgrp;printfcalling processs real user id = %dn,getuid;sleep;int child_pid;child_pid = fork;ifexit;wait;printf;char x;scanf;ifexit;return 0;2、#include #include #include #include int main int i; if fork i = wait; printf; printf; else printf; sleep; exit;3、#include #incl

16、ude #include #include int main int i,j; printfMy pid is %d, my fathers pid is %dn,getpid ,getppid; fori=0; i iffork=0 printf%d pid=%d ppid=%dn, i,getpid,getppid; else j=wait; printf%d:The chile %d is finished.n,getpid,j; 4、#include #include #include #include int main int child_pid1,child_pid2,child_

17、pid3; int pid,status; setbuf; child_pid1=fork; if execlpecho,echo,child process 1,0; perror; exit; child_pid2=fork; if execlpdate,date,0; perror; exit; child_pid3=fork; if execlpls,ls,0; perror; exit; puts; whilepid=wait!=-1 if printfchild process 1 terminated with status %dn,8; else if printfchild

18、process 2 terminated with status %dn,8; else if printfchild process 3 terminated with status %dn ,8; puts; puts; exit;5、#include #include #include #includeint globa=4;int main pid_t pid; int vari=5; printf; if pid=fork printf; exit; else if globa+; vari-; printfChild %d changed the vari and globa.n,

19、getpid; else printfParent %d did not changed the vari and globa.n,getpid; printfpid=%d, globa=%d, vari=%dn,getpid,globa,vari; exit;6、#include #include #include #include #include int main int i,r,j,k,l,p1,p2,fd2; char buf50,s50; pipe; whilep1=fork=-1; if lockf; sprintf; printf; write; lockf; sleep; j

20、=getpid; k=getppid; printf; exit; else whilep2=fork=-1; if lockf; sprintf; printf; write; lockf; sleep; j=getpid; k=getppid; printf; exit; else l=getpid; wait; ifr=read=-1 printf; else printf; wait; ifr=read=-1 printf; else printf; exit; 7、8、服务器程序:#include #include #include #include #include #includ

21、e#include#define MSGKEY 75struct msgform long mtype; char mtext256;msg;int msgqid;int main int i,pid,* pint; extern cleanup; fori=0;i signal; msgqid=msgget; for msgrcv; pint=msg.mtext; pid=*pint; printf; msg.mtype=pid; *pint=getpid; msgsndmsgqid,&msg,sizeof,0; cleanup msgctl; exit;客户端程序:#include #in

22、clude #include #include #include #include#include#define MSGKEY 75struct msgform long mtype; char mtext256;int main struct msgform msg; int msgqid,pid,*pint; msgqid=msgget; pid=getpid; pint=msg.mtext; *pint=pid; msg.mtype=1; msgsndmsgqid,&msg,sizeof,0; msgrcv; printf;9、#include #include #include #in

23、clude #include #include#include#define MSGKEY 75int main int i,j,k; int func; signal18,func; ifi=fork j=kill; printf; k=wait; printfAfter wait %d,Parent %d: finished.n,k,getpid; else sleep; printfChild %d: A signal from my parent is recived.n,getpid; func int m; m=getpid; printf;10、#include #include

24、 #include #include #include #include #define N 5 / 消费者或者生产者的数目 #define M 10 / 缓冲数目int in = 0; / 生产者放置产品的位置 int out = 0; / 消费者取产品的位置 int buffM = 0 ; / 缓冲初始化为0,开始时没有产品 sem_t empty_sem; / 同步信号量,当满了时阻止生产者放产品 sem_t full_sem; / 同步信号量,当没产品时阻止消费者消费 pthread_mutex_t mutex; / 互斥信号量,一次只有一个线程访问缓冲 int product_id = 0; /生产者id int prochase_id = 0; /消费者id/信号处理函数 void Handlesignal printf; exit; /* 打印缓冲情况 */ void print inti; printf; fori = 0; i printf; printf; /* 生产者方法 */ void *product int id = +p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论