第一篇:操作系统调研报告
操作系统调研报告
随着日常生活的数字化发展,计算机作成为了工作、学习、娱乐所不可或缺的一部分,而操作系统通过组织和管理软硬件资源,使之协调一致并高效地完成各种用户的工作,成为现代电脑必不可少的系统软件,是电脑的灵魂所在。从设计者角度看,操作系统是计算机软硬件资源的管理和控制机构,其目的是充分利用软硬件资源;从用户角度看,操作为用户提供了方便简单的使用计算机的环境。因此本次关于操作系统的调研,我们着眼于操作系统提供的各种接口,通过分析操作系统提供的各种接口,更深入的了解操作系统的组成,了解操作系统的原理,从而提高我们对计算机这一系统整体上的认识,具体的认识、深入的了解计算机的工作方式、原理。同时,对我们以后在使用计算机进行工作与学习时遇到问题快速准确的解决提供一些帮助。因为,操作系统管理了所有的计算机资源,一切的应用软件都是运行于基础之上的。
操作系统提供给用户的接口,随着操作系统的发展逐渐的发展着。最初,操作系统是没有提供图形化的接口给用户,那个时候使用计算机就是一种复杂而麻烦的事,需要使用者花费大量的时间在学习命令及其使用之上,而不是将时间专注与利用计算机以及操作系统这一工具解决其他的问题。也因此,在图形化的界面没有出现以前,计算机大都应用于专业人群之中,应用于对计算机有深入了解的用户之中。到如今,大家以及很习惯于通过图形化界面,通过鼠标来使用计算机。但,我觉得对于命令式的接口,我们还是有必要做一定的了解。同时,操作系统还有另外一种接口,即程序接口。实际上命令接口与图形接口的实现都是依赖于程序接口。顾名思义,程序接口是提供给程序用的。一下分别介绍这三种接口。
命令接口
在当前几乎所有的计算机,包括大、中型机到微型机的操作系统都向用户提供了命令接口,以实现用户与计算机之间的交互。命令接口可以理解为计算机为了与用户沟通所使用的语言,用户使用命令接口来与计算机进行交互时,首先必须在终端上键入正确的操作命令,由终端处理程序接收用户键入的命令,并将它显示在终端屏幕上。当一条命令输入完成后,操作系统的命令解释程序对用户输入的命令进行分析,然后执行相应的命令处理程序。操作系统的命令接口都应包括一组命令、终端处理程序和命令解释程序。其中,命令解释程序的主要作用是在屏幕上给出提示符,请求用户输入命令,然后读入命令,并识别命令,再转到相应的命令处理程序去执行,并将处理结果送屏幕上显示。若用户键入的命令有错,命令解释程序未能识别,或在执行过程中出现错误,则显示出错信息。并将处理结果送屏幕上显示。
对DOS来说,命令行程序分为内部命令和外部命令,内部命令是随command.com装入内存的,而外部命令是一条一条单独的可执行文件。内部命令都集中在根目录下的command.com文件里,电脑每次启动时都会将这个文件读入内存,也就是说在电脑运行时,这些内部命令都驻留在内存中,用dir命令是看不到这些内部命令的。外部命令都是以一个个独立的文件存放在磁盘上的,它们都是以com和exe为后缀的文件,例如我们常用的一些可执行文件,它们并不常驻内存,只有在电脑需要时,才会被调入内存。
大家比较熟悉的命令解释程序有MS-DOS/windows 98的command.com,windows 2000/xp/vista/7的cmd.exe以及UNIX/Linux的shell程序。
图形接口
图形用户界面或图形用户接口(Graphical User Interface,GUI)是指采用图形方式显示的计算机操作环境用户接口。与早期计算机使用的命令行界面相比,图形界面对于用户来说更为简便易用。GUI的广泛应用是当今计算机发展的重大成就之一,它极大地方便了非专业用户的使用人们从此不再需要死记硬背大量的命令,取而代之的是可用用通过窗口、菜单、按键等方式来方便地进行操作。
图形接口的组成一般如下:
桌面:在启动时显示,也是界面中最底层,有时也指代包括窗口、文件浏览器在内的“桌面环境”。在桌面上由于可以重叠显示窗口,因此可以实现多任务化。一般的界面中,桌面上放有各种应用程序和数据的图标,用户可以依此开始工作。桌面与既存的文件夹构成里面相违背,所以要以特殊位置的文件夹的参照形式来定义内容。
视窗:应用程序为使用数据而在图形用户界面中设置的基本单元。应用程序和数据在窗口内实现一体化。在窗口中,用户可以在窗口中操作应用程序,进行数据的管理、生成和编辑。通常在窗口四周设有菜单、图标,数据放在中央。
在窗口中,根据各种数据/应用程序的内容设有标题栏,一般放在窗口的最上方,并在其中设有最大化、最小化(隐藏窗口,并非消除数据)、最前面、缩进(仅显示标题栏)等动作按钮,可以简单地对窗口进行操作。
单一文件界面(Single Document Interface)
在窗口中,一个数据在一个窗口内完成的方式。在这种情况下,数据和显示窗口的数量是一样的。若要在其他应用程序的窗口使用数据,将相应生成新的窗口。因此窗口数量多,管理复杂。
多文件界面(Multiple Document Interface)
在一个窗口之内进行多个数据管理的方式。这种情况下,窗口的管理简单化,但是操作变为双重管理。
标签:多文件界面的数据管理方式中使用的一种界面,将数据的标题在窗口中并排,通过选择标签标题显示必要的数据,这样使得接入数据方式变得更为便捷。
上述中,多文件界面主要是微软视窗系统采用。而在其他环境中,通常多是单文件界面,所以无所谓单一/多文件界面的称呼问题。
菜单:将系统可以执行的命令以阶层的方式显示出来的一个界面。一般置于画面的最上方或者最下方,应用程序能使用的所有命令几乎全部都能放入。重要程度一般是从左到右,越往右重要度越低。命定的层次根据应用程序的不同而不同,一般重视文件的操作、编辑功能,因此放在最左边,然后往右有各种设置等操作,最右边往往设有帮助。一般使用鼠标的第一按钮进行操作。
即时菜单:与应用程序准备好的层次菜单不同,在菜单栏以外的地方,通过鼠标的第二按钮调出的菜单称为“即时菜单”。根据调出位置的不同,菜单内容即时变化,列出所指示的对象目前可以进行的操作。
图标:显示在管理数据的应用程序中的数据,或者显示应用程序本身。数据管理程序,即在文件夹中用户数据的管理、进行特定数据管理的程序的情况下,数据通过图标显示出来。通常情况下显示的是数据的内容或者与数据相关联的应用程序的图案。另外,点击数据的图标,一般可以之间完成启动相关应用程序以后再显示数据本身这两个步骤的工作。应用程序的图标只能用于启动应用程序。
按钮:菜单中,利用程度高的命令用图形表示出来,配置在应用程序中,成为按钮。应用程序中的按钮,通常可以代替菜单。一些使用程度高的命令,不必通过菜单一层层
翻动才能调出,极大提高了工作效率。但是,各种用户使用的命令频率是不一样的,因此这种配置一般都是可以由用户自定义编辑。
回收站:为了实现文件删除的“假安全“功能而设置了”回收站“(垃圾桶)功能。在文件删除的时候,暂时将其移动到系统特定的地方,一旦用户发现删除错误,还可以将其找回,从而实现防止错误删除的目的。在麦金塔系统中,垃圾桶不仅可以删除文件,还可以进行各种各样对象的删除功能,如将可移动硬盘从系统中移出,将光盘从光驱中取出等等。
应用程序启动器:从图形界面上启动应用程序有很多方式,有好几种操作系统都采用菜单形式的程序启动器。NEXTSTEP和Mac OS X中有一种称为dock的操作面板型的工具,可以存放各种文件和应用程序的信息,并通过鼠标点击调出。
图形用户界面的任务管理
在图形用户界面中,用户操作是以窗口为单位的。除了MDI和Mac OS以外,大多都是“窗口数量=任务数量”。因此在看整体界面的时候,怎样进行任务管理是很重要的。Windows等操作系统中,最常用的方式是在桌面上设置一个棒状的”任务栏“,放置各种窗口的图标和标题,确保系统的可操作性和可视性,方便对窗口进行管理。其他的方法包括,在桌面上的菜单中添加各个窗口管理菜单,在桌面上显示任务的图标,用虚拟桌面的方式表面增加桌面的数量等等。在Mac OS X系统中使用Dock进行任务管理,但是还有Exposé进行窗口一览显示模式的功能。
指针设备的操作:图形用户界面的基本操作是,用指针设备(一般是鼠标)进行指示操作,然后使用设备上的按钮(通常为两到三个)进行动作的激活。因此”位置“和”指示“都非常明了,从而实现可视操作。
指示的内容根据位置而不同。在数据管理应用程序中,第一按钮进行指针所在位置数据的选择,而两次连续按钮(所谓“双击”)可以调出预制的应用程序开始处理数据。第二按钮通常用来显示即时菜单。第二按钮调出的菜单可以再用第一按钮进行选择打操作。第三按钮在X Window System中比较常用。另外,最近四键、五键鼠标相继问世,各个按钮可以在操作系统中进行动作定义。
程序接口
程序接口即应用编程接口,应用编程接口允许应用程序调用操作系统的服务和功能。程序接口由一组系统调用组成,用户程序使用“系统调用”就可获得操作系统的底层服务,使用或访问系统的各种软硬件资源从某种角度上看,进行系统调用就象进行一个特殊的过程调用。但是,系统调用的实现与一般的过程调用的实现相比,两者间有很大的差异。系统调用可以进入操作系统内核,而过程调用则不能进入操作系统的内核。对于系统调用,控制是由原来的用户态转换为系统态,这是借助于中断和陷入机制来完成的,在该机制中包括中断和陷入硬件机构和中断和陷入处理程序两部分系统调用的格式随计算机的不同而不同,但对任何不同的计算机都有以下共同的特点:
(1)每个系统调用对应一个功能号,要调用操作系统的某一特定例程,必须在指令中给出对应的功能号。
(2)按功能号实现调用的过程大体相同,即都是通过对功能号的解释分别转入对应例行子程序。
对于程序接口,主要是提供给程序调用的。一般用户不会接触到。
第二篇:实时操作系统报告
实时操作系统课程实验报告
专业:通信1001 学号:3100601025 姓名:陈治州
完成时间:2013年6月11日
实验 简易电饭煲的模拟
一.实验目的:
掌握在基于嵌入式实时操作系统µC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。
二.实验要求:
1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”;2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择;
3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间;
4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式;
5.按“X”退出系统,时间区域不显示。
6.煮饭时长为30,煮粥时长为50,煮面时长为40.三.实验设计:
1.设计思路:
以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。
本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。2.模块划分图:(1)界面显示:
Main()Taskstart()Taskstartdispinit()在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。(2)按键查询与响应:
Main()Taskstart()在TaskStart()函数中,用if(PC_GetKey(&key)== TRUE)判断是否有按键输入。然后根据key的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。(3)切换功能:
l计数“C”按键的次数M=l%3Switch(m)M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“ ”以“擦出”之前画下的“@”,注意l自增。
四.主要代码:
#include “stdio.h” #include “includes.h” #include “time.h” #include “dos.h” #include “sys/types.h” #include “stdlib.h” #define TASK_STK_SIZE
512
#define N_TASKS
OS_STK
TaskStk[N_TASKS][TASK_STK_SIZE];
OS_STK
TaskStartStk[TASK_STK_SIZE];
INT8U
TaskData[N_TASKS];
void Task0(void *pdata);
void TaskStart(void *pdata);
static void TaskStartDispInit(void);
void main(void){
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);
OSTaskCreate(TaskStart,(void *)0, &TaskStartStk[TASK_STK_SIZE-1], 4);
OSStart();
} void TaskStart(void *pdata){ #if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;#endif
INT8U l,m;
INT16S key;
l=0;
pdata = pdata;
TaskStartDispInit();
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
for(;;){
if(PC_GetKey(&key)== TRUE)
{
switch(key)
{
case 0x1B:
PC_DOSReturn();
break;
case 0x43:
{ m=(l%3);
switch(m)
{ case 0: {
PC_DispStr(26,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(40,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(55,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);} break;
case 1: { PC_DispStr(26,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(40,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(55,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);} break;case 2: { PC_DispStr(26,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(40,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(55,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);}
break;}
l++;} break;
} } OSCtxSwCtr = 0;
OSTimeDlyHMSM(0, 0, 1, 0);
} } static void TaskStartDispInit(void){ PC_DispStr(0, 0, “
uC/OS-II, The Real-Time Kernel
”, DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);PC_DispStr(0, 1, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 2, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 3, “
dianfanbao shiyan
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 4, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 5, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 6, “
kai shi.zhu fan.zhu zhou.zhu mian.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 7, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 8, “
bao wen.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 9, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 10, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 11, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 12, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 13, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 14, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 15, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 16, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 17, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 18, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 19, “ 'S':kai ji.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 20, “ 'C':mo shi qie huan.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 21, “ 'B':kai shi zhi xin.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 22, “ 'Q':qu xiao dang qian gong zuo zhuang tai.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 23, “ 'X':tui chu xi tong.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
PC_DispStr(0, 24, “
<-PRESS 'ESC' TO QUIT->
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);}
五.运行界面:
(1)主界面:
(2)显示北京时间:
(3)模式切换:
(4)倒计时:
(5)保温执行时间:
六.总结:
本次实验主要以老师所给的实验事例为基础,并结合老师课堂讲的内容,理解编写程序。做实验本实验前,先执行了一下事例程序,以此了解borlandc的一些基本操作;然后就是看懂每个实验的框架和主要部分;接着,将事例程序中的部分思想运用到本次实验中,其中以显示界面的思想运用的最多;除此以外,在模式切换上花了最大的精力,最终的解决方法是以变量l作为一个计数值,并运用switch语句在选择的模式上画上“@”,同时还得注意在未选择的模式上画上空格来“擦除”之前画上的@;在查询按键上,同样运用switch语句......这次实验收获不少,不仅对之前学的C语言有了更进一步的巩固,而且还强化了ucos里面的多任务的一些认识;同时,以前对DOS界面很陌生,但本次实验使用的正是DOS界面,通过几天的经历,对DOS中的编译、“help”等各个方面有了更深入的认识,不再害怕使用DOS了。
对本课程有很大的兴趣,在以后的课余时间里我会不断学习这些知识。
第三篇:操作系统课程设计报告
课程设计报告
题 目: 模拟请求页式管理
课程名称: 计算机操作系统 学 院: 信息工程学院
专 业: 计算机科学与技术
班 级: 14计本(1)学生姓名: * * * 学 号: 201403031** 指导教师: * * 成 绩:
开课时间: 2016-2017 学年 一 学期
模拟请求页式管理
第1章 需求分析
1.1设计要求
请求页式管理是一种常用的虚拟存储管理技术。本设计通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。本实验要求用Vc++或其他高级语言编写和调试。
编写程序实现:
(1)先进先出页面置换算法(FIFO)(2)最近最久未使用页面置换算法(LRU)最佳置换页面置换算法(OPT)设计一个虚拟存储区和内存工作区,编程序演示以上三种算法的具体实现过程,并计算访问命中率。
1.2解决方案
首先确定实现语言使用c#实现图形化界面,后确定要实现哪些功能,比如算法选择,页面添加,模拟控制。然后确定输出结构以便于程序的测试和验证。将基本框架建立后再进行编程。编程前进行算法结构分析最后编程实现。
1.3算法实现原理
1、先进先出置换算法(FIFO):
发生缺页中断时按照页面进入内存顺序总是淘汰最先进入内存的页面。
2、最近最久未使用置换算法(LRU):
发生缺页中断时总是淘汰存在内存中最长时间未被使用的页面。
3、最佳置换算法(OPT):
发生缺页中断时若一个或几个页面将来将不会被调用则按先进先出原则淘汰页面,若将来都有调用则比较调用时刻选择最远时刻页面淘汰。
4、缺页率:缺页次数占页面调用次数的百分比。
第2章 概要设计
2.1数据设计
常变量:调用页面最大数量(MaxN),内存最大页面数(MaxM)待调用页面数组:page_dd[MaxN]存放等待调用的页面号
页面数组专用指针 page_p,用于指向page_dd数组中正需调入内存的页号 内存块数组:Memery[MaxM],存放内存当前存放的页号 缺页计数器:count,记录缺页次数
内存块状态数组:M1[MaxN],M2[MaxN],M3[MaxN],记录每次页面调用结束后内存各块的状态
缺页记录数组s[MaxN],用于记录页面调用时是否产生缺页中断,初始化为是
2.2函数设计
1、页面添加函数:void btnAdd_Click(object sender, EventArgs e)用于实现通过点击按钮实现数据输入。
2、内存初始化函数:init(int[] a, int[] b,int []m1,int[]m2,int[]m3)参数有页面数组、内存数组、状态数组,采用先进先出算法对内存先进行装满 服务于先进先出页面置换函数和最佳置换函数。
3、输出函数:void display(int[]a,int[]m1,int[]m2,int[]m3,char[]c)用于输出模拟结果,参数有页面数组,内存数组,状态数组,缺页记录数组。再模拟之后调用。
4、模拟控制函数:void btnmo_Click(object sender, EventArgs e)用于实现通过单击模拟按钮,根据用户所选算法进行模拟并显示结果。
5、先进先出算法模拟函数:
void FIFO(int[] a, int[] b,int[]m1,int[]m2,int[]m3,char[] s)用于实现先进先出算法模拟,参数有页面数组,内存数组、内存状态记录数组,缺页记录数组。在模拟函数中调用。
6、最近最久未使用算法模拟函数:
void LRU(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s)用于 3 实现最近最久未使用算法模拟,参数有页面数组,内存数组,内存状态记录数组,缺页记录数组。在模拟函数中被调用。
7、最近最久未使用函数辅助函数:void LUR_I(int[] a,int e)用于对最近最久未使用算法中所用辅助数组(记录页面存在时长)进行调整,参数有辅助数组及需调整的数据下标。在最近最久未使用函数中调用。
8、最佳置换算法模拟函数:
void OPT(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s)用于模拟最佳置换算法。参数有页面数组,内存数组,内存状态记录数组,缺页记录数组。在模拟函数中被调用。
9、最佳置换算法辅助函数:void OPT_F(int[] a, int e)用于对最佳置换算法中的辅助数组进行调整。参数有辅助数组,需调整数据下标。在最佳置换算法中被调用。
10、重置函数:void btncz_Click(object sender, EventArgs e)用于重新选择算法进行新的模拟。
2.3主要算法设计
1、初始化函数算法:
第一步:将第一个页面调入内存,调整最佳置换算法辅助数组,缺页计数器加一,保存内存数组状态。
第二步:调用下一个页面并判断内存中是否有本页面有转第三步,无转第四步。第三步:更改缺页数组对应下标值,记录当前内存状态,调整最佳置换算法辅助数组,页面指针指向下一页。
第四步:将页面调入内存,调整最佳置换算法辅助函数,缺页计数器加一,保存内存数组状态。若内存尚不满转第一步。具体见图1初始化算法流程图。
开始页面调入内存缺页计数器加一记录内存状态调用下一页否否内存是否有该页面是记录内存状态修改缺页数组内存已满是结束
图1 初始化算法流程图
2、先进先出页面置换算法:
第一步:检查内存中是否已有需调用页面,有则转第二步,无则转第三步。第二步:记录当前内存状态,修改缺页数组对应下标值。
第三步:内存中无需要调用的页面,进行出队操作,然后进行入队操作,记录内存块状态,缺页计数器加一。
第四步:若页面数组未被调用结束转第一步。具体见图2先进先出算法流程图。
开始页面调入内存该页在内存中是否已存在是否否先出队操作后入队操作记录内存状态修改缺页数组值记录内存状态缺页计数器加一页面调用结束是结束
图2 先进先出算法流程图
3、最近最久未使用置换算法:
第一步:将页面调入内存,记录内存状态,缺页计数器加一,调整辅助数组,页面指针加一。
第二步:检查内存中是否已有所需页面,有转第三步,无转第一步。
第三步:修改缺页数组对应下标记录,记录内存状态,调整辅助数组,页面指针加一。第四步:内存是否已满,无则转第一步,是则转第五步。
第五步:检查内存中是否有所需页面,有则记录当前内存状态,修改缺页数组对应下标值。无则转第六步。
第六步:检查辅助数组找出最大值并记录其下标,置换内存中对应下标的数据,调整辅助数组,缺页计数器加一。
第七步:页面是否调用结束未结束则转第五步。具体见图3最近最久未使用算法流程图。
开始调入页面至内存记录内存状态计数器加一否调整辅助数组调用下一页内存中是否已有该页否内存已满是通过辅助数组确定淘汰页面是修改缺页数组记录内存状态调整辅助数组否页面置换记录内存状态计数器加一调用结束是结束
图3 最近最久未使用算法
4、最佳置换算法:
第一步:检查内存中是否已有所需页面,有则记录内存状态,修改缺页数组对应下标数值。无则转第二步。
第二步:判断内存中各页面的未来调用情况,记录是否还有调用,若有则记录调用时刻。
第三步:分析调用情况,内存中页面都在将来不会被调用转第四步,有一个被调用转第五步,有两个被调用转第六步,全被调用转第七步。
第四步:查找辅助数组找到内存中存在时间最长的页面进行置换,修改内存状态,缺页计数器加一,修改辅助数组。
第五步:查找到不会被调用的页面,并根据辅助数组选择最早进入内存的页面将其置换。修改内存状态,缺页计数器加一,修改辅助数组。
第六步:查找辅助数组找到将来不需要在调用的页面将其置换,修改辅助数组,记录内存状态,缺页计数器加一。
第七步:查找辅助数组,找寻最晚被调用的页面,将其置换。记录内存状态,修改辅助数组,缺页计数器加一。
第八步:页面是否调用完成,否则转第一步。具体见图4最佳置换算法流程图
开始调入页面记录内存状态计数器加一更新辅助函数是页面已存在否向后检查内存当前页面调用情况所有页面都不会再度调用否是一个页面会调用否否是两个页面会调用是否查找辅助数组得到最先进入页面通过辅助数组得到不会再调用的页面通过辅助数组获取最晚调用的页面通过辅助数组得到另外两个页面中最先进入的页面置换页面记录内存状态计数器加一更新辅助函数页面调用结束是结束
图4 最佳置换算法流程图 2.4界面设计
采用c# 设计windows窗体应用程序,使用下拉列表框选择算法,通过按钮添加待调用的页面。通过文本控件显示模拟结果。显示样式:第一行:算法名称;
第二行:调用页面顺序;
第三行至第五行显示内存在每调用一次页面后的状态;
第六行:是否缺页;
最后一行显示缺页率;
第3章 详细设计与实现
3.1函数设计
1、添加按钮功能实现代码
主要功能:实现单击一次添加一个调用页面,并给出相应的提示,如正在输入的是第几次调度页面,在输入为空时能够弹出对话框提示用户,在输入完成时为避免数组越界应在输入完成时隐藏;输入过程中始终保证时输入焦点。private void btnAdd_Click(object sender, EventArgs e){ if(txtAdd.Text!= “")//输入不为空才能继续输入 { page_dd[i_add] = Convert.ToInt32(txtAdd.Text);/*将输入值赋值给页面数组*/ txtShow.Text += txtAdd.Text + ” “;/*显示供用户查阅*/ i_add++;txtAdd.Clear();/*清空*/ if(i_add == MaxN)//输入结束时 { txtAdd.ReadOnly = true;//不允许继续输入 btnAdd.Hide();//按钮隐藏 return;} txtAdd.Focus();//设置为输入焦点
label2.Text = ”第“ +(i_add + 1)+ ”次调度页面:“;/*提示用户正在输入的是第几次调度页面*/ } /*输入为空则弹出对话框提示用户输入为空*/ else { MessageBox.Show(”请输入调用页面!“, ”输入为空“, MessageBoxButtons.OK, MessageBoxIcon.Warning);txtAdd.Focus();} }
2、初始化函数
主要功能:将内存一先进先出方式填满,并记录每个页面进入时间,服务于先进先出页面置换算法和最佳置换算法。
void init(int[] a, int[] b,int []m1,int[]m2,int[]m3){ /*内存未满时循环*/ for(int i = 0;i < MaxM&&page_p //调整辅助数组将刚进入内存的页面的对应时间 OPT_F(O_Q ,i); count++;//缺页计数器加一 m1[page_p] = b[0];//保存内存状态 m2[page_p] = b[1];m3[page_p] = b[2];page_p++;//调用下一页面 //检查内存中是否原先就有需要的页面; for(int j = 0;j <= i&&page_p s[page_p] = 'F';//缺页数组对应数据更改 m1[page_p] = b[0];//记录内存状态 m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q,-1);//调整最佳置换算法辅助函数 page_p++;//调用下一页 j =-1;//重新开始寻找 } } } } 3、先进先出页面置换函数 主要功能:根据先进先出算法要求在产生缺页中断时采用先进先出方式确定淘汰页面,并在每次页面调用时记录下内存状态,缺页次数;采用循环队列使得每次出队的一定是最先进入内存的。 private void FIFO(int[] a, int[] b,int[]m1,int[]m2,int[]m3,char[] s){ int Fpage_p = page_p;int front, rear;//定义队列对手和对尾指针并初始化 front = 0;rear = MaxM1;int sa;for(;Fpage_p < MaxN;Fpage_p++){ sa = 0;for(int i = 0;i < MaxM;i++)//检查内存中是否已有要调用的页面。 { if(b[i] == a[Fpage_p]){ m1[Fpage_p] = b[0];m2[Fpage_p] = b[1];m3[Fpage_p] = b[2];s[Fpage_p] = 'F';sa = 1;break;} } if(sa == 0){ front =(front + 1)% MaxM; rear =(rear + 1)% MaxM;b[rear] = a[Fpage_p];m1[Fpage_p] = b[0];m2[Fpage_p] = b[1];m3[Fpage_p] = b[2];count++;} else continue;} } /*最近最久未使用算法辅助数组调整函数*/ private void LUR_I(int[] a,int e){ int temp;temp = a[e];a[e] = 1;for(int i = 0;i < MaxM;i++){ if(a[i] < temp && i!=e)a[i]++;} } /*最佳置换算法辅助数组调整函数*/ private void OPT_F(int[] a, int e){ if(e!=-1){ a[e] = 0;for(int i = 0;i < MaxM;i++){ if(i!= e)a[i]++;} } else for(int i = 0;i < MaxM;i++){ a[i]++;} } /*最近最久未使用算法*/ private void LRU(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s){ int[] L_Q = new int[MaxM]{3,3,3};int sa;for(int i = 0;i < MaxM && page_p < MaxN;i++){ b[i] = a[page_p];//调入内存 count++;m1[page_p] = b[0];//保存内存状态 m2[page_p] = b[1];m3[page_p] = b[2];LUR_I(L_Q, i);page_p++;for(int j = 0;j <= i && page_p < MaxN;j++){ if(b[j] == a[page_p]){ s[page_p] = 'F';m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];LUR_I(L_Q, j);page_p++;j =-1;} } } for(;page_p < MaxN;page_p++){ sa = 0;for(int i = 0;i < MaxM;i++)//用的页面。{ if(b[i] == a[page_p]){ m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];s[page_p] = 'F';LUR_I(L_Q, i);sa = 1;break;} } if(sa == 0){ 检查内存中是否已有要调40 for(int i = 0;i < MaxM;i++){ if(L_Q[i] == 3){ b[i] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];LUR_I(L_Q, i);break;} } count++;} else continue;} } /*最佳置换算法*/ private void OPT(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s){ int sa;int O_p;int Ocount;int[] OPT_I=new int [MaxM ]{-1 ,-1 ,-1 };int[] OPT_J=new int [MaxM]{MaxN ,MaxN ,MaxN };for(;page_p < MaxN;page_p++){ for(int i = 0;i < MaxM;i++){ OPT_I[i] =-1;//刷新状态数组 OPT_J[i] = MaxN;} sa = 0;for(int i = 0;i < MaxM;i++)//检查内存中是否已有要调用的页面。 { if(b[i] == a[page_p]){ m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q,-1); s[page_p] = 'F';sa = 1;break;} } if(sa == 0)//缺页 { Ocount = 0;for(int i = 0;i < MaxM;i++){ O_p = page_p + 1;for(;O_p < MaxN;O_p++){ if(b[i] == a[O_p]){ Ocount++;OPT_I[i] = 1;OPT_J[i] = O_p;break;} } } switch(Ocount){ case 0://全部页面以后都不会再度调用 int temp = 0;for(int i = 0;i < MaxM;i++){ if(O_Q[i] > O_Q[temp])temp = i;} b[temp] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q ,temp);count++;break;case 1://有一个页面将在以后调用 temp = 0;for(int i = 0;i < MaxM;i++){ if(OPT_I[i]!= 1 && O_Q[i] > O_Q[temp])temp = i; } b[temp] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q ,temp);count++;break;case 2: for(int i = 0;i < MaxM;i++){ if(OPT_I[i] ==-1){ b[i] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q, i);count++;} } break;case 3: int p = 0;for(int i = 0;i < MaxM;i++){ if(OPT_J[i] >OPT_J[p])p = i;} b[p] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q, p);count++;break;} } } } /*重置函数*/ private void btncz_Click(object sender, EventArgs e){ comboBox1.SelectedIndex = 0; txtAdd.Text = ”“;page_p = 0;i_add = 0;count = 0;//txtShow.Text = ”";for(int i = 0;i < MaxM;i++)Memery[i] =-1;for(int i = 0;i < MaxN;i++)s[i] = 'T';} } } 操 作 系 统 课 程 设 计 实 验 报 告 学院:计算机科学与技术学院 班级:计112 学号:1113022032 姓名: 一、实验名称: 用C++实现驱动调度算法、页面替换算法、银行家算法、处理器调度算法 二、实验要求: 书写实验报告,包括的内容有: (1)实验题目 (2)程序中使用的数据结构及主要文字说明 (3)带有注释的源程序 (4)执行程序说明,表明各进程控制快的初始状态,以及各算法的运行状态 (5)通过实验后的收获与体会及对实验的改进意见和见解 二、实验目的: 通过自己编程来实现各类操作系统算法,进一步理解操作系统的概念及含义,提高对操作系统的认识,同时提高自己的动手实践能力。加强我们对各类算法的理解。 三、实验内容: 1、实现页面替换算法 (1)FIFO 先进先出页面替换算法 (2)LRU最近最少使用页面替换算法 (3)LFU最少使用频率页面替换算法 2、银行家算法 3、实现驱动调度算法 (1)先来先服务算法 (2)电梯算法 (3)扫描算法 4、实现处理器调度 (1)先进先出处理器调度 (2)时间片轮转法 (3)优先级调度 四、实验原理: 1、页面替换算法 先进先出页面置换算法:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面加以淘汰。将已调入内存的页面按先后次序链接成一个队列,将最先调入的页面与新页面进行置换 最近最久未使用置换算法:该算法是利用“最近的过去”作为“最近的将来”,将最近最久未使用的页面加以淘汰。将已调入内存的页面按先后顺序链接成一个队列,为每一个页面增加一个访问字段,用来记录一个页面自上次被访问以来所经历的是时间t,当需淘汰一个页面时,选择现有页面中其t值最大,即最近最久未使用的页面加以淘汰 2、银行家算法 先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。若请求合法,则进行试分配。最后对试分配后的状态调用安全性检查算法进行安全性检查。若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。 3、驱动调度算法 先进先出算法(FIFO):总是严格按时间顺序对磁盘请求予以处理。算法实现简单、易于理解并且相对公平,不会发生进程饿死现象。但该算法可能会移动的柱面数较多并且会 经常更换移动方向,效率有待提高 电梯调度算法:总是将一个方向上的请求全部处理完后,才改变方向继续处理其他请求。 扫描算法(scan algorithm):总是从最外向最内(或最内向最外)进行扫描,然后在从最内向最外(或最外向最内)扫描。该算法与电梯调度算法的区别是电梯调度在没有最外或最内的请求时不会移动到最外或最内柱面。 4、处理器调度算法 先进先出处理器调度:按照作业进入系统后备工作队列的先后次序来挑选作业,先进入系统的作业将优先被挑选进入主存,创建用户进程,分配所需资源,然后移入就绪队列。 时间片轮转法调度算法:调度次序每次把CPU分配给就绪队列进程/线程使用规 定的时间间隔,就绪队列中每个进程/线程轮流的运行一个时间片,当时间片耗尽时,就强迫当前运行进程/线程让出处理器,转而排列到就绪队列尾部,等候下一轮调度。 优先级调度:根据确定的优先级来选取进程/线程,总是选择就绪队列中的优先 级最高者投入运行,即优先级越高,先被调用。 五、数据结构设计 对操作系统的各类算法设计数据结构如下: 页面替换算法:void FIFO();void LRU();void LFU(); 银行家算法:void Init()初始化算法 void Bank()银行家算法 bool Safe()安全性算法 驱动调度算法: struct MagneticHead//磁头构成{ int site; int count; bool direct; }; struct Range//磁盘磁道范围 { int mStart; int mEnd; }; struct RequestList//请求序列 { int site; bool state; }; struct Data//基本数据集合{ MagneticHead magneticHead; RequestList *requestList; int *executeList; Range range; int length; }; 处理器调度: typedef struct pcb//时间片轮转法 { char pname[N]; int runtime; int arrivetime; char state; struct pcb*next; }PCB; typedef struct PCB1//先进先出服务 { char ID[3];//进程号 char name[10];//进程名 char state;//运行状态 floatarrivetime;//到达时间 floatstarttime;//进程开始时间 floatfinishtime;//进程结束时间 floatservicetime;//服务时间 float turnaroundtime;//周转时间 float weightedturnaroundtime;//带权周转时间 struct PCB1 *next;//指向下个进程 }pcb1; struct pcb2 {优先级调度 char name[10]; char state; int super; int ntime; int rtime; struct pcb2* link; }*ready=NULL,*d; typedef struct pcb2 PCB2; 六、课程设计总结 在本次课程设计中,就是讲平时所做的实验结合起来,实现操作系统的各类算法,了解操作系统的运行原理以及其基本概念,更好的将操作系统的原理很好的展现出来。同时,在本次实验中遇到了很多问题,需要我们仔细的检查和修改。其次,实验中为了能更好的体现各类算法的运行情况,需要做一个清晰的界面,以能清楚地看出运行结果。 操作系统课程设计报告 专 业:计算机科学与技术 学 号: 姓 名: 提交日期: 操作系统课程设计报告 【设计目的】 (1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 (2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。 (3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力 【设计内容】 为Linux系统设计一个简单的二级文件系统。要求做到以下几点: 1.可以实现下列几条命令: login 用户登录 dir 列目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 cd 进出目录 2.列目录时要列出文件名,物理地址,保护码和文件长度 3.源文件可以进行读写保护 【实验环境】 Windows xp/7 C++/VC++ 【相关知识综述】 1、文件系统 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。 2、位示图 位示图是利用二进制的一位来表示磁盘中的一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已经分配。有的系统把“0”作为盘块已分配的标记,把“1”作为空闲标志。(它们的本质上是相同的,都是用一位的两种状态标志空闲和已分配两种情况。)磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。 操作系统课程设计报告 【设计思路】 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。 首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。 用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2„并以编号作为物理地址,在目录中进行登记。 【程序主要流程图】 否 验证是否成 功? 是 目录 右键进行选择 操作 新建目录新建文件打开文件 结束 开始登录删除属性 2 操作系统课程设计报告 【源程序清单】 typedef struct //文件结构体 /*the structure of OSFILE*/ { int fpaddr; /*file physical address*/ int flength; /*file length*/ int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write;3-Protect;*/ char fname[MAXNAME]; /*file name*/ } OSFILE; typedef struct //用户文件目录结构体 user file directory /*the structure of OSUFD*/ { char ufdname[MAXNAME]; /*ufd name*/ OSFILE ufdfile[MAXCHILD]; /*ufd own file*/ }OSUFD; typedef struct //登陆 /*the structure of OSUFD'LOGIN*/ { char ufdname[MAXNAME]; /*ufd name*/ char ufdpword[8]; /*ufd password*/ } OSUFD_LOGIN; typedef struct //文件打开模式 /*file open mode*/ { int ifopen; /*ifopen:0-close,1-open*/ int openmode; /*0-read only,1-write only,2-read and write,3-initial*/ }OSUFD_OPENMODE; void DeleteF()/*Delete File*/ { int i,j,k=0;char str[255],str1[255];char fname[MAXNAME];k=ExistD(dirname);//获取用户的序号 printf(“Please input filename:”);gets(fname);//获得需要打开的文件名fname for(i=0;i if(strcmp(strupr(ufd[k]->ufdfile[i].fname),strupr(fname))==0) { 操作系统课程设计报告 } } void OpenF()/*Open File*/ { int i,k=0;char fname[MAXNAME];//printf(“nnC:%s>”,strupr(dirname));k=ExistD(dirname);printf(“Please input filename:”);gets(fname);//获得需要打开的文件名fname for(i=0;i if(strcmp(strupr(ufd[k]->ufdfile[i].fname),strupr(fname))==0) { ifopen[k][i].ifopen=1;//打开文件 ifopen[k][i].openmode=ufd[k]->ufdfile[i].fmode;//将读写属性赋值 //test// printf(“i=%d,k=%dn”,i,k); ///test// printf(“openmode=%dn”,ifopen[k][i].openmode); printf(“Open file successfully!n”); break;//打开文件则跳出循环 itoa(ufd[k]->ufdfile[i].fpaddr,str,10);//itoa函数,把数字转换成字符串 strcpy(str1,“file”);strcat(str1,str);strcpy(str,“c:osfilefile”);strcat(str,str1);strcat(str,“.txt”);//str为文件的物理路径 if(remove(str)==0) //调用remove函数删除 第k个用户的第i个文件ufd[k]->ufdfile[i] { fpaddrno[ufd[k]->ufdfile[i].fpaddr] = 0;//位示图置为0,表示没被占用 for(j = i;j<=fcount[k]-1;j++)//文件顺序往前移一位 ufd[k]->ufdfile[j] = ufd[k]->ufdfile[j+1]; fcount[k] = fcount[k]-1;//文件数-1 printf(“Delete file successfully!n”); //除了删除原文件,还要 删除dir中的东西 } else printf(“Delete file fail!n”);break;} 操作系统课程设计报告 } } } void CloseF()/*Close File*/ { int i,k=0;char fname[MAXNAME]; k=ExistD(dirname);printf(“Please input filename:”);gets(fname);//获得需要关闭的文件名fname for(i=0;i if(strcmp(strupr(ufd[k]->ufdfile[i].fname),strupr(fname))==0) { ifopen[k][i].ifopen=0;//关闭文件 ifopen[k][i].openmode=4;//fmode改为初始值4 printf(“Close file successfully!n”); break; } } } void WriteF()/*Write File*/ { int i,k,n=0;char fname[MAXNAME];char str[255],str1[255];int flag=1; if(strcmp(strupr(ltrim(rtrim(dirname))),“")==0) { printf(”nError.Please convert to ufd dir before read.n“); wgetchar=1; return;} printf(”nCaution:Open file firstn“);printf(”Opened File(s)List:n“);k=ExistD(dirname); 操作系统课程设计报告 for(i=0;i //文件属性为只写或者是读写才能write { printf(”%15s“,ufd[k]->ufdfile[i].fname); n++;} if((n%4==0)&&(n!=0))printf(”n“); } printf(”n%d files openned.n“,n); if(n==0)wgetchar=1;if(n!=0){ printf(”nPlease input FileName:“);gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){ if(ifopen[k][i].ifopen==1) { if((ifopen[k][i].openmode==1)||(ifopen[k][i].openmode==2)) { itoa(ufd[k]->ufdfile[i].fpaddr,str,10); strcpy(str1,”file“); strcat(str1,str); strcpy(str,”c:osfilefile“); strcat(str,str1); strcat(str,”.txt“);//物理路径 int length=0; char c; printf(”Please input text('#' stands for end):n“); fp_file=fopen(str,”ab+“);//在文件末尾加 add bit while((c=getchar())!='#')//以#为结尾 { fputc(c,fp_file); if(c!='n')length++; } //fprintf(fp_file,”n“); 操作系统课程设计报告 fclose(fp_file); ufd[k]->ufdfile[fcount[i]-1].flength += length;//原长度加输入长度 printf(”n'%s' has been written successfully!n“,fname); } else { printf(”nError.'%s' has been opened with WRITE ONLY mode.It isn't read.n“,fname); wgetchar=1; } } else { printf(”nError.'%s' is in closing status.Please open it before readn“,fname); wgetchar=1; } } else { printf(”nError.'%s' does not exist.n",fname); wgetchar=1; } } } 操作系统课程设计报告 【测试结果】 1、创建用户 2、创建文件,并且打开读取文件 操作系统课程设计报告 3、写文件 4、删除文件 操作系统课程设计报告 【设计总结】 这两周的课程设计时间非常短,从中学到了很多知识,也为我们的学习提供了良好的实践平台。首先,通过老师的细心指导和同学们的相互帮助,让我对题目【二级文件系统】有了进一步了解。接下来,主要是研究老师所给的大部分代码,参考他的基本思路,并且思考每一个结构体在代码中的具体作用。这期间和一些同学交流了各自的思路,在交流中,大家渐渐的明确了这个程序的思路、框架结构等。我们所做的主要是补充了删除文件,打开文件,关闭文件,写文件这几个部分。 代码编写完了之后,实现了题目所要求的基本功能,但是在测试的过程中,还发现了这个程序存在各种各样的bug。不断的测试修改后,得到完善。 这次课设最大的收获在于:学会交流以及相互帮助。在大家的交流沟通之中,我们解决了一个又一个难题。 在这次课设中,我还意识到,要把这门课真真正正地学好,不单单只是为了能够应付考试,平时还要多加学习,多加努力才对。 【参考文献】 【1】C语言程序设计(第三版)谭浩强 【2】计算机操作系统教程(第三版).张尧学 史美林 张高 【3】计算机操作系统,西安电子科技大学出版社,方敏主编,2004.8第四篇:操作系统课程设计报告
第五篇:操作系统课程设计报告