合肥师范学院第二学期操作系统实验指导书_第1页
合肥师范学院第二学期操作系统实验指导书_第2页
合肥师范学院第二学期操作系统实验指导书_第3页
合肥师范学院第二学期操作系统实验指导书_第4页
合肥师范学院第二学期操作系统实验指导书_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、合肥师范学院第二学期操作系统实验指导书合肥师范学院第二学期操作系统实验指导书合肥师范学院第二学期操作系统实验指导书操作系统实验指导书操作系统课程组编著计算机科学与技术系操作系统实验指导书目录序言.-1-实验项目一熟习LINUX基本命令及编程环境.-2-实验项目二进度管理.-4-实验项目三进度调动.-9-实验项目四进度通讯.-15-实验项目五储蓄管理.-24-操作系统实验指导书序言操作系统是计算机本科各专业的专业核心课程,其实践性、应用性很强,实验讲课环节是必不可以少的一个重要环节。经过操作系统实验部分讲课,使学生加深理解和更好的掌握操作系统的基本源理、技术和方法,坚固所学理论知识,激发实验兴趣

2、,掌握实验要领,培育对操作系统理论课程所学知识贯穿交融和综合运用的能力。经过实验,使学生深入认识和娴熟掌握Linux操作系统的使用,及在Linux操作系统下进行程序设计开发的方法,掌握操作系统中进度管理、进度调动、进度通讯和储蓄管理的方法,使学生拥有初步分析实质操作系统的能力,为此后学习使用其余的程序设计环境和语言打好基础。为了收到优秀的实查见效,编写这本实验指导书。在指导书中,每一个实验均依据该课程实验纲领的要求编写,力争紧扣理论知识点、突出设计方法、明确设计思路,经过多种形式完成实验任务,最后指引学生有目的、有方向地完成实验任务,得出实验结果。实验前,指导教师部署实验任务,给定实验内容,进

3、行必然的分析和解说,学生进行预习,提早设计实验方案,此后进入实验室进行实验;实验中,要修业生依据实验要求进行实验,仔细完成每个实验项目的详细内容,指导教师全程指导协调实验进行,对于实验中学生所发问题进行详细解答;实验后,学生应该实时总结实验过程,并依据实质状况对实验报告进行填写,能对在实验过程中发生的问题实时分析并找到解决方案,提交实验报告;指导教师需要对实验报告进行仔细批阅,并依据需要采纳要点内容进行谈论分析。-1-操作系统实验指导书实验项目一熟习LINUX基本命令及编程环境一、实验种类本实验为考证性实验。二、实验目的与任务熟习Linux操作系统的安装和使用;熟习使用Linux字符界面,窗口

4、系统的常用命令。掌握运用Linux常用的编程工具;掌握怎样编写、编译、运转程序。三、实验准备熟习linux系统中常用命令及其功能熟习vi编写器或Gedit编写器的各项功能复习C语言程序的编写。四、实验内容练习使用Gedit编写器使用Gedit编写器用C语言编写一个HelloWorld程序,并保留。详细操作:点击“任务栏地点主文件夹”,翻开主文件夹地点文件阅读器,空白处右键单击,弹出菜单项选择择“创立文档空文件”,新建一个空文件,并命名为“hello.c”,右键单击“hello.c”,选择“使用Gedit翻开”,在Gedit编写器中编写代码以下:#includeintmain()printf(H

5、ello,Wrold!n);编写完成后,点击“保留”,保留文件。使用gcc编译源程序。gcc是linux下的一种c程序编译工具,使用方法以下:编译:gcc-ofilename1filename.c(或许gccfilename.c-ofilename1),此中:filename.c是源文件名,filename1是目标文件名,o代表object详细操作:点击“任务栏应用程序附件终端”,目前默认路径即为主文件夹,输入“gcchello.c-ohello”,回车运转后,若无任何提示,怎说明编译成功,已生成可履行文件“hello“,若提示有错误,则依据详细提示回到Gedit中改正源程序,保留后从头编译。

