天津大学仁爱学院操作系统实验_第1页
天津大学仁爱学院操作系统实验_第2页
天津大学仁爱学院操作系统实验_第3页
天津大学仁爱学院操作系统实验_第4页
天津大学仁爱学院操作系统实验_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、天津大学仁爱学院计算机系操作系统原理实验报告 指导老师: 张磊 殷妍 姓名:徐亮亮 学号:600920375 班级:网络(2)班 完成日期: 2012年1 月 1 日操作系统课程实验(一)生产者消费者同步问题的算法实现一)问题描述:一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。二)整体功能设计采用多线程方式实现,有3个生产者,4个消费者,生产者当有空池时放入数据,消费者当有数据时取出并打印三)代码:/by 徐亮亮/2012

2、1 1#include <iostream>#include <semaphore.h>#include <pthread.h>#include <queue>#define p(a) sem_wait(&a)#define v(a) sem_post(&a)/定义生产者,消费者线程个数,缓冲区大小#define PRD 3#define CSM 4#define PSZ 15using namespace std;/定义剩余缓冲区,已有数据项,访问限制锁sem_t pool,iterms,mutex;/定义缓冲区queue &l

3、t;char> pdt;/生产者线程void* prod(void*argv) while(1) p(pool); p(mutex); pdt.push(*(char*)argv); cout<<"生产者产生一个数据:"<<*(char*)argv)<<endl; v(mutex); v(iterms); /消费者线程void* coms(void*argv) char tem; while(1) p(iterms); p(mutex); tem=pdt.front(); pdt.pop(); cout<<"消

4、费者消耗一个数据:"<<tem<<endl; v(mutex); v(pool); char prodt3= 'a','b','c'int main(int argv,char* argc) pthread_t prdPRD,csmCSM; /初始化信号量 sem_init(&pool,0,PSZ); sem_init(&iterms,0,0); sem_init(&mutex,0,1); /创建生产者线程 for(int i=0; i<PRD; +i) pthread_create

5、(&prdi,NULL,prod,(void*)&prodti); /创建消费者线程 for(int i=0; i<CSM; +i) pthread_create(&csmi,NULL,coms,NULL); sem_t mn; sem_init(&mn,0,0); p(mn); 四)使用说明 自行调整代码中的线程数目,编译后运行即可五)结果分析运行正确,截图如下六)体会信号量是并发编程的好帮手!操作系统课程实验(二)进程管理和调度的算法实现(1)问题概述进程调度是处理机管理的核心内容。本设计要求用高级语言编写和调试一个简单的进程调度程序。通过本实验可以加

6、深理解有关进程控制块、进程队列的概念,并体会和了解优先权调度算法和时间片轮转调度算法的具体实施办法。(2)整体功能及设计 如老师给的报告所述 /by 徐亮亮/2012 1 1#include<iostream>#include<string>using namespace std;struct proc string name,state; /PRIO/ROUND int pr; unsigned long cputime,needtime; int count; proc* next;proc *run(NULL),*ready(NULL),*finish(NULL)

7、,*tail(NULL);string algo;/打印函数void print() proc*tem; for(tem=ready;tem!=NULL;tem=tem->next) cout<<tem->name<<" "<<tem->state<<endl; for(tem=finish;tem!=NULL;tem=tem->next) cout<<tem->name<<" "<<tem->state<<endl; /进

8、程创建void create() proc* tem; if(ready=NULL) ready=new proc; tem=ready; else for(tem=ready;tem->next!=NULL;tem=tem->next); tem->next=new proc; tem=tem->next; cin>>tem->name; cin>>tem->pr; cin>>tem->needtime; tem->next=NULL; tem->count=0; tem->state="

9、;W" tail=tem; /循环调度void roundsch() run->cputime+=run->pr; run->needtime-=run->pr; +run->count; if(run->needtime>0) run->state="W" tail->next=run; tail=run; ready=ready->next; else run->state="O" if(ready=run) ready=run->next; else proc*tem

10、; for(tem=ready;tem->next!=run;tem=tem->next); tem->next=run->next; if(finish=NULL) finish=run; else for(proc*tem=finish;tem->next!=NULL;tem=tem->next); tem->next=run; tail->next=run; tail=run; ready=ready->next; /优先级调度void prisch() int maxm(0);proc* maxp; run->pr-=3; +

