- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北方工业大学《计算机操作系统》实验报告——进程管理
实 验 报 告 书
学 生 姓 名
学 号
班 级
2012 — 2013 学年 第 一 学期
《计算机操作系统》实验报告 实验名称 进程管理 实验序号 1 实验日期 2012年12月 实验人 一、实验目的和要求
加深对进程概念的理解,明确进程和程序的区别
进一步认识并发执行的实质
分析进程争用资源的现象,学习解决进程互斥的方法
了解Linux系统中进程通信的基本原理 二、相关背景知识
1.初步了解了进程的并发执行,互斥,同步等相关理论知识;
2.明白父进程如何通过fork()函数创建子进程,pipe()函数创建管道,以及跟实验有关的lock(),signal(),exit(),wait(),kill()等函数的调用过程;
3.知道如何使用UNIX/Linux系统自带的功能强大的可视化的编辑器Vi。 三、实验内容
进程的创建
进程的控制
进程的软中断通信
进程的管道通信 四、关键数据结构与函数的说明
fork( ):创建一个新进程
返回值的意义:0:创建子进程,从子进程返回;0:从父进程返回,返回值为子进程的进程标识符;-1:创建失败。如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(pare的副本,称为子进程。lockf(files,mode,size):用于锁定文件的某些段或者整个文件
files是文件描述符;mode是锁定和解锁:1表示锁定,0表示解锁.size是锁定或解锁的字节数,为0,表示从文件的当前位置到文件尾.。
signal(int signum,void(* handler)(int)):signal()会依参数signum 指定的信号编号来设置该信 号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。kill(pid_t pid,int sig),可以用来送参数sig指定的信号给参数pid指定的进程Child process 1 is killed by parent!
Child process 2 is killed by parent!
父进程等待两个子进程终止后输出:
Parent process is killed!
4.进程的管道通信
使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道各写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
而父进程则从管道中读出来自于两个子进程的信息,先接收P1发来的消息,然后再接收P2发来的消息,显示在屏幕上。
六、实验结果与分析
1.进程的创建从进程执行并发来看,输出。fork()创建进程所需的时间多于输出一个字符的时间,父进程与子进程的输出内容会叠加在一输出次序带有随机性。:由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。因为lockf(1,1,0)lockf(1,0,0)解锁标准输出设备,在lockf(1,1,0)与lockf(1,0,0)中间的for循环输出不会被中断,加锁与不加锁效果相同。进程并发执行时的调度顺序和父子进程的抢占处理机问题#include stdio.h
main( )
{
int p1,p2;
while((p1=fork( ))==-1); /*创建子进程p1*/
if (p1==0) putchar(b);
else
{
while((p2=fork( ))==-1); /*创建子进程p2*/
if(p2==0) putchar(c);
else putchar(a);
}
}#include stdio.h
main( )
{
int p1,p2,i;
while((p1=fork( ))==-1); /*创建子进程p1*/
if (p1==0)
{
for(i=0;i10000;i++)
printf(aaa);
}
else
{
while((p2=fork( ))==-1); /*创建子进程p2*/
if(p2==0)
{
for(i=0;i10000;i++)
printf
文档评论(0)