6、履行程序履行:./filenamel此中:filename1是目标文件名。详细操作:在“终端”中输入“./hello”,回车后运转,若无错误,终端中将显示运转结果“Hello,Wrold!”。-2-操作系统实验指导书五、注意事项gcc编译器不可以够编译不带扩展名的c语言程序。注意编译和运转程序的基本过程。从头编写源程序后,必然从头编译,才会生成新的可履行程序。-3-操作系统实验指导书实验项目二进度管理一、实验种类本实验为考证性实验。二、实验目的理解进度的见解,掌握父、子进度创立的方法。认识和认识并发履行的实质,掌握进度的并发及同步操作。三、实验预备知识1.fork()函数头文件:#includ

7、e#include函数原型:pid_tfork(void);pid_t是一个宏定义,其实质是int,被定义在#include中)返回值:若成功调用一次则返回两个值,子进度返回0,父进度返回子进度ID;不然,犯错返回-1函数说明:一个现有进度能够调用fork函数创立一个新进度。由fork创立的新进度被称为子进度(childprocess)。fork函数被调用一次但返回两次。两次返回的独一差别是子进度中返回0值而父进度中返回子进度ID。子进度是父进度的副本,它将获得父进度数据空间、堆、栈等资源的副本。注意,子进度拥有的是上述储蓄空间的“副本”,这意味着父子进度间不共享这些储蓄空间。linux将复制

8、父进度的地点空间内容给子进度,因此,子进度有了独立的地点空间。为何fork会返回两次?因为在复制时复制了父进度的货仓段,因此两个进度都逗留在fork函数中,等候返回。因为fork函数会返回两次,一次是在父进度中返回,另一次是在子进度中返回,这两次的返回值是不同样样的,过程如图2.1。调用fork此后,数据、货仓有两份,代码仍旧为一份但是这个代码段成为两个进度的共享代码段都从fork函数中返回,箭头表示各自的履行处。当父子进度有一个想要改正代码段时,两个进度真切分裂。-4-操作系统实验指导书父进度If(fork()=0),Else,父进度子进度If(fork()=0)If(fork()=0),E

9、lseElse,图2.1fork()函数分裂表示图示例代码:#include/对于此程序而言此头文件用不到#include#includeintmain(intargc,char*argv)intpid=fork();if(pid0)printf(error!);elseif(pid=0)printf(Thisisthechildprocess!);elseprintf(Thisistheparentprocess!childprocessid=%d,pid);return0;fork函数的特色归纳起来就是“调用一次,返回两次”,在父进度中调用一次,在父进度和子进度中各返回一次。fork的另一

10、个特色是全部由父进度翻开的描绘符都被复制到子进度中。父、子进度中同样编号的文件描绘符在内核中指向同一个file构造体,也就是说,file构造体的引用计数要增添。-5-操作系统实验指导书2.wait()函数头文件:#include#include函数原型:pid_twait(int*status);返回值:假如履行成功则返回子进度鉴别码(PID),假如有错误发生则返回-1。函数说明:wait()会临时停止目行进度的履行,直到有信号到达或子进度结束。假如在调用wait()时子进度已经结束,则wait()会立刻返回子进度结束状态值。子进度的结束状态值会由参数status返回,而子进度的进度鉴别码也会

11、一同返回。假如不在乎结束状态值,则参数status能够设成NULL。子进度的结束状态值请参照下边的waitpid()。示例代码:#include#include#include#includeintmain(intargc,char*argv)pid_tpid;intstatus,i;if(fork()=0)printf(Thisisthechildprocess.pid=%dn,getpid();exit(5);elsesleep(1);printf(Thisistheparentprocess,waitforchild.n);pid=wait(&status);i=WEXITSTATUS(

12、status);printf(childspid=%d.exitstatus=%dn,pid,i);3.waitpid()函数头文件:#include#include-6-操作系统实验指导书函数原型:pid_twaitpid(pid_tpid,int*status,intoptions);返回值:假如履行成功则返回子进度鉴别码(PID),假如有错误发生则返回-1。函数说明:waitpid()会临时停止目行进度的履行,直到有信号到达或子进度结束。假如在调用wait()时子进度已经结束,则wait()会立刻返回子进度结束状态值。子进度的结束状态值会由参数status返回,而子进度的进度鉴别码也会一

