




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于 linux 的操作系统实验系统第 1 页第二章进程管理实验【实验目的】1、加深对进程概念的理解,明确进程和程序的区别;2、进一步认识并发执行的实质;3、分析进程争用资源的现象,学习解决进程互斥的方法;4、了解 linux 系统中进程通信的基本原理【准备知识】一基本概念1、进程的概念;进程与程序的区别。2、并发执行的概念。3、进程互斥的概念。4、进程通信的基本原理。二系统调用系统调用是一种进入系统空间的办法。通常, 在 os 的核心中都设置了一组用于实现各种系统功能的子程序,并将它们提供给程序员调用。程序员在需要os提供某种服务的时候, 便可以调用一条系统调用命令,去实现希望的功能, 这就
2、是系统调用。因此,系统调用就像一个黑箱子一样,对用户屏蔽了操作系统的具体动作而只是控制程序的执行速度等。各个不同的操作系统有各自的系统调用,如windows api,便是windows 的系统调用, linux 的系统调用与之不同的是linux 由于内核代码完全公开,所以可以细致的分析出其系统调用的机制。1 系统调用和普通过程的区别1.1 运行于不同的系统状态用户程序可以通过系统调用进入系统空间,在核心态执行;而普通过程则只能在用户空间当中运行。1.2 通过软中断切换由于用户程序使用系统调用后要进入系统空间,所以需要调用一个软中断;而基于 linux 的操作系统实验系统第 2 页普通过程在被调
3、用时没有这个过程。2 系统调用的类型系统调用的作用与它所在的操作系统有密切关系,根据操作系统的性质不同,它们所提供的系统调用会有一定的差异,不过对于普通操作系统而言,应该具有下面几类系统调用 : (1) 进程控制类型; (2) 文件操纵类型; (3) 进程通信类型;(4) 信息维护类型。3 系统调用的实现机制由于操作系统的不同,其系统调用的实现方式可能不同,然而实现机制应该是大致相同的,一般包含下面几个步骤:3.1 设置系统调用号在系统当中,往往设置多条系统调用命令,并赋予每条系统调用命令一个唯一的系统调用号。根据分配系统调用号方式的不同分为:直接方式和参数表方式。系统调用的参数表方式有分为直
4、接和间接两种方式,如图2.1 。3.2 处理系统调用操作系统中有一张系统调用入口表。表中的每个表目都对应一条系统调用命令,它包含有该系统调用自带参数的数目、系统调用命令处理程序的入口地址等等。操作系统内核便是根据所输入的系统调用号在该表中查找到到相应的系统调用,进而转入它的入口地址去执行它。4 linux 的系统调用机制linux 的系统调用是通过中断机制实现的。中断,这个概念涉及到计算机系统结构方面的知识,显然它与微处理器等硬件有着密不可分的关系。变元表:n参数 1 参数 2 参数 n (a) 直接方式trap 参数 1 参数 2 参数 n 变元表:n指针(b) 间接方式图 2.1 系统调用
5、的参数表方式基于 linux 的操作系统实验系统第 3 页中断(interrupt) ,是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件, 使得 cpu暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后再返回原来被中断处继续执行的过程。其发生一般而言是 “异步”的,换句话说就是在无法预测何种情况下发生的(比如系统掉电)。所以计算机的软硬件对于中断的相应反应完全是被动的。软中断,是对硬中断的一种模拟,发送软中断就是向接收进程的proc 结构中的相应项发送一个特定意义的信号。软中断必须等到接收进程执行时才能生效。陷阱( trap ) ,由软件产生的中断,指处理机
6、和内存内部产生的中断,它包括程序运算引起的各种错误,如地址非法、校验错、页面失效等。它由专门的指令,如x86中的“ int n ” ,在程序中有意的产生。所以说陷阱是主动的,“同步”的。异常(exception ) ,一般也是异步的,多半是由于不小心造成的,比如在进行除法操作时除数为0,就会产生一次异常。三相关函数。1 fork( )函数fork()函数创建一个新进程。其调用格式为:int fork();其中返回int 取值意义如下:正确返回:等于 0:创建子进程,从子进程返回的id 值;大于 0:从父进程返回的子进程的进程id 值。错误返回:等于 1:创建失败。2 wait( )函数wait
7、()函数常用来控制父进程与子进程的同步。在父进程中调用wait()函数,则父进程被阻塞,进入等待队列, 等待子进程结束。当子进程结束时,会产生一个终止状态字, 系统会向父进程发出sigchld 信号。 当接到信号后, 父进程提取子进程的终止状态字,从wait()函数返回继续执行原程序。其调用格式为: #include #include (pid_t) wait(int *statloc);正确返回:大于0:子进程的进程id 值;等于 0:其它。错误返回:等于1:调用失败。基于 linux 的操作系统实验系统第 4 页3 exit( )函数 exit()函数是进程结束最常调用的函数,在main(
8、) 函数中调用return ,最终也是调用exit()函数。这些都是进程的正常终止。在正常终止时,exit()函数返回进程结束状态。其调用格式为: #include void exit(int status);其中 status为进程结束状态。4 kill( )函数kill()函数用于删除执行中的程序或者任务。其调用格式为: kill(int pid,int iid);其中: pid 是要被杀死的进程号,iid 为向将被杀死的进程发送的中断号。5 signal( ) 函数signal()函数是允许调用进程控制软中断信号的处理。其调用格式为: #include int sig;void (*fu
9、nc)();signal(sig,function);其中:(1)sig 的值是下列之一: sighup 挂起 1 sigint 键盘按 delete键或 break 键 2 sigquit 键盘按 quit键 3 sigill 非法指令 4 sigtrap 跟踪中断 5 sigiot iot 指令 6 sigbus 总线错 7 sigfpe 浮点运算溢出 8 sigkll 要求终止进程 9 sigusr1 用户定义信号#1 10 sigsegv 段违法 11 sigusr2 用户定义信号#2 12 sigpipe 向无读者管道上写 13 sigalrm 定时器告警,时间到 14 基于 lin
10、ux 的操作系统实验系统第 5 页sigterm kill 发出的软件结束信号 15 sigchld 子进程死 17 sigpwr 电源故障 30 (2)function的解释如下:sig_dfl :缺省操作。 对除 sigpwr 和 sigcld外所有信号的缺省操作是进程终结。对信号sigquit、sigtrap 、sigill 、sigiot、 sigemt 、sigfpe 、sigbus 、sigsegv和 sigsys ,它产生一内存映象文件。sig_ign:忽视该信号的出现。function :在该进程中的一个函数地址,在核心返回用户态时,它以软件中断信号的序号作为参数调用该函数,对
11、除了信号sigill 、sigtrap和 sigpwr 以外的信号,核心自动地重新设置软中断信号处理程序的值为sig_dfl,一个进程不能捕获sigkill 信号。6 pipe( )函数pipe()函数用于创建一个管道。其调用格式为: #include pipe(int fp2);其中: fp2是供进程使用的文件描述符数组,fp0用于写, fp1用于读。正确返回: 0 :调用成功;错误返回:1:调用失败。【实验内容】任选下列之一进行实验:1、编制一段程序,实现软中断通信:使用系统调用fork()创建两个子进程, 再用系统调用 signal()让父进程捕捉键盘上来的中断信号 (即按 del键)
12、,当父进程接受到这两个软中断的其中某一个后,父进程用系统调用 kill()向两个子进程分别发送整数值为16和17软中断信号, 子进程获得对应软中断信号后,分别输出下列信息后终止:child process 1 is killed by parent ! child process 2 is killed by parent ! 父进程调用 wait()函数等待两个子进程终止后,输出以下信息后终止:parent process is killed! 多运行几次编写的程序,简略分析出现不同结果的原因。基于 linux 的操作系统实验系统第 6 页2、编制一段程序,实现进程的管道通信:使用系统调用
13、pipe()建立一条管道线,两个子进程分别向管道各写一句话:child process 1 is sending a message! child process 2 is sending a message! 而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。要求:父进程先接收子进程p1发来的消息,然后再接收子进程p2发来的消息。【实验指导】1 编制一段程序,实现进程的软中断通信,算法流程图:开始初始化软中断信号集创建子进程1子进程1创建成功?否是是否子进程1 等待软中断信号16 发生否等待软中断发生是是过了5 秒?否产生软中断sigalrm是调用kill( )向两子进程发中断信号
14、等待子进程1 终止结束子进程2 等待软中断信号17 发生否否软中断信号17否子进程1 终止软中断信号16当前运行的是父进程?创建子进程2子进程2 创建成功?当前运行的是父进程?得到软中断号16 发生?得到软中断号17 发生?子进程2 终止是接受软中断sigquit等待子进程2 终止父进程终止是基于 linux 的操作系统实验系统第 7 页2 编制一段程序,实现进程的管道通信,算法流程图: 开始子进程1创建成功?创 建 子 进 程 2是是是否子进程 2创建成功?锁 定 管 道 写 入 端 fd1将 信 息 “ child process 1 is sendingmessage !”输 入 变 量
15、 outpipe否子 进 程 1终 止结 束创 建 管 道 fd管道fd创建成功?否创 建 子 进 程 1锁 定 管 道 写 入 端 fd1将 outpipe 里 的 信 息 写 入管 道 写 入 端 fd1解 除 对 写 入 端 fd1 的 锁 定将 信 息 “ child process 2 is sendingmessage !”输 入 变 量 outpipe将 outpipe 里 的 信 息 写 入管 道 写 入 端 fd1解 除 对 写 入 端 fd1 的 锁 定子 进 程 1等 待 父 进 程 从 管 道 读 取端 fd0 读 出 信 息 到 变 量 inpipe子 进 程 2等
16、待 父 进 程 从 管 道 读 取端 fd0 读 出 信 息 到 变 量 inpipe将 inpipe 里 的 信 息 打 印 到 屏 幕 上子 进 程 2终 止父 进 程 终 止基于 linux 的操作系统实验系统第 8 页【附录】1 进程的软中断通信1.1 参考程序源代码 : #include #include #include #include int wait_flag;void stop( );main( ) int pid1, pid2; signal(3,stop); / 或者 signal(14,stop); while(pid1 = fork( ) = -1); if(pid
17、1 0) while(pid2 = fork( ) = -1); if(pid2 0) wait_flag = 1; sleep(5); kill(pid1,16); kill(pid2,17); wait(0); wait(0);printf(“n”) ; exit(0); else wait_flag = 1; signal(17,stop);printf(“n”) ; exit(0); 基于 linux 的操作系统实验系统第 9 页 else wait_flag = 1; signal(16,stop);printf(“n”) ; exit(0); void stop( ) wait_f
18、lag = 0; 1.2 运行结果 :child process 1 is killed by parent ! child process 2 is killed by parent ! parent process is killed ! 或者:(运行多次后会出现如下结果)child process 2 is killed by parent ! child process 1 is killed by parent ! parent process is killed ! 1.3 简要分析 : 1、上述程序中,调用函数signal()都放在一段程序的前面部位,而不是在其他接收信号处,这是
19、因为signal()的执行只是为进程指定信号量16 和 17 的作用,以及分配相应的与stop() 过程链接的指针。从而signal()函数必须在程序前面部分执行。2、该程序段前面部分用了两个wait(0),这是因为父进程必须等待两个子进程终止后才终。 wait()函数常用来控制父进程与子进程的同步。在父进程中调用wait()函数,则父进程被阻塞。进入等待队列,等待子进程结束。当子进程结束时,会产生一个终止状态字,系统会向父进程发出sigchld信号。 当接到信号后, 父进程提取子进程的终止状态字,从wait()返回继续执行原程序。3、该程序中每个进程退出时都用了语句exit(0),这是进程的
20、正常终止。在正常终止时, exit()函数返回进程结束状态。异常终止时, 则由系统内核产生一个代表异常终止原因的终止状态,该进程的父进程都能用wait()得到其终止状态。在子进程调用exit()后,子进程的结束状态会返回给系统内核,由内核根据状态字生成终基于 linux 的操作系统实验系统第 10 页止状态,供父进程在wait()中读取数据。若子进程结束后,父进程还没有读取子进程的终止状态, 则系统就子进程的终止状态置为“zombie ”并保留子进程的进程控制块等信息, 等父进程读取信息后,系统才彻底释放子进程的进程控制块。若父进程在子进程结束之前就结束的话,则子进程就变成了“孤儿进程” ,系
21、统进程init会自动“收养”该子进程,成为该子进程的父进程即父进程标识号变为1,当子进程结束时, init会自动调用wait()读取子进程的遗留数据,从而避免系统中留下大量的垃圾。4、上述结果中“child process 1 is killed by parent ! ”和“ child process 2 is killed by parent !”的出现,当运行几次后,谁在前谁在后是随机的,这是因为:从进程调度的角度看,子进程被创建后处于就绪态,此时, 父进程和子进程作为两个独立的进程,共享同一个代码段,分别参加调度、执行、直至进程结束。但是谁会先得到调度, 与系统的调度策略和系统当前的资源状态有关,是不确定的, 因此,谁先从 fork()函数中返回继续执行后面的语句也是不确定的。2 进程的管道通信的参考程序源代码:2.1 参考程序源代码:#include #in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防癌护理科普
- 三下乡暑期实践活动个人总结模版
- 护士行业实习心得体会模版
- 新疆吐鲁番市2024-2025学年高一下学期期中考试 生物 含解析
- 学生旅游活动方案
- 18 文言文二则《囊萤夜读》课件
- 2025届山东省招远市八下数学期末质量跟踪监视模拟试题含解析
- 调经止痛护理方案
- 仁爱英语七年级上知识点短语总结模版
- 特应性角结膜炎的临床护理
- 建筑用砂石料采购 投标方案(技术方案)
- 融于教学的形成性评价读书分享
- 广东省广州市八区联考2024年高一数学第二学期期末考试模拟试题含解析
- 体质外貌鉴定
- 起重机维护保养记录表
- 大数据技术基础(第2版)全套教学课件
- 《煤矿重大危险源评估报告》
- 大锁孙天宇小品《时间都去哪了》台词剧本完整版-一年一度喜剧大赛
- 《中国铁路总公司铁路建设项目档案管理办法》(铁总档史〔2018〕29号)
- 监控工程验收单-范本模板
- 浙江开放大学2024年《法律文化》形考作业1-4答案
评论
0/150
提交评论