




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河南城建学院操作系统课程设计说明书设计题目: 信号通信与控制 专 业: 计算机科学与技术 指导教师: 班 级: 学 号: 姓 名: 同 组 人: 计算机科学与工程系2011年12月 30 日前言操作系统是计算机应用专业学生必修的专业基础课之一。在计算机软硬件课程的设置上,它起着承上启下的作用。其特点是概念多、较抽象和涉及面广,其整体实现思想和技术又往往难于理解。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。因此本课程的目的与任务是使学生通过本课程的学习,理解操作系统的基本概念和主要功能,掌握常用操作系统(如Linux/Windows)的一般使用和管理方法,了解它是如何组织和运作的,从而为学生以后的学习和工作打下基础。本学期通过对操作系统原理这门课程的学习,对操作系统相关知识有了更进一步的认识。为了检验与巩固所学习到的知识,要求设计一个信号通信与进程控制的程序,实现进程的创建,实现进程之间的互斥,软中断的捕获与重定义。完成本次课程设计,首先,必须配置操作系统编写的所需的环境,包括虚拟机的建立和相应环境建立。用VI编辑器编写相应的程序,实现进程间通信的功能。目录前言2系统环境3设计目的5程序原理5流程图6函数说明7signal(sig,function)7kill(pid,sig)8fork()8lockf(files,function,size)9Waiting()9wait()9exit()10调试与测试11设计中遇到的问题及解决方法16源程序17总结,收获与体会23参考文献24系统环境1)文本编辑器Windows环境平台下的EditPlus或者Linux平台下的一种文本编辑器2)汇编编译器NASM汇编编译器3)C语言编译器linux平台下的GCC编译器鉴于条件的限制,我们将在Windows平台下安装VMware虚拟机来搭建Linux平台。设计目的(l)进程的创建:编写一段程序,使用系统调用fork()创建两个或多个子进程。当此程序运行时,在系统中有一个父进程和其余为子进程在活动。(2)进程的控制:在程序中使用系统调用lockf()来给每一个进程加锁,实现进程之间的互斥。(3)进程通信:软中断通信;在程序中使用实例signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)进行通信操作,观察执行结果,并分析原因。(4)软中断的捕获与重定义。首先定义一个服务函数function(),然后利用signal(sig,function)系统调用来实现中断的捕获与改道。(5)使用操作系统保留给用户的信号SIGUSR1和SIGUSR2进行通信。(6)扩展程序,使之成为信号或事件驱动的应用程序。程序原理1) 软中断的工作工程模拟了实际的中断处理过程,当某一软中断时间发生后,首先需要设置对应的中断标记位,触发中断事务,然后唤醒守护线程去检测中断状态寄存器,如果通过查询发现某一软中断事务发生之后,那么通过软中断向量表调用软中断服务程序。这就是软中断的过程,与硬件中断唯一不同的地方是从中断标记到中断服务程序的映射过程。在CPU的硬件中断发生之后, CPU需要将硬件中断请求通过向量表映射成具体的服务程序,这个过程是硬件自动完成的,但是软中断不是,其需要守护线程去实现这一过程,这也就是软件模拟的中断,故称之为软中断。2) 在本程序中,父进程创建两个子进程,再用kill()向两个子进发出中断信号,子进程P1和P2接到信号后,用exit(0)函数正常终止自我进程(向父进程发SIGCHLD信号。父进程的wait()函数收到子进程的SIGCHLD信号后,对子进程作适当处理后(资源回收)后返回本进程。因为父进程有两个子进程,所以需要两个wait()函数来等待子进程的结束。流程图函数说明signal(sig,function)允许调用进程控制软中断信号的处理。头文件:#include参数定义signal(sig,function)intsig;void(*function)();返回值:成功时返回旧的(以前)函数描述,失败时返回SIG_ERR。说明:信号sig的值在头文件singal.h中有完整定义和描述,可用man 7 signal来获得帮助。(1) sig的取值如下:信号功能值SIGHUP挂起1SIGINT键盘中断,键盘按Delete键或Break键2SIGQUIT键盘按Quit键3SIGILL非法指令4SIGTRAP跟踪中断5SIGIOTIOT指令6SIGBUS总线错7SIGFPE浮点运算溢出8SIGKILL要求终止进程9SIGUSR1用户定义信号#110SIGSEGV段违法11SIGUSR2用户定义信号#212SIGPIPE向没有读进程的管道上写13SIGALRM定时器告警,时间到14SIGTERMkill发出的软件结束信号15SIGCHLD子进程死17SIGCONT若已停止则继续18SIGPWR电源故障30kill(pid,sig)向pid为进程号的进程发送信号sig。头文件:#include#include参数定义int kill(pid_t pid,int sig)pid_t pid:信号的接收进程。(pid_t可用整数代替。)若pid0,则pid为接收者的进程号,若pid=0,则接收者为同组的所有进程。若pid=-1则发送到除init进程外的所有进程。若pid0:从父进程返回的子进程id值-1:创建失败lockf(files,function,size)用作锁定文件的某些段或者整个文件。头文件:#include参数定义:int lockf(files,function,size);int files,function;long size;function的解释如下: SIG_DFL 默认操作。对除SIGPWR和SIGCHLD外所有信号的默认操作是进程终结。对信号SIGQUIT、SIGRAP、SIGLL、SIGFPE、SIGBUS和SIGSEGV,它产生一内存映像文件。 SIG_IGN 忽视该信号的出现。 Function 在该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGILL、SIGTRAP、SIGPWAP以外的信号,核心自动地重新设置软中断信号处理程序的值SIG_DFL,一个进程不能捕获SIGKILL信号。Waiting() 等待子进程运行结束。如果子进程没有完成,父进程一直等待。Waiting( )将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在waiting( )前已有子进程暂停或终止,则调用进程做适当处理后便返回。系统调用格式:static void waiting()wait() 在父进程中调用第1个wait(0)后,则父进程被阻塞。进入等待第一个子进程运行结束的队列,等待子进程结束。当子进程结束后,会产生一个终止状态字,系统会向父进程发出SIGCHLD信号。当接到信号后,父进程提取子进程的终止状态字,从wait()返回继续执行原程序。同样的方式,父进程继续执行第二个wait(0),并再次阻塞,等待第2个子进程运行结束。当第二个子进程运行结束后父进程继续执行剩余的语句。 exit() 该函数中每个进程退出时都用了语句exit(0),这是进程的正常终止。在正常终止时,exit()函数返回进程结束状态。进程终止时,则由系统内核产生一个代表异常终止原因的终止状态,该进程的父进程都能用wait()得到其终止状态。在子进程调用exit()后,子进程的结束状态会返回给系统内核,由内核根据状态字生成终止状态,供父进程在wait()中读取数据。若子进程结束后,父进程还没有读取子进程的终止状态,则子进程就变成了“孤儿进程”,系统进程init会自动“收养”该子进程,成为该子进程的父进程,即父进程标识号变成1,当子进程结束时,init会自动调用wait()读取子进程的遗留数据,从而避免在系统中留下大量的垃圾。调试与测试(1:编写一段程序,使用系统调用fork()创建两个子进程。(2:在程序中使用系统调用lockf()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。(3:编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Del或CTRL+C键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号。在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIGIGN),观察执行结果,并分析原因里,signal(SIGINT,SIGIGN)和signal(SIGQUIT,SIGIGN)分别为忽略Del,或CTRL+C键信号以及忽略中断信号。设计中遇到的问题及解决方法在设计的过程中,对于各种系统的函数还是不太清楚,经过突击,把各种系统调用的函数摸清楚了,然后开始设计我们的实验,刚开始的两道题还是比较简单的,主要是进程的创建和进程之间的互斥,通过fork()和lockf()这两个函数来实现,但是进程之间的软中断通信不是太清楚,在刚开的时候,函数的调用都是不太太清楚的,但是经过我们三个人的努力,很快就将函数的使用方法搞清楚了,然后开始设计我们的题目,可是对于命令的标识符还是没有完全懂,后来我们就像老师请教,将kill的命令的形式搞懂了,在这个过程中我们学会了很多,最终我们成功的设计好了我们的程序,通过不同的终端我们实现了我们的程序,课程设计的任务成功的完成。其中还遇到大家意见不同的时候,这让人很无语,大家意见不同,总是会影响课程设计的进程的,但是经过大家互相讨论,然后查阅相关的资料,最终把正确的思路弄清楚了,这个过程我学到很多,知识点的记忆又加深了,这个过程又是一个享受的过程,感觉好有成就感,团队的合作让我感觉到这不是任务,而是大家的娱乐。源程序编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一句话。#include int main()intp1,p2;while(p1=fork()=-1);if(p1=0) printf(Childn); else while(p2=fork()=-1);if(p2=0)printf(sonn); else printf(daugtern);修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。如果在程序中使用系统调用lockf()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。#includemain()int p1,p2,i;while(p1=fork()=-1);if(p1=0) for(i=0; i500;i+) printf(child %dn,i);else while(p2=fork()=-1);if(p2=0) for(i=0;i500;i+)printf(son %dn,i);elsefor(i=0;i500;i+)printf(daughter %dn,i);child.sondaughter.daughter.或child.son.child.sondaughter 等分析:由于函数printf()输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。但是,由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。#includemain()intp1,p2,i;while(p1=fork()=-1);if(p1=0)lockf(1,1,0) ;for(i=0; i10; i+) printf(Child %dn,i);lockf(1,0,0); else while(p2=fork()=-1);if(p2=0)lockf(1,1,0);for(i=0;i10;i+) printf(son %dn,i);lockf(1,0,0); else lockf(1,1,0);for(i=0;i10;i+) printf(daugter %dn,i);lockf(1,0,0);大致与未上锁的输出结果相同,也是随着执行时间不同,输出结果的顺序有所不同。分析:因为上述程序执行时,不同进程之间不存在共享临界资源(其中打印机的互斥性已由操作系统保证问题,所以,加锁与不加锁效果相同。编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Del或CTRL+C键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:child process 1 is killed by parent!child process 2 is killed by parent!父进程等待两个子进程终止后,输出以下信息后终止parent process is killed!程序:#include#include#includevoid waiting(),stop();int wait_mark;main()int p1,p2; printf(%dn,getpid();while(p1=fork()=-1); /创建进程p1if(p10)while(p2=fork()=-1);if(p20)wait_mark=1;signal(SIGINT,stop); /接收,Dei信号,并转Stop保waiting(); sleep(5);kill(p1,SIGUSR1); /向p1发中断信号SIGUSR1 sleep(5); kill(p2,SIGUSR2); /向p2发中断信号SIGUSR2wait(0); /同步wait(0);printf(parent process is killed!n);exit(0); else wait_mark=1;signal(SIGUSR2,stop);waiting();lockf(1,1,0);printf(child process 2 is killed by parent!n);lockf(1,0,0);exit(0); else wait_mark=1;signal(SIGUSR1,stop);waiting();lockf(1,1,0);printf(child process 1 is killed by parent!n);lockf(1,0,0);exit(0);void waiting()while(wait_mark!=0);void stop()wait_mark=0;child process 1 is killed by parent!child process 2 is killed by parent!Parent process is killed!分析上述程序中,实用函数signal()都放在一段程序的前面部位,而不是在其他接收信号处。这是因为signal()的执行只是为进程指定信号量SIGUSR1或SIGUSR2的作用,以及分配相应的与stop()过程链接的指针。从而,signal()函数必须在程序前面部分执行。在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIGIGN),观察执行结果,并分析原因。这里,signal(SIGINT,SIGIGN)和signal(SIGQUIT,SIGIGN)分别为忽略Del,或CTRL+C键信号以及忽略中断信号。#include#include#includeintpid1,pid2;int EndFlag=0; void IntDelete()kill(pid1,SIGUSR1);kill(pid2,SIGUSR2);EndFlag=1;void Int1()printf(child process 1 is killed by parent!n);exit(0);void Int2()printf(child process 2 is killed by parentn);exit(0);main()int exitpid;signal(SIGINT,SIG_IGN);signal(SIGQUIT,SIG_IGN); printf(%dn,getpid();while(pid1=fork()=-1);if(pid1=0)signal(SIGUSR1,Int1);signal(SIGINT,SIG_IGN);pause();exit(0); else while(pid2=fork()=-1);if(pid2=0) signal(SIGUSR1,Int2);signal(SIGINT,SIG_IGN);pause();exit(0); else signal(SIGINT,IntDelete);waitpid(-1,&exitpid,0);printf(parent process is killedn);exit(0);由于忽略了中断与退出信号,程序会一直保持阻塞状态而无法退出。总结,收获与体会本次操作系统课程设计完成是软中断的进程间通信的设计,通过对软中断信号(signal)和进程的创建,对其有了一定的掌握。软中断信号是一种简单且最基本的进程间的通信机制,它最大的特点是提供了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设备采购合同补充协议范文
- 公共文化服务项目评估与反馈方案
- 三年级语文重点文章同步练习题
- 可解释性对深度学习模型泛化的影响-洞察及研究
- 混合编程安全分析-洞察及研究
- 机场碳排放数据管理系统开发研究-洞察及研究
- 微服务架构下的CICD实践-洞察及研究
- 差异化服务质量保障-洞察及研究
- 环境温度对家禽代谢影响-洞察及研究
- 基于Transformer的文本生成-洞察及研究
- 小学体育家长会课件
- 教育的人口功能
- 抗凝剂皮下注射技术临床实践指南2024版
- 中小学教辅材料征订管理制度
- 2025年芳香保健师(初级)职业技能鉴定理论考试真题解析试卷
- 2025年陕西省中考数学试题(原卷版)
- 腰椎管狭窄症病例讨论
- 二衬混凝土浇筑施工技术
- 2025至2030全球及中国护理教育行业项目调研及市场前景预测评估报告
- 培训课件的字体版权
- 注塑加工项目可行性研究报告
评论
0/150
提交评论