《东北大学操作系统实验报告.pdf》由会员分享,可在线阅读,更多相关《东北大学操作系统实验报告.pdf(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课程编号:课程编号:B080000070B080000070操作系统实验报告操作系统实验报告姓姓班班实实开开开开报报评评验验设设设设告告定定名名学学时时日日成成名名级级称称期期间间期期绩绩评评评评定定指指导导教教师师石凯石凯操作系统实验操作系统实验2016-20172016-2017 第二学期第二学期第第 1111 周第周第 1818 周周20172017 年年 7 7 月月 3 3 日日定定日日人人石凯石凯期期20172017 年年 7 7 月月 5 5 日日东北大学软件学院东北大学软件学院实验一实验一进程的同步与互斥进程的同步与互斥实验题目:实验题目:通过学习和分析基础例子程序,使用 wi
2、ndows 进程和线程编程(也可以采用 Java 或Unix/Linux 的 POSIX 线程编程)实现一个简单的生产者/消费者问题的程序。关键代码:关键代码:importimport java.util.ArrayList;publicpublic classclass Produce publicpublic Object object;publicpublic ArrayList list;/用list存放生产之后的数据,最大容量为1publicpublic Produce(Object object,ArrayList list )thisthis.object = object;th
3、isthis.list = list; publicpublic voidvoid produce() synchronizedsynchronized (object) /*只有list为空时才会去进行生产操作*/trytry whilewhile(!list.isEmpty() System.outout.println(生产者+Thread.currentThread().getName()+ waiting);object.wait(); intint value = 9999;list.add(value); System. outout.println(生产者+Thread.cur
4、rentThread().getName()+Runnable);object.notifyAll();/然后去唤醒因object调用wait方法处于阻塞状态的线程 catchcatch (InterruptedException e) e.printStackTrace(); importimport java.util.ArrayList;publicpublic classclass Consumer publicpublic Object object;publicpublic ArrayList list;/用list存放生产之后的数据,最大容量为1publicpublic Cons
5、umer(Object object,ArrayList list )thisthis.object = object;thisthis.list = list; publicpublic voidvoid consmer() synchronizedsynchronized (object) trytry /*只有list不为空时才会去进行消费操作*/whilewhile(list.isEmpty() System.outout.println(消费者+Thread.currentThread().getName()+ waiting);object.wait(); list.clear()
6、; System. outout.println(消费者+Thread.currentThread().getName()+Runnable);object.notifyAll();/然后去唤醒因object调用wait方法处于阻塞状态的线程 catchcatch (InterruptedException e) e.printStackTrace(); 实验结果:实验结果:思考题:思考题:(1)如何控制进程间的相互通信?答:主要有:管道,信号,共享内存,消息队列(2)什么是进程的同步?什么是进程的互斥?分别有哪些实现方式?答:进程互斥是进程之间的间接制约关系。 当一个进程进入临界区使用临界资
7、源时, 另一个进程必须等待。只有当使用临界资源的进程退出临界区后, 这个进程才会解除阻塞状态。 进程同步也是进程之间直接的制约关系, 是为完成某种任务而建立的两个或多个线程, 这个线程需要在某些位置上协调他们的工作次序而等待、 传递信息所产生的制约关系。 进程间的直接制约关系来源于他们之间的合作。可以利用信号量来实现进程的同步与互斥。实验二实验二处理机调度处理机调度实验题目:实验题目:设计一个按优先权调度算法实现处理器调度的程序设计一个按优先权调度算法实现处理器调度的程序数据结构及符号说明:数据结构及符号说明:typedef struct pb /每个进程char pname5; /进程的名字
8、char status8; /进程的状态int time; /要求运行时间int pri; /进程的优先权int cputime; /cpu时间struct pb *p; /队列结构,它的下一个。pbc, *pbcp;流程设计:流程设计:关键代码:关键代码:void attemper(pbcp pbca) pbcp pItem = pbca-p;pbcp pIterator = pbca-p;while (pIterator!= NULL) if (pItem-time -= 1) = 0) pItem-cputime += 1;pItem-pri -= 1;strcpy(pItem-stat
9、us, finish);if (pItem-pri pri&pIterator-time != 0) pIterator = pIterator-p;pItem = pIterator;else pIterator = pbca-p;while (pIterator != NULL) printPbc(pbca);if (pIterator-cputime != 0&pIterator!=pItem&pIterator-time!=0) pIterator = pIterator-p;pIterator-cputime += 1;strcpy(pIterator-status, ready);
10、strcpy(pItem-status, run);pItem-cputime += 1;pItem-pri -= 1;strcpy(pItem-status, run);运行结果:运行结果:思考题:思考题:(1)处理机调度的目的?答:主要还是为了优化软件的运行。(2)你实现优先权调度算法的思想?答:遍历一次,取出优先权最高的,判断该进程是否还要运行,要允许就运行它。实验三实验三存储管理存储管理实验题目:实验题目:模拟分页式存储管理中硬件的地址转换和产生缺页中断。模拟分页式存储管理中硬件的地址转换和产生缺页中断。用先进先出(用先进先出(FIFOFIFO)页面调度算法处理缺页中断。)页面调度算法
11、处理缺页中断。数据结构及符号说明:数据结构及符号说明:int paper_table75 /7 乘 5 的页表char *oper_char12 /每次操作int oper_table122 /指令序列的单元号和操作存储int fifo_table4 / 先进先出表,记录那几个在内存中int static count = 0; /记下哪个先来的流程设计:流程设计:核心代码:核心代码:void scheduler(void)int i, page, page_block, page_move;for (i = 0; i12; i+)page = *(oper_table + i);printf(
12、-%d-n, i);if (*(*(paper_table + page) + 1) = 1) /在页表中else printf(n);if (*(*(paper_table + fifo_tablecount % 4) + 4) = 1) else *(*(paper_table + page) + 1) = 1;/移入内存,改变在内存中的标志为1*(*(paper_table + fifo_tablecount) + 1) = 0;/改变在内存中的标志为0*(*(paper_table + page) + 2) = *(*(paper_table + fifo_tablecount) +
13、2); /*(*(paper_table + fifo_tablecount) + 2) = 0;/重置页表里的主存块号值fifo_tablecount % 4 = *(*(oper_table + i) + 0);/更新fifo表page_block = *(*(paper_table + page) + 2);page_move = *(*(oper_table + i) + 1);printf(换入内存成功,块号:%d;偏移量:%d;物理地址:%d;n, page_block,fifo_print();count+;count = count % 4;printf(缺页中断,被替换的页号
14、为:%d;页被直接替换n,printf(缺页中断,被替换的页号为:%d;页修改存入硬盘n,*(*(paper_table + fifo_tablecount % 4) + 4) = 0;page_block = *(*(paper_table + page) + 2);page_move = *(*(oper_table + i) + 1);printf(在内存中, 块号: %d;偏移量: %d; 物理地址: %dn, page_block, page_move,*(*(paper_table + count) + 4) = 1;/修改变为1fifo_print();page_block *
15、128 + page_move);fifo_tablecount);fifo_tablecount);重置页表里的主存块号值page_move, page_block * 128 + page_move);实验结果:实验结果:思考题:思考题:(1)先进先出页面调度算法的思想?答:基本思想:先进入内存的页面先淘汰,后进入内存的后淘汰(2) 最近最少用 (LRU) 页面调度算法思想?答: 基本思想: 最近用的最少的最先淘汰。(3)比较两种调度算法的效率(哪种调度算法使产生缺页中断的次数少)?答:从作业题我感觉最近最少使用优于先进先出。(4)分析在什么情况下采用哪种调度算法更有利?答:如果页访问高度
16、随机的话,不见得 LRU 好,LRU 是根据最近最少使用的来决定哪个页表被替换,但过去很多时候不能代表未来。实验四实验四文件系统文件系统实验题目:实验题目:用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。数据结构及符号说明:数据结构及符号说明:struct TYPE_UFD/主文件目录;struct TYPE_MFD/用户文件目录;struct TYPE_AFD/打开文件目录,即运行文件目录;class TYPE_FILE_SYSTEM/文件系统类public:;void Initial(void);void St
17、art(void);intintint_Number_Users; /用户数_Number_Files; /文件数_MaxNumber_Open_Files; /最大打开文件数int File_ID; /文件IDbool Read;bool Write;bool Execute;int Pointer;stringUser_Name; /用户名TYPE_UFD *Pointer;stringFile_Name; /文件名bool Read; /是否可读可写可执行bool Write;bool Execute;intLength_File; /文件长度private:TYPE_MFD *_MFD
18、;TYPE_UFD *_UFD;TYPE_AFD *_AFD;流程设计:流程设计:关键代码:关键代码:void TYPE_FILE_SYSTEM:Start(void)int User_ID;int i, temp_int;string temp;char choice;int Number_Open_Files;string User_Name;string Command;TYPE_UFD *UFD;dodocout 已创建指令有: create delete open dir diropen write read logout shutdowncout User_Name;for (Us
19、er_ID = 0; User_ID_Number_Users; User_ID+)if (User_ID = _Number_Users)cout 用户名错误,请再次输入 . endl;if (_MFDUser_ID.User_Name = User_Name)break;nn; while (User_ID = _Number_Users);cout 欢迎登录 , User_Name ! endl;UFD = _MFDUser_ID.Pointer;for (i = 0; i_MaxNumber_Open_Files; i+)Number_Open_Files = 0;docout C:
20、User_Name ;cin Command;if (Command = dir)cout endl;cout 打开用户 User_Name 的文件 endl;cout t Statet Lengtht File name endl;for (i = 0; i_Number_Files; i+)if (UFDi.Length_File != -1)cout t;if (UFDi.Read = true)cout R;cout -;cout W;elseif (UFDi.Write = true)_AFDi.File_ID = -1;elsecout -;cout E;cout -;if (UF
21、Di.Execute = true)elsecout t;cout UFDi.Length_File;cout t;cout UFDi.File_Name endl;cout endl;else if (Command = diropen)else if (Command = create)cout endl;cout 打开用户 User_Name 的文件 endl;cout t Statet Open File name endl;for (i = 0; i_MaxNumber_Open_Files; i+)cout endl;if (_AFDi.File_ID != -1)cout t;i
22、f (_AFDi.Read = true)cout R;cout -;cout W;cout -;cout E;cout -;elseif (_AFDi.Write = true)elseif (_AFDi.Execute = true)elsecout t;cout UFD_AFDi.File_ID.File_Name endl;for (i = 0; i_Number_Files; i+)cout 请输入新文件信息: endl;cout temp;UFDi.File_Name = temp;cout 文件权限 : ;cout Read (y/n):;dochoice = getch();
23、while (choice != y & choice != n);if (choice = y)UFDi.Read = true;UFDi.Read = false;elsecout endl;cout Write (y/n):;dochoice = getch(); while (choice != y & choice != n);if (choice = y)UFDi.Write = true;UFDi.Write = false;elsecout endl;cout Execute (y/n):;dochoice = getch(); while (choice != y & cho
24、ice != n);if (choice = y)UFDi.Execute = true;UFDi.Execute = false;elsecout endl;cout temp_int;if (UFDi.Length_File = -1)break;if (i = _Number_Files)cout Error: 已有名为 _Number_Files 的文件. 0)UFDi.Length_File = temp_int;cout 新文件 UFDi.File_Name 已建立! endl;else if (Command = delete)else if (Command = open)if
25、 (Number_Open_Files = _MaxNumber_Open_Files)cout Error: 你已经打开了 Number_Open_Files 文件. cout temp;for (i = 0; i_Number_Files; i+)UFDi.Length_File = -1;cout 文件 UFDi.File_Name 已删除 . endl;if (UFDi.Length_File != -1) & (UFDi.File_Name = temp)break;if (i = _Number_Files)cout 文件名错误,请再次输入 . endl;elseendl;else
26、cout temp;for (i = 0; i_Number_Files; i+)Number_Open_Files+;for (temp_int = 0; temp_int_MaxNumber_Open_Files; temp_int+)if (_AFDtemp_int.File_ID = -1)break;if (UFDi.Length_File != -1) & (UFDi.File_Name = temp)break;if (i = _Number_Files)cout 文件名错误,请再次输入 . endl;else_AFDtemp_int.File_ID = i;_AFDtemp_i
27、nt.Pointer = 0;cout 请定义打开方式 : endl;if (UFDi.Read = true)elseelseelse_AFDtemp_int.Execute;cout Execute (y/n):;dochoice = getch(); while (choice != y & choice != n);if (choice = y)_AFDtemp_int.Execute = true;_AFDtemp_int.Execute = false;elsecout endl;_AFDtemp_int.Write = false;if (UFDi.Execute = true)
28、cout Write (y/n):;dochoice = getch(); while (choice != y & choice != n);if (choice = y)_AFDtemp_int.Write = true;_AFDtemp_int.Write = false;elsecout endl;_AFDtemp_int.Read = false;if (UFDi.Write = true)cout Read (y/n):;dochoice = getch(); while (choice != y & choice != n);if (choice = y)_AFDtemp_int
29、.Read = true;_AFDtemp_int.Read = false;elsecout endl;else if (Command = logout)else if (Command = close)else if (Command = read)cout temp;for (i = 0; i_Number_Files; i+)if (UFDi.Length_File != -1) & (UFDi.File_Name = temp)break;cout temp;for (i = 0; i_Number_Files; i+)for (temp_int = 0; temp_int_Max
30、Number_Open_Files; temp_int+)_AFDtemp_int.File_ID = -1;Number_Open_Files-;cout 文件 temp 已关闭 . endl;if (_AFDtemp_int.File_ID = i)break;if (UFDi.Length_File != -1) & (UFDi.File_Name = temp)break;cout 再见 , User_Name ! endl;break;cout 文件 temp 已打开 . endl;if (i = _Number_Files)cout 文件名错误,请再次输入 . endl;elsei
31、f (temp_int = _MaxNumber_Open_Files)cout 文件 temp 未打开 . endl;elseif (i = _Number_Files)cout 文件名错误,请再次输入 . endl;elsefor (temp_int = 0; temp_int_MaxNumber_Open_Files; temp_int+)if (_AFDtemp_int.Read = true)cout 文件 temp 成功读取. endl;cout Error: 文件打开模式错误 . endl;elseif (_AFDtemp_int.File_ID = i)break;if (te
32、mp_int = _MaxNumber_Open_Files)cout 文件 temp 未打开 . endl;elseelse if (Command = write)else if (Command = shutdown)cout 正在注销. endl;cout 再见 , User_Name ! endl;cout temp;for (i = 0; i_Number_Files; i+)for (temp_int = 0; temp_int_MaxNumber_Open_Files; temp_int+)if (_AFDtemp_int.Write = true)cout 文件 temp 成
33、功写入. endl;cout Error: 文件打开模式错误 . endl;elseif (_AFDtemp_int.File_ID = i)break;if (UFDi.Length_File != -1) & (UFDi.File_Name = temp)break;if (i = _Number_Files)cout 文件名错误,请再次输入 . endl;elseif (temp_int = _MaxNumber_Open_Files)cout 文件 temp 未打开 . endl;elsecout 正在关机. endl;break;elsecout 指令错误,请再次输入 . endl; while (Command != logout & Command != shutdown); while (Command != shutdown);实验结果:实验结果:评价表格考核标准(1)正确理解和掌握实验所涉及的概念和原理(20%);(2)按实验要求合理设计数据结构和程序结构(20%);(3)运行结果正确(20%);(4)认真记录实验数据,原理及实验结果分析准确(20%);得分(5) 实验过程中, 具有严谨的学习态度和认真、 踏实、 一丝不苟的科学作风 (10%) ;(7)实验报告规范(10%)。合计
限制150内