OS课程设计报告最后版.doc_第1页
OS课程设计报告最后版.doc_第2页
OS课程设计报告最后版.doc_第3页
OS课程设计报告最后版.doc_第4页
OS课程设计报告最后版.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

操作系统课程设计说明书1概述21.1目的21.2主要完成任务21.3使用的开发工具31.4解决的主要问题32使用的基本概念和原理32.1线程32.2临界区32.3句柄32.4增强型图元文件42.5模态对话框42.6非模态对话框43总体设计43.1基本技术路线43.2软件的总体结构43.3要创立的线程44详细设计54.1要使用的API函数54.2设计的结构体64.3声明变量64.4声明的函数74.5流程图85编码设计105.1开发环境的设置和建立105.2程序设计时要注意的事项;105.3关键构建的特点和使用105.4主要程序的代码设计及注释115.5解决的技术问题155.6经常犯的错误156测试时出现过的问题及其解决方法156.1数字不能正常显示出来156.2非模态对话框不能正常显示出来166.3从修改对话框的编辑子窗口中获取的页号序列不对166.4四个页面置换算法不能正常实现166.5保存的文件有的地方应该有内容却没有成功写上数据166.6线程函数不能正常执行166.7随机函数生成的序列太过于固定166.8使用strcat(szBuffer,c)函数连接的字符串不正确166.9设置对话框的取消按钮不能有效的将刚修改的值取消167运行结果177.1打开界面177.2设置界面187.3运行界面187.4打开保存的结果197.5通过美图看看打开保存运行结果208软件使用说明208.1基本功能208.2需要运行的环境218.3安装218.4运行218.5操作219总结219.1课程设计完成情况219.2经验总结219.3收获及感受2210参考文献221 概述1.1 目的通过使用程序设计语言设计一个程序,模拟页式存储管理中FIFO、LRU、LFU、OPT四页面置换算法运行的过程。1.2 主要完成任务i. 采用四个线程同时完成每个算法;ii. 能够设定驻留内存页面的个数、内存的存取时间、缺页中断的时间、快表的时间并提供省缺值;iii. 能够随机输入存取的逻辑页面的页号序列;iv. 能够随机产生存取的逻辑页面的页号序列;v. 能够设定页号序列中页面个数和范围;vi. 提供良好图形界面,同时能够展示四个算法运行的结果。vii. 计算每种页面置换算法每个页面的存取时间。viii. 能够将每次的实验输入和实验结果存储起来,下次运行时或以后可查询;ix. 完成多次不同设置的实验,总结实验数据,看看能得出什么结论。1.3 使用的开发工具使用C语言在VC+6.0上完成程序的设计。1.4 解决的主要问题i. 四个算法的实现ii. 每次执行结果的显示iii. 每次执行结果的保存iv. 动态修改参数的交互过程v. 随机序列的生成2 使用的基本概念和原理2.1 线程线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。2.2 临界区多个进程中涉及到同一个临界资源的临界区称为相关临界区。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。2.3 句柄句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个指针,程序不能利用句柄来直接阅读文件中的信息。2.4 增强型图元文件增强型图元文件是 32 位格式,可以同时包含矢量信息和位图信息。此格式是对Windows 图元文件格式的改进,包含了一些扩展功能。2.5 模态对话框模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。2.6 非模态对话框非模态对话框允许用户在处理非模态对话框的同时处理目标对话框。其不会垄断用户的输人,Windows应用程序中,对话框分为两种。另一种是模态对话框。二者的区别在于当话框打开时,是否允许用户进行其他对象的操作。3 总体设计3.1 基本技术路线使用C语言的Windows程序设计,面向过程。3.2 软件的总体结构i. 程序一运行产生一个对话框界面,用来完成四个算法的执行的显示过程以及显示相应的参数。ii. 通过点击开始按钮生成四个线程完成算法的演示过程。iii. 通过点击菜单生成一个非模态对话框来设置参数,完成参数的修改。iv. 通过点击打开按钮产生一个非模态对话框,用来显示保存在文件里的运行结果。3.3 要创立的线程i. DWORD WINAPI FIFOThread(LPVOID pvoid);/执行FIFO算法的线程ii. DWORD WINAPI LRUThread(LPVOID pvoid);/执行LRU算法的线程iii. DWORD WINAPI LFUThread(LPVOID pvoid);/执行LFU算法的线程iv. DWORD WINAPI OPTThread(LPVOID pvoid);/执行OPT算法的线程4 详细设计4.1 要使用的API函数CRITICAL_SECTION g_hdc;声明临界区变量InitializeCriticalSection(&g_hdc);初始化临界区EnterCriticalSection(&g_hdc);进入临界区LeaveCriticalSection(&g_hdc);退出临界区DeleteCriticalSection(&g_hdc);删除临界区DialogBox();产生模态对话框EndDialog();对话框返回,结束对话框MessageBox();产生消息提示框GetDlgItemInt();获取编辑框中的数SetDlgItemInt()设置编辑框中显示的数GetDlgItemText();获取编辑框中的字符串SetDlgItemText()设置编辑框中显示的字符串CreateDialog();用于产生非模态对话框ShowWindow();用于显示非模态对话框GetEnhMetaFile(hemf);打开图元文件,获取增强型图元文件的句柄DeleteEnhMetaFile(hemf);删除打开的图元文件的句柄CreateEnhMetaFile(hdcMeta);创建图元文件,返回图元文件的的句柄CloseEnhMetaFile (hdcMeta);关闭图元文件SendDlgItemMessage()向对话框中的子窗口发送消息,对其进行控制CreateThread();创建线程CloseHandle();用于关闭线程对像的句柄TextOut();将字符串写入到指定的设备句柄上wsprintf();格式化要显示的字符串GetCurrentTime;获取系统当前的时间4.2 设计的结构体i. 传递给线程的结构体typedef struct int F1NUM;/标记位1int F2NUM;/标记位2char MNUM;/表示内存:存放页号int t;/标记位,表示该次置换是否发生中断int num;/记录发生中断的次数int p;/在内存中访问当前序列中的第p个页int List_box;/记录List_Box的ID,结果显示在其中int k;/用于指示在图元文件中显示的位置char buffer10;/用于显示在图元文件中的字符串PARAMS,*PPARAMS;ii. 用于获取用于获取设置对话框中输入的值的结构体typedef structint N1;/内存页面个数,初值3int N_page;/页面序列的个数,初值20int T1;/内存的存取时间,初值10int T_Page;/缺页中断的时间,初值1000int T_Quick;/快表时间,初值1char bufferNUM2;/页的序列初始为70120304230321201701PARAMS_GET,*PPARAMS_GET;iii. 用于记录操作的结构体typedef structint N;/页号个数,用于在各函数中中操作int N1;/内存容量,用于在各函数中中操作char BNUM2+1;/记录序列号,用于在各函数中操作PARAMS_OPERATION,*PPARAMS_OPERATION;/一点开始则进行初始化4.3 声明变量i. 全局变量表格 1声明的全局变量表PARAMS_GET params_get;记录修改后的值PARAMS_GET params_cancle;用于点击取消按钮时,撤销刚做的修改PARAMS_OPERATION params_operation;记录 页号数 ,内存容量,序列号,用于在其它函数进行操作char buffer1;记录默认的序号70120304230321201701char buffer51;用于记录产生的随机序列HDC hdcMeta ;用于绘制图元文件CRITICAL_SECTION g_hdc;临界区,控制多个线程向文件写入int icmdshow;用于显示非模态对话框HINSTANCE hinstance;记录程序的句柄TCHAR szFileName320;图元文件名HWND hwnd_picture;用于记录打开窗口的句柄HWND hwnd;用于记录主窗口的句柄ii. 传递给线程的变量表格 2传递给线程的变量表PARAMS params_fifo;传递给FIFOThread线程的参数PARAMS params_lru;传递给LRUThread线程的参数PARAMS params_lfu;传递给LFUThread线程的参数PARAMS params_opt;传递给OPTThread线程的参数4.4 声明的函数i. 初始化函数表格 3初始化函数表Chushi_Get(PPARAMS_GET P);初始化params_get参数ChuShi_FIFO(PPARAMS P);初始化params_fifo参数ChuShi_LRU(PPARAMS P);初始化params_lru参数ChuShi_LFU(PPARAMS P);初始化params_fu参数ChuShi_OPT(PPARAMS P);初始化params_opt参数ChuShi_Array()初始化B数组,记录序列号的ii. 线程函数表格 4线程函数表FIFOThread(LPVOID pvoid);执行FIFO算法的线程LRUThread(LPVOID pvoid);执行LRU算法的线程LFUThread(LPVOID pvoid);执行LFU算法的线程OPTThread(LPVOID pvoid);执行OPT算法的线程iii. 窗口函数表格 5窗口函数表AboutDlgProc()主窗口过程ShezhiDlgProc()设置对话框的过程PictureDlgProc()打开对话框的过程iv. 辅助线程执行的函数表格 6辅助函数表FindPgInM()判断页X是否在内存中,若在,返回在内存中的位置,若不在,返回-1GetTheSmall()查找标记的值最小的那个,用于FIFO算法中GetLRUID()查找最近最久没使用的空间,用于LRU算法中GetLFUID()查找最近使用最少的空间,用于LFU算法中GetTheBig()当有空闲的空间时,返回空间的空间,否则查找标记值最大的空间,此函数应用在OPT算法中RnewF_LRU()用于更新LRU的标记数组,此函数用在LRU算法中RnewF_OPT()用于更新OPT的标记数组,此函数用于OPT算法中v. 其它函数表格 7其它函数表SuiJiXuLie()生成随机序列的函数operation1(PPARAMS params);执行显示操作的函数,在线程中调用operation2(PPARAMS params);执行保存操作的函数,在线程中调用4.5 流程图i. FIFO算法的流程图图表 1 FIFO算法流程图ii. LRU算法的流程图图 2 LRU算法流程图iii. LFU算法的流程图图表 3 LFU算法流程图iv. OPT算法的流程图图表 4 OPT算法流程图5 编码设计5.1 开发环境的设置和建立在VC+6.0平台下,新建Win32 Application 的工程,再新建相应的.c文件和资源。5.2 程序设计时要注意的事项;i. 尽量避免全局变量的使用;ii. 变量的命名要规范;iii. 注意给代码多写注释;iv. 注意参数的初始化问题,参数的传递问题;v. 注意进行模块化设计,写相应的函数来完成相应的功能5.3 关键构建的特点和使用i. 使用模态对话框作为主窗口;ii. 模态对话框产生非模态对话框来完成设置和显示保存的文件;iii. 使用编辑框来完成用户的输入和显示;iv. 使用按钮控件和菜单来完成用户的控制;v. 使用滚动条控件来帮助完成用户的输入;vi. 使用列表框控件来完成算法过程的演示;vii. 使用图片控件来完成增强型图元文件的显示;viii. 使用静态文本控件来与用户进行交互;5.4 主要程序的代码设计及注释5.4.1 FIFO算法的线程DWORD WINAPI FIFOThread(LPVOID pvoid)/实现FIFO算法的线程int q,l;/l是标记,标记当前访问的页面是否在内存中PPARAMS params;params=(PPARAMS)pvoid;while(params-pp,params-M);/查找第params-p个页是否在内存中,不再则返回-1if(l=0)/在则进行置换params-t=0;else/q=GetTheSmall(params-F1);/按照先进先出的顺序返回可以置换的那个内存空间params-F1q=params-p;/表示进入内存的次序 越小表示越早params-Mq=params_operation.Bparams-p;/进行置换params-t=1;/缺页中断标志params-num+;/缺页中断次数SetDlgItemInt(hwnd,IDC_EDITFIFO,params-num,FALSE);/显示缺页中断的次数params-p+;/operation1(params);/ 用于显示 算法的结果operation2(params);/保存操作Sleep(SLEEP);return 0;5.4.2 LRU算法的线程DWORD WINAPI LRUThread(LPVOID pvoid)/实现LRU算法的线程int q,i; /i是标记,标记当前访问的页面是否在内存中PPARAMS params;params=(PPARAMS)pvoid;while(params-pp,params-M); /查找第params-p个页是否在内存中,不再则返回-1if(i=0)RnewF_LRU(params-F2);/将F2中的标记都加1params-F2i=0;/将该位置标记置0params-t=0;/标记未发生中断elseq=GetLRUID(params);/查找F2中最大的标记,若相等找F1中 小的params-F1q=params-p;/记录进入内存的次序RnewF_LRU(params-F2);/更新F2标记params-F2q=0;/标记置0,0次未使用即刚刚使用params-Mq=params_operation.Bparams-p;/页面置换params-t=1;/页面置换标记params-num+;/中断次数加1SetDlgItemInt(hwnd,IDC_EDITLRU,params-num,FALSE);/显示中断次数params-p+;operation1(params);/显示运行结果operation2(params);/保存运行结果Sleep(SLEEP);return 0;5.4.3 LFU算法的线程DWORD WINAPI LFUThread(LPVOID pvoid)/实现LFU算法的线程int q,i; /i是标记,标记当前访问的页面是否在内存中PPARAMS params;params=(PPARAMS)pvoid;while(params-pp,params-M); /查找第params-p个页是否在内存中,不再则返回-1if(i=0)params-F2i+=1;/使用次数加一params-t=0;elseq=GetLFUID(params); /查找F2中最小的标记,若相等找F1 中小的params-F1q=params-p;/进入内存的次序params-F2q=1;/使用次数params-Mq=params_operation.Bparams-p;params-t=1;params-num+;SetDlgItemInt(hwnd,IDC_EDITLFU,params-num,FALSE);params-p+;operation1(params);operation2(params);Sleep(SLEEP);return 0;5.4.4 OPT算法的线程DWORD WINAPI OPTThread(LPVOID pvoid)/实现OPT算法的线程int q;PPARAMS params;params=(PPARAMS)pvoid;while(params-pp,params-M)=0)/判断当前访问的页号是否在内存RnewF_OPT(params-F1,params-p,params-M);/更新标记params-t=0;elseq=GetTheBig(params-F1,params-F2);/查找最大的标记params-Mq=params_operation.Bparams-p;/页面置换RnewF_OPT(params-F1,params-p,params-M);/更新标记params-t=1;params-num+;SetDlgItemInt(hwnd,IDC_EDITOPT,params-num,FALSE);/显示中/断次数params-p+;operation1(params);/显示运行结果operation2(params);/保存运行结果Sleep(SLEEP);return 0;5.4.5 创建线程的函数CloseHandle(CreateThread(NULL,0,FIFOThread,¶ms_fifo,0,NULL);/FIF0线程CloseHandle(CreateThread(NULL,0,LRUThread,¶ms_lru,0,NULL);/LRU线程CloseHandle(CreateThread(NULL,0,LFUThread,¶ms_lfu,0,NULL);/LFU线程CloseHandle(CreateThread(NULL,0,OPTThread,¶ms_opt,0,NULL);/OPT线程5.5 解决的技术问题i. 通过模态对话框创建了非模态对话框ii. 多个线程同步的向同一个文件写入数据iii. 利用系统时间参数,通过伪随机函数生成随机序列iv. 通过滚动条来完成用户的输入的微调5.6 经常犯的错误i. 参数在使用之前未进行初始化。ii. 有时候参数名记错,大小写出错。iii. 有时候会忘了写分号或者大括号,导致未知错误iv. 有时候在定义一个变量的语句之前写了一条赋值语句,导致了未知的错误。6 测试时出现过的问题及其解决方法6.1 数字不能正常显示出来解决方案:数字的ASCII码是从48到57,所以将char c=3,不能直接显示,应该加48进行修正。6.2 非模态对话框不能正常显示出来解决方案:传递给CreateDialog函数的参数不对,要将hinstance设置为全局变量来传递给它,而且在创建了对话框之后,应该调用ShowWindow(hdlg,icmdshow)才能将其显示出来。6.3 从修改对话框的编辑子窗口中获取的页号序列不对解决方案:使用GetDlgItemText(hDlg,IDC_EDIT3, buffer, N_page+1);在第四个参数位置应该加一个1,因为获取计算字符串长度时,最后一个空也被考虑了,所以有效的长度是N_page,所以第四个参数应该加上一。6.4 四个页面置换算法不能正常实现解决方案:参数要初始化,且要考虑正确的值。线程中的辅助函数存在缺陷,将各个辅助函数优化。6.5 保存的文件有的地方应该有内容却没有成功写上数据解决方案:多个线程同时向一个文件写入数据导致了不可预知的问题,因此需要用一个临界区来控制四个线程同时向一个文件的写入。6.6 线程函数不能正常执行解决方案:传递的参数出现了问题,修改为静态变量之后,问题解决了。6.7 随机函数生成的序列太过于固定解决方案:引入时间参数,获取系统当前时间修正随机序列的生成。6.8 使用strcat(szBuffer,c)函数连接的字符串不正确解决方案:应该现将szBuffer初始化,令szBuffer0=0;6.9 设置对话框的取消按钮不能有效的将刚修改的值取消解决方案:应该在打开设置对话框之前将值记录下来,点取消按钮时利用它将刚刚的修改取消。记录该变量的值将用在两个对话框中,所以应该设置为全局变量。7 运行结果7.1 打开界面图表 5 程序界面图7.2 设置界面图表 6 设置界面图7.3 运行界面图表 7 运行界面图7.4 打开保存的结果图表 8 打开保存的结果图7.5 通过美图看看打开保存运行结果图表 9 保存后的图片8 软件使用说明8.1 基本功能i. 采用四个线程同时完成每个算法;ii. 能够设定驻留内存页面的个数、内存的存取时间、缺页中断的时间、快表的时间,并提供省缺值;iii. 驻留内存的页面个数范围是:1-10,内存的存取时间设置范围为:10-100,缺页中断的时间设置范围为:1000-10000,快表的时间设置范围为:1-10;iv. 能够随机输入存取的逻辑页面的页号序列;v. 能够随机产生存取的逻辑页面的页号序列;vi. 能够设定页号序列中页面个数和范围,个数的范围为:1-50;vii. 提供良好图形界面,同时能够展示四个算法运行的结果。viii. 能计算每种页面置换算法每个页面的存取时间,并显示出来。ix. 能够将每次的实验输入和实验结果自动存储起来,是以增强型图元文件的方式保存起来的,下次运行时或以后可查询;8.2 需要

温馨提示

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

评论

0/150

提交评论