信号机制实现最新操作系统原理课程设计.docx

上传人:b****8 文档编号:9918694 上传时间:2023-02-07 格式:DOCX 页数:14 大小:159.50KB
下载 相关 举报
信号机制实现最新操作系统原理课程设计.docx_第1页
第1页 / 共14页
信号机制实现最新操作系统原理课程设计.docx_第2页
第2页 / 共14页
信号机制实现最新操作系统原理课程设计.docx_第3页
第3页 / 共14页
信号机制实现最新操作系统原理课程设计.docx_第4页
第4页 / 共14页
信号机制实现最新操作系统原理课程设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

信号机制实现最新操作系统原理课程设计.docx

《信号机制实现最新操作系统原理课程设计.docx》由会员分享,可在线阅读,更多相关《信号机制实现最新操作系统原理课程设计.docx(14页珍藏版)》请在冰豆网上搜索。

信号机制实现最新操作系统原理课程设计.docx

信号机制实现最新操作系统原理课程设计

*******************

实践教学

*******************

 

兰州理工大学

计算机与通信学院

2007年秋季学期

 

操作系统原理课程设计

 

题目:

信号机制实现

专业班级:

计通基地班

姓名:

学号:

指导教师:

成绩:

_______________

摘要

操作系统被建立在用户和系统硬件之间,接受用户命令,从而组织硬件完成相应功能,以满足用户要求。

进程是操作系统上程序的执行过程。

程序通过进程得以执行。

然而,程序并不是孤立的,复杂的问题,可以使用不同程序去解决,即不同的进程去协作完成。

由此产生了进程通信的概念。

信号机制作为进程通信的一个基本方法,在进程通信中占有重要地位。

虽然其机制有些陈旧,但在操作系统中仍然起着不可替代的作用,又被称为软中断.

在本程序中,父进程创建两个子进程,再用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语言程序计设这个平台并对各位老师的精心栽培表示衷心的感谢。

同时还要感谢对同一题目进行攻关的同学们给予的帮助,没他们的帮助可能有很多问题我个人不能进行很好的解决。

在此我对他们帮助给予衷心的感谢。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1