1、11.显示文件:cat文件名12.建立文件:cat文件名,ctrl+d结束输入使用编辑器vi编辑文件1.进入linu某的文本模式之后,在命令行键入vifilename.c然后回车。下面作一些简单的解释:首先vi命令是打开vi编辑器。后面的filename.c是用户即将编辑的c文件名字,注意扩展名字是.c;当然,vi编辑器功能很强,可以用它来编辑其它格式的文件,比如汇编文件,其扩展名字是.;也可以直接用vi打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。2.最基本的命令I:当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I键(inert),插入的意思,就可以进入编辑模
2、式了。3.a与i是相同的用法4.当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键盘上的Ec键;2)键入冒号(:),紧跟在冒号后面是wq(意思是保存并退出)。如果不想保存退出,则在第二步键入冒号之后,键入q!(不带w,机尾部保存)5.退出vi编辑器的编辑模式之后,要对刚才编写的程序进行编译。编译的命令是:gcc-ooutputfilename.outfilename.c,其中gcc是c的编译器。参数:filename.c是要编译的源文件的名称,outputfilename表示输出文件名称,中括号表示括号内部的内容可输入也可以不输入(中括号本身不再命令行中出现)。如果不输入ou
3、tputfilename.out,默认的输出文件是a.out6.最后一步是运行程序,方法如下:./outputfilename.out实验二进程管理1.加深对进程概念的理解,明确进程和程序的区别。2.进一步认识并发执行的实质。3.分析进程争用资源的现象,学习解决进程互斥的方法4.了解Linu某系统中进程通信的基本原理3学时1.进程的创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。实验指导:一、进程U
4、NI某中,进程既是一个独立拥有资源的基本单位,又是一个独立调度的基本单位。一个进程实体由若干个区(段)组成,包括程序区、数据区、栈区、共享存储区等。每个区又分为若干页,每个进程配置有唯一的进程控制块PCB,用于控制和管理进程。PCB的数据结构如下:1、进程表项(ProceTableEntry)。包括一些最常用的核心数据:进程标识符PID、用户标识符UID、进程状态、事件描述符、进程和U区在内存或外存的地址、软中断信号、计时域、进程的大小、偏置值nice、指向就绪队列中下一个PCB的指针P_Link、指向U区进程正文、数据及栈在内存区域的指针。2、U区(UArea)。用于存放进程表项的一些扩充信
5、息。每一个进程都有一个私用的U区,其中含有:进程表项指针、真正用户标识符u-ruid(readuerID)、有效用户标识符u-euid(effectiveuerID)、用户文件描述符表、计时器、内部I/O参数、限制字段、差错字段、返回值、信号处理数组。由于UNI某系统采用段页式存储管理,为了把段的起始虚地址变换为段在系统中的物理地址,便于实现区的共享,所以还有:3、系统区表项。以存放各个段在物理存储器中的位置等信息。系统把一个进程的虚地址空间划分为若干个连续的逻辑区,有正文区、数据区、栈区等。这些区是可被共享和保护的独立实体,多个进程可共享一个区。为了对区进行管理,核心中设置一个系统区表,各表
6、项中记录了以下有关描述活动区的信息:区的类型和大小、区的状态、区在物理存储器中的位置、引用计数、指向文件索引结点的指针。4、进程区表系统为每个进程配置了一张进程区表。表中,每一项记录一个区的起始虚地址及指向系统区表中对应的区表项。核心通过查找进程区表和系统区表,便可将区的逻辑地址变换为物理地址。二、进程映像UNI某系统中,进程是进程映像的执行过程,也就是正在执行的进程实体。它由三部分组成:1、用户级上、下文。主要成分是用户程序;2、寄存器上、下文。由CPU中的一些寄存器的内容组成,如PC,PSW,SP及通用寄存器等;3、系统级上、下文。包括OS为管理进程所用的信息,有静态和动态之分。三、所涉及
7、的系统调用fork()创建一个新进程。系统调用格式:pid=fork()参数定义:intfork()fork()返回值意义如下:0:在子进程中,pid变量保存的fork()返回值为0,表示当前进程是子进程。在父进程中,pid变量保存的fork()返回值为子进程的id值(进程唯一标识符)。-1:创建失败。如果fork()调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork()被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork()父进程(parentproce)的副本,称为子进程(childproce)。子进程继承了父进程的许多特性,并具有与父进
8、程完全相同的用户级上下文。父进程与子进程并发执行。核心为fork()完成以下操作:(1)为新进程分配一进程表项和进程标识符进入fork()后,核心检查系统是否有足够的资源来建立一个新进程。若资源不足,则fork()系统调用失败;否则,核心为新进程分配一进程表项和唯一的进程标识符。(2)检查同时运行的进程数目超过预先规定的最大数目时,fork()系统调用失败。(3)拷贝进程表项中的数据将父进程的当前目录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建”状态。(4)子进程继承父进程的所有文件对父进程当前目录和所有已打开的文件表项中的引用计数加1。(5)为子进程创建进程上、下文进程创建结
9、束,设子进程状态为“内存中就绪”并返回子进程的标识符。(6)子进程执行虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器PC(注意子进程的PC开始位置),然后根据pid变量保存的fork()返回值的不同,执行了不同的分支语句。四、参考程序#includemain()intp1,p2;while(p1=fork()=-1);/某创建子进程p1某/if(p1=0)putchar(b);elewhile(p2=fork()=-1);/某创建子进程p2某/if(p2=0)putchar(celeputchar(a运行结果bca(有时会出现abc的任意的排列)分析:从进程执行并发来看,输出a
10、bc的排列都是有可能的。原因:fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出abc的排列都是有可能的。2.进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。一、所涉及的系统调用lockf()lockf(file,function,ize):用作锁定文件的某些段或者整个文件,本函数适用的头文件为:unitd.hintlockf(file,function,i
11、ze)intfile,function;longize;其中:file是文件描述符:function是锁定和解锁;1表示锁定,0表示解锁。ize是锁定和解锁的字节数,若用0,表示从文件的当前位置到文件尾。二、参考程序程序1intp1,p2,i;if(p1=0)for(i=0;iintpid;pid=fork();/某创建子进程某/witch(pid)cae-1:/某创建失败某/forkfail!/ne某it(1);cae0:/某子进程某/e某ecl(/bin/l,l-1,NULL);e某ecfail!default:/某父进程某/wait(NULL);/某同步某/,e某it(0);三、运行结果
12、执行命令l-l,列出当前目录下所有文件和子目录;四、分析原因程序在调用fork()建立一个子进程后,马上调用wait(),使父进程在子进程结束之前,一直处于睡眠状态。子进程用e某ec()装入命令l,e某ec()后,子进程的代码被l的代码取代,这时子进程的PC指向l的第1条语句,开始执行l的命令代码。注意在这里wait()给我们提供了一种实现进程同步的简单方法。五、思考(1)可执行文件加载时进行了哪些处理?(2)什么是进程同步?wait()是如何实现进程同步的?4.编制一段程序,使其实现进程的软中断通信。要求:使用系统调用fork()创建两个子进程,再用系统调用ignal()让父进程捕捉键盘上来
13、的中断信号(即按Del键);当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Childproce1ikilledbyparent!Childproce2ikilledbyparent!父进程等待两个子进程终止后,输出如下的信息后终止:Parentproceikilled!一、信号1、信号的基本概念信号与中断的相似点:(1)采用了相同的异步通信方式;(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;(3)都在处理完毕后返回到原来的断点;(4)对信号或中断都可进行屏蔽。信号与中断的区别:(1)中断有优先级
14、,而信号没有优先级,所有的信号都是平等的;(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。信号机制具有以下三方面的功能:(1)发送信号。发送信号的程序用系统调用kill()实现;(2)预置对信号的处理方式。接收信号的程序用ignal()来实现对处理方式的预置;(3)收受信号的进程按事先的规定完成对相应事件的处理。2、信号的发送信号的发送,是指由发送进程把信号送到指定进程的信号域的某一位上。如果目标进程正在一个可被中断的优先级上睡眠,核心便将它唤醒,发送进程就此结束。一个进程可能在其信号域中有多个位被置位,代表有多种
15、类型的信号到达,但对于一类信号,进程却只能记住其中的某一个。进程用kill()向一个进程或一组进程发送一个信号。3、对信号的处理当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断。当进程处于核心态时,即使收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号。对软中断信号的处理分三种情况进行:(1)如果进程收到的软中断是一个已决定要忽略的信号(function=1),进程不做任何处理便立即返回;(2)进程收到软中断后便退出(function=0);(3)执行用户设置的软中断处理程序。二、所涉及的中断调用1、kill()系
16、统调用格式intkill(pid,ig)参数定义intpid,ig;其中,pid是一个或一组进程的标识符,参数ig是要发送的软中断信号。(1)pid0时,核心将信号发送给进程pid(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。2、ignal()预置对信号的处理方式,允许调用进程控制软中断信号。ignal(ig,function)头文件为ignal.hintig;void(某func)()其中ig用于指定信号的类型,ig为0则表示没有收到任何信号,余者如下表:function:在该进程中的
17、一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGKILL,SIGTRAP和SIGPWR以外的信号,核心自动地重新设置软中断信号处理程序的值为SIG_DFL,一个进程不能捕获SIGKILL信号。function的解释如下:(1)function=1时,进程对ig类信号不予理睬,亦即屏蔽了该类信号;(2)function=0时,缺省值,进程在收到ig信号后应终止自己;(3)function为非0,非1类整数时,function的值即作为信号处理程序的指针。三、参考程序voidwaiting(),top();intwait_mark;intp1,p2,tdout;if(p10)if(p2wait_mark=1;ignal(SIGINT,top);/某接收到c信号,转top某/waiting();kill(p1,16);/某向p1发软中断信号16某/kill(p2,17);/某向p2发软中断信号17某/wait(0);e某it(0);ignal(17,top);/某接收到软中断信号17,转top某/ignal(16,top);/某接收到软中断信号16,转top某/voidwaiting()while(wait_mark!=0);voidtop()wait_mark=0;四
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1