13、快返回。假如不在乎结束状态值,则参数status能够设成NULL。参数pid为欲等候的子进度鉴别码,其余数值意义以下:pid0等候任何子进度鉴别码为pid的子进度。参数option能够为0或下边的组合:WNOHANG假如没有任何已经结束的子进度则立刻返回,不予以等候。WUNTRACED假如子进度进入暂停履行状况则立刻返回,但结束状态不予以理睬。子进度的结束状态返回后存于status,底下有几个宏可鉴别结束状况:WIFEXITED(status)假如子进度正常结束则为非0值。WEXITSTATUS(status)获得子进度exit()返回的结束代码,一般会先用WIFEXITED来判断能否正常结束

14、才能使用此宏。WIFSIGNALED(status)假如子进度是因为信号而结束则此宏值为真。WTERMSIG(status)获得子进度因信号而中断的信号代码,一般会先用WIFSIGNALED来判断后才使用此宏。WIFSTOPPED(status)假如子进度处于暂停履行状况则此宏值为真。一般只有使用WUNTRACED时才会有此状况。WSTOPSIG(status)获得引起子进度暂停的信号代码,一般会先用WIFSTOPPED来判断后才使用此宏。4.exit()函数头文件:#include函数原型:voidexit(intstatus);返回值:无。函数说明:进度结束正常停止,返回结束状态。stat

15、us为进度结束状态,是返回给父进度的一个整数,以备查考。为了实时回收进度所占用的资源并减少父进度的干涉,UNIX/LINUX利用exit()来实现进度的自我停止,平常父进度在创立子进度时,应在进度的尾端安排一条exit(),使子进度自我停止。exit(0)表示进度正常停止,exit(1)表示进度运转有错,异样停止。-7-操作系统实验指导书假如调用进度在履行exit()时,其父进度正在等候它的停止,则父进度可立刻获得其返回的整数。核心须为exit()完成以下操作:(1)封闭软中断(2)回收资源(3)写记帐信息(4)置进度为“僵死状态”四、实验内容编写一C语言程序,实此刻程序运转时经过系统调用fo

16、rk()创立两个子进度,使父、子三进度并发履行,父亲进度履行时屏幕显示“Iamfather,儿”子进度履行时屏幕显示“Iamson,”女儿进度履行时屏幕显示“Iamdaughter。”多次连续频频运转这个程序,察看屏幕显示结果的次序,直至出现不同样样的状况为止。记下这类状况,试简单分析其原由。3.改正程序,在父、子进度中分别使用wait()、exit()等系统调用“实现”其同步推动,并获得子进度的ID号及结束状态值。多次频频运转改良后的程序,察看并记录运转结果。五、实验报告要求列出实验内容1、3各程序清单,并以截图形式记录相应运转结果。对实验运转结果进行分析:1)实验内容1运转结果为何无固定次

17、序,fork()函数创立进度是怎样并发履行的。2)实验内容3是怎样实现父子进度的同步履行的。-8-操作系统实验指导书实验项目三进度调动一、实验种类本实验为考证性实验。二、实验目的理解进度控制块和进度组织方式;掌握时间片轮转调动算法实现办理机调动。三、实验预备知识实验基本源理进度控制块经过链表行列的方式组织起来,系统中存在运转行列和就绪行列(为简单起见,不设拥堵行列),进度的调动就是进度控制块在运转行列和就绪行列之间的切换。当需要调动时,从就绪行列中精选一个进度占用办理机,即从就绪行列中删除一个进度,插入到运转行列中,当占用办理机的进度运转的时间片完成后,放弃办理机,即在运转行列中的进度控制块经

18、过一段时间(时间片)后,从该行列上删除,假如该进度运转完成,则删除该进度(节点);不然,则插入到就绪行列中。实验中使用的数据构造PCB进度控制块内容包含参数进度名name;要求运转时间runtime;已运转时间runedtime;本轮运转时间killtime。进度行列为简单起见,只设运转行列,就绪行列两种数据构造,进度的调动在这两个行列中切换,如图3.1所示。PCBi运转行列PCBjPCBj+1,PCBj+n,就绪行列,图3.1PCB链表3.rand()函数和srand()函数-9-操作系统实验指导书库函数中系统供给了两个函数用于产生随机数:srand()和rand()。函数一:intrand

