1、计算机操作系统实验课实验报告实验报告实验课程: 计算机操作系统 学生姓名: XXX 学 号: XXXX 专业班级: 软件 2014年12月25日实验一 熟悉Windows XP中的进程和线程 一、 实验名称熟悉Windows XP中的进程和线程二、 实验目的1、熟悉Windows中任务管理器的使用。2、通过任务管理器识别操作系统中的进程和线程的相关信息。 3、掌握利用spy+.exe来察看Windows中各个任务的更详细信息。三、 实验结果分析1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。
2、2、 调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表:表一:统计进程的各项主要信息序号进程名称进程ID线程数量占用内存优先级占CPU时间虚拟内存1Bddownloader.exe7312329980k标准0:00:009200k2Taskmgr.exe722834124k高0:00:043372k3BaiDuSdTray.exe5144308588k标准0:00:1543652k4QQprotect.exe46681120700k标准0:00:0123572k5TXPlatform.exe590831716k标准0:00:002128k6Explorer.exe5
3、8161730340k标准0:00:1121720k3、 启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是 任务管理器无法结束进程 ,原因是 该系统是系统进程 。4、 在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化 桌面上图标菜单都消失了 、得到的结论 explorer.exe是管理桌面图标的文件 (说出explorer.exe进程的作用)。
4、5、运行“spy+.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:进程:explorer.exe 中的各个线程序号进程ID线程ID基本优先级当前优先级CPU时间上下文开关1000016B800000104 8100:00:0649983362000016B8000003EC15150:00:0083000016B8000009048100:00:00114000016B800000A0C8100:00:00135000016B800001280880:00:078171386000016B8000013D88100:00:002
5、3266、注意某些线程前有“”,如图所示:,说明二者之间的差异 前有“+”其器线程下有窗口 。四、 心得体会 通过本次实验,我了解到了windows系统中进程的管理与操作,我了解了如何切出任务管理器,任务管理器应用与其他与进程相关的知识,明白了有些系统程序不能够关闭,系统中的进程与线程虽然很多,但是其中有许多关联,只要弄清楚其中的关联那么就能够运用好进程与线程,达到我们的目的。 每个进程下都包含着许多线程,我们控制进程来达到控制线程的目的只有我们了解好掌握还进程,我们才能更好的运用线程,更好的控制运用计算机。实验二 进程调度一、 实验名称进程调度二、 实验目的1、使学生进一步理解进程的概念,并
6、在此基础上掌握有关PCB、进程队列的概念。2、掌握进程基本状态的转化;3、 掌握进程调度的策略、具体实施方法以及系统性能的评价方法。三、实验结果分析简化的实验代码如下:#include#include/调用STL中的优先队列 using namespace std;/定义一个PCB进程类 class PCBpublic:char name10;/进程的名字 int runtime;/该进程的运行时间 int priority;/该进程的优先级 char state;/该进程的状态 PCB* next;/指向下个进程的指针 void print()const/输出进程的信息 cout(name=
7、name,runtime=runtime,state=state,priority=priority)endl;class PCBSortCriterion/优先队列的优先准则类 public:bool operator()(const PCB & p1,const PCB & p2)const/仿函数确定优先准则,从大到小 return (p1.priority p2.priority);PCB* pcb=new PCBnumber;/一个PCB的数组用来保存就绪进程PCB* p1=new PCBnumber;/一个PCB的数组用来保存已经结束的进程coutendl;PCB p;/一个PCB
8、型的变量,用来保存队首元素int i;for( i=0 ;i=number-1;i+)/建立进程信息 cout请输入pcbi的信息!endl;cout以(name,runtime,state(初始为R),priority)格式输入!pcbi.name;cinpcbi.runtime;cinpcbi.state;cinpcbi.priority;coutendl;typedef priority_queuePCB,vector ,PCBSortCriterion pQueue;/以 /PCBSortCriterion为/优先准则的优先队列 pQueue q,/ 优先队列pQueue的一个对象,对
9、这个队列进行主操作temp;/优先队列pQueue的一个对象,是q的一个拷贝对象,作为实现打印输出/的一个中间变量for(int j=0;j=number-1;j+)/将进程入队建立优先队列 q.push(pcbj);/输出进程控制块的初始状态信息cout进程控制块的初始状态信息为:endl; temp=q;while(!temp.empty()p=temp.top();p.print();temp.pop();coutendl;int n=0, /进程执行的次数 m=0;/完成进程的个数 while(!q.empty()/对进程进行调度 cout第+n次运行;p=q.top();coutq.
10、top().name!endl;p.runtime-=1;p.priority-=1;q.pop();if(p.runtime!=0)/表明该进程还未执行完 ,继续入队进行操作 q.push(p);else /表明该进程已经执行完,设置其状态为Z,并将其保存到p1中 p.state=Z;p1m+=p;cout运行后的状态为:0)/输出完成的进程的信息 for( i=0;i=m-1;i+)p1i.print();coutendl;coutendl;system(pause);return 0;int main() coutsetw(40)进程模拟调度设计endlendl; cout提示:输入1选
11、择先来先服务算法,输入2选择优先级法,输入3选择轮转法,输入4退出程序endlendl; cout 1、先来先服务n 2、优先级法n 3、时间片轮转法n 4.多级反馈轮转法n 5.动态优先级法n 6.退出endlendl; int choice; int go=1; while(go) coutchoice; switch(choice) /调用先来先服务算法求解 case 1: FCFS();break; /调用优先级法求解 case 2: PRIO();break; /调用时间片轮转法求解 case 3: LZF();break; /调用多级反馈轮转法求解 case 4: DJFKLZ()
12、;break; case 5: DTYXJF();break; case 6: cout退出endl;go=0;break; /返回首页 default: cout选择有误,请重新输入选择!endl;break; system(pause); return 0;程序运行结果:初始化界面:先来先服务法:静态优先级法:时间片轮转法:. 动态优先级法: 多级反馈轮转法: 四、心得体会 1、通过这次实验使得我对进程调度几种算法的思想以及实现原理有了进一步的认识和掌握。在设计多级反馈轮转法的算法以及实现代码时,遇到了代码不会写,算法理解不够透彻的问题,而导致在这个问题上纠结了很久。最后还是在查阅资料以及
13、同组成员的讨论下解决了。2、这次实验使用的编程语言是C。由于在以前学习C的时候掌握的不是很好和很多知识点都忘记了以至于在实验的很多地方(如实验界面和代码的精简)做得不是很好,以后得注意对C的学习和巩固。3、也使我更能体会到集体的力量永远要大于个人。在实验中我们遇见的很多问题基本上都是一起讨论才解决的。4. 一开始以为涉及到操作系统的模拟编程的都是高不可攀的,然而在仔细阅读课本以及实验说明后,发现只要弄清楚了优先级数调度的实现原理后其实并不难,用优先队列就可以了。通过这个实验一来加深了对优先级数调度的理解,二来也加强了自己的编程实践能力!实验三 死锁避免银行家算法的实现一、 实验名称死锁避免银行
14、家算法的实现二、 实验目的1、 掌握死锁产生的原因和必要条件。2、 掌握银行家算法的实现三、 实验结果分析#include using namespace std;#define mp 50 /最大进程数#define mr 100 /最大资源数int keyongmr; /可用资源数组int MAXmpmr; /最大需求矩阵int fenpeimpmr; /分配矩阵int needmpmr; /剩余需求矩阵bool FINISHmp; /系统是否有足够资源分配int pmp; /记录序列int Workmr; /工作数组int m,n; /m个进程,n个资源int l=0; void Ini
15、t(); /初始化bool Safe();void jc();void main() Init(); Safe(); if(l!=m) jc();void Init() /初始化算法 int i,j;coutm; coutn; cout请输入每个进程最多所需的各资源数,按照mxn矩阵输入endl; for(i=0;im;i+) for(j=0;jMAXij; cout请输入每个进程已分配的各资源数,也按照mxn矩阵输入endl; for(i=0;im;i+) for(j=0;jfenpeiij; needij=MAXij-fenpeiij; if(needij0) cout您输入的第i+1个进
16、程所拥有的第j+1个资源数错误,请重新输入:endl; j-; continue; cout请输入各个资源现有的数目:endl; for(i=0;ikeyongi; cout剩余需求矩阵:endl; for(i=0;im;i+) for(j=0;jn;j+) coutneedij ; if(j=n-1) coutendl; cout各资源现有数量:endl; for(i=0;in;i+) coutkeyongi ; coutendl; bool Safe() /*安全性算法*/ int i,j,k; for(i=0;in;i+) Worki=keyongi; for(i=0;im;i+) FI
17、NISHi=false; /判断进程i是否已执行 for(i=0;im;i+) if(FINISHi=true) continue; else for(j=0;jWorkj) break; if(j=n) FINISHi=true; for(k=0;kn;k+) Workk+=fenpeiik; /进程i执行完后回收资源 pl+=i; i=-1; else continue; if(l=m) cout系统是安全的endl; cout安全序列:endl; for(i=0;il;i+) coutpi; if(i!=l-1) cout; coutendl; return true; cout会发生死
18、锁,发生死锁的进程是:endl; for(i=0;im;i+) if(FINISHi=false) couti ; coutendl; return false;void jc() int i,j,k,q; i=0;while(im&FINISHi=false) /寻找没执行的 for(j=0;jn;j+) keyongj+=fenpeiij; /回收 fenpeiij=0; if(Safe() cout死锁已解除endl; else i+; Safe(); 输入进程已拥有资源数总需求资源数1(0.0.1.2)(0.0.1.2.)2(2.0.0.0)(2.7.5.0)3(0.0.3.4)(6.
19、6.5.6)4(2.3.5.4)(4.3.5.6)5(0.3.3.2)(0.6.5.2)四、心得体会通过这次实验,我了解了有关资源申请分配、检测以及避免死锁等概念,了解死锁和避免死锁的具体实施方法。死锁的解除实质上就是如何让释放资源的进程能够继续运行.为了解除死锁就要剥夺资源,实验四 存储管理一、实验名称储存管理二、实验目的1、掌握物理内存和虚拟内存的基本概念,理解绝对地址和相对地址;2、了解Windows中内存管理机制,掌握页式虚拟存储;3、掌握虚拟存储管理中有关缺页处理方法等内容,巩固有关虚拟存储管理的教学内容;4、理解内存分配原理、特别是以页面为单位的虚拟内存分配原理;5、掌握常用的页面
20、置换算法。三、实验结果分析#define MAXSIZE 20#include void main() int label=0; /标记此页是否已经装入内存 int input=0; /用于输入作业号 int worknum=0; /记录作业个数 int storesize=0; /系统分配的存储块数 int interrupt=0; /中断次数 int quenceMAXSIZE; /队列,FIFO算法的主要数据结构 int workstepMAXSIZE; /用于记录作业走向 /*初始化*/ for(int i=0;iMAXSIZE;i+) quencei=0; workstepi=0;
21、coutstoresize; cout请输入作业走向(输入0结束):n; for(int j=0;jMAXSIZE;j+) cout页面号:input; workstepj=input; if(input=0) cout输入结束!n; break; worknum+; if(workstep0=0) cout未输入任何作业,系统将退出!n; return; cout置换情况如下:n; for(int k=0;kworknum;k+) label=0; /*看队列中是否有相等的页号或空位置*/ for(int l=0;lstoresize;l+) /*是否有相等的页号*/ if(quencel=
22、workstepk) cout内存中有workstepk号页面,无须中断!n; label=1; /标记此页面已装入内存 break; /*是否有空位置*/ if(quencel=0) quencel=workstepk; cout发生中断,但内存中有空闲区,workstepk号页面直接调入!n; interrupt+; label=1; break; /*上述情况都不成立则调出对首,将调入页面插入对尾*/ if(label=0) cout发生中断,将quence0号页面调出,workstepk号装入!n; interrupt+; for(int m=0;mstoresize;m+) quencem=quencem+1; quencestoresize-1=workstepk; cout作业worknum个,中断interrupt次,缺页率:float(interrupt)/float(worknum)*100%n;四、心得体会通过上机,我了解了许多关于操作系统的专业知识。无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。这次实验课上机是我了解了许多知识,让我更加了解了处理系统,我相信我能够把处理系统用好。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1