北邮操作系统进程管理实验报告及源代码.docx_第1页
北邮操作系统进程管理实验报告及源代码.docx_第2页
北邮操作系统进程管理实验报告及源代码.docx_第3页
北邮操作系统进程管理实验报告及源代码.docx_第4页
北邮操作系统进程管理实验报告及源代码.docx_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

进程管理实验报告1实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象,学习解决进程互斥的方法;(4)了解Linux系统中进程通信的基本原理。2实验预备内容(1)阅读Linux的sched.h源码文件,加深对进程管理概念的理解;(2)阅读Linux的fork()源码文件,分析进程的创建过程。3、环境说明 本次实验使用的是win7下的VMWare workstation虚拟机,安装了ubuntu系统 在ubuntu系统下使用code:blocks IDE编写代码并执行程序的4、实验内容:1、进程的创建:(1)实验题目和要求:编写一段程序,使用系统调用fork() 创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。(2)程序设计说明:参照书上的例子进行设计,详见源代码 (3)程序运行结果截图:(4)程序分析:a,b,c随机出现,因为父进程与两个子进程之间并没有同步措施,所以a,b,c随机打印出来,也就是三个进程的活动次序是随机进行的,不同的系统可能有不同的进程调度方式。(5)源程序:#include#include#includeint main() pid_t pid1,pid2; if(pid1=fork()0) printf(Fork Failed.n); exit(-1); else if(pid1=fork()=0) printf(bn); else if(pid2=fork()0) printf(Fork Failed.n); exit(-1); else if(pid2=fork()=0) printf(cn); else wait(NULL); printf(an); exit(0); return 0;2、进程的控制:要求一:(1)实验题目和要求:修改已经编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。(2)程序设计说明:将第一个程序的输出进行修改,把输出一个字符改为一句话,其他不变(3)程序运行结果截图:(4)程序分析:和第一个程序的输出顺序,也就是三个进程活动的次序基本是一致的,同一个进程里输出的字符串不会被中断(5)源程序: #include#include#includeint main() pid_t pid1,pid2; if(pid1=fork()0) printf(Fork Failed.n); exit(-1); else if(pid1=fork()=0) printf(Child process 1 is created!n); else if(pid2=fork()0) printf(Fork Failed.n); exit(-1); else if(pid2=fork()=0) printf(Child process 2 is created!n); else wait(NULL); printf(The parent process is created!n); exit(0); return 0;要求二:(1)实验题目和要求:如果在程序中使用系统调用lockf () 来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。(2)程序设计说明: 在每个进程的每个条件语句中开头加入lockf(1,1,0),结尾处加入lockf(1,0,0),从而实现给每一个进程加锁并且实现进程之间的互斥(3)程序运行结果截图: (4)程序分析:根据输出情况可以看出,每个进程活动的次序都是随机的,但是加锁后进程执行完毕后才会让另一个进程执行而不会中途被打断,因此 lockf(1,1,0)的作用是锁定屏幕输出,不让其他进程可以输出到屏幕,lockf(1,0,0)则是解锁(5)源程序: #include#include#includeint main() pid_t pid1,pid2; int i; if(pid1=fork()0) printf(Fork Failed.n); exit(-1); else if(pid1=fork()=0) lockf(1,1,0); for(i=0;i=2;i+) printf(process A:%dn,i); lockf(1,0,0); else if(pid2=fork()0) printf(Fork Failed.n); exit(-1); else if(pid2=fork()=0) lockf(1,1,0); for(i=0;i=2;i+) printf(process B:%dn,i); lockf(1,0,0); else lockf(1,1,0); for(i=0;i=2;i+) printf(process C:%dn,i); lockf(1,0,0); exit(0); return 0;3、进程的软中断通信:(1)实验题目和要求: 编写一段程序,使其实现进程的软中断通信。(a)要求:使用系统调用fork() 创建两个子进程,再用系统调用signal() 让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill() 向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child Process 1 is killed by Parent!Child Process 2 is killed by Parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent Process is killed!源程序: #include#include#include#include#includeint live;void live_wait() while(live = 1);void be_killed() live = 0;int main() pid_t p1,p2; while(p1=fork() = -1);if(p1 = 0) live = 1; signal(1,be_killed); live_wait(); printf(Child Process 1 is killed by Parent!n); exit(0); else while(p2=fork() = -1); if(p2 = 0) live = 1; signal(2,be_killed); live_wait(); printf(Child Process 2 is killed by Parent!n); exit(0); signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); live = 1; signal(SIGINT,be_killed); live_wait(); kill(p1,1); kill(p2,2); wait(NULL); wait(NULL); printf(Parent Process is killed!n); exit(0); return 0;(b) 在上面的程序中增加语句signal(SIGINT, SIG-IGN) 和 signal(SIGQUIT, SIG-IGN),观察执行结果,并分析原因。(2)程序设计说明: signal(SIGTINT, SIG_IGN)从后台进程读中断信号,signal(SIGQUIT, SIG_IGN)程序终止信号(3)程序运行结果截图: (4)程序分析:用系统调用signal() 让父进程捕捉键盘上来的中断信号ctrl+c(a)没有添加signal(SIGINT,SIG_IGN)时可以看出程序运行在子进程1中,当按下ctrl+c后子进程1被直接杀死,而不是由父进程的kill杀死,没有打印语句Child Process 1 is killed by Parent!。但是子进程2是被父进程杀死故打印语句:Child Process 2 is killed by Parent!。(b)在两个子进程中添加了signal(SIGINT,SIG_IGN),这样使得两个子进程不被ctrl+c杀死而由父进程杀死。所以从实验截图中可以看出,两个子进程均被父进程杀死故打印语句Child Process 1 is killed by Parent!和Child Process 2 is killed by Parent!(5)源程序:#include #include int wait_mark; void waiting() while(wait_mark=1); void stop() wait_mark=0; int main() int p1,p2; while(p1=fork()=-1); if(p1=0) wait_mark=1; signal(SIGINT,SIG_IGN); signal(16,stop); waiting(); printf(Child Process1 is Killed by Parent!n); exit(0); else while(p2=fork()=-1); if(p2=0) wait_mark=1; signal(SIGINT,SIG_IGN); signal(17,stop); waiting(); printf(Child Process2 is Killed by Parent!n); exit(0); else wait_mark=1; signal(SIGINT,stop); waiting(); kill(p1,16); kill(p2,17); wait(0); wait(0); printf(Parent Process is Killed!n); exit(0); 4、进程的管道通信:(1) 实验题目和要求: 编制一段程序,实现进程的管道通信。使用系统调用pipe() 建立一条管道线;两个子进程P1和P2分别向管道各写一句话:Child 1 is sending a message!Child 2 is sending a message!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。(2) 程序设计说明:使用系统调用pipe()建立一条管道线,并且对管道加锁,从而形成独占,避免冲突产生。而父进程用之前的wait()函数等待两个子进程执行后再执行。(3) 程序运行结果截图: (4) 程序分析:管道通信通过系统调用pipe()初始化一个二元组为管道,1出0进。(5) 源程序:#include #include #include int pid1,pid2; int main() int fd2; char OutPipe100, InPipe100; pipe(fd); while(pid1 = fork() = -1); if( pid1 = 0) lockf( fd1, 1, 0 ); sprintf(OutPipe, n Child process 1 is sending message!n); write( fd1, OutPipe, 50); sleep(5); lockf(fd1, 0 , 0); exit(0); else while(pid2 = fork() = -1); if( pid2 = 0) lockf( fd1, 1, 0 ); sprintf(OutPipe, n Child process 2 is sending message!n); write( fd1, OutPipe, 50); sleep(3); lockf(fd1, 0 , 0); exit(0); else wait(0); read(fd0, InPipe, 50); printf(%sn, InPipe); wait(0); read(fd0, InPipe, 50); printf(%sn, InPipe); exit(0); return 0;4思考(部分参考网上资料)(1)系统是怎样创建流程的?linux 系统创建进程是用 fork() 系统调用创建子进程由 fork() 系统调用创建的新进程被称为子进程。该函数被调用一次,但返回两次。如果 fork()进程调用成功,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程号(2)可执行文件加载时进行了哪些处理? 相对可执行文件有三个重要的概念:编译(compile)、连接(link,也可称为链接、联接)、加载(load)。源程序文件被编译成目标文件,多个目标文件被连接成一个最终的可执行文件,可执行文件被加载到内存中运行。当操作系统装载一个可执行文件的时候,首先操作系统判断该文件是否是一个合法的可执行文件。如果是操作系统将按照段表中的指示为可执行程序分配地址空间。(3)当首次调用新创建进程时,其入口在哪里?fork系统调用创建的子进程继承了原进程的context,也就是说fork调用成功后,子进程与父进程并发执行相同的代码。但由于子进程也继承了父进程的程序指针,所以子进程是从fork()后的语句开始执行(也就是新进程调用的入口)。另外fork在子进程和父进程中的返回值是不同的。在父进程中返回子进程的PID,而在子进程中返回0。所以可以在程序中检查PID的值,使父进程和子进程执行不同的分支。(4)进程通信有什么特点?管道(Pipe)及有名管道(named pipe):管道可

温馨提示

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

评论

0/150

提交评论