计算机操作系统实验报告.doc_第1页
计算机操作系统实验报告.doc_第2页
计算机操作系统实验报告.doc_第3页
计算机操作系统实验报告.doc_第4页
计算机操作系统实验报告.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

院 系: 计算机科学学院 专 业:计算机科学与技术年 级: 2011级 课程名称: 计算机操作系统 指导教师: 张辉 学 号: 姓 名: 2014 年 12 月 10 日年级2011级专 业计算机科学与技术班级组号实验室9#206日期实验名称计算机操作系统实验实验内容分项内容实验级别实验一 操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)操作系统使用级实验二 进程控制操作系统观察级原码阅读与系统编程级实验三 进程同步与通信管理操作系统使用级实验四 虚拟内存管理操作系统观察级实验五 文件系统与磁盘管理操作系统管理级原码阅读与系统编程级小 组 成 员姓名学号组内分工自我评分教师评分小组成绩评定教师签名: 年 月 日实验分项1操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)实验目的1、 熟练掌握linux系统下的常用命令。2、windows 平台下IDE中API的使用。实验要求具体题目实验一 操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)系统平台Linux/Windows平台编程工具实验原理步骤(算法流程)实验原理步骤(算法流程)Linux基本操作介绍:(1)Linux 系统基本操作(启动与退出、文件和目录操作、文档备份与压缩、联机帮助等)pwd命令:此命令显示出当前工作目录的绝对路径,cd命令:改变工作目录。mkdir命令:创建一个目录。rmdir命令:删除空目录。cat命令:将文件的内容打印输出到显示器或终端窗口上。cp命令:将给出的文件或目录拷贝到另一文件或目录中。mv命令:为文件或目录改名或将文件由一个目录移入另一个目录中。rm命令:删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。ls命令:列出目录的内容。chmod命令:用于改变文件或目录的访问权限。sort命令:对文件中的各行进行排序。gzip命令:对文件进行压缩。unzip命令:用于解扩展名为.zip的压缩文件。tar命令:为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。(2)gcc的使用:gcc是linux系统的C编译器,将C/C+源程序和目标程序编译并调用链接程序ld生成可执行文件。例如:gcc o hello hello.c #生成可执行文件hellog+命令的使用:完成C+程序的编译和链接,可以自动的完成目标代码与C+库的链接并生成可执行程序。例如:g+ hello.C #hello.C是一个C+文件,生成可执行程序a.out3)gdb命令的使用:gdb是linux系统的调试工具,是用来调试C或C+程序的功能强大的调试器,它使用户能在程序运行的时候观察程序的内部结构和内存的使用情况,它提供了一些功能:(1)监视或修改程序中变量的值;(2)设置断点,使程序指定的代码行上暂停执行;(3)单步执行或程序跟踪。例如:1. 编译时使用调试参数-g cc g o myp f1.c f2.c f3.c 2.启动gdb: gdb myp3.设置断点: (gdb)break 7 #在第七行设置断点4.开始执行: (gdb) run5.程序继续执行直到结束: (gdb)continue6.退出gdb: (gdb)quit实验结果及分析译时使用调试参数启动gdb设置断点开始执行.程序继续执行直到结束退出gdb心得体会1. 因为有linux操作系统课程,本次实验内容比较轻松;2. 复习了linux常用的指令,对shell也进一步熟悉;3. 在对文件操作过程中出现较多问题,主要是在路径和文件命名上;4. 掌握了linux的文件系统的基本结构。实验分项2实验二 进程控制实验目的熟悉linux和windows下进程的管理,包括创建,睡眠,销毁等。实验要求具体题目1 Linux 系统常用进程管理命令的使用(操作系统观察级)2 Linux 系统常用进程创建与管理的系统调用(原码阅读与系统编程级)3 Windows平台常用进线程控制API(原码阅读与系统编程级)系统平台 Linux Windows实验原理步骤(算法流程)实验原理步骤(算法流程)#include #include #include #include int main() pid_t ret; int status,i, role = -1; ret= fork(); if(ret0) printf(Parent: this is the parent process (pid %d)n,getpid(); for(i=0;i6;i+) printf(Parent: At count %dn,i); sleep(2); ret = wait(&status); role = 0; else if(ret = 0) printf(Child: this is the Child process (pid %d)n,getpid(); for(i=0;i6;i+) printf(Child: At count %dn,i); sleep(2); role = 1; else printf(Parent: Error trying to fork() (%d)n,errno); printf(%s: Exiting.n,(role = 0) ? Parent : Child);nt main(int argc, char* argv) /用来存放快照进程信息的一个结构体 PROCESSENTRY32 pe32; /如果想进一步了解可以查看API文档 pe32.dwSize = sizeof(pe32); /给系统内的所有进程拍照 HANDLE hProcessSnap = :CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); /快照中包含进程列表 if (hProcessSnap = INVALID_HANDLE_VALUE) printf(CreateToolhelp32Snapshot 调用失败! n); return -1; /遍历进程快照,轮流显示每个进程信息 BOOL bMore = :Process32First(hProcessSnap,&pe32); /从第一个开始 while (bMore) printf( 进程ID为:%u ,pe32.th32ProcessID); printf( 进程名称为:%sn,pe32.szExeFile); bMore = :Process32Next(hProcessSnap,&pe32); /遍历下一个 :CloseHandle(hProcessSnap); /清除snapshot对象 cin.get(); return 0; int APIShellExecute() cin.get(); cout ShellExecute(NULL,open,NotePad,NULL,NULL,SW_RESTORE)endl; ShellExecute(NULL,open,NotePad,NULL,NULL,SW_RESTORE); cin.get(); cout ShellExecute(NULL,open,.test.txt,NULL,NULL,SW_RESTORE)endl; ShellExecute(NULL,open,.test.txt,NULL,NULL,SW_RESTORE); cin.get(); cout ShellExecute(NULL,open,Calc,NULL,NULL,SW_RESTORE)endl; ShellExecute(NULL,open,Calc,NULL,NULL,SW_RESTORE); cin.get(); cout ShellExecute(NULL,explore,D:,NULL,NULL,SW_RESTORE)endl; ShellExecute(NULL,explore,D:,NULL,NULL,SW_RESTORE);/-/*BOOL CreateProcess( LPCTSTR lpApplicationName,/ pointer to name of executable module LPTSTR lpCommandLine,/ pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes,/ pointer to process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes,/ pointer to thread security attributes BOOL bInheritHandles,/ handle inheritance flag DWORD dwCreationFlags,/ creation flags LPVOID lpEnvironment,/ pointer to new environment block LPCTSTR lpCurrentDirectory,/ pointer to current directory name LPSTARTUPINFO lpStartupInfo,/ pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation / pointer to PROCESS_INFORMATION );*/ int CreateProcess() cin.get(); cout CreateProcessendl; STARTUPINFO si ; ZeroMemory(&si,sizeof(STARTUPINFO); si.cb=sizeof(STARTUPINFO); PROCESS_INFORMATION pi; BOOL fCreated=CreateProcess(C:Program FilesMicrosoft OfficeOFFICE11WinWord.exe, NULL, NULL, NULL, FALSE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &si, &pi );实验结果及分析进程调用和创建Window系统下的API当一个进程调用了fork以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样.当然创建两个一模一样的进程是没有意义的.为了区分父进程和子进程,我们必须跟踪fork的返回值. 当fork掉用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1,否则fork的返回值有重要的作用.对于父进程fork返回子进程的ID,而对于fork子进程返回0.我们就是根据这个返回值来区分父子进程的. 父进程为什么要创建子进程呢?前面我们已经说过了Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源. 一旦子进程被创建,父子进程一起从fork处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用wait或者waitpid系统调用心得体会1.了解PCB的基本结构和使用方法;2.分析清楚线程和进程之间的区别,也了解父进程和子进程之间的调用关系3.同时也复习了gcc和gdb指令的使用;4.了解掌握在linux系统中近程的创建和销毁。实验分项3实验三 进程同步与通信管理实验目的1.了解掌握进程同步和互斥原理2.掌握简单进程通信原理实验要求具体题目读者写者问题,哲学家进餐,管道系统平台Windows平台,Linux平台实验原理步骤(算法流程)实验原理步骤(算法流程)实验原理步骤(算法流程)实验原理步骤(算法流程)实验原理步骤(算法流程)实验原理步骤(算法流程)int main(int argc, char* argv) HANDLE rMutex; /用于互斥访问count的信号量 HANDLE wMutex; /用于读写互斥和写写互斥的信号量 rMutex=CreateMutex(NULL,false,rMutex); cout 首先创建用于互斥访问count的信号量. endl; Sleep(2000); /2秒后创建wMutex信号量 wMutex=CreateMutex(NULL,false,wMutex); cout 接着创建用于读写互斥和写写互斥的信号量. endl; Sleep(2000); /2秒后创建读写进程 cout 准备创建读写进程. endl; Sleep(2000); STARTUPINFO sReader,sWriter ; PROCESS_INFORMATION pReader,pWriter; BOOL fCreated; cout 创建读者进程!endl; /创建读者进程 ZeroMemory(&sReader,sizeof(STARTUPINFO); sReader.cb=sizeof(STARTUPINFO); fCreated=CreateProcess(.Reader.exe, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &sReader, &pReader ); cout 创建写者进程!endl; /创建写者进程 ZeroMemory(&sWriter,sizeof(STARTUPINFO); sWriter.cb=sizeof(STARTUPINFO); fCreated=CreateProcess(.Writer.exe, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &sWriter, &pWriter ); cin.get(); return 0;/哲学家进餐DWORD Thread1ID,Thread2ID,Thread3ID,Thread4ID,Thread5ID;/用来保存线程ID。HANDLE h_Mutex1,h_Mutex2,h_Mutex3,h_Mutex4,h_Mutex5;/用来保存互斥对象句柄。HANDLE Comman_Mutex;DWORD WINAPI Thread1(PVOID pvParam)/第1个线程函数/for(int k=0;k5;+k)/ AfxMessageBox(My Thread 1);WPARAM wparam;/发送哪个哲学家LPARAM lparam;/发送哪个筷子。如果非0,则是筷子,如果是0,那么说明哲学家放下两边的筷子。while(1) Sleep(1000);WaitForSingleObject(h_Mutex5,INFINITE); / AfxMessageBox(哲学家1拿到筷子5,等待筷子1); wparam=1;lparam=5; :PostMessage (main_window,WM_MYMSG,wparam,lparam);WaitForSingleObject(h_Mutex1,INFINITE);/AfxMessageBox(哲学家1拿到筷子1,开始进餐);wparam=1; lparam=1; :PostMessage (main_window,WM_MYMSG,wparam,lparam); Sleep(5000);wparam=1;lparam=0;:PostMessage (main_window,WM_MYMSG,wparam,lparam);ReleaseMutex(h_Mutex5);ReleaseMutex(h_Mutex1); / AfxMessageBox(哲学家1用餐完毕,放下筷子5和1);return 0;DWORD WINAPI Thread2(PVOID pvParam)/第2个线程函数WPARAM wparam;/发送哪个哲学家LPARAM lparam;/发送哪个筷子。如果非0,则是筷子,如果是0,那么说明哲学家放下两边的筷子。while(1)Sleep(1000);WaitForSingleObject(h_Mutex2,INFINITE); / AfxMessageBox(哲学家2拿到筷子2,等待筷子1); wparam=2;lparam=2; :PostMessage (main_window,WM_MYMSG,wparam,lparam);WaitForSingleObject(h_Mutex1,INFINITE);/AfxMessageBox(哲学家2拿到筷子1,开始进餐); wparam=2;lparam=1; :PostMessage (main_window,WM_MYMSG,wparam,lparam); Sleep(5000); / AfxMessageBox(哲学家2用餐完毕,放下筷子2和1); wparam=2; lparam=0;:PostMessage (main_window,WM_MYMSG,wparam,lparam); ReleaseMutex(h_Mutex2);ReleaseMutex(h_Mutex1);return 0;DWORD WINAPI Thread3(PVOID pvParam)/第3个线程函数WPARAM wparam;/发送哪个哲学家LPARAM lparam;/发送哪个筷子。如果非0,则是筷子,如果是0,那么说明哲学家放下两边的筷子。while(1) Sleep(1000);WaitForSingleObject(h_Mutex2,INFINITE); / AfxMessageBox(哲学家3拿到筷子2,等待筷子3);wparam=3;lparam=2; :PostMessage (main_window,WM_MYMSG,wparam,lparam);WaitForSingleObject(h_Mutex3,INFINITE);/AfxMessageBox(哲学家3拿到筷子3,开始进餐); wparam=3;lparam=3;:PostMessage (main_window,WM_MYMSG,wparam,lparam); Sleep(5000); / AfxMessageBox(哲学家3用餐完毕,放下筷子2和3);wparam=3;lparam=0;:PostMessage (main_window,WM_MYMSG,wparam,lparam); ReleaseMutex(h_Mutex2);ReleaseMutex(h_Mutex3);return 0;DWORD WINAPI Thread4(PVOID pvParam)/第4个线程函数WPARAM wparam;/发送哪个哲学家LPARAM lparam;/发送哪个筷子。如果非0,则是筷子,如果是0,那么说明哲学家放下两边的筷子。 while(1) Sleep(1000);WaitForSingleObject(h_Mutex4,INFINITE); /AfxMessageBox(哲学家4拿到筷子4,等待筷子3);wparam=4;lparam=4;:PostMessage (main_window,WM_MYMSG,wparam,lparam);WaitForSingleObject(h_Mutex3,INFINITE);/AfxMessageBox(哲学家4拿到筷子3,开始进餐);wparam=4;lparam=3;:PostMessage (main_window,WM_MYMSG,wparam,lparam); Sleep(5000); /AfxMessageBox(哲学家4用餐完毕,放下筷子4和3);wparam=4;lparam=0;:PostMessage (main_window,WM_MYMSG,wparam,lparam); ReleaseMutex(h_Mutex4);ReleaseMutex(h_Mutex3);return 0;DWORD WINAPI Thread5(PVOID pvParam)/第5个线程函数WPARAM wparam;/发送哪个哲学家LPARAM lparam;/发送哪个筷子。如果非0,则是筷子,如果是0,那么说明哲学家放下两边的筷子。while(1) Sleep(1000);WaitForSingleObject(h_Mutex4,INFINITE); /AfxMessageBox(哲学家5拿到筷子4,等待筷子5);wparam=5;lparam=4;:PostMessage (main_window,WM_MYMSG,wparam,lparam);WaitForSingleObject(h_Mutex5,INFINITE);/AfxMessageBox(哲学家5拿到筷子5,开始进餐);wparam=5;lparam=5;:PostMessage (main_window,WM_MYMSG,wparam,lparam); Sleep(5000); /AfxMessageBox(哲学家5用餐完毕,放下筷子4和5);wparam=5;lparam=0;:PostMessage (main_window,WM_MYMSG,wparam,lparam); ReleaseMutex(h_Mutex4);ReleaseMutex(h_Mutex5);return 0;h_Mutex1=CreateMutex(NULL,FALSE,NULL);/创建用来访问筷子1的互斥对象 h_Mutex2=CreateMutex(NULL,FALSE,NULL);/创建用来访问筷子2的互斥对象 h_Mutex3=CreateMutex(NULL,FALSE,NULL);/创建用来访问筷子3的互斥对象 h_Mutex4=CreateMutex(NULL,FALSE,NULL);/创建用来访问筷子4的互斥对象 h_Mutex5=CreateMutex(NULL,FALSE,NULL);/创建用来访问筷子5的互斥对象 Comman_Mutex=CreateMutex(NULL,FALSE,NULL);/创建用来互斥访问数组的互斥对象m_thread_handle1=:CreateThread(NULL,0,Thread1,0,0,&Thread1ID);/创建第1个线程,返回线程句柄m_thread_handle2=:CreateThread(NULL,0,Thread2,0,0,&Thread2ID);/创建第2个线程,返回线程句柄m_thread_handle3=:CreateThread(NULL,0,Thread3,0,0,&Thread3ID);/创建第3个线程,返回线程句柄m_thread_handle4=:CreateThread(NULL,0,Thread4,0,0,&Thread4ID);/创建第4个线程,返回线程句柄m_thread_handle5=:CreateThread(NULL,0,Thread5,0,0,&Thread5ID);/创建第5个线程,返回线程句柄void CPhilosophers_eating_problemView:OnMYMSG(WPARAM wParam, LPARAM lParam) WaitForSingleObject(Comman_Mutex,INFINITE); /进入互斥区if(lParam!=0 )/拿起筷子。if(philosopherswParam-10=0)/如果左手是空的。 philosopherswParam-10=lParam;/放在哲学家的左手中elsephilosopherswParam-11=lParam;/放在哲学家的右手中chopstickslParam-1=0;/表示此筷子被拿走。else /释放左右手的筷子。 chopsticksphilosopherswParam-10-1=1;chopsticksphilosopherswParam-11-1=1;philosopherswParam-10=0; philosopherswParam-11=0;实验结果及分析读者写者在该实验中,设置两个信号量rWutex和wWutex。流程如下:(1) 对于读者,如果还没有读者,开始,并阻塞以后的写者,如果没有读者了,唤醒可能阻塞的写者。(2) 对于写者,控制比较简单,只用信号量wMutex即可实现(3) 该实验关键是设置了用于保护读者数量Readcount的一个信号量rWutex,当Readcount为0时,表示尚无读者,执行Wait(wWutex),同时Readcount加1。同理当Readcount减1时,才需要执行signal(wWutex)。心得体会1 掌握了进程互斥的基本原理,亲身操作了读者写者、苹果橘子、哲学家就餐经典同步互斥的案例,对其有深刻了解;2 进程通信三种方法,官道,消息,缓冲,共享内存有了初步认识;3 进程同步互斥问题本身就是经典的编程思想。实验分项4 虚拟内存管理实验目的熟悉操作系统的内存结构和页置换过程实验要求1 局部性原理演示(数组清零)(操作系统观察级)2 页面置换算法模拟演示(算法仿真实现级)3 实际系统内存分配演示(Linux,Windows平台)(操作系统观察级)实验原理步骤(算法流程)#include#include #include int const row=10240;long array102401024;int main() int i,j;clock_t start,finish; double totaltime; start=clock(); int temp; for (temp=0;temp10;temp+) for (i=0;irow;i+) for (j=0;j1024;j+) arrayij=0; finish =clock(); totaltime =(double) (finish -start)/CLOCKS_PER_SEC; printf(按行清零所用时间为:%4fn,totaltime); start =clock(); for(temp=0;temp10;temp+) for (j=0;j1024;j+) for (i=0;irow;i+) arrayij=0; finish =clock(); totaltime=(double)(finish -start)/CLOCKS_PER_SEC; printf(按列清零所用时间为: %4fn,totaltime); return 0;#include iostream.hconst int DataMax=100;const int BlockNum = 10;int DataShowBlockNumDataMax; / 用于存储要显示的数组bool DataShowEnableBlockNumDataMax; / 用于存储数组中的数据是否需要显示/int DataDataMax=4,3,2,1,4,3,5,4,3,2,1,5,6,2,3,7,1,2,6,1; / 测试数据/int N = 20; / 输入页面个数int DataDataMax; / 保存数据int BlockBlockNum; / 物理块int countBlockNum; / 计数器int N ; / 页面个数int M;/最小物理块数int ChangeTimes;void DataInput(); / 输入数据的函数void DataOutput();void FIFO(); / FIFO 函数void Optimal(); / Optimal函数void LRU(); / LRU函数/*void main(int argc, char* argv) DataInput();/ DataInput(); / FIFO(); / Optimal(); / LRU(); / return 0; int menu; while(true) coutendl; cout* 菜单选择 *endl; cout*endl; cout* 1-FIFO *endl; cout* 2-Optimal *endl; cout* 3-LRU *endl; cout* 0-EXIT *endl; cout*menu; switch(menu) case 1: FIFO();break; case 2: Optimal();break; case 3: LRU();break; default: break; if(menu!=1&menu!=2&menu!=3) break; void DataInput() coutM; while(M BlockNum) / 大于数据个数 coutM; coutN; while(N DataMax) / 大于数据个数 coutN; cout请输入页面访问序列:endl; for(int i=0;iDatai;void DataOutput() int i,j; for(i=0;iN;i+) / 对所有数据操作 coutDatai ; coutendl;for(j=0;jM;j+) cout ; for(i=0;iN;i+) / 对所有数据操作 if( DataShowEnableji ) coutDataShowji ; else cout ; coutendl; cout缺页次数: ChangeTimesendl; cout缺页率: ChangeTimes*100/N%endl;void FIFO() int i,j; bool find; int point; int temp; / 临时变量 ChangeTimes = 0; for(j=0;jM;j+) for(i=0;iN;i+) DataShowEnableji = false; / 初始化为false,表示没有要显示的数据 for(i=0;i=3的块,替换后计数值置1, / 同时其它的块计数值加1 ,成了(1 3 2 ),见下面先进先出程序段 for(i=0;iN;i+) / 对有所数据操作 / 增加count for(j=0;jM;j+) countj+; find = f

温馨提示

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

评论

0/150

提交评论