大连理工大学操作系统实验报告(附代码).pdf

上传人:wj 文档编号:14651395 上传时间:2023-06-25 格式:PDF 页数:20 大小:4.09MB
下载 相关 举报
大连理工大学操作系统实验报告(附代码).pdf_第1页
第1页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第2页
第2页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第3页
第3页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第4页
第4页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第5页
第5页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第6页
第6页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第7页
第7页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第8页
第8页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第9页
第9页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第10页
第10页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第11页
第11页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第12页
第12页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第13页
第13页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第14页
第14页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第15页
第15页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第16页
第16页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第17页
第17页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第18页
第18页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第19页
第19页 / 共20页
大连理工大学操作系统实验报告(附代码).pdf_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

大连理工大学操作系统实验报告(附代码).pdf

《大连理工大学操作系统实验报告(附代码).pdf》由会员分享,可在线阅读,更多相关《大连理工大学操作系统实验报告(附代码).pdf(20页珍藏版)》请在冰点文库上搜索。

大连理工大学操作系统实验报告(附代码).pdf

一.进程管理

(1)#include#include#includeintmain(void)pid_tpid;pid=fork();if(pid0)printf(errprinfork!

n);elseif(pid=0)pid_tpid2;pid2=fork();if(pid20)printf(errorinfork!

n);elseif(pid2=0)printf(Iamthechildprogress2,Idis%dn,getpid();elsewaitpid(pid2);printf(Iamthechildprogress1.Idis%dn,getpid();printf(mychildprogressIDis%dn,pid2);elsewaitpid(pid);printf(Iamtheparentprogress,IDis%dn,getpid();printf(mychildprogressIDis%dn,pid);wait(0);return1;

(2)#include#include#includeintmain(void)pid_tpid;pid=fork();if(pid0)printf(errorinfork!

n);elseif(pid=0)printf(Ianthechildprogress1,IDis%dn,getpid();elsepid_tpid2;pid2=fork();if(pid20)printf(errorinfork!

n);elseif(pid2=0)printf(Ianthechildprogress2,IDis%dn,getpid();elseprintf(Iamtheparentprogress,IDis%dn,getpid();printf(mychildprogress1IDis%dn,pid);printf(mychildprogress2IDis%dn,pid2);return1;(3)oswork3.cpp#include#include#include#includeusingnamespacestd;intmain(intargc,char*argv)if(argc2)coutyouneedtoinputenoughargs.endl;return0;stringcontent=argv1;inti=argc-1;char*p=newchar*i+1;for(intj=0;ji;j+)pj=argvj+1;pi=(char*)0;if(content=max)execve(max,p,NULL);elseif(content=min)execve(min,p,NULL);elseif(content=average)execve(average,p,NULL);return1;max.cpp#include#include#includeusingnamespacestd;intmain(intargc,char*argv)if(argc2)coutyouneedtoinputenoughargs.endl;return0;inti=argc-1;float*p=newfloati;for(intj=0;ji;j+)pj=atof(argvj+1);floattemp=p0;for(intj=1;jtemp)temp=pj;couttempendl;return1;min.cpp#include#include#includeusingnamespacestd;intmain(intargc,char*argv)if(argc2)coutyouneedtoinputenoughargs.endl;return0;inti=argc-1;float*p=newfloati;for(intj=0;ji;j+)pj=atof(argvj+1);floattemp=p0;for(intj=1;ji;j+)if(pjtemp)temp=pj;couttempendl;return1;average.cpp#include#include#includeusingnamespacestd;intmain(intargc,char*argv)if(argc2)coutyouneedtoinputenoughargs.endl;return0;inti=argc-1;float*p=newfloati;floatsum=0;for(intj=0;ji;j+)pj=atof(argvj+1);sum+=pj;coutsum/(argc-1)endl;return1;2.WinSock#include#include#includeusingnamespacestd;DWORDWINAPIfx1(LPVOIDlp);DWORDWINAPIfx2(LPVOIDlp);SOCKETlink,sender,s;/定义连接套接字和数据收发套接字sockaddr_inaddr1,addr2;/定义套接字地址结构intport=75;/默认使用端口char*friendIp;/对方ipboolconnected=false;/是否被连接上,连接成功才可以接收boolconnecting=false;/是否连接上对方,连接成功才可以发送boolclose=false;/是否已经关闭连接intmain()friendIp=newchar20;WSADatadata;WORDwVersion=MAKEWORD(2,0);:

WSAStartup(wVersion,&data);/初始化套接字库link=:

socket(AF_INET,SOCK_STREAM,0);/创建TCP套接字s=:

socket(AF_INET,SOCK_STREAM,0);addr1.sin_family=AF_INET;/初始化地址结构addr1.sin_port=htons(port);addr1.sin_addr.S_un.S_addr=INADDR_ANY;while

(1)if(:

bind(link,(sockaddr*)&addr1,sizeof(addr1)=0)/绑定套接字:

listen(link,5);cout你已成功启动.n;break;elseaddr1.sin_port=htons(+port);HANDLEh1=:

CreateThread(NULL,0,fx1,NULL,0,NULL);HANDLEh2=:

CreateThread(NULL,0,fx2,NULL,0,NULL);while

(1)if(close):

CloseHandle(h1);:

CloseHandle(h2);:

closesocket(link);:

WSACleanup();break;return0;/等待连接-发送信息(需等待连接上对方)DWORDWINAPIfx2(LPVOIDlp)/套接字地址结构大小intl=sizeof(addr2);chartext=连接成功.n;while(true)/等待对方连接sender=:

accept(link,(sockaddr*)&addr2,&l);if(sender!

=NULL)coutinet_ntoa(addr2.sin_addr)已成功连接.text1;fflush(stdin);:

send(s,text1,sizeof(text1),0);stringtemp(text1);if(temp=close)close=true;break;:

closesocket(s);return0;/连接线程-收取信息(需等待对方连接)DWORDWINAPIfx1(LPVOIDlp)sockaddr_inaddr3;intport0=75;addr3.sin_family=AF_INET;coutfriendIp;addr3.sin_addr.S_un.S_addr=inet_addr(friendIp);if(port=75)port0=port+1;elseport0=port-1;addr3.sin_port=htons(port0);while(true)if(:

connect(s,(sockaddr*)&addr3,sizeof(addr3)=0)cout已成功连接到friendIpendl;connecting=true;break;while(true)if(connected)TCHARtext50;:

recv(sender,text,sizeof(text),0);stringtemp(text);if(temp.size()!

=0)if(temp=close)close=true;break;couttempendl;:

closesocket(sender);return0;每个程序定义两个套接字,分别作客户端和服务器,所有程序公用一份代码。

3.生产者-消费者问题分别定义了一个生产者线程和消费者线程,以及三个事件对象,并初始化为空生产者每生产一次将waitFull置为有信号状态,消费者申请到waitFull再将其置空。

消费者与生产者同理以及数组访问权waitMutex同理。

#include#include#includeconstintN=15;usingnamespacestd;HANDLEwaitMutex;HANDLEwaitEmpty;HANDLEwaitFull;CRITICAL_SECTIONsection;/定义临界区对象char*p;intfull=0,empty=N,mutex=1;intin=0,out=0;DWORDWINAPIproducer(LPVOIDlp);DWORDWINAPIconsumer(LPVOIDlp);intmain()p=newcharN;memset(p,0,20*sizeof(char);/创建事件对象用于唤醒阻塞线程waitMutex=:

CreateEvent(NULL,false,false,NULL);waitEmpty=:

CreateEvent(NULL,false,false,NULL);waitFull=:

CreateEvent(NULL,false,false,NULL);InitializeCriticalSection(§ion);/初始化临界区对象HANDLEh1=:

CreateThread(NULL,0,producer,NULL,0,NULL);:

Sleep(16000);HANDLEh2=:

CreateThread(NULL,0,consumer,NULL,0,NULL);while

(1)if(getchar()=q)DeleteCriticalSection(§ion);:

CloseHandle(h1);:

CloseHandle(h2);return0;return0;DWORDWINAPIproducer(LPVOIDlp)while

(1)/请求emptywhile

(1)if(-empty0)/得不到empty则堵塞等待事件对象:

WaitForSingleObject(waitEmpty,INFINITE);:

ResetEvent(waitEmpty);break;elsebreak;/请求mtuexwhile

(1)EnterCriticalSection(§ion);/进入临界区if(-mutex0)LeaveCriticalSection(§ion);/得不到mtuex则堵塞等待事件对象:

WaitForSingleObject(waitMutex,INFINITE);:

ResetEvent(waitMutex);break;elseLeaveCriticalSection(§ion);break;pin=a;coutproducer:

在in写入aendl;in=(in+1)%N;:

Sleep(1000);/signal(v)full+;if(full=0):

SetEvent(waitFull);mutex+;if(mutex=0):

SetEvent(waitMutex);return0;DWORDWINAPIconsumer(LPVOIDlp)while

(1)/请求fullwhile

(1)if(-full0):

WaitForSingleObject(waitFull,INFINITE);/得不到full则堵塞等待事件对象:

ResetEvent(waitFull);break;elsebreak;/请求mtuexwhile

(1)EnterCriticalSection(§ion);/进入临界区if(-mutex0)LeaveCriticalSection(§ion);:

WaitForSingleObject(waitMutex,INFINITE);/得不到mtuex则堵塞等待事件对象:

ResetEvent(waitMutex);break;elseLeaveCriticalSection(§ion);break;coutconsumer:

在out取出aendl;out=(out+1)%N;:

Sleep(1000);/signal(v)empty+;if(empty=0):

SetEvent(waitEmpty);mutex+;if(mutex=0):

SetEvent(waitMutex);return0;4.进程调度

(1)根据分配给进程的页面数,定义相应大小的循环队列,对于页面引用串的每个页面,首先判断队列是否非空,如果是则判断是否该页面已经在队列里,如果在表明此页面已经在内存中,继续查看下一个引用;如果不在,则发出缺页信息,并判断队列是否已满,那么需将队首页面出队,之后将本次引用页面加入队尾。

而如果队列为空的话,直接发出缺页信息,并将引用页面直接加入队尾。

FIFO#includeusingnamespacestd;typedefstructint*p;intf;intr;Queue;intmiss=0;/记录缺页次数/初始化队列intinit_queue(Queue*q,intn)q-p=newintn+1;q-f=q-r=0;return1;/判断队列是否已满boolif_full(Queue*q,intsize)if(q-r+1)%size)=q-f)returntrue;elsereturnfalse;/判断是否已经在内存里boolif_already_in(Queue*q,intpage,intsize)if(q-r=q-f)returnfalse;inti=q-f;while(i!

=q-r)if(q-pi=page)/coutf!

=q-r)if(if_already_in(q,page,size)return0;cout缺页pageendl;miss+;elsemiss+;cout缺页pagef=(q-f+1)%size;q-pq-r=page;q-r=(q-r+1)%size;return1;intmain()intn=0,l=0,page;Queueq;coutn;init_queue(&q,n);coutl;inttemp=l;coutpage;Equeue(&q,page,n+1);cout缺页次数:

missendl;cout缺页率:

(miss*1.0)/tempendl;return0;LRU

(2)建立一个带头结点的链表,对于页面引用串的每个页面,首先判断链表是否非空,如果是则判断是否该页面已经在链表里,如果在表明此页面已经在内存中,那么将此节点取出放到链表尾部,表明此页面最近使用;如果不在,则发出缺页信息,并判断队列是否已满,那么需将链表头部页面删除,之后将本次引用页面加入链表尾部。

而如果链表为空的话,直接发出缺页信息,并将引用页面直接加入链表尾部。

#includeusingnamespacestd;typedefstructLNodestructLNode*next;intdata;LNode;typedefstructLNode*link;LNode*last;/最后一个节点intlength;intnum;LinkList;intmiss=0;intinit_List(LinkList*l,intn)l-length=n;l-num=0;l-link=newLNode1;l-link-data=-1;l-link-next=NULL;l-last=l-link;return0;boolif_full(LinkListl)if(l.num=l.length)returntrue;elsereturnfalse;LNode*if_already_in(LinkListl,intpage)LNode*p=l.link-next,*q=l.link;while(p!

=NULL)if(page=p-data)returnq;q=p;p=p-next;returnNULL;intEList(LinkList*l,intpage)if(l-link-next!

=NULL)LNode*temp1=if_already_in(*l,page);if(temp1!

=NULL)LNode*temp2=temp1-next;l-last-next=temp2;temp1-next=temp2-next;temp2-next=NULL;return1;cout缺页:

pageendl;miss+;elsecout缺页:

pagelink-next;l-link-next=temp-next;deletetemp;l-last-next=newLNode1;l-last=l-last-next;l-last-data=page;l-last-next=NULL;l-num+;return0;intmain()intn=0,l=0,page;LinkListq;coutn;init_List(&q,n);coutl;inttemp=l;coutpage;EList(&q,page);cout缺页次数:

missendl;cout缺页率:

(miss*1.0)/tempendl;return0;5.

(1)每次遍历当前未访问过的磁道与移动臂当前位置的距离,选出其中的最小值将其交换到数组第i个位置,i为当前遍历次数,这样下次遍历n-i个磁道即可。

SSTF#include#include#defineMAX1000usingnamespacestd;/*测试数据*40*2044404801276*/intSSTF(int*p,intn,intstart)/temp:

保存访问该柱面需移动的距离,temp2:

保存下一个访问的柱面intmin,temp=0,temp2=0,sum=0;for(inti=0;in;i+)min=MAX;for(intj=i;jn;j+)temp=abs(pj-start);if(tempmin)min=temp;temp2=j;sum+=min;start=ptemp2;/更新下次移动臂起始位置coutptemp2;/输出响应序列temp=pi;/将已调度的放在最前面pi=ptemp2;ptemp2=temp;returnsum;intmain()intinput,start,i=0;int*p=newintMAX;coutstart;coutinput)pi+=input;input=SSTF(p,i,start);coutn移动总量为:

inputendl;return0;

(2)每次遍历当前未访问过的其中相应方向上的磁道与移动臂当前位置的距离,选出最小值将其交换到数组第i个位置,i为当前遍历次数,这样下次遍历n-i个磁道即可。

如果当前方向上没有未访问的磁道则改变方向,此时i不增加。

SCAN#include#include#defineMAX1000usingnamespacestd;/false表示从小到大,true表示从大到小booldirection=false;intSCAN(int*p,intn,intstart)intsum=0,min=MAX,temp=0,temp2=0;boolflag;for(inti=0;in;i+)min=MAX;flag=false;for(intj=i;jn;j+)if(direction&(pj=start)temp=abs(pj-start);if(tempmin)min=temp;temp2=j;flag=true;if(!

flag)direction=!

direction;i-;elsesum+=min;start=ptemp2;/更新下次移动臂起始位置coutptemp2;/输出响应序列temp=pi;/将已调度的放在最前面pi=ptemp2;ptemp2=temp;returnsum;intmain()intinput,start,i=0;int*p=newintMAX;coutstart;coutinput)pi+=input;input=SCAN(p,i,start);coutn移动总量为:

inputendl;return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2