19、(void);从srand(seed)中指定的seed开始,返回一个0,RAND_MAX(0 x7fff)间的随机整数。函数二:voidsrand(unsignedseed);参数seed是rand()的种子,用来初始化rand()的初步值。函数rand()是真切的随机数生成器,而srand()会设置供rand()使用的随机数种子。假如你在第一次调用rand()从前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子同样的数调用srand()会致使同样的随机数序列被生成。srand(unsigned)time(NULL)则使用系统准时/计数器的值做为随机种子。每个种子对应

20、一组依据算法开初生成的随机数,因此,在同样的平台环境下,不同样时间产生的随机数会是不同样的,相应的,若将srand(unsigned)time(NULL)改为srand(TP)(TP为任一常量),则不论何时运转、运转多少次获得的“随机数”都会是一组固定的序列,因此srand生成的随机数是伪随机数。但是,要注意的是所谓的“伪随机数”指的其实不是假的随机数。其实绝对的随机数但是一种理想状态的随机数,计算机只好生成相对的随机数即伪随机数。计算机生成的伪随机数既是随机的又是有规律的一部份恪守必然的规律,一部份则不恪守任何规律。比方“世上没有两片形状完满同样的树叶”,这表现到了事物的特色差别性;但是每种

21、树的叶子都有近似的形状,这正是事物的共性规律性。从这个角度讲,我们就能够接受这样的事实了:计算机只好产生伪随机数而不是绝对的随机数。系统在调用rand()从前都会自动调用srand(),假如用户在rand()从前曾调用过srand()给参数seed指定了一个值,那么rand()就会将seed的值作为产生伪随机数的初始值;而假如用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始值。假如给了一个定值,那么每次rand()产生的随机数序列都是同样的。因此为了防范上述状况的发生我们平常用srand(unsigned)time(0)或许srand(unsigned)time

22、(NULL)来产生种子。假如仍旧感觉时间间隔太小,能够在(unsigned)time(0)或许(unsigned)time(NULL)后边乘上某个适合的整数。例如,srand(unsigned)time(NULL)*10)。其余,对于time_ttime(0):time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。srand()、rand()用法举例:#include#includevoidmain()inti,j;srand(10);/srand(int)time(0);for(i=0;i10;i+)j=(int)(rand()%20;print

23、f(%dn,j);-10-操作系统实验指导书4.malloc()函数头文件:#include函数原型:void*malloc(unsignedintsize);函数说明:其作用是在内存的动向储蓄区中分派一个长度为size的连续空间,此函数的值(即“返回值”)是一个指向分派域其实地点的指针(种类为void)。若此函数未能成功履行则返回空指针。程序流程图-11-操作系统实验指导书开始成立就绪行列,每个进度设置相应参数,如运转时间,进度名字等成立运转行列指针,初始值指向空从就绪行列中准时间先后顺序选一个进度插入运转行列每个进度占用办理机一个时间片,即runtime=runtime-时间片大小Yrun

24、time=0runtime赋值0N改正相应参数改正相应参数结束该进度,将该进度插入就绪行列中即开释节点空就绪行列为空么?Y结束产生一次调动,即准时间先后次序从头节点删除一个节点插入运转行列中N图3.2模拟进度调动的流程图部分参照程序PCB数据构造structPCB-12-操作系统实验指导书intname;intruntime;intrunedtime;intkilltime;structPCB*next;typedefstructPCBPCB;创立就绪列表#defineLENsizeof(PCB)PCB*runqueue;/运转行列指针PCB*top,*tail,*temp;/就绪行列指针in

