信号机制实现最新操作系统原理课程设计汇编.docx
《信号机制实现最新操作系统原理课程设计汇编.docx》由会员分享,可在线阅读,更多相关《信号机制实现最新操作系统原理课程设计汇编.docx(14页珍藏版)》请在冰豆网上搜索。
信号机制实现最新操作系统原理课程设计汇编
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2007年秋季学期
操作系统原理课程设计
题目:
信号机制实现
专业班级:
计通基地班
姓名:
学号:
指导教师:
成绩:
_______________
目录
摘要3
正文6
1.设计思想6
2.算法用到的主要数据结构8
3.相关的各模块的伪码算法9
4.调试分析和测试结果10
5.源程序11
总结14
参考文献15
致谢15
摘要
操作系统被建立在用户和系统硬件之间,接受用户命令,从而组织硬件完成相应功能,以满足用户要求。
进程是操作系统上程序的执行过程。
程序通过进程得以执行。
然而,程序并不是孤立的,复杂的问题,可以使用不同程序去解决,即不同的进程去协作完成。
由此产生了进程通信的概念。
信号机制作为进程通信的一个基本方法,在进程通信中占有重要地位。
虽然其机制有些陈旧,但在操作系统中仍然起着不可替代的作用,又被称为软中断.
在本程序中,父进程创建两个子进程,再用kill()向两个子进发出中断信号,子进程P1和P2接到信号后,用exit(0)函数正常终止自我进程(向父进程发SIGINT信号)。
父进程的wait()函数收到子进程的SIGINT信号后,对子进程作适当处理后(资源回收)后返回本进程。
因为父进程有两个子进程,所以需要两个wait()函数来等待子进程的结束。
关键字
信号,软中断,父进程,子进程,stop(),waiting(),fork(),signal(),exit()
前言
1.信号的基本概念
每个信号都对应一个正整数常量(称为signalnumber,即信号编号。
定义在系统头文件中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。
每个进程在运行时都要通过信号机制来检查是否有信号到达。
若有,便中断正在执行的程序,转向与该信号相对应的处理程序,以完成对该事件的处理;处理结束后再返回到原来的断点继续执行。
实质上,信号机制是对中断机制的一种模拟,故在早期的UNIX版本中又把它称为软中断。
信号与中断的相似点:
(1)采用了相同的异步通信方式;
(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
(3)都在处理完毕后返回到原来的断点;
(4)对信号或中断都可进行屏蔽。
信号与中断的区别:
(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;
(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。
信号机制具有以下三方面的功能:
(1)发送信号的程序用系统调用kill()实现;
(2)接收信号的程序用signal()来实现对处理方式的预置;
(3)收受信号的进程按事先的规定完成对相应事件的处理。
2.信号的发送
信号的发送,是指由发送进程把信号送到指定进程的信号域的某一位上。
如果目标进程正在一个可被中断的优先级上睡眠,核心便将它唤醒,发送进程就此结束。
一个进程可能在其信号域中有多个位被置位,代表有多种类型的信号到达,但对于一类信号,进程却只能记住其中的某一个。
进程用kill()向一个进程或一组进程发送一个信号。
在本程序中,使用16SIGUSR1用户自定义信号1和17SIGUSR2用户自定义信号2分别向子进程1、2发送信号。
即kill(p1,16)和kill(p2,17)。
3.对信号的处理
当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断。
当进程处于核心态时,即使收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号。
对软中断信号的处理分三种情况进行:
(1)如果进程收到的软中断是一个已决定要忽略的信号(function=1),进程不做任何处理便立即返回;
(2)进程收到软中断后便退出(function=0);
(3)执行用户设置的软中断处理程序。
正文
1.设计思想
学生通过该题目的设计过程,可以掌握信号的发送与接收的原理、软件开发方法并提高解决实际问题的能力。
使用系统调用kill(),wait(),signal(),及fork()编制一个通过信号完成进程通信,在接受信号后进程完成相应功能的程序。
<程序设计>
(1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,使用信号”SIGINT”进行通信。
(2)程序运行产生父进程使用signal()捕捉信号Ctrl+C(即^C)然后用kill()向子进程发送SIGINT并使用wait()等待子进程结束,然后打印“parentkilled“并退出。
(3)fork()建立两个子进程,等待其父进程发来的消息。
当遇到SIGINT信号时,则作为结束信号,子进程打印:
“childprocess1killedbyparent"
并结束退出。
涉及的系统调用:
1. kill()
向指定进程发送信号。
2. signal()
捕捉信号并在捕捉到相应信号后调用函数。
3.wait()
中断进程执行,等待子进程结束停止等待继续进程的执行。
4.fork( )
创建进程的系统调用。
2.算法用到的主要数据结构(采用类c语言定义)
1、kill()系统调用格式
intkill(pid,sig)
参数定义
intpid,sig;
其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。
(1)pid>0时,核心将信号发送给进程pid。
(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。
(3)pid=-1时,核心将信号像广播般传送给系统内所有进程。
2、signal()
预置对信号的处理方式,允许调用进程控制软中断信号。
系统调用格式
signal(sig,function)
头文件为#include
参数定义
signal(sig,function)
intsig;
void(*function)()
函数说明:
signal()会依参数sig指定的信号编号来设置该信号的处理函数。
当指定信号到达时就会跳转到参数function指定的函数执行。
如果参数function不是函数指针,则必须是下列两个常数之一:
SIG_IGN忽略参数sig指定的信号
SIG_DFL将参数sig指定的信号重设为核心预设的信号处理方式。
其中sig用于指定信号的类型,sig为0则表示没有收到任何信号,其中SIGINT(值是02)表示中断,当用户从键盘按^c键或^break键时,则会产生此信号。
function:
该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGKILL,SIGTRAP和SIGPWR以外的信号,核心自动地重新设置软中断信号处理程序的值为SIG_DFL,一个进程不能捕获SIGKILL信号。
function的解释如下:
(1)function=1时,进程对sig类信号不予理睬,亦即屏蔽了该类信号;
(2)function=0时,缺省值,进程在收到sig信号后应终止自己;
(3)function为非0,非1类整数时,function的值即作为信号处理程序的指针。
3、wait()
等待子进程运行结束。
如果子进程没有完成,父进程一直等待。
wait()将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。
如果在wait()前已有子进程暂停或终止,则调用进程做适当处理后便返回。
系统调用格式:
intwait(status)
int*status;
其中,status是用户空间的地址。
它的低8位反应子进程状态,为0表示子进程正常结束,非0则表示出现了各种各样的问题;高8位则带回了exit()的返回值。
exit()返回值由系统给出。
核心对wait()作以下处理:
(1)首先查找调用进程是否有子进程,若无,则返回出错码;
(2)若找到一处于“僵死状态”的子进程,则将子进程的执行时间加到父进程的执行时间上,并释放子进程的进程表项;
(3)若未找到处于“僵死状态”的子进程,则调用进程便在可被中断的优先级上睡眠,等待其子进程发来软中断信号时被唤醒。
4、exit()终止进程的执行。
系统调用格式:
voidexit(status)
intstatus;
其中,status是返回给父进程的一个整数,以备查考。
为了及时回收进程所占用的资源并减少父进程的干预,UNIX/LINUX利用exit()来实现进程的自我终止,通常父进程在创建子进程时,应在进程的末尾安排一条exit(),使子进程自我终止。
exit(0)表示进程正常终止,exit
(1)表示进程运行有错,异常终止。
如果调用进程在执行exit()时,其父进程正在等待它的终止,则父进程可立即得到其返回的整数。
核心须为exit()完成以下操作:
(1)关闭软中断
(2)回收资源
(3)写记帐信息
(4)置进程为“僵死状态”
5、lockf()用作锁定文件的某些段或整个文件。
系统调用格式:
intlockf(feles,function,size)
intfiles,function;
longsize;
其中,files是文件描述符;function是锁定和解锁,1表示锁定,0表示解锁;size是锁定和解锁的字节数,若用0,表示从文件的当前位置到文件尾。
6、fork()函数用于创建一个新进程(子进程)。
其调用格式为:
Intfork();
其中返回int取值意义如下:
正确返回:
等于0,创建子进程,从子进程返回ID值。
错误返回:
等于-1,创建失败。
3.相关的各模块的伪码算法
1)创建子进程1和2并它们接受软中断信号
main()
{
intp1,p2;
if(p1=fork())/*创建子进程p1*/
{
if(p2=fork())/*创建子进程p2*/
{
wait_mark=1;
signal(SIGINT,stop);/*接收到^c信号,转stop*/
waiting();
kill(p1,02);/*向p1发软中断信号02*/
kill(p2,02);/*向p2发软中断信号02*/
wait(0);/*等待子进程1结束的信号*/
wait(0);/*等待子进程2结束的信号*/
printf("parentprocessiskilled!
\n");
exit(0);/*父进程结束*/
}
else
{
wait_mark=1;
signal(SIGINT,stop);/*等待进程2被杀死的中断号02*/
waiting();
lockf(1,0,0);
printf("childprocess2iskilledbyparent!
\n");
lockf(1,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(SIGINT,stop);/*等待进程1被杀死的中断号02*/
waiting();
lockf(1,0,0);
printf("childprocess1iskilledbyparent!
\n");
lockf(1,0,0);
exit(0);
}
}
2)定义waiting()函数
voidwaiting()
{
while(wait_matk!
=0);
}
3)定义stop()函数
voidstop()
{
while(wait_mark=0);
}
4.调试分析和测试结果
父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
childprocess1iskilledbyparent!
childprocess2iskilledbyparent!
parentprocessiskilled!
5、源程序(带注释):
4.#include
5.#include
6.#include
7.#include
8.intwaite;
9.voidstop()
10.{
11.waite=0;
12.}
13.staticvoidwaiting()
14.{
15.while(waite==1);
16.}
17.main()
18.{
19.intp1,p2;
20.while((p1=fork())==-1);/*创建子进程p1*/
21.if(p1>0)
22.{
23.printf("Child1iscreate!
\n");
24.while((p2=fork())==-1);/*创建子进程p2*/
25.if(p2>0)
26.{
27.printf("Child2iscreate!
\n");
28.printf("Pleasepress'ctrl+C'\n");
29.waite=1;
30.signal(SIGINT,stop);/*接收到^c信号转stop*/
31.waiting();
32.kill(p1,16);/*向p1发软中断信号16*/
33.kill(p2,17);/*向p2发软中断信号17*/
34.wait(0);/*同步*/
35.wait(0);/*同步*/
36.printf("\nParentprocessiskilled!
\n");
37.exit(0);
38.}
39.else
40.{
41.waite=1;
42.signal(SIGINT,stop);
43.waiting();
44.printf("\nChildprocess2iskilledbyparent!
\n");
45.exit(0);
46.}
47.}
48.else
49.{
50.waite=1;
51.signal(SIGINT,stop);
52.waiting();
53.printf("\nChildprocess1iskilledbyparent!
\n");
54.exit(0);
55.}
56.}
总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.
在这两周的操作系统课程设计中,我感受很深,使我明白只有彻底掌握知识才能把理论和知识牢固结合起来。
由于以前没有接触过UNIX/LINUX,也不知道如何使用vi编辑器,所以在调程序的时候翻阅了大量的资料。
虽然很辛苦,但是可以学到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
另外,我还体会到深刻理解操作系统的重要性。
只有真正了解信号机制的原理,才能编好这次的文件系统实验。
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.
2.王清,李光明.《计算机操作系统》.冶金工业出版社.
3.孙钟秀等.操作系统教程.高等教育出版社
4.曾明. Linux操作系统应用教程.陕西科学技术出版社.
5.张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.
6.孟静, 操作系统教程--原理和实例分析.高等教育出版社
7.周长林,计算机操作系统教程.高等教育出版社
8.张尧学,计算机操作系统教程,清华大学出版社
9.任满杰,操作系统原理实用教程,电子工业出版社
10.王旭阳操作系统原理,国防工业出版社
致谢
这次课程设计培养了我耐心、慎密、全面地考虑问题的能力,从而加快了问题解决的速度、提高了个人的工作效率,以及锻炼围绕问题在短时间内得以解决的顽强意志。
在编写程序的过程中,我得到了王旭阳老师的指导以及孜孜不倦的教诲,在老师的指导下,我的能力得到了提高,同时养成了科学、严谨的作风和习惯。
为此我要感谢计通学院开设了这门操作系统课程设计,为我们提供了进一步学习算法、操作系统和巩固C语言程序计设这个平台并对各位老师的精心栽培表示衷心的感谢。
同时还要感谢对同一题目进行攻关的同学们给予的帮助,没他们的帮助可能有很多问题我个人不能进行很好的解决。
在此我对他们帮助给予衷心的感谢。