《东北大学操作系统实验报告.doc》由会员分享,可在线阅读,更多相关《东北大学操作系统实验报告.doc(23页珍藏版)》请在金锄头文库上搜索。
1、课程编号:B操作系统实验报告姓名班级指导教师石凯实验名称操作系统实验开设学期2016-2017第二学期开设时间第11周第18周报告日期2017年7月3日评定成绩评定人石凯评定日期2017年7月5日东北大学软件学院实验一 进程的同步与互斥实验题目:通过学习和分析基础例子程序,使用windows进程和线程编程(也可以采用Java 或Unix/Linux的POSIX线程编程)实现一个简单的生产者/消费者问题的程序。关键代码:import java.util.ArrayList; public class Produce public Object object; public ArrayList l
2、ist;/用list存放生产之后的数据,最大容量为1 public Produce(Object object,ArrayList list ) this.object = object; this.list = list; public void produce() synchronized (object) /*只有list为空时才会去进行生产操作*/ try while(!list.isEmpty() System.out.println(生产者+Thread.currentThread().getName()+ waiting); object.wait(); int value =
3、9999; list.add(value); System.out.println(生产者+Thread.currentThread().getName()+ Runnable); object.notifyAll();/然后去唤醒因object调用wait方法处于阻塞状态的线程 catch (InterruptedException e) e.printStackTrace(); import java.util.ArrayList;public class Consumer public Object object; public ArrayList list;/用list存放生产之后的数
4、据,最大容量为1 public Consumer(Object object,ArrayList list ) this.object = object; this.list = list; public void consmer() synchronized (object) try /*只有list不为空时才会去进行消费操作*/ while(list.isEmpty() System.out.println(消费者+Thread.currentThread().getName()+ waiting); object.wait(); list.clear(); System.out.prin
5、tln(消费者+Thread.currentThread().getName()+ Runnable); object.notifyAll();/然后去唤醒因object调用wait方法处于阻塞状态的线程 catch (InterruptedException e) e.printStackTrace(); 实验结果:思考题:(1)如何控制进程间的相互通信?答:主要有:管道,信号,共享内存,消息队列(2)什么是进程的同步?什么是进程的互斥?分别有哪些实现方式?答:进程互斥是进程之间的间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个
6、进程才会解除阻塞状态。进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系来源于他们之间的合作。可以利用信号量来实现进程的同步与互斥。实验二 处理机调度实验题目:设计一个按优先权调度算法实现处理器调度的程序数据结构及符号说明: typedef struct pb /每个进程char pname5; /进程的名字char status8; /进程的状态int time; /要求运行时间int pri; /进程的优先权int cputime; /cpu时间struct pb *p
7、; /队列结构,它的下一个。pbc, *pbcp;流程设计:关键代码: void attemper(pbcp pbca) pbcp pItem = pbca-p;pbcp pIterator = pbca-p;while (pIterator!= NULL) if (pItem-pri pri&pIterator-time != 0) pItem = pIterator;pIterator = pIterator-p;if (pItem-time -= 1) = 0) pItem-cputime += 1;pItem-pri -= 1;strcpy(pItem-status, finish);
8、else strcpy(pItem-status, run);pItem-cputime += 1;pItem-pri -= 1;strcpy(pItem-status, run);pIterator = pbca-p;while (pIterator != NULL) if (pIterator-cputime != 0&pIterator!=pItem&pIterator-time!=0) pIterator-cputime += 1;strcpy(pIterator-status, ready);pIterator = pIterator-p;printPbc(pbca); 运行结果:
9、思考题:(1)处理机调度的目的?答:主要还是为了优化软件的运行。(2)你实现优先权调度算法的思想?答:遍历一次,取出优先权最高的,判断该进程是否还要运行,要允许就运行它。 实验三 存储管理实验题目:模拟分页式存储管理中硬件的地址转换和产生缺页中断。用先进先出(FIFO)页面调度算法处理缺页中断。数据结构及符号说明:int paper_table75 /7乘5的页表char *oper_char12 /每次操作int oper_table122 /指令序列的单元号和操作存储int fifo_table4 / 先进先出表,记录那几个在内存中int static count = 0; /记下哪个先来
10、的流程设计:核心代码:void scheduler(void)int i, page, page_block, page_move;for (i = 0; i12; i+)page = *(oper_table + i);printf(-%d-n, i);if (*(*(paper_table + page) + 1) = 1) /在页表中page_block = *(*(paper_table + page) + 2);page_move = *(*(oper_table + i) + 1);printf(在内存中,块号:%d;偏移量:%d;物理地址:%dn, page_block, pag
11、e_move, page_block * 128 + page_move);*(*(paper_table + count) + 4) = 1;/修改变为1fifo_print();else if (*(*(paper_table + fifo_tablecount % 4) + 4) = 1) printf(缺页中断,被替换的页号为:%d;页修改存入硬盘n, fifo_tablecount);*(*(paper_table + fifo_tablecount % 4) + 4) = 0;else printf(缺页中断,被替换的页号为:%d;页被直接替换n, fifo_tablecount);*(*(paper_table + page) + 1) = 1;/移入内存,改变在内存中的标志为1*(*(paper_table + fifo_tablecount) + 1) = 0;/改变在内存中的标志为0*(*(paper_table + page) + 2) = *(*(paper_table + fifo_tablecount) + 2);/重置页表里的主存块号值*(*(paper_table + fifo_tablecount) + 2) = 0;/重置页表里的主存块号值fifo_tablecount