25、ti;srand(int)time(0);for(i=0;iname=i;temp-runtime=rand()%15;temp-runedtime=0;temp-next=NULL;temp-killtime=0;if(i=0)top=temp;tail=temp;elsetail-next=temp;tail=temp;printf(processname%d,runtime=%d,runedtime=%d,killtime=%dn,tail-name,tail-runtime,tail-runedtime,tail-killtime);准时间片轮转算法进行进度调动的过程描绘。第1步:取就

26、绪行列的队首结点为运转行列的结点,改正就绪行排队首指针后移;第2步:调动运转行列结点,即运转行列结点的要求运转时间减去时间片刻间;第3步:a若改正后要求运转时间=0,则表示该进度结点运转完成,改正良程结点的PCB信息,记录runtime,runedtime,killtime等信息。并将结点信息输出。b不然,表示该进度结点未完成,记录runtime,runedtime,killtime等信息,将结点信息输出。并将该结点置于就绪行列的队尾,等候下次-13-操作系统实验指导书调动,同时改正队尾指针。第4步:若就绪行列非空,则连续履行第1步,直至就绪行列为空。四、实验内容成立合理的PCB数据构造,成立

27、含有8个进度结点的就绪行列,每个进度的要求运转时间随机产生,要求每个进度的要求运转时间不大于15。设置时间片大小(36),使用时间片轮转调动算法实现办理机调动。五、实验报告要求列出实验内容所要求的程序清单,并以截图形式记录相应运转结果;对实验运转结果进行分析:假如时间片设置值过大或过小,会对进度的调动产生何种影响。-14-操作系统实验指导书实验项目四进度通讯一、实验种类本实验为综合性实验。二、实验目的认识什么是信息,熟习信息传达原理。认识和熟习共享储蓄系统。掌握信息的发送与接收的实现方法。三、实验预备知识任务一信息的发送和接收实验基本源理信息(message)是一个格式化的可变长的信息单元。信

28、息系统赞成由一个进度给其余随意的进度发送一个信息。当一个进度收到多个信息时,可将它们排成一个信息行列。信息使用两种重要的数据构造:一是信息首部,此中记录了一些与信息相关的信息,如信息数据的字节数;二是信息行列头表,其每一表项是作为一个信息行列的信息头,记录了信息行列的相关信息。信息系统的数据构造:structmsgformlongmtype;charmtext1024;(1)信息首部记录一些与信息相关的信息,如信息的种类、大小、指向信息数据区的指针、信息行列的链接指针等。(2)信息行列头表其每一项作为一个信息行列的信息头,记录了信息行列的相关信息如指向信息行列中第一个信息和指向最后一个信息的指

29、针、行列中信息的数量、行列中信息数据的总字节数、行列所赞成信息数据的最大字节总数,还有近来一次履行发送操作的进度表记符和时间、近来一次履行接收操作的进度表记符和时间等。(3)信息行列的描绘符UNIX中,每一个信息行列都有一个称为要点字(key)的名字,是由用户指定的;信息行列有一信息行列描绘符,其作用与用户文件描绘符同样,也是为了方便用户和系统抵信息行列的接见。-15-操作系统实验指导书2.msgget()函数头文件:#include#include#include函数原型:intmsgget(key_tkey,intmsgflag);函数说明:创立一个信息,获得一个信息的描绘符。系统内核将搜

30、寻信息行列头表,确立能否有指命名字的信息行列。若无,系统内核将分派一新的信息行列头,并对它进行初始化,此后给用户返回一个信息行列描绘符,不然它但是检查信息行列的赞成权便返回。系统调用格式:msgqid=msgget(key,flag)。此中:msgqid是该系统调用返回的描绘符,失败则返回-1。msgget()函数的第一个参数是信息行列对象的要点字(key),函数将它与已有的信息行列对象的要点字进行比较来判断信息行列对象是否已经创立。而函数进行的详细操作是由第二个参数msgflg控制的。它能够取下边的几个值:IPC_CREAT:假如信息行列对象不存在,则创立之,不然则进行翻开操作;IPC_EX

31、CL:和IPC_CREAT一同使用(用”|连”接),假如信息对象不存在则创立之,不然产生一个错误并返回。假如独自使用IPC_CREAT标记,msgget()函数要么返回一个已经存在的消息行列对象的表记符,要么返回一个新成立的信息行列对象的表记符。假如将IPC_CREAT和IPC_EXCL标记一同使用,msgget()将返回一个新建的信息对象的表记符,或许返回-1。假如信息行列对象已存在,IPC_EXCL标记自己并无太大的意义,但和IPC_CREAT标记一同使用能够用来保证所得的信息行列对象是新创立的而不是翻开的已有的对象。除了以上的两个标记之外,在msgflg标记中还能够够有存取权限控制符。这

32、类控制符的意义和文件系统中的权限控制符是近似的。3.msgsnd()函数头文件:#include#include#include函数原型:intmsgsnd(intmsqid,constvoid*msgp,inttmsgsz,intmsgflg);函数说明:在信息行列进步行收发信息,为了发送信息,调用进度抵信息行列进行写入时必然有写权能。成功履行时返回0,失败时返回-1。此中msgqid是返回信息行列的描绘符;msgp是指向用户信息缓冲区的一个构造体指针。缓冲区中包含消-16-操作系统实验指导书息种类和信息正文,即longmtype;/*信息种类*/charmtext;/*信息的文本*/msg

33、sz指示由msgp指向的数据构造中字符数组的长度;即信息的长度。这个数组的最大值由MSG-MAX()系统可调用参数来确立。msgflag参数是控制函数行为的标记,取值能够是:0,表示忽视。若在标记msgflag中未设置IPC_NOWAIT位,则当该信息行列中的字节数超出最大值时,或系统范围的消息数超出某一最大值时,调用msgsnd进度睡眠。假如设置IPC_NOWAIT,则在此状况下,msgsnd立刻返回。对于msgsnd(),系统内核须完成以下工作:(1)抵信息行列的描绘符和赞成权及信息长度等进行检查。若合法才连续履行,不然返回;(2)系统内核为信息分派信息数据区。将用户信息缓冲区中的信息正文

34、,拷贝到信息数据区;(3)分派信息首部,并将它链入信息行列的尾端。在信息首部中须填写信息种类、信息大小和指向信息数据区的指针等数据;(4)改正信息行列头中的数据,如行列中的信息数、字节总数等。最后,唤醒等候信息的进度。4.msgrcv()函数头文件:#include#include#include函数原型:intmsgrcv(intmsqid,void*msgp,intmsgsz,longmsgtyp,intmsgflg);函数说明:msgrcv()函数用来接收一信息。从指定的信息行列中接收指定种类的信息。此中,msgqid,msgp,msgsz,msgflg与msgsnd中的对应参数相像,m

35、sgtyp是规定要读的信息种类,msgflg规定假如该行列无信息,系统内核应做的操作,是控制函数行为的标记,取值能够是:0,表示忽视;IPC_NOWAIT,假如信息行列为空,则返回一个ENOMSG,并将控制权交回调用函数的进度。假如不指定这个参数,那么进度将被拥堵直到函数能够从行列中获得符合条件的信息为止。这样时设置了IPC_NOWAIT标记,则立刻返回,若在flag中设置了MS_NOERROR,且所接收的信息大于size,则系统内核截断所接收的信息。对于msgrcv系统调用,系统内核须完成下述工作:(1)抵信息行列的描绘符和赞成权等进行检查。若合法,就往下履行;不然返回;(2)依据msgty

36、p的不同样分红三种状况办理:msgtyp=0,接收该行列的第一个信息,并将它返回给调用者;msgtyp为正整数,接收种类type的第一个信息;-17-操作系统实验指导书msgtyp为负整数,接收小于等于type绝对值的最低种类的第一个信息。(3)当所返回信息大小等于或小于用户的恳求时,系统内核便将信息正文拷贝到用户区,并从信息行列中删除此信息,此后唤醒睡眠的发送进度。但假如信息长度比用户要求的大时,则做犯错返回。5.msgctl()函数头文件:#include#include#include函数原型:intmsgctl(intmsgqid,intcmd,structmsqid_ds*buf);

37、函数说明:系统调用msgctl()用来控制抵信息行列的操作。此中,函数调用成功时返回0,不可以功则返回-1。buf是用户缓冲区地点,供用户寄存控制参数和查问结果;cmd是规定的命令。命令可分三类:(1)IPC_STAT。查问相关信息行列状况的命令。如查问行列中的信息数量、行列中的最大字节数、最后一个发送信息的进度表记符、发送时间等;(2)IPC_SET。按buf指向的构造中的值,设置和改变相关信息行列属性的命令。如改变信息行列的用户表记符、信息行列的赞成权等;(3)IPC_RMID。除去信息行列的表记符。msgqid_ds构造定义以下:structmsgqid_dsstructipc_perm

38、msg_perm;/*赞成权构造*/shortpad17;/*由系统使用*/ushortmsg_qnum;/*行列上信息数*/ushortmsg_qbytes;/*行列上最大字节数*/ushortmsg_lspid;/*最后发送信息的PID*/ushortmsg_lrpid;/*最后接收信息的PID*/time_tmsg_stime;/*最后发送信息的时间*/time_tmsg_rtime;/*最后接收信息的时间*/time_tmsg_ctime;/*最后改正时间*/;structipc_permushortuid;/*目前用户*/ushortgid;/*目行进度组*/ushortcuid;/

39、*创立用户*/ushortcgid;/*创立进度组*/ushortmode;/*存取赞成权*/shortpid1;longpad2;/*由系统使用*/样例程序-18-操作系统实验指导书/client_ex.c发送端#include#include#include#include#include#defineMSGKEY75structmsgformlongmtype;charmtext1024;msg;intmsgqid;voidclient()msgqid=msgget(MSGKEY,0777);/*翻开75#信息行列*/msg.mtype=1;msg.mtext1=a;printf(cli

40、ent)sentn);msgsnd(msgqid,&msg,1024,0);/*发送信息*/exit(0);intmain()client();/server_ex.c接收端#include#include#include#include#include#defineMSGKEY75structmsgformlongmtype;charmtext1024;msg;intmsgqid;voidserver()msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*创立75#信息行列*/msgrcv(msgqid,&msg,1024,0,0);/*接收信息*/printf(%

