级操作系统实验报告.docx
《级操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《级操作系统实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
级操作系统实验报告
哈尔滨学院
实验报告
课程名称:
计算机操作系统
专业:
软件工程
班级:
12-8
学号:
12031801
姓名:
常燕如
教务处制
实验一进程管理
【实验目的与要求】
⒈加深对进程概念的理解,明确进程与程序的区别。
⒉掌握Linux进程创建及撤销的方法,进一步认识并发执行的实质。
⒊掌握Linux系统下守护进程的创建方法。
【实验原理】
⒈Linux进程管理命令
⑴进程查看
⑵进程终止
⑶进程优先级设置
⒉Linux进程控制函数
⑴创建和修改进程
⑵设置进程属性
⑶获取进程属性
⑷进程的退出
⒊Linux守护进程
⑴独立启动守护进程
⑵超级守护进程
⑶守护进程的编写流程
守护进程的编写遵循特定的流程,主要包括五个步骤:
Step⒈创建子进程,退出父进程
Step⒉在子进程中创建新会话
Step⒊改变当前目录为根目录
Step⒋重设文件权限掩码
Step⒌关闭文件描述符
【实验主要仪器与材料】
⒈带Linux操作系统的PC机
⒉GCC编译器
【实验内容】
⒈获取进程信息
通过管理命令,获取系统当前执行进程的信息,包括进程名称与ID、PID和PGID等。
⒉创建进程
编程程序,实现父进程创建一个子进程,返回后父子进程都分别循环输出字符串“Iamparent.”或“Iamchild.”5次,每输出一次延时1秒(sleep
(1)),然后进入下一次循环。
观察并分析运行结果。
然后将程序改为父子进程同步执行:
子进程循环输出字符串“Iamchild.”5次,然后父进程再循环输出字符串“Iamparent.”5次。
再次观察并分析运行结果。
【实验步骤及实验结果分析】
⒈实验内容1
通过进程实现及验证父进程及子进程的id号的命令
ps-lg
⒉实验内容2
⑴实现父进程创建一个子进程,返回后父子进程都分别循环输出字符串“Iamparent.”或“Iamchild.”5次,每输出一次延时1秒(sleep
(1)),然后进入下一次循环。
#include
#include
#include
intmain()
{
pid_tpt;
printf("Helloworld!
\n");
inti;
pt=fork();
for(i=0;i<5;i++)
{
if(pt==-1)
printf("Forkerror.\n");
elseif{
printf("Iamaparent.\n");
Sleep
(1);
}
else{
printf("Iamachild.\n");
Sleep
(1);
}
}
return0;
}
⑵父子进程同步执行:
子进程循环输出字符串“Iamchild.”5次,然后父进程再循环输出字符串“Iamparent.”5次。
#include
#include
#include
intmain()
{
pid_tpt;
printf("Helloworld!
\n");
inti;
pt=fork();
for(i=0;i<5;i++)
{
if(pt==-1)
printf("Forkerror.\n");
elseif{
printf("Iamaparent.\n");
}
else{
printf("Iamachild.\n");
}
}
return0;
}
【思考题】
⒈程序和进程的区别。
(1)程序是动态的,程序是静态的:
程序是有序代码的集合;进程是程序的执行。
通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和可以复制。
(2)进程是暂时的,程序是永久的:
进程是一个状态变化的过程,程序可长久保存。
(3)进程和程序的组成不同:
进程的组成包括程序、数据和进程控制块(即进程状态信息)。
(4)进程和程序的对应关系:
通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
⒉Linux操作系统下有哪些进程类型。
交互进程;批处理进程;守护进程;
⒊进程创建函数fork和vfork的区别。
(1)fork()用于创建一个新进程。
由fork()创建的子进程是父进程的副本。
即子进程获取父进程数据空间,堆和栈的副本。
父子进程之间不共享这些存储空间的部分。
而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit)于是也就不会存放该地址空间。
相反,在子进程调用exec或exit之前,它在父进程的空间进行。
(2)vfork()与fork()另一个区别就是:
vfork保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。
(3)vfork和fork之间的还有一个区别是:
vfork保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。
如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
⒋进程的退出函数有哪些?
有何区别?
C程序是如何被启动终止的?
exit函数;return函数;abort函数_exit函数。
exit和_exit函数用于正常终止一个程序
exit先执行一些清除处理.然后进入内核清除操作包括调用执行各终止处理程序,关闭所有标准I/O流
_exit立即进入内核
abort函数用于异常终止一个程序
exit是一个函数,有参数,把控制权交给系统
return是函数执行完后的返回,将控制权交给调用函数
实验二进程通信
【实验目的与要求】
⒈了解基于信号的进程通信机制。
⒉熟悉LINUX系统中进程之间软中断通信的基本原理。
【实验原理】
一、信号
⒈信号的基本概念
⒉信号的发送
⒊对信号的处理
二、所涉及的中断调用
⒈kill()
⒉signal()
⒊wait()
⒋waitpid()
⒌lockf()
【实验主要仪器与材料】
⒈带Linux操作系统的PC机
⒉GCC编译器
【实验内容】
⒈编写程序:
用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Childprocess1iskilledbyparent!
Childprocess2iskilledbyparent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parentprocessiskilled!
⒉分析利用软中断通信实现进程同步的机理。
【实验步骤及实验结果分析】
⒈编写程序:
用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Childprocess1iskilledbyparent!
Childprocess2iskilledbyparent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parentprocessiskilled!
⒉对软中断信号的处理分三种情况进行:
(1)如果进程收到的软中断是一个已决定要忽略的信号,不做处理便立即返回。
(2)进程收到软中断后便退出。
(3)执行用户设置的软中断处理程序。
【思考题】
实验内容的参考程序如下,请仔细阅读、调试、分析,回答下述问题:
#include
#include
#include
#include
#include
voidwaiting(),stop();
intwait_mark;
intmain()
{
intp1,p2,stdout=1;
while((p1=fork())==-1);/*创建子进程p1*/
if(p1>0)
{
while((p2=fork())==-1);/*创建子进程p2*/
if(p2>0)
{
wait_mark=1;
signal(SIGINT,stop);/*接收到^c信号,转stop*/
waiting();
kill(p1,16);/*向p1发软中断信号16*/
kill(p2,17);/*向p2发软中断信号17*/
wait(0);/*同步*/
wait(0);
printf("Parentprocessiskilled!
\n");
exit(0);
}
else
{
wait_mark=1;
signal(17,stop);/*接收到软中断信号17,转stop*/
waiting();
lockf(stdout,1,0);
printf("Childprocess2iskilledbyparent!
\n");
lockf(stdout,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(16,stop);/*接收到软中断信号16,转stop*/
waiting();
lockf(stdout,1,0);
printf("Childprocess1iskilledbyparent!
\n");
lockf(stdout,0,0);
exit(0);
}
return0;
}
voidwaiting()
{
while(wait_mark!
=0);
}
voidstop()
{
wait_mark=0;
}
⒈参考程序段前面部分用了两个wait(0),它们起什么作用?
作用:
wait(0)函数作用是等待子进程结束,父进程有两个子进程,所以两个wait函数。
⒉参考程序段中每个进程退出时都用了语句exit(0),为什么?
作用:
是为了让子进程正常自我终止,正常退出。
⒊参考程序的运行结果是什么?
Parentprocessiskilled!
⒋参考程序是否符合实验要求?
为什么?
不符合。
原因:
p1,p2都会捕捉中断信号。
对于父进程,当它捕捉到中断信号时就会转向指定的函数stop();函数,之后父进程被唤醒,从被中断处继续执行。
对于子进程,由于没有给它们指定的收到中断信号后的动作,就会执行默认的动作,结束自己。
所以当我们发出中断信号后,父进程按预计的方式正常执行,而p1,p2自己结束了自己,所以不会有预计的结果。
⒌参考程序该如何修改才能得到正确结果?
第一种方法:
在fork()语句创建