ImageVerifierCode 换一换
格式:PDF , 页数:20 ,大小:4.09MB ,
资源ID:14651395      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14651395.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(大连理工大学操作系统实验报告(附代码).pdf)为本站会员(wj)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

1、一.进程管理(1)#include#include#include int main(void)pid_t pid;pid=fork();if(pid 0)printf(errpr in fork!n);else if(pid=0)pid_t pid2;pid2=fork();if(pid2 0)printf(error in fork!n);else if(pid2=0)printf(I am the child progress 2,Id is%dn,getpid();else waitpid(pid2);printf(I am the child progress 1.Id is%dn,

2、getpid();printf(my child progress ID is%dn,pid2);else waitpid(pid);printf(I am the parent progress,ID is%dn,getpid();printf(my child progress ID is%dn,pid);wait(0);return 1;(2)#include#include#include int main(void)pid_t pid;pid=fork();if(pid 0)printf(error in fork!n);else if(pid=0)printf(I an the c

3、hild progress 1,ID is%dn,getpid();else pid_t pid2;pid2=fork();if(pid2 0)printf(error in fork!n);else if(pid2=0)printf(I an the child progress 2,ID is%dn,getpid();else printf(I am the parent progress,ID is%dn,getpid();printf(my child progress 1 ID is%dn,pid);printf(my child progress 2 ID is%dn,pid2);

4、return 1;(3)oswork3.cpp#include#include#include#include using namespace std;int main(int argc,char*argv)if(argc 2)coutyou need to input enough args.endl;return 0;string content=argv1;int i=argc-1;char*p=new char*i+1;for(int j=0;ji;j+)pj=argvj+1;pi=(char*)0;if(content=max)execve(max,p,NULL);else if(c

5、ontent=min)execve(min,p,NULL);else if(content=average)execve(average,p,NULL);return 1;max.cpp#include#include#include using namespace std;int main(int argc,char*argv)if(argc 2)coutyou need to input enough args.endl;return 0;int i=argc-1;float*p=new floati;for(int j=0;j i;j+)pj=atof(argvj+1);float te

6、mp=p0;for(int j=1;j temp)temp=pj;couttempendl;return 1;min.cpp#include#include#include using namespace std;int main(int argc,char*argv)if(argc 2)coutyou need to input enough args.endl;return 0;int i=argc-1;float*p=new floati;for(int j=0;j i;j+)pj=atof(argvj+1);float temp=p0;for(int j=1;j i;j+)if(pj

7、temp)temp=pj;couttempendl;return 1;average.cpp#include#include#include using namespace std;int main(int argc,char*argv)if(argc 2)coutyou need to input enough args.endl;return 0;int i=argc-1;float*p=new floati;float sum=0;for(int j=0;j i;j+)pj=atof(argvj+1);sum+=pj;coutsum/(argc-1)endl;return 1;2.Win

8、Sock#include#include#include using namespace std;DWORD WINAPI fx1(LPVOID lp);DWORD WINAPI fx2(LPVOID lp);SOCKET link,sender,s;/定义连接套接字和数据收发套接字 sockaddr_in addr1,addr2;/定义套接字地址结构 int port=75;/默认使用端口 char*friendIp;/对方 ip bool connected=false;/是否被连接上,连接成功才可以接收 bool connecting=false;/是否连接上对方,连接成功才可以发送 b

9、ool close=false;/是否已经关闭连接 int main()friendIp=new char20;WSAData data;WORD wVersion=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_ad

10、dr=INADDR_ANY;while(1)if(:bind(link,(sockaddr*)&addr1,sizeof(addr1)=0)/绑定套接字 :listen(link,5);cout你已成功启动.n;break;else addr1.sin_port=htons(+port);HANDLE h1=:CreateThread(NULL,0,fx1,NULL,0,NULL);HANDLE h2=:CreateThread(NULL,0,fx2,NULL,0,NULL);while(1)if(close):CloseHandle(h1);:CloseHandle(h2);:closeso

11、cket(link);:WSACleanup();break;return 0;/等待连接-发送信息(需等待连接上对方)DWORD WINAPI fx2(LPVOID lp)/套接字地址结构大小 int l=sizeof(addr2);char text=连接成功.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);st

12、ring temp(text1);if(temp=close)close=true;break;:closesocket(s);return 0;/连接线程-收取信息(需等待对方连接)DWORD WINAPI fx1(LPVOID lp)sockaddr_in addr3;int port0=75;addr3.sin_family=AF_INET;coutfriendIp;addr3.sin_addr.S_un.S_addr=inet_addr(friendIp);if(port=75)port0=port+1;else port0=port-1;addr3.sin_port=htons(po

13、rt0);while(true)if(:connect(s,(sockaddr*)&addr3,sizeof(addr3)=0)cout已成功连接到friendIpendl;connecting=true;break;while(true)if(connected)TCHAR text50;:recv(sender,text,sizeof(text),0);string temp(text);if(temp.size()!=0)if(temp=close)close=true;break;couttempendl;:closesocket(sender);return 0;每个程序定义两个套接

14、字,分别作客户端和服务器,所有程序公用一份代码。3.生产者-消费者问题 分别定义了一个生产者线程和消费者线程,以及三个事件对象,并初始化为空 生产者每生产一次将waitFull置为有信号状态,消费者申请到waitFull再将其置空。消费者与生产者同理以及数组访问权waitMutex同理。#include#include#include const int N=15;using namespace std;HANDLE waitMutex;HANDLE waitEmpty;HANDLE waitFull;CRITICAL_SECTION section;/定义临界区对象 char*p;int f

15、ull=0,empty=N,mutex=1;int in=0,out=0;DWORD WINAPI producer(LPVOID lp);DWORD WINAPI consumer(LPVOID lp);int main()p=new charN;memset(p,0,20*sizeof(char);/创建事件对象用于唤醒阻塞线程 waitMutex=:CreateEvent(NULL,false,false,NULL);waitEmpty=:CreateEvent(NULL,false,false,NULL);waitFull=:CreateEvent(NULL,false,false,N

16、ULL);InitializeCriticalSection(§ion);/初始化临界区对象 HANDLE h1=:CreateThread(NULL,0,producer,NULL,0,NULL);:Sleep(16000);HANDLE h2=:CreateThread(NULL,0,consumer,NULL,0,NULL);while(1)if(getchar()=q)DeleteCriticalSection(§ion);:CloseHandle(h1);:CloseHandle(h2);return 0;return 0;DWORD WINAPI producer(

17、LPVOID lp)while(1)/请求 empty while(1)if(-empty 0)/得不到 empty 则堵塞等待事件对象 :WaitForSingleObject(waitEmpty,INFINITE);:ResetEvent(waitEmpty);break;else break;/请求 mtuex while(1)EnterCriticalSection(§ion);/进入临界区 if(-mutex 0)LeaveCriticalSection(§ion);/得不到 mtuex 则堵塞等待事件对象:WaitForSingleObject(waitMutex,

18、INFINITE);:ResetEvent(waitMutex);break;else LeaveCriticalSection(§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);return 0;DWORD WINAPI consumer(LPVOID lp)while(1)/请求 full while(1)if(-full 0):

19、WaitForSingleObject(waitFull,INFINITE);/得不到 full 则堵塞等待事件对象 :ResetEvent(waitFull);break;else break;/请求 mtuex while(1)EnterCriticalSection(§ion);/进入临界区 if(-mutex 0)LeaveCriticalSection(§ion);:WaitForSingleObject(waitMutex,INFINITE);/得不到 mtuex则堵塞等待事件对象 :ResetEvent(waitMutex);break;else LeaveCri

20、ticalSection(§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);return 0;4.进程调度(1)根据分配给进程的页面数,定义相应大小的循环队列,对于页面引用串的每个页面,首先判断队列是否非空,如果是则判断是否该页面已经在队列里,如果在表明此页面已经在内存中,继续查看下一个引用;如果不在,则发出缺页信息,并判断队列是否已

21、满,那么需将队首页面出队,之后将本次引用页面加入队尾。而如果队列为空的话,直接发出缺页信息,并将引用页面直接加入队尾。FIFO#include using namespace std;typedef struct int*p;int f;int r;Queue;int miss=0;/记录缺页次数 /初始化队列 int init_queue(Queue*q,int n)q-p=new intn+1;q-f=q-r=0;return 1;/判断队列是否已满 bool if_full(Queue*q,int size)if(q-r+1)%size)=q-f)return true;else ret

22、urn false;/判断是否已经在内存里 bool if_already_in(Queue*q,int page,int size)if(q-r=q-f)return false;int i=q-f;while(i!=q-r)if(q-pi=page)/coutf!=q-r)if(if_already_in(q,page,size)return 0;cout缺页pageendl;miss+;else miss+;cout缺页pagef=(q-f+1)%size;q-pq-r=page;q-r=(q-r+1)%size;return 1;int main()int n=0,l=0,page;Q

23、ueue q;coutn;init_queue(&q,n);coutl;int temp=l;coutpage;Equeue(&q,page,n+1);cout缺页次数:missendl;cout缺页率:(miss*1.0)/tempendl;return 0;LRU(2)建立一个带头结点的链表,对于页面引用串的每个页面,首先判断链表是否非空,如果是则判断是否该页面已经在链表里,如果在表明此页面已经在内存中,那么将此节点取出放到链表尾部,表明此页面最近使用;如果不在,则发出缺页信息,并判断队列是否已满,那么需将链表头部页面删除,之后将本次引用页面加入链表尾部。而如果链表为空的话,直接发出缺页信

24、息,并将引用页面直接加入链表尾部。#include using namespace std;typedef struct LNode struct LNode*next;int data;LNode;typedef struct LNode*link;LNode*last;/最后一个节点 int length;int num;LinkList;int miss=0;int init_List(LinkList*l,int n)l-length=n;l-num=0;l-link=new LNode1;l-link-data=-1;l-link-next=NULL;l-last=l-link;re

25、turn 0;bool if_full(LinkList l)if(l.num=l.length)return true;else return false;LNode*if_already_in(LinkList l,int page)LNode*p=l.link-next,*q=l.link;while(p!=NULL)if(page=p-data)return q;q=p;p=p-next;return NULL;int EList(LinkList*l,int page)if(l-link-next!=NULL)LNode*temp1=if_already_in(*l,page);if

26、(temp1!=NULL)LNode*temp2=temp1-next;l-last-next=temp2;temp1-next=temp2-next;temp2-next=NULL;return 1;cout缺页:pageendl;miss+;else cout缺页:pagelink-next;l-link-next=temp-next;delete temp;l-last-next=new LNode1;l-last=l-last-next;l-last-data=page;l-last-next=NULL;l-num+;return 0;int main()int n=0,l=0,pag

27、e;LinkList q;coutn;init_List(&q,n);coutl;int temp=l;coutpage;EList(&q,page);cout缺页次数:missendl;cout缺页率:(miss*1.0)/tempendl;return 0;5.(1)每次遍历当前未访问过的磁道与移动臂当前位置的距离,选出其中的最小值将其交换到数组第i个位置,i为当前遍历次数,这样下次遍历n-i个磁道即可。SSTF#include#include#define MAX 1000 using namespace std;/*测试数据 *40 *20 44 40 4 80 12 76 */int

28、 SSTF(int*p,int n,int start)/temp:保存访问该柱面需移动的距离,temp2:保存下一个访问的柱面 int min,temp=0,temp2=0,sum=0;for(int i=0;i n;i+)min=MAX;for(int j=i;j n;j+)temp=abs(pj-start);if(temp min)min=temp;temp2=j;sum+=min;start=ptemp2;/更新下次移动臂起始位置 coutptemp2;/输出响应序列 temp=pi;/将已调度的放在最前面 pi=ptemp2;ptemp2=temp;return sum;int m

29、ain()int input,start,i=0;int*p=new intMAX;coutstart;coutinput)pi+=input;input=SSTF(p,i,start);coutn移动总量为:inputendl;return 0;(2)每次遍历当前未访问过的其中相应方向上的磁道与移动臂当前位置的距离,选出最小值将其交换到数组第 i 个位置,i 为当前遍历次数,这样下次遍历 n-i 个磁道即可。如果当前方向上没有未访问的磁道则改变方向,此时 i 不增加。SCAN#include#include#define MAX 1000 using namespace std;/false

30、 表示从小到大,true 表示从大到小 bool direction=false;int SCAN(int*p,int n,int start)int sum=0,min=MAX,temp=0,temp2=0;bool flag;for(int i=0;i n;i+)min=MAX;flag=false;for(int j=i;j n;j+)if(direction&(pj=start)temp=abs(pj-start);if(temp min)min=temp;temp2=j;flag=true;if(!flag)direction=!direction;i-;else sum+=min;start=ptemp2;/更新下次移动臂起始位置 coutptemp2;/输出响应序列 temp=pi;/将已调度的放在最前面 pi=ptemp2;ptemp2=temp;return sum;int main()int input,start,i=0;int*p=new intMAX;coutstart;coutinput)pi+=input;input=SCAN(p,i,start);coutn移动总量为:inputendl;return 0;

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

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