41、c,msg.mtextmsg.mtype);-19-操作系统实验指导书printf(server)receivedn);msgctl(msgqid,IPC_RMID,0);/*删除信息行列,送还资源*/exit(0);intmain()server();任务二使用共享储蓄区通讯实验基本源理共享储蓄区(ShareMemory)是UNIX系统中通讯速度最高的一种通讯系统。该系统可使若干进度共享主存中的某一个地区,且使该地区出现(照耀)在多个进度的虚地点空间中。另一方面,一个进度的虚地点空间中又可连结多个共享储蓄区,每个共享储蓄区都有自己的名字。当进度间欲利用共享储蓄区进行通讯时,必然先在主存中成立

42、一共享储蓄区,此后将它附接到自己的虚地点空间上。此后,进度对该区的接见操作,与对其虚地点空间的其余部分的操作完满同样。进度之间即可经过对共享储蓄区中数据的读、写来进行直接通讯。图4.1列出二个进度经过共享一个共享储蓄区来进行通讯的例子。此中,进度A将成立的共享储蓄区附接到自己的AA地区,进度B将它附接到自己的BB地区。进度A的虚空间内存地点进度B的虚空间正文正文数据数据AB共享存A储区B栈栈图4.1共享储蓄区应该指出,共享储蓄区系统只为进度供给了用于实现通讯的共享储蓄区和对共享储蓄区进行操作的手段,但是并未供给对该区进行互斥接见及进度同步的举措。因此当用户需要使用该系统时,必然自己设置同步和互

43、斥举措才能保证明现正确的通讯。2.shmget()函数头文件:#include#include#include-20-操作系统实验指导书函数原型:intshmget(key_tkey,size_tsize,intshmflg);函数说明:获得一个共享内存表记符或创立一个共享内存对象并返回共享内存表记符。此中,key是共享储蓄区的名字;size是其大小(以字节计);shmflg是用户设置的标记,如IPC_CREAT。IPC_CREAT表示若系统中还没有指名的共享储蓄区,则由系统内核成立一个共享储藏区;若系统中已有共享储蓄区,便忽视IPC_CREAT,并返回此共享内存的表记符。在shmflg标记中

44、还能够够有存取权限控制符。这类控制符的意义和文件系统中的权限控制符是近似的。3.shmat()函数头文件:#include#include#include函数原型:void*shmat(intshmid,constvoid*shmaddr,intshmflg);函数说明:把共享内存区对象照耀到调用进度的地点空间,系统调用的返回值是共享储蓄区所附接到的进度虚地点。连结共享内存表记符为shmid的共享内存,连结成功后把共享内存区对象照耀到调用进度的地点空间,随后可像当地空间同样访问。此中,shmid是共享储蓄区的表记符;shmaddr是用户给定的,将共享储蓄区附接到进度的虚地点空间;shmflg规

45、定共享储蓄区的读、写权限,以及系统能否应付用户规定的地点做舍入操作。其值为SHM_RDONLY时,表示只好读;其值为0时,表示可读、可写;其值为SHM_RND(取整)时,表示操作系统在必需时舍去这个地点。4.shmdt()函数头文件:#include#include#include函数原型:intshmdt(constvoid*shmaddr);函数说明:与shmat函数相反,是用来断开与共享内存附带点的地点,严禁本进度接见此共享内存。此中,shmaddr是要断开连结的虚地点,亦即从前由连结的系统调用shmat()所返回的虚地点。调用成功时,返回0值,调用不可以功,返回-1。本函数调用其实不删

46、除所指定的共享内存区,而但是将先前用shmat函数连结(attach)好的共享内存走开(detach)目前的进度。5.shctl()函数-21-操作系统实验指导书头文件:#include#include#include函数原型:intshmctl(intshmid,intcmd,structshmid_ds*buf);函数说明:系统调用shmctl()用来控制对共享储蓄区的操作,对其状态信息进行读取和改正。此中,shmid是共享储蓄区的表记符,buf是用户缓冲区地点,cmd是操作命令。命令可分为多各样类:(1)用于查问相关共享储蓄区的状况。如其长度、目前连结的进度数、共享区的创立者表记符等;(

47、2)用于设置或改变共享储蓄区的属性。如共享储蓄区的赞成权、目前连结的进度计数等;(3)对共享储蓄区的加锁和解锁命令;(4)删除共享储蓄区表记符等。上述的查问是将shmid所指示的数据构造中的相关成员,放入所指示的缓冲区中;而设置是用由buf所指示的缓冲区内容来设置由shmid所指示的数据构造中的相应成员。cmd有以下几种数值:IPC_STAT:获得共享内存的状态,把共享内存的shmid_ds构造复制到buf中;IPC_SET:改变共享内存的状态,把buf所指的shmid_ds构造中的uid、gid、mode复制到共享内存的shmid_ds构造内;IPC_RMID:删除这片共享内存样例程序/cl

48、ient_ex.c发送端#include#include#include#include#include#defineSHMKEY75intshmid,i;int*addr;voidclient()inti;shmid=shmget(SHMKEY,1024,0777);/*翻开共享储蓄区*/addr=shmat(shmid,0,0);/*获得共享储蓄区首地点*/while(*addr!=-1);printf(client)sentn);*addr=100;-22-操作系统实验指导书exit(0);intmain()client();/server_ex.c接收端#include#include

49、#include#include#include#defineSHMKEY75intshmid,i;int*addr;voidserver()shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);/*创立共享储蓄区*/addr=shmat(shmid,0,0);/*获得首地点*/*addr=-1;while(*addr=-1);printf(%d,*addr);printf(server)receivedn);shmctl(shmid,IPC_RMID,0);/*取消共享储蓄区,送还资源*/exit(0);intmain()server();四、实验内容1.依据信息

50、传达机理,使用系统调用msgget(),msgsnd(),msgrev(),及msgctl()编制一长度为k的信息发送和接收的程序,要求在程序中完成10次信息的发送和接收,每次发送信息结束和接收信息结束都需给出相应的屏幕提示,且每次发送的的内容好多于一个字符,并能在接收端输出。依据共享储蓄区原理,使用系统调用shmget(),shmat(),shmdt(),及shctl()编制程序,要求创立一个长度为k的共享储蓄区,并完成10次数据的发送和接收,每次发送数据结束和接收数据结束都需给出相应的屏幕提示,且每次发送的的数据应能在接收端输出。五、实验报告要求列出实验内容所要求的程序清单,并以截图形式记

51、录相应运转结果。对实验运转结果进行分析:试比较实验中两种方法实现进度通讯的不同样之处。-23-操作系统实验指导书实验项目五储蓄管理一、实验种类本实验为考证性实验。二、实验目的熟习内存安闲分区的分派方式;理解动向分区储蓄管理方式;掌握动向分区的分派与回收的过程。三、实验预备知识实验基本源理使用一个链表来模拟内储藏藏空间,成立内存块来记录内存分派使用状况,经过随机产生进度及其所需要的内存来模拟真切的进度。经过给进度分派内存及回收来实现对动向不等长储蓄管理方法。实验中使用的数据构造(1)内存块结点包含参数进度名name;初步地点address;长度length;标记flag,表示该块能否被分派。2)为简单起见,只设内存分派记录链表数据构造,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论