11、run->cputime; -run->needtime; +run->count; for(proc*tem=ready;tem!=NULL;tem=tem->next) if(tem->pr>maxm) maxm=tem->pr; maxp=tem; if(run->needtime>0) run->state="W" else run->state="O" if(ready=run) ready=run->next; else for(proc*tem=ready;tem-&g

12、t;next!=run;tem=tem->next); tem->next=run->next; if(finish=NULL) finish=run; else for(proc*tem=finish;tem->next!=NULL;tem=tem->next); tem->next=run; run=maxp; print(); void firstin() run=ready; run->state="R" if(algo="PRIORITY") prisch(); else if(algo="R

13、OUNDROBIN") roundsch(); int main() for(int i=0;i<5;+i) cout<<"输入进程1信息:"<<endl; create(); i_n:cout<<"输入运行类型:"<<endl; cin>>algo; firstin(); (4)使用说明 按提示输入信息,最后输入调度方式(5)结果分析数据量太少看不出两种调度的区别(6)设计体会无操作系统课程实验(三)内存管理和分配算法模拟1、 问题概述目的:页面置换算法的好坏直接关系到系统运行

14、的效率。本设计要求用高级语言编写和调试一个简单的内存页面调度程序。通过本实验可以加深理解有关最佳置换算法、先进先出置换算法和最近最久未使用置换算法的概念,并体会和了解这三种页面置换算法的具体实施办法。问题:1、页面流如下:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,12 首先利用最佳置换算法求出理想状态下的置换率。再将先进先出算法和最近最久未使用算法与最佳置换算法做比较,说明哪个缺页率较低。3 假设所用的物理块个数分别为3和4。二、整体功能及设计三、编程实现(代码)/by 徐亮亮/2012 1 1#include<iostream>using nam

15、espace std;void algorithm3_2() int cache3 = -1, -1, -1 ; int count = 0; int i, j, k = 0; for (i = 0; i < 3; i+) cachei = pagei; cout<<"第" <<(i + 1) << "次:"<<endl; for (j = 0; j < 3; j+) cout<<cachej<<" "<<endl; cout<<

16、;endl; for (i = 3; i < 20; i+) cout<<"第" <<(i + 1) << "次:"<<endl; if (pagei = cache0 | pagei = cache1 | pagei = cache2) goto M; else count+; cachek = pagei; k+; if (k = 3) k = 0; goto M; M: for (int m = 0; m < 3; m+) cout<<cachem<<"

17、"<<endl; continue; cout<<"缺页数:" <<count<<endl; double result; result=double (count)/20.0; cout<<"缺页率:" << result<<endl; cout<<endl; int page20= 7,0,1,2,0, 3,0,4,2,3,0,3,2,1,2, 0,1,7,0,1;void algorithm3_1() int cache3 = -1, -1,

18、-1, ,count = 0; int i, j, k, flag1, flag2, flag3, index; for (i = 0; i < 3; i+) cachei = pagei; cout<<"第" <<(i + 1) << "次:"<<endl; for (j = 0; j < 3; j+) cout<<cachej<<" "<<endl; cout<<endl; for (i = 3; i < 20; i+

19、) cout<<"第" <<(i + 1) << "次:"<<endl; if (cache0 = pagei | cache1 = pagei | cache2 = pagei) goto M; else count+; flag1 = flag2 = flag3 = 0; index = -1; for (j = i; j < 20; j+) if (cache0 = pagej) if (flag1 != 0) goto L; flag1 = 1; index = 0; else if (cac

20、he1 = pagej) if (flag2 != 0) goto L; flag2 = 1; index = 1; else if (cache2 = pagej) if (flag3 != 0) goto L; flag3 = 1; index = 2; L: continue; if (flag1 = 0) index = 0; else if (flag2 = 0) index = 1; else if (flag3 = 0) index = 2; cacheindex = pagei;M: for (k = 0; k < 3; k+) cout<<cachek &l

21、t;< " "<<endl; cout<<endl; cout<<"缺页数:" <<count<<endl; double result; result = double(count) / 20.0; cout<<"缺页率:" << result<<endl; cout<<endl; void algorithm3_3() int cache3= -1, -1, -1 ; int count = 0; int i, j,

22、flag1, flag2, flag3, index; for (i = 0; i < 3; i+) cout<<"第" <<(i + 1) << "次:"<<endl; cachei = pagei; for (j = 0; j < 3; j+) cout<<cachej<<" "<<endl; cout<<endl; for (i = 3; i < 20; i+) cout<<"第" &

23、lt;<(i + 1) << "次:"<<endl; if (cache0 = pagei | cache1 = pagei | cache2 = pagei) goto L; else count+; flag1 = flag2 = flag3 = 0; index = -1; for (j = i - 1; j >= 0; j-) if (flag1 * flag2 * flag3) != 0) goto N; if (cache0 = pagej) if (flag1 != 0) goto M; flag1 = 1; index =

24、 0; else if (cache1 = pagej) if (flag2 != 0) goto M; flag2 = 1; index = 1; else if (cache2 = pagej) if (flag3 != 0) goto M; flag3 = 1; index = 2; M: continue; N: cacheindex = pagei; L: for (int m = 0; m < 3; m+) cout<<cachem<<" "<<endl; cout<<endl; cout<<&q

25、uot;缺页数:" <<count<<endl; double result; result = double(count) / 20.0; cout<<"缺页率:" << result<<endl; cout<<endl; void algorithm4_1() int cache4 = -1, -1, -1, -1 ; int count = 0; int i, j, k, flag1, flag2, flag3, flag4, index; for (i = 0; i < 4; i

26、+) cachei = pagei; cout<<"第" <<(i + 1) << "次:"<<endl; for (j = 0; j < 4; j+) cout<<cachej<<" "<<endl; cout<<endl; for (i = 5; i < 20; i+) cout<<"第" <<(i + 1) << "次:"<<endl;

27、 if (cache0 = pagei | cache1 = pagei | cache2 = pagei | cache 3=pagei) goto M; else count+; flag1 = flag2 = flag3 = flag4 = 0; index = -1; for (j = i; j < 20; j+) if (cache0 = pagej) if (flag1 != 0) goto L; flag1 = 1; index = 0; else if (cache1 = pagej) if (flag2 != 0) goto L; flag2 = 1; index =

28、1; else if (cache2 = pagej) if (flag3 != 0) goto L; flag3 = 1; index = 2; else if (cache3 = pagej) if (flag4 != 0) goto L; flag4 = 1; index = 3; L: continue; if (flag1 = 0) index = 0; else if (flag2 = 0) index = 1; else if (flag3 = 0) index = 2; else if (flag4 = 0) index = 3; cacheindex = pagei;M: f

29、or (k = 0; k < 4; k+) cout<<cachek<<" "<<endl; cout<<endl; cout<<"缺页数:" <<count<<endl; double result; result = double(count) / 20.0; cout<<"缺页率:" << result<<endl; cout<<endl; void algorithm4_2() int ca

30、che4= -1, -1, -1, -1 ; int count = 0; int i, j, k = 0; for (i = 0; i < 4; i+) cachei = pagei; cout<<"第" <<(i + 1) << "次:"<<endl; for (j = 0; j < 4; j+) cout<<cachej<<" "<<endl; cout<<endl; for (i = 5; i < 20; i+)

31、cout<<"第" <<(i + 1) << "次:"<<endl; if (pagei = cache0 | pagei = cache1 | pagei = cache2) goto M; else count+; cachek = pagei; k+; if (k = 4) k = 0; goto M; M: for (int m = 0; m < 4; m+) cout<<cachem<<" "<<endl; continue; cout

32、<<"缺页数:" <<count<<endl; double result; result = double(count) / 20.0; cout<<"缺页率:" << result<<endl; cout<<endl; int main() while (true) cout<<"请设置物理块数:1. 3块 2. 4块"<<endl; int ph_ch; cin>>ph_ch;L: int ch_al; swi

33、tch (ph_ch) case 3: cout<<"请选择算法:1.最佳置换算法 2.先进先出算法 3.最近最久未使用算法"<<endl; cin>>ch_al; switch (ch_al) case 1: algorithm3_1(); break; case 2: algorithm3_2(); break; case 3: algorithm3_3(); break; default : cout<<"输入错误!请重新输入!"<<endl; goto L; break; case 4:

34、 cout<<"请选择算法:1.最佳置换算法 2.先进先出算法 3.最近最久未使用算法"<<endl; cin>>ch_al; switch (ch_al) case 1: algorithm4_1(); break; case 2: algorithm4_2(); break; case 3: algorithm4_3(); break; default : cout<<"请重新输入!"<<endl; goto L; break; default : cout<<"请重新

35、输入!"<<endl; break; while(1); return 0; 四、使用说明 运行后,按输出提示输入相应数据即可运行结果分析不同块数的时候最优调度最有效。六、设计体会测试数据太少,导致结果分析不明朗。操作系统课程实验(四)磁盘调度算法模拟1、 问题概述目的: 磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘是,应采用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。目前最成用的磁盘调度算法有先来先服务(FCFS),最短寻道时间优先(SSTF),以及扫描算法(SCAN)。通过本实验可以加深理解有关磁盘调度的目标,并体会和了解最短寻道时间优先算法和扫

36、描算法的具体实施办法。问题:1 从100#磁道开始,被访问的磁道号分别为:55,58,39,18,90,160,150,38,184。2 要求用最短寻道时间优先算法的和扫描算法实现磁盘调度。3 记录下每访问一个磁道磁头移动的磁道数,并计算平均寻道长度(平均移动磁道数)。2、 实验要求与设计分别用两种算法实现磁盘调度。在实验结果分析中,将比较结果以列表的形式表现出来。用数组(或链表)TR 存储待访问磁道号,将每次磁头移动磁道数用数组AR 存储。输出结果应如下例:(注意空格)15050160101842418166382039155165839032平均寻道长度:35.83、 编程实现(代码)/by徐亮亮/2012 1 1#include<iostream>#include<cstdlib>#include<cmath>using namespace std;int TR9 = 55, 58, 39, 18, 90, 160, 150, 38, 184;int main() int mark,num,num

温馨提示

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

评论

0/150

提交评论