




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机操作系统实验报告实验一一、实验目的 在单处理器环境下,实现互斥和同步的控制。熟悉并掌握常用Windows命令行。更进一步理解PV操作的并发控制的实现。二、Windows命令行常用命令dir是英文单词directory(目录)的缩写,主要用来显示一个目录下的文件和子目录。md是英文make directory(创建目录)的缩写。功能:创建一个子目录cd是英文change directory(改变目录)的缩写,功能:改变目录rd是英文remove directory(删除目录)的缩写,功能;:删除目录copy功能:复制一个或一组文件至指定的目录中del是英文delete(删除)的缩写,功能:删除指定目录下一个或一组文档edit功能:edit是一个简单的编辑软件,可用于编辑程序或批处理文件。bacc功能:编译指定的文件(如bacc dd)bainterp功能:运行指定文件(如:bainterp dd)三、并发程序设计题目:在BACI环境下,对程序并发执行的实验:(1)没有控制时正确的程序执行的结果不正确;(2)BACI中PV操作的并发控制的实现。实验1、多进程共享内存堆栈(1)设计思路:(2)代码:int stack10; semaphore s=1; int top=4;void release(int free) p(s); top+; couttop=topendl; stacktop=free; v(s);main() int i; for(i=0;i10;i+) stacki=-1; stack0=0; stack1=156; stack2=254; stack3=129; stack4=23; cobegin getspace(); release(100); couttop=top=0;top-) coutstacktop=stacktopendl;实验2、同步关系_奇数偶数假定有三个进程R、W1、W2共享一个缓冲区B,而B每次只能存放一个整数。当缓冲区中无数时,进程R可以从输入设备上读入一个整数并存入B中;若存到B中的数是奇数,则允许进程W1将其取出打印;若是偶数,则允许进程W2将其取出打印。另外规定:进程R必须等B中的数被取出打印后才能再存放下一个数,进程W1或W2对每次存入的数只能打印一次并且都不能从空的缓冲区中取数。请用PV操作实现R、W1和W2三个进程的并发执行。代码:Int buf; semaphore s1=1;s2=0;s3=0;void r() p(s1);coutinput buf;if(buf%2) v(s2);else v(s3);void w1() p(s2);coutw1buf=bufendl;v(s1); void w2() p(s3);coutw2buf=bufendl; v(s1); main() cobegin r(); r(); w1(); w2();实验二一、实验目的1目的 1、进程通信是多任务协作的基础,具有广泛的应用。2、熟悉Linux的基于消息队列的进程通信的系统调用,并实现一个简单的C/S结构的实例。二、Linux环境下常见shell命令cd 改变当前的工作目录cd /usr/srcLs 列出当前目录的文件名及子目录名ls l *.ccp文件拷贝cp *.c /mnt/usbrm删除文件rm a.outmkdir创建一个子目录mkdir /usr/myDatarmdir删除一个子目录rmdir /usr/myDatachmod设置文件的存取权限chmod 777 myCC.shfdisk查看文件系统fdisk lmount装载文件系统mount /dev/sda0 /mnt/usbumount卸载文件系统umount /mnt/usbpwd显示当前工作目录pwdps显示当前运行的进程ps akill删除运行中的进程kill 3685cc基本使用实例用法结果说明cc ex2.c编译后生成可执行目标文件a.outcc o ex2 ex2.c编译后生成可执行目标文件ex2cc I/mnt/usb /include ex2.c编译器编译过程除了在默认路径、还可以在指定的路径/mnt/usb/include下查找源文件包含的头文件cc L/mnt/usb/lib ex2.c编译器在自动连接时,除了在默认路径、还可以在指定的路径/mnt/usb/lib下查找源文件用到的库文件.另外在命令状态下:DD :剪切一行 NDD :剪切N行 DW :剪切一个单词 NDW :剪切N个单词 P :粘贴 YY :复制一行 NYY :复制N行 YW:复制一个单词 NYW :复制N个单词虚拟机里linux对u盘的操作首先在终端输入:fdisk l然后会看到下面的信息:红线所画的就是我们的优盘接下来,创建一个文件夹用于映射u盘,具体命令如下:mkdir dinglinmount /dev/sdb1 dinglin(dev表示device,sdb1就是优盘的编号,这句话表示吧优盘映射到dinglin文件夹)现在,已经成功把优盘映射到dinglin文件夹然后输入以下命令,进入优盘并查看文件Cd dinglinLs(从图片中可以看到我们需要的两个文件:cnt.c,svr.c)接下来要做的便是把文件备份一下,具体操作如下:输入以下代码:Cd rootMkdir diskCp /root/dinglin/cnt.c /root/diskCp /root/dinglin/svr.c /root/diskCd diskLs第一句,因为刚刚我们通过cd dinglin进入了U盘,所以现在要返回root文件夹下面,不然文件夹就建到了U盘里面第2句:因为新终端默认打开的是root文件夹,这句话表示在root文件夹下面新建了disk文件夹第3、4句:虽然我们已经新建了disk,但是我们还在root文件夹下面,所以要输入完整的路径才能把文件复制到指定文件夹,/root/dinglin/svr.c表示源文件位置,/root/disk表示目标路径在复制文件的时候还有其他种方法,这里就不贴图了Cd /rootMkdir diskCd dinglinCp cnt.c /root/diskCd /root/disk这种方法是进入U盘把文加复制过去,因为进入了dinglin文件夹,所以不需要输入完整的文件源地址现在,可以开始编译和运行了,操作如下Cc o cnt cnt.cLs./cnt第一句表示把cnt.c编译问指定文件名的程序,第一个cnt就是编译后的文件的名称,后面的cnt.c是我们的源文件通过ls命令。我们看到文件夹里面多出一个cnt的文件,现在,直接输入./cnt运行就可以了运行完毕之后就是卸载U盘了,操作如下Cd /rootUmount dinglin因为我们在root下面建的dinglin,所以必须返回root才能umount,如果显示device is busy,说明你可能有其他终端打开了U盘而没有退出去,直接把其他终端关闭,在执行一次就ok了三、消息队列通信消息机制提供四个系统调用,分别是:int msgget(key_t key, int msgflg);int msgsnd(int msgqid, struct msgbuf *msgp, size_t msgsz, int msgflg)int msgrcv(int msgqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg)int msgctl(int msgqid, int cmd, struct msgqid_ds *buf)注意:在使用各种通信机制的系统调用前,必须include三个头文件:1)int msgget(key_t key, int msgflg);参数KEY是一个键值,由FTOK获得;MSGFLG参数是一些标志位。该调用返回与健值KEY相对应的消息队列描述字。在以下两种情况下,该调用将创建一个新的消息队列:如果没有消息队列与健值KEY相对应,并且MSGFLG中包含了IPC_CREAT标志位;KEY参数为IPC_PRIVATE;参数MSGFLG可以为以下:IPC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或结果。调用返回:成功返回消息队列描述字,否则返回-1。注:参数KEY设置成常数IPC_PRIVATE并不意味着其他进程不能访问该消息队列,只意味着即将创建新的消息队列。2)int msgrcv(int msgqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg)该系统调用从msgid代表的消息队列中读取一个消息,并把消息存储在msgp指向的msgbuf结构中。msqid为消息队列描述字;消息返回后存储在msgp指向的地址,msgsz指定msgbuf的mtext成员的长度(即消息内容的长度),msgtyp为请求读取的消息类型;读消息标志msgflg可以为以下几个常值的或:IPC_NOWAIT 如果没有满足条件的消息,调用立即返回,此时,errno=ENOMSG IPC_EXCEPT 与msgtyp0配合使用,返回队列中第一个类型不为msgtyp的消息 IPC_NOERROR 如果队列中满足条件的消息内容大于所请求的msgsz字节,则把该消息截断,截断部分将丢失。 msgrcv手册中详细给出了消息类型取不同值时(0; 0; =0),调用将返回消息队列中的哪个消息。msgrcv()解除阻塞的条件有三个:1.消息队列中有了满足条件的消息; 2. msqid代表的消息队列被删除; 3.调用msgrcv()的进程被信号中断; 调用返回:成功返回读出消息的实际字节数,否则返回-1。3)int msgsnd(int msgqid, struct msgbuf *msgp, size_t msgsz, int msgflg)向msgid代表的消息队列发送一个消息,即将发送的消息存储在msgp指向的msgbuf结构中,消息的大小由msgze指定。对发送消息来说,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待。造成msgsnd()等待的条件有两种:当前消息的大小与当前消息队列中的字节数之和超过了消息队列的总容量; 当前消息队列的消息数(单位个)不小于消息队列的总容量(单位字节数),此时,虽然消息队列中的消息数目很多,但基本上都只有一个字节。 调用返回:成功返回0,否则返回-1。4)int msgctl(int msgqid, int cmd, struct msgqid_ds *buf)该系统调用对由msqid标识的消息队列执行cmd操作,共有三种cmd操作:IPC_STAT、IPC_SET 、IPC_RMID。1. IPC_STAT:该命令用来获取消息队列信息,返回的信息存贮在buf指向的msqid结构中; 2. IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf指向的msqid结构中;可设置属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。 3. IPC_RMID:删除msqid标识的消息队列; 调用返回:成功返回0,否则返回-1。四、消息队列应用实例(1)题目:基于通信的字符串传递,实现在客户端输入一个字符串,服务器端进行倒序,再到客户端输出。client.c#include #include #include #define MSGKEY 75struct msgformlong mtype;char sour256;char dest256;int sour_pid;char mtext256;int length = sizeof(struct msgform)-sizeof(long);main()struct msgform msg;int msgqid,pid;msgqid = msgget(MSGKEY,0777);printf(msgqid=%dn,msgqid);pid=getpid();printf(input string :);scanf(%s,&msg.sour);msg.sour_pid = pid; msg.mtype=1;msgsnd(msgqid,&msg,length,0);msgrcv(msgqid,&msg,length,msg.sour_pid,0);printf(client: msgqid = %dn,msgqid);printf(receive from pid = %dn,msg.sour_pid);printf(receive string is %sn,msg.dest);server.c#include #include #include #define MSGKEY 75struct msgformlong mtype;char sour256;char dest256;int sour_pid;char mtext256;msg;int msgqid;int length = sizeof(struct msgform)-sizeof(long);main()int i,pid;extern cleanup();for(i=0;i=0;i-)msg.destj+ = msg.souri;printf(string is %sn,msg.dest);msgsnd(msgqid,&msg,length,0);cleanup()msgctl(msgqid,IPC_RMID,0);exit(0); (2)两个进程利用通信进行协作,实现简单的四则运算。一个进程称为客户进程(Client),其任务是从键盘上接收3个参数:两个操作数和一个运算操作符,然后把这3个参数发送给另一个进程,即服务器进程(Server);服务器进程接收客户进程的请求,并根据提供的运算操作符,对两个操作数进行运算,服务器把运算的结果返回给客户。client:#include #include #include #define MSGKEY 75struct msgformlong mtype;float a,b,result;char f3;int sour_pid;int length = sizeof(struct msgform)-sizeof(long);main()struct msgform msg;int msgqid,pid;msgqid = msgget(MSGKEY,0777);pid=getpid();printf(input a = );scanf(%f,&msg.a);printf(input b = );scanf(%f,&msg.b);printf(input operator = );scanf(%s,&msg.f);if(msg.f0=/ & msg.b=0)printf(Errorn);return 0;msg.sour_pid = pid; msg.mtype=1;msgsnd(msgqid,&msg,length,0);msgrcv(msgqid,&msg,length,msg.sour_pid,0);printf(result = %fn,msg.result);server:#include #include #include #define MSGKEY 75struct msgformlong mtype;float a,b,result;char f3;int sour_pid;int msgqid;int length = sizeof(struct msgform)-sizeof(long);main()struct msgform msg;int i,pid;extern cleanup();for(i=0;i20;i+)signal(i,cleanup);msgqid = msgget(MSGKEY,0777|IPC_CREAT);printf(server is waiting.n);for(;)msgrcv(msgqid,&msg,length,1,0);printf(a = %fn,msg.a);printf(b = %fn,msg.b);printf(f = %sn,msg.f);if(msg.f0=+)msg.result =msg. a+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仲夏促销活动策划方案
- 仿生青蛙活动方案
- 企业万圣节活动方案
- 企业人才周活动方案
- 企业全年活动方案
- 企业冰壶团建活动方案
- 企业十周年庆活动方案
- 企业咨询服务公司策划方案
- 企业基金会募捐活动方案
- 企业宣传前期活动方案
- 高一地理必修一地方时和区时课件
- 初中八年级数学同步作业判断题练习1840道
- 中国工业清洗协会职业技能证考试(化学清洗)试题
- 苏州市五年级下学期期末数学试题题及答案
- CPK分析表的模板
- 《敬畏生命向阳而生》的主题班会
- 企业清产核资报表
- 金融风险管理习题汇总第1-13章金融风险概述思考题-经济资本与风险调整绩效
- 2021年NICaS-(无创血流动力学监测系统)课件
- 消防维保协议书
- 膀胱功能训练技术(康复护理课件)
评论
0/150
提交评论