2015广工操作系统实验报告(文档最后含源码下载地址)
操作系统实验报告(全)
操作系统实验报告书院系名称:电子工程学院电子指导教师:班级:学号:学生姓名:实验题目一:进程一、实验目的通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。
二、实验内容(1)补充POSIX 下进程控制的残缺版实验程序(2)回答下列问题:1. 你最初认为运行结果会怎么样?2. 实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
3. proc_number 这个全局变量在各个子进程里的值相同吗?为什么?4. kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?5. 使用kill 命令可以在进程的外部杀死进程。
进程怎样能主动退出?这两种退出方式哪种更好一些?三、实验步骤1.根据题意进入DOC环境中编写程序。
2.编译,链接,运行程序,进行调试。
3.分析实验结果及回答问题。
四、调试情况,回答问题及体会1、对自己设计进行评价,指出合理和不足之处,提出改进的方案。
2、在设计过程中的感受。
调试情况:回答上述实验内容中的问题1.预期结果:会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。
2.实际结果:与预期差不多,因输入进程总数20大于设定的最大进程数,因此按进程数10来处理。
随机输出0-9号进程,sleep(SLEEP_INTERV AL),循环输出,直到输入数字键,则会杀死该数字对应的进程,直到输入q退出循环,然后杀死本组所有进程。
分析:每创建一个子进程时,将其pid存储在pid[i]中,i存储在proc_number,然后调用死循环函数do_something(),输出该进程的代号proc_number;当输入数字键时,主进程会执行kill(pid[ch-'0'],SIGTERM),从而杀死(ch-‘0’)号进程。
2015广工编译原理课程设计报告(文档最后含源码下载地址)
课程设计课程名称___编译原理__________题目名称___PL/0编译器的扩充 __ 学生学院___计算机学院_________专业班级_计算机科学与技术13(9)学号学生姓名指导教师___林志毅________________ 2016 年1 月2 日一、 已完成的内容:(1) 扩充赋值运算:*= 和 /=(2) 扩充语句(Pascal 的FOR 语句)FOR <变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句>(3) 增加类型:①字符类型;②实数类型。
(4) 增加注释; 多行注释由/*和*/包含,单行注释为//二、 实验环境与工具(1)计算机及操作系统:PC 机,Windows7(2)程序设计语言:C++(3)使用软件Borland C++ Builder 6.0(4)教学型编译程序:PL/0三、 具体实现:1. 扩充赋值运算:*= 和 /=(1) 语法树(2) 修改GetSym()方法(写出修改的代码)else if(CH=='*') {GetCh();if(CH=='=') { SYM=TIMESBECOMES; GetCh(); }else SYM=TIMES;} else if(CH=='/') {GetCh();if(CH=='=') { SYM=SLASHBECOMES; GetCh(); }(3) 修改STATEMENT ()方法(写出修改的代码)case IDENT:i=POSITION(ID,TX); if (i==0) Error(11);else if (TABLE[i].KIND==VARIABLE || TABLE[i].KIND==FLOATTYPE) { /*ASSIGNMENT TO NON-VARIABLE*/GetSym();if (SYM==BECOMES|| SYM==TIMESBECOMES || SYM==SLASHBECOMES||SYM==PLUSBECOMES||SYM==MINUSBECOMES) {RELOP=SYM;if(SYM!=BECOMES) { //若为除等于(或其他类似符号)则先把符号左边的变量值放入栈中GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}GetSym();} else Error(13);EXPRESSION(FSYS,LEV,TX);if(RELOP==TIMESBECOMES) {GEN(OPR,0,4);} else if(RELOP==SLASHBECOMES) {GEN(OPR,0,5);} else if(RELOP==PLUSBECOMES) {GEN(OPR,0,2);} else if(RELOP==MINUSBECOMES) {GEN(OPR,0,3);}GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}(4)运行测试(测试的PL0源码扩充单词的测试并贴运行结果截图)PL0源码:PROGRAM EX01;VAR A,B,C,D;BEGINA:=16;A/=2;WRITE(A); //结果为8B:=4;B*=2;WRITE(B); //结果为8C:=6;C+=2;WRITE(C); //结果为8D:=10;D-=2;WRITE(D); //结果为8END.(5)运行结果:(6)出现的问题及解决开始时在实现/=和*=操作时,*=的实现很顺利,而/=却一直没有得到理想的结果,通过与同学的讨论得知代码中除号指令的解析中,其实为除余操作,于是将%改为/,但是结果还是错误,经过调试发现是两个相除的数在栈中的位置相反了,正确的状态应该是除数位于次栈顶,而被除数位于栈顶。
《操作系统》实验报告
《操作系统》实验报告一、实验目的操作系统是计算机系统中最为关键的组成部分之一,本次实验的主要目的是深入理解操作系统的基本原理和功能,通过实际操作和观察,熟悉操作系统的核心概念,包括进程管理、内存管理、文件系统和设备管理等,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、进程管理实验进程是操作系统中最基本的执行单元。
在这个实验中,我们使用C++编写程序来创建和管理进程。
通过观察进程的创建、执行和结束过程,理解进程的状态转换和资源分配。
首先,我们编写了一个简单的程序,创建了多个子进程,并通过进程标识符(PID)来跟踪它们的运行状态。
然后,使用等待函数来等待子进程的结束,并获取其返回值。
在实验过程中,我们发现进程的创建和销毁需要消耗一定的系统资源,而且进程之间的同步和通信需要谨慎处理,以避免出现死锁和竞争条件等问题。
2、内存管理实验内存管理是操作系统的核心功能之一,它直接影响系统的性能和稳定性。
在这个实验中,我们研究了动态内存分配和释放的机制。
使用 C++中的 new 和 delete 操作符来分配和释放内存。
通过观察内存使用情况和内存泄漏检测工具,了解了内存分配的效率和可能出现的内存泄漏问题。
同时,我们还探讨了内存分页和分段的概念,以及虚拟内存的工作原理。
通过模拟内存访问过程,理解了页表的作用和地址转换的过程。
3、文件系统实验文件系统是操作系统用于管理文件和目录的机制。
在这个实验中,我们对文件的创建、读写和删除进行了操作。
使用 C++的文件流操作来实现对文件的读写。
通过创建不同类型的文件(文本文件和二进制文件),并对其进行读写操作,熟悉了文件的打开模式和读写方式。
此外,还研究了文件的权限设置和目录的管理,了解了如何保护文件的安全性和组织文件的结构。
4、设备管理实验设备管理是操作系统与外部设备进行交互的桥梁。
广工操作系统2015的实验报告材料
实验报告课程名称操作系统实验学生学院计算机学院专业班级计算机科学与技术学号学生姓名指导教师孙为军2015 年 12 月30日实验一进程调度一、实验目的编写并调试一个模拟的进程调度程序,以加深对进程的概念及进程调度算法的理解.二、实验内容1.采用“短进程优先”调度算法对五个进程进行调度。
每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已用CPU时间、进程状态等等。
2.每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
三、实现思路先考虑实现进程调度所需要的数据结构,然后根据所需要的算法进行设计。
四、主要的数据结构进程控制块PCB:struct pcb {char name[10];char state;int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;五、算法流程图六、运行与测试输入进程信息:输入完毕,显示当前运行以及就绪的进程:优先运行短进程七、改进的方向界面比较难看,可以中文化信息。
实验二作业调度一、实验目的用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。
二、实验内容1.写并调试一个单道处理系统的作业等待模拟程序。
2.作业等待算法:分别采用先来先服务(FCFS)、响应比高者优先(HRN)的调度算法。
3.由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。
4.每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
广东工业大学 操作系统实验报告
char state;
int super;
int ntime;
int rtime;
struct pcb* link;
}*ready=NULL,*p;
typedef struct pcb PCB;
//////////////////////////////////////////////////////////////
}
}
//////////////////////////////////////////////////////////////
input()/* 建立进程控制块函数*/
{
int i,num;
system("cls");
printf("\n 请输入进程号?");
scanf("%d",&num);
for(i=0;i<num;i++)
printf("%s\t",pr->name);
printf("%c\t",pr->state);
printf("%d\t",pr->super);
printf("%d\t",pr->ntime);
printf("%d\t",pr->rtime);
printf("\n");
}
////////////////////////////////////////////////
while(second!=NULL)
{
if((p->super)>(second->super))
操作系统课程设计实验报告(附思考题答案)
操作系统课程设计实验报告(附思考题答案)课程设计(综合实验)报告( 2015 -- 2016 年度第 1 学期)名称:操作系统综合实验题目:oslab综合实验院系:计算机系班级:学号:学生姓名:指导教师:设计周数:分散进行成绩:日期:2015 年10 月29 日一、综合实验的目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。
二、实验正文实验1:实验环境的使用1.1实验目的:1.熟悉操作系统集成实验环境OS Lab 的基本使用方法。
2.练习编译、调试EOS 操作系统内核以及EOS 应用程序。
1.2实验内容:1.启动OS Lab2.学习OS Lab 的基本用法● 新建 Windows 控制台应用程序项目(1)在“文件”菜单中选择“新建”,然后单击“项目”。
(2)在“新建项目”对话框中,选择项目模板“控制台应用程序(c)”。
(3)在“名称”中输入新项目使用的文件夹名称“oslab ”。
(4)在“位置”中输入新项目保存在磁盘上的位置“C:\test ”。
(5)点击“确定”按钮。
● 生成、执行项目●3.EOS 内核项目的生成和调试● 新建 EOS 内核项目并按F7生成项目● 调试项目● 查看软盘镜像文件中的内容、EOS SDK (Software Development Kit )文件夹4.EOS 应用程序项目的生成和调试● 新建 EOS 应用程序项目● 修改 EOS 应用程序项目名称使用断点中断执行查看变量的值5.退出OS Lab6.保存EOS内核项目1.3思考与练习●在实验1中,生成EOS SDK文件夹的目的和作用是什么?答:SDK文件夹中提供了开发EOS应用程序需要的所有文件。
debug文件夹是在使用debug配置生成项目时生成的,其中存放了调试版本的EOS二进制文件。
操作系统文件系统实验报告后附源代码
目录1 课程设计简介 (1)1.1 课程设计的目的 (1)1.2 课程设计内容 (1)2 数据结构的设计 (2)2.1 预定义 (2)2.2 结构体 (2)2.3 全局变量和函数 (2)3 功能模块(或算法)描述 (5)3.1 模块划分 (4)3.2 模块流程图 (6)4 程序运行结果 (8)5心得体会 (9)参考文献 (10)附源代码 (11)1 课程设计简介1.1 课程设计的目的课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
1.2 课程设计内容课程设计内容设计一个简单的多用户文件系统。
即①在系统中用一个文件来模拟一个磁盘;②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。
③实现这个文件系统。
④能实际演示这个文件系统。
基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。
1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。
另外,为打开文件设置了运行文件目录(AFD)。
3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4)因系统小,文件目录的检索使用了简单的线性搜索。
5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录,如图5.1所示。
2 数据结构的设计2.1 预定义#define BLOCKSIZ 512 //磁盘块的大小#define DA TABLKNUM 512 //数据块的数目#define BLKGRUPNUM 50 //数据块组包含多少数据块#define P_N_BLOCKS 15 //inode节点中指向数据块的指针个数#define GROUPNUM DATABLKNUM/BLKGRUPNUM+1 //数据块组组数#define DINODESIZ 512 //磁盘i结点区的大小(空间32×512)#define DINODENUM 32 //磁盘i结点区的块数#define SYSOPENFILE 40#define DIRNUM 32 //一个目录下的最多目录和文件的总和数#define DIRSIZ 14 //文件、目录名的长度(字节)#define UPWDSIZ 15 //密码的长度#define UNAMSIZ 15 //用户名的长度#define PWDSIZ sizeof(struct pwd) //密码结构的长度#define PWDNUM BLOCKSIZ/PWDSIZ //密码数据空间的大小(pwd为单位)#define NOFILE 20 //一个用户最多可以打开的文件数目#define DINODESTART 4*BLOCKSIZ//i结点区的开始地址-inodes table ,1引导2超块3block bitmap 4inode bitmap#define DA TASTART (2+DINODENUM)*BLOCKSIZ //数据区的开始地址#define DATASTARTNO 36 //数据区开始指针#define DIMODE_EMPTY 00000/*可以用的空间*/#define DIMODE_FILE 00001#define DIMODE_DIR 00002#define DIMODE_PASSWD 00004#define GRUP_0 0 //管理员组#define GRUP_1 1#define GRUP_2 2#define GRUP_4 42.2 结构体//磁盘i结点结构,struct inode{// char di_name[DIRSIZ];unsigned __int16 di_ino; /*磁盘i节点标识*/unsigned __int16 di_number; /*关联文件数,当为0时表示删除文件*/unsigned __int16 di_mode; /*存取权限*/unsigned __int16 di_uid; /*磁盘i节点用户id*/unsigned __int16 di_gid; /*磁盘i节点权限组id*/ //1管理员组2用户组unsigned __int32 di_size; /*文件大小*/unsigned __int32 di_ctime; /* Creation time */unsigned __int32 di_mtime; /* Modification time */unsigned __int16 di_block[P_N_BLOCKS]; /* 一组block 指针*/};// 目录项结构struct direct{char d_name[DIRSIZ]; /*目录名(14字节)*/__int16 d_ino; /*目录号*/};//超级快结构struct super_block{unsigned __int16 s_inodes_count; /* inodes 计数*/unsigned __int16 s_blocks_count; /* blocks 计数*/unsigned __int16 s_r_blocks_count; /* 保留的blocks 计数*/unsigned __int16 s_free_blocks_count; // 空闲的blocks 计数unsigned __int16 s_free_inodes_count; /* 空闲的inodes 计数*/unsigned __int16 s_free_blocks_group[GROUPNUM];//新增一个数组来记录每个数据块组中的空闲数据块计数unsigned __int16 s_first_data_block; /* 第一个数据block */unsigned __int16 s_log_block_size; /* block 的大小*/unsigned __int16 s_blocks_per_group; /* 每block group 的block 数量*/unsigned __int16 s_inodes_per_group; /* 每block group 的inode 数量*/};// 用户密码struct pwd{unsigned __int8 p_uid;unsigned __int8 p_gid;char username[UNAMSIZ];/*用户名新加的*/char password[UPWDSIZ];};// 目录结构struct dir{struct direct direct[DIRNUM];__int16 size;};2.3 全局变量和函数// 全局变量unsigned __int8 di_bitmap[DINODENUM]; // 硬盘inode节点位图1表示已使用0表示未使用unsigned __int8 bk_bitmap[DA TABLKNUM]; // 数据块block位图struct super_block filsys; //超级块struct pwd pwd[PWDNUM];FILE *fd; //文件指针struct inode *cur_inode; //i节点当前目录指针struct inode *inodetemp; //i节点指针const char fsystemname[20]="Linux.EXT2"; //模拟硬盘的文件名struct direct dir_buf[BLOCKSIZ / sizeof(struct direct)]; //目录数组char cmdhead[20];//cmd 的头表示所在哪个文件夹、int i_lock=0;//inode位图锁可能会多线程int b_lock=0;//block位图锁struct pwd *cur_user;/* 全局函数*/extern int Format();//格式化磁盘extern int Install();//启动,安装文件系统struct inode * read_inode(int);//install里面读取文件dinodestruct direct * read_dir_data(int);//读取存储文件夹的物理块extern void showdir();//命令dirint Enterdir(char[]);//进入某个文件夹命令-- cd 文件名int Fd_dirfile(char[]);//查找当前目录里的文件没找到返回-1 找到返回inode号int Iscmd(char[]);//判断是否两个字符串的命令void two_cmd(char[],char[]);//两个字符串的命令int creat(char[]);//创建文件void changeinode();//交换指针char * ReadFile(char[]);//读取文件int mkdir(char[]);//创建文件夹void showbitmap();//显示位图int deletefd(char[]);//删除文件int editfile(char[]);//编辑文件int rename(char[]);//重命名void showhelp();//命令帮助void login();void logout();int access();//权限判断/*磁盘i节点的分配与释放(当一个新文件被建立的时候,在给该文件分配磁盘存储区之前,应为该文件分配存放该文件说明信息的磁盘i节点,当从文件系统中删除某个文件时,应首先删除它的磁盘i节点项。
2015广工操作系统课程设计报告之磁盘调度(附java源代码)
《操作系统》课程设计磁盘调度算法学 院 计算机学院 专 业 计算机科学与技术 学 号 姓 名指导教师孙为军日期2016年1月2日操作系统课程设计任务书说明:本表由指导教师填写,由系主任审核后下达给选题学生,装订在设计(论文)首页一、设计思想说明1.1 设计环境开发平台:eclipse Version: Luna Service Release 1 (4.4.1) Build id: 20140925-1800开发环境:Windows10 操作系统Java版本:java version “1.8.0_25”java<TM> SE Runtime Environment <build 1.8.0_25-b18>java HotSpot(TM) 64-Bit Server Vm <Build 25.25-b02,mixed mode>1.2 设计思想1.先到先服务算法(FCFS)这是一种比较简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。
2.最短寻道时间优先调度算法(SSTF)该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。
其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。
在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。
3.扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。
广工操作系统实验
操作系统实验报告学生学院计算机学院专业班级12级网络1班学号3112006345学生姓名沙宇丰指导教师敏2015 年01月07日目录1 实验一进程调度………………………………………………………………2 实验二作业调度………………………………………………………………3 实验三存储管理………………………………………………………………实验一进程调度(实现了最高优先级优先,时间片轮转,多级反馈队列三种算法)1、实验目的编写并调试一个模拟的进程调度程序,采用最高优先数优先算法,时间片轮转算法,多级反馈队列算法对进程进行调度。
以加深对进程的概念及进程调度算法的理解.2:实验原理每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:进程名、到达时间、需要运行时间、已运行时间、进程状态等等。
每个进程的状态可以是就绪W(Wait)、运行R(Run)两种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用运行时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程需要继续运行,此时应分配时间片给就绪队列中排在该进程之后的进程,并将它插入就绪队列队尾。
3:实验容,法首先对于:最高优先数算法:最高优先数算法的基本思想是把cpu分配给就绪队列中优先数最高的进程。
而我采用优先数动态变化的式,进程在没获得一次cpu时间后其优先数就减一,然后对各个进程的优先数进行重新排序。
继续把cpu分配给优先数最高的进程。
进程的剩余时间为0时就退出队列。
首先用create()函数创建链表并对其初始化,然后对链表按照优先级大小进行排序,然后把排序后的链表放进processing()函数中进行处理,让其占有一个时间片执行,若进程任然未完成,则把该进程放进insert()函数中插入就绪队列中。
用disp()函数进行进程的显示。
安徽工业大学操作系统实验报告.
《操作系统教程》实验报告书专业班级学号姓名指导教师2015年12月28号实验一WINDOWS进程初识1、实验目的(1)学会使用VC编写基本的Win32 Consol Application(控制(2)台应用程序)。
(3)掌握WINDOWS API的使用方法。
(4)编写测试程序,理解用户态运行和核心态运行。
2、实验内容和步骤(1)编写基本的Win32 Consol Application步骤1:登录进入Windows,启动VC++ 6.0。
步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。
创建一个新的控制台应用程序工程。
步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。
步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。
编译成可执行文件。
步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe运行结果 (如果运行不成功,则可能的原因是什么?) :运行成功,截图:(2)计算进程在核心态运行和用户态运行的时间步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。
步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。
步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。
2015广工操作系统课程设计报告(文档最后含源码下载地址)
操作系统课程设计学生学院____ 计算机学院______ 专业班级 13级计科9 学号学生姓名指导教师李敏2015 年12 月29 日成绩一、课程设计介绍设计模拟一个实现多道批处理系统的两级调度。
通过具体的作业调度、进程调度、内存分配等功能的实现,加深对多道批处理系统的两级调度模型和实现过程的理解。
作业从进入系统到最后完成,要经历两级调度:作业调度和进程调度。
作业调度是高级调度,它的主要功能是根据一定的算法,从输入井中选中若干个作业,分配必要的资源,如主存、外设等,为它们建立初始状态为就绪的作业进程。
进程调度是低级调度,它的主要功能是根据一定的算法将CPU分派给就绪队列中的一个进程。
在本次课程设计中假定系统可供用户使用的主存空间共100KB,并有4台磁带机。
主存分配采用可变分区分配方式且主存中信息不允许移动,对磁带机采用静态分配策略,作业调度分别采用先来先服务算法和最小作业优先算法,进程调度则采用先来先服务和最短进程优先算法。
二、课程设计环境1.计算机及操作系统:PC机,WindowsXP系统2.程序设计使用工具:Microsoft VisualC++ 6.03.程序设计语言:C语言三、课程设计思想假定“预输入”程序已经把一批作业的信息存放在输入井了,并为它们建立了相应作业表。
测试数据如下:作业到达时间估计运行时间内存需要磁带机需要JOB1 10:00 25分钟15K 2台JOB2 10:20 30分钟60K 1台JOB3 10:30 10分钟50K 3台JOB4 10:35 20分钟10K 2台JOB5 10:40 15分钟30K 2台本次课程设计采用的是两个作业调度算法:先来先服务算法和短作业优先算法,两个进程调度算法:先来先服务算法,短进程优先算法。
系统根据所选算法组合对输入系统的作业进行两级调度(作业调度,进程调度)。
分别在不同算法控制下运行设计的程序,依次显示被选中作业、内存空闲区和磁带机的情况,输出不同算法作业的选中次序及作业平均周转时间。
《操作系统》课程实验报告
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
操作系统实验报告
操作系统实验报告1. 实验目的本实验旨在通过设计和实现一个基本的多道批处理操作系统来加深对操作系统基本概念和原理的理解,并加强对操作系统进行实践的能力。
2. 实验环境本实验采用如下环境进行实验:•操作系统:Windows 10•编程语言:C3. 实验内容本实验实现了一个基本的多道批处理操作系统,主要包括以下内容:3.1 进程调度操作系统通过进程调度算法,根据进程的优先级和进程的执行状态来决定下一次运行的进程,从而合理利用和分配CPU资源。
本实验中我们采用了基本的抢占式调度算法,即优先级越高的进程将会获得更多的CPU时间。
3.2 进程管理操作系统管理着多个并发运行的进程,在系统的执行过程中需要对这些进程进行管理,如创建新进程、销毁进程、挂起进程等等。
本实验中我们实现了进程的创建和销毁功能,并可以通过调用相应系统调用来挂起和恢复进程。
3.3 内存管理操作系统需要管理系统中的内存空间,为各个进程分配所需的内存。
本实验中我们实现了基本的内存管理功能,可以为进程分配内存空间,并在进程结束时回收内存资源。
3.4 文件管理操作系统能够管理文件系统,在文件系统中进行文件的创建、读取、写入和删除等操作。
本实验中我们实现了文件管理功能,可以创建和删除文件,并实现了文件的读写操作。
4. 实验结论通过本次实验,我们深入学习了操作系统的基本原理和概念,并实践了设计和实现一个基本的多道批处理操作系统。
通过实验,我们掌握了进程调度、进程管理、内存管理和文件管理等基本功能的实现方法。
在实现的过程中,我们发现操作系统的设计与实现是非常复杂且需要考虑多种因素的。
通过本次实验,我们对操作系统的工作原理有了更加深入的理解,并提升了解决问题和编程能力。
5. 实验总结通过本次实验,我们进一步了解了操作系统的工作原理和基本功能,并通过设计和实现一个基本的多道批处理操作系统来加深对操作系统的理解。
在实验过程中,我们遇到了一些问题,如进程调度算法的选择、内存资源的分配等等。
操作系统实验报告(DOC)
实验六设备管理实验目的1、理解设备管理的概念和任务。
2、掌握独占设备的分配、回收等主要算法的原理并编程实现。
实验内容与基本要求1、在Windows系统中,编写程序实现对独占设备的分配和回收的模拟,该程序中包括:建立设备类表和设备表、分配设备和回收设备的函数。
实验报告内容1、独占设备的分配、回收等主要算法的原理。
为了提高操作系统的可适应性和可扩展性,现代操作系统中都毫无例外地实现了设备独立性,又叫做设备无关性。
设备独立性的含义是,应用程序独立于具体使用的物理设备。
为了实现独占设备的分配,系统设置数据表格的方式也不相同,在实验中只要设计合理即可。
这里仅仅是一种方案,采用设备类表和设备表。
(1)数据结构操作系统设置“设备分配表”,用来记录计算机系统所配置的独占类型、台数以及分配情况。
设备分配表可由“设备类表”和“设备表”两部分组成,如下图(2)设备分配当进程申请某类设备时,系统先查“设备类表”如果该类设备的现存台数可以满足申请要求 则从该类设备的“设备表”始址开始依次查该类设备在设备表中的登记项,找出“未分配”的设备分配给进程。
分配后要修改设备类表中的现存台数,把分配给进程的设备标志改为“已分配”且填上占用设备的进程名。
然后把设备的绝对号与相对号的对应关系通知用户,以便用户在分配到的设备上装上存储介质。
(3)设备回收当进程执行结束撤离时应归还所占设备,系统根据进程名查设备表,找出进程占用设备的登记栏,把标志修改为“未分配”清除进程名。
同时把回收的设备台数加到设备类表中的现存台数中。
2、程序流程图。
主体流程设备分配设备回收3、程序及注释。
#include<stdio.h>#include<string.h>#include<stdlib.h>#define false 0#define true 1#define n 4 /*宏定义 用于修改设备类型数目*/#define m 10 /*宏定义 用于修改设备数目*/struct /*该结构体用于定义设备类表各信息*/{ char type[10]; /*设备类型名*/int count; /*拥有的设备总台数*/int remain; /*现存的可用设备台数*/ int address; /*该类设备设备表中的起始地址*/ }equiptype[n]; /*系统设备类型为n*/struct /*该结构体用于定义设备表各信息*/{int number; /*设备绝对编号*/int lnumber; /*设备相对编号*/int status; /*设备好坏状态*/int remain; /*设备是否已被分配*/ char jobname[4]; /*占有设备的作业名*/ } equipment[m]; /*系统设备数为m*/ /******子函数作业设备分配*******/allocate(char *J,char *type,int cc){int i,t,j;i=0;while(i<n&&strcmp(equiptype[i].type,type)!=0) /*查找欲申请分配的设备类型 strcmp函数用于比较equiptype[i].type与type的大小若相等则返回0*/i++;if(i>=n) /*若没有找到欲申请设备*/ {printf("没有找到欲分配的设备,分配失败!");return(false);}if(equiptype[i].remain<1) /*欲申请设备现存可用台数不足*/ {printf("该类设备数量不足 分配失败!");return(false);}t=equiptype[i].address; /* 取出该类设备在设备表中的起地址赋给t*/while(!(equipment[t].status==1 && equipment[t].remain==0))t++; /*该设备类型起始地址加一*/ equiptype[i].remain--; /*剩余设备数减一*/equipment[t].remain=1; /*状态改为已分配*/strcpy(equipment[t].jobname,J); /*strcpy为字符串拷贝函数把J中的字符串拷贝到equipment[t].jobname中*/equipment[t].lnumber=cc; /*设备相对号写入cc*/}/**********************子函数 作业设备回收*****************************/reclaim(char *J,char *type){int i,t,j,k,nn;i=0;while(i<n&&strcmp(equiptype[i].type,type)!=0) /*查找欲申请归还的设备类型 strcmp函数用于比较equiptype[i].type与type的大小若相等则返回0*/i++;if(i>=n)/*若没有找到该类设备*/{printf("无该类设备,设备回收失败!");return(false);} t=equiptype[i].address; /*取出该类设备在设备表中的起始地址赋给t*/j=equiptype[i].count; /*取出该类设备的数量赋给j*/k=0;nn=t+j;for(;t<nn;t++)if(strcmp(equipment[t].jobname,J)==0&&equipment[t].remain==1) /*若占用某个设备的作业与欲回收的作业相同且状态为已分配*/{equipment[t].remain=0; /*则将其状态改为未分配*/k++; /*回收设备计数*/}equiptype[i].remain= equiptype[i].remain+k; /*该类设备剩余设备数加k*/if(k==0) /*若回收设备计数值k为0,*/printf("本作业没有占用这类资源!/n");}/**********************主函数*****************************/ void main( ){char J[4];int i,mm,a;char type[10];printf(" *******************\n\ *******************\n\);printf("设备类初始化\n ");for(i=0;i<4;i++) /*输入设备类表初始信息*/{printf("请输入相应设备名称 ");scanf("%s",&equiptype[i].type);printf("请输入相应设备的数量 ");scanf("%d",&equiptype[i].count);printf("请输入当前空闲设备数量 ");scanf("%d",&equiptype[i].remain);printf("请输入设备表起始地址 ");scanf("%d",&equiptype[i].address);}for(i=0;i<10;i++) /*初始化设备表*/{equipment[i].number=i;equipment[i].status=1;equipment[i].remain=0;}while(1){ printf("\n0-退出,1-分配,2-回收,3-显示"); /*功能选择界面*/printf("\n请选择功能(0-3):");scanf("%d",&a);switch(a){case 0 : /*a=0程序结束*/exit(0);case 1 : /*a=1分配设备*/ printf("请输入作业名、作业所需设备类型和设备相对号\n");scanf("%s%s%d",J,type,&mm);allocate(J,type,mm); /*分配设备*/break;case 2: /*a=2回收设备*/printf("请输入作业名和作业归还的设备类\n");scanf("%s%s",J,type); /*输入要回收的作业名及对应的设备类*/reclaim(J,type); /*回收设备*/break;case 3: /*a=3 输出设备类表和设备表的内容*/printf("输出设备类表!\n"); /*输出设备类表内容*/printf(" 设备类型设备总量空闲好设备起始地址\n");for(i=0;i<n;i++)printf("%9s%16d%22d%14d\n",equiptype[i].type,equiptype[i].count,equiptype[i].remain,equiptype[i].address);printf("输出设备表:\n"); /*输出设备表内容*/printf("绝对号好/坏已/未分配占用作业名相对号\n");for(i=0;i<m;i++)printf("%3d%11d%15d%15s%9d\n",equipment[i].number,equipment[i].status,equipment[i].remain,equipment[i].jobname,equipment[i].lnumber);}}}4、运行结果以及结论。
广东工业大学操作系统-实验报告-4份全
ready=p;
}
else/* 进程比较优先级,插入适当的位置中*/
{first=ready;
second=first->link;
while(second!=NULL)
{if((p->super)>(second->super))/*若插入进程比当前进程优先数大,*/
(一)、最高优先数优先的调度算法
1、实验原理
进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。
2 实验二作业调度………………………………………………………………
3 实验三可变式分区分配………………………………………………………
4 实验四简单文件系统…………………………………………………………
试验一 进程调度
一、实验目的:
编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验内容:以两种典型算法为例说明实现的算法
操作系统实验报告
学生学院____计算机学院______
专业班级_10级计算机科学与技术5班
学 号__3210006071__________
学生姓名___陈丹飞_____________
指导教师________孙为军_______
2013年 1月 10 日
1 实验一 进程调度………………………………………………………………1
操作系统实验报告
操作系统实验报告操作系统是计算机科学中十分重要的一门课程,本次实验是关于操作系统的,通过实验,我们可以更深入地了解操作系统的相关知识和操作。
本篇文章将着重介绍本次操作系统实验的内容和实验过程中的收获。
一、实验内容本次实验内容主要涉及操作系统的进程、线程和进程同步三部分。
具体内容包括:1. 进程的创建和管理2. 线程的创建和管理3. 进程同步的实现在实验过程中,我们将分别使用C语言和Linux操作系统实现上述功能。
二、实验过程1. 进程的创建和管理在这一部分实验中,我们要创建多个进程,实现进程的调度和管理功能。
我们采用了Linux系统下的fork()函数,用于创建子进程。
在程序运行时,首先创建一个父进程,然后使用fork()函数创建四个子进程,每个子进程都有自己的进程号(pid),并在屏幕上输出该进程号以示区分。
为了实现进程的调度功能,我们在代码中加入了sleep()函数,用于将进程挂起一段时间,然后再轮流执行其他进程。
2. 线程的创建和管理在这一部分实验中,我们使用了C语言的POSIX线程库pthread.h,实现多线程的功能。
同样地,我们采用了Linux系统下的fork()函数来创建线程。
在代码运行时,我们创建了两个线程,并在屏幕上输出线程号(tid)以示区分。
为了实现线程的调度和管理功能,我们在代码中加入了pthread_join()函数,用于等待线程的执行完成。
3. 进程同步的实现在这一部分实验中,我们使用了Linux系统下的进程同步工具——信号量(semaphore)。
在代码中,我们使用sem_init()函数创建信号量,使用sem_wait()函数阻塞进程或线程,使用sem_post()函数释放进程或线程。
为了更好地理解信号量的工作原理,我们将代码分为生产者和消费者两部分,其中生产者用于向缓冲区添加数据,消费者则用于删除数据。
在这个过程中,我们需要使用信号量控制生产者和消费者的数量,避免出现生产过多或消费过多的情况。
广工2015年计算机网络实验报告
广东工业大学实验报告实验名称计算机网络实验开课学院计算机学院指导教师姓名王文彦专业班级计算机科学与技术4班学生姓名柏石先学生学号31120059012015年5月实验一名称 GNS3安装使用与交换机技术实验日期学生姓名:柏石先专业班级:计算机科学与技术4班学时:4一、实验目的1、掌握GNS3搭建网络拓扑2、掌握网络设备基础操作3、掌握交换机基本配置4、掌握VLAN基础配置5、掌握VLAN之间的通信二、实验测试结果(需要截图和简要理解说明)1、通过GNS3绘制完整网络拓扑图通过导入“CISCO3640.BIN”文件,创建可用设备。
然后把需要的设备拖放到工程主界面上,并且根据需要修改“标识符”,修改“设备名”,形成网络拓扑图的雏形。
最后进行配置,配置完成后完整的网络拓扑图如下:2、测试同VLAN内PC之间的连通性① 测试PC1 ping PC3的效果由于PC1和PC3在同一个VLAN(虚拟局域网)中,所以可以进行连通。
②测试PC2 ping PC4的效果由于PC2和PC4在同一个VLAN(虚拟局域网)中,所以可以进行连通。
3、测试不同VLAN之间的连通性①关闭路由器,测试PC1 ping PC2的效果由于PC1和PC2不在同一个VLAN(虚拟局域网)中,所以没有路由器的连接,只通过交换机是不能连通的。
红色代表关闭路由器:不能连通:虽然PC1和PC2不在同一个VLAN(虚拟局域网)中,但是通过路由器的连接,可以把它们连通起来。
绿色代表开启路由器:可以连通:4、通过Wireshark抓包测试Trunk上的流量(观察其标签信息)抓取Trunk上的流量截图:下面对于图中的数据进行分析说明:(1)我选中一帧,查看该帧所在的各层分组的头部,如下图。
通过头部信息可以看出,该帧在数据链路层使用的是IEEE 802.3标准的Ethernet协议。
不存在网络层。
可以看出该帧的目的Mac地址为01:00:0c:cc:cc:cc,源Mac地址为cc:02:08:e8:f0:01,数据部分长度为0141(16进制表示),也就是256+64+1=321字节。
广工操作系统实验报告
广工操作系统实验报告操作系统实验报告学生学院计算机学院专业班级2010级计算机科学与技术四班学号3110006015 学生姓名张法光指导教师何翠红2013年 1月 05 日目录实验一、进程调度 ..................................................................... ............ 4 实验二、作业调度 ..................................................................... ............ 8 实验三、动态分区分配方式的模拟 (16)实验四、文件系统 ..................................................................... . (24)31 实验一进程调度1、实验目的编写并调试一个模拟的进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。
以加深对进程的概念及进程调度算法的理解(2、实验原理在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。
对调度的处理又都可采用不同的调度方式和调度算法。
调度算法是指:根据系统的资源分配策略所规定的资源分配算法。
短进程优先调度算法是指对短进程优先调度的算法,它是从后备队列中选择一个或者若干个进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
短进程优先调度源程序如下:#include<stdio.h>#define n 5#define num 5#define max 65535typedef struct pro{int PRO_ID;//进程号int arrive_time;//到达时间int sum_time;//运行总时间int flag;}Pro;//整数排序int bubble(int temp[]){int i,j,tem=0;for(i=1;i<num;i++)4{int lastX=1;for(j=0;j<num-i;j++) {if(temp[j]>temp[j+1]) {tem=temp[j];temp[j]=temp[j+1]; temp[j+1]=tem;lastX=0;}}if(lastX==1) break; }return temp[0];}//进程排序Pro bubble(Pro p[]) {int i,j;Pro temp={0};Pro s[num];for(i=0;i<num;i++){ s[i]=p[i];}for(i=1;i<num;i++){int lastX=1;for(j=0;j<num-i;j++){if(s[j].sum_time>s[j+1].sum_time) {temp=s[j];s[j]=s[j+1];s[j+1]=temp;lastX=0;}}if(lastX==1) break;}return s[0];}5void SPF(int p){if(n>0){int i,j,k,l,tc=0;Pro seq[n];Pro temp_seq[n];printf("************************************************************ ****\n");printf("10计科4班张法光 3110006015\n");printf("\n");printf("实验一:短进程优先调度算法SPF\n");printf("请依次输入5个进程的进程号、到达时间和执行时间\n");printf("成员变量用逗号隔开;进程间用回车隔开\n");printf("************************************************************ ****\n");for(i=0;i<n;i++){scanf("%d,%d,%d",&seq[i].PRO_ID,&seq[i].arrive_time,&seq[i].sum_time );}printf("调度顺序是:\n");//初始化tcint temp[num];for(i=0;i<num;i++){temp[i]=seq[i].arrive_time;}tc=bubble(temp);//tc是断点啊//flag 表示对应i的pro的队列情况//-1表示未进入过队列,0表示在队列中,1表示被清除了for(i=0;i<n;i++){seq[i].flag=-1;}for(i=0;i<n;i++){for(j=0;j<n;j++){if(seq[j].flag!=1&&seq[j].arrive_time<=tc){seq[j].flag=0;}}for(j=0;j<n;j++){temp_seq[j]=seq[j];if(seq[j].flag!=0){temp_seq[j].sum_time=max;}6}l=bubble(temp_seq).PRO_ID;for(j=0;j<n;j++){if(l==seq[j].PRO_ID){k=j;}}tc=tc+bubble(temp_seq).sum_time;seq[k].flag=1;printf("%d",l);}printf("\n");}}void main(){SPF(n);}运行结果:结果分析与实验小结非抢占式的短进程优先调度相对简单,有个易错的地方就是最早来的不管所需服务时间长短均必须先服务,而且数量可能不止一个,此时可以再根据短进程优先法则调度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告学生学院____ 计算机学院______专业班级 13级计科9学 号学生姓名指导教师 李敏2015 年 12 月 29 日实验一进程调度实验一、实验目的用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验内容和要求设计一个有N个进程共行的进程调度程序。
要求采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程),时间片轮转算法,多级反馈队列调度算法这三种算法。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
三、实验主要仪器设备和材料实验环境硬件环境:IBM-PC或兼容机软件环境:C++、C语言编程环境四、实验方法1、编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。
“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。
动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。
例如:在进程获得一次CPU后就将其优先数减少1。
或者,进程等待的时间超过某一时限时增加其优先数的值,等等。
2、编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。
轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。
简单轮转法的基本思想是:所有就绪进程按FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。
如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。
直至所有的进程运行完毕。
3、多级反馈队列调度算法的基本思想是:当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。
当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。
五、程序流程图(一个实验有多个算法的应该分别给出)1、“最高优先数优先”调度算法(已在模板中给出)2、“轮转法”调度算法3、多级反馈队列调度算法六、各程序之间的调用关系1、“最高优先数优先”调度算法(已在模板中给出)2、“轮转法”调度算法3、多级反馈队列调度算法七、重要数据结构或源程序中疑难部分的说明,需附详细注释1、“最高优先数优先”调度算法(已在模板中给出)2、“轮转法”调度算法typedef struct pcb{char name[10];//进程名int time; //进程的总时间int runtime;//进程已经占用的cpu时间int needtime;//进程还需要的时间char state;//进程运行状态:w(wait) or r(runing)struct pcb *next;}pcb,*PCB;3、多级反馈队列调度算法typedef struct pcb{char name[10];//进程名int time; //进程的总时间int runtime;//进程已经占用的cpu时间int needtime;//进程还需要的时间char state;//进程运行状态:w(wait) or r(runing)struct pcb *next;}pcb,*PCB;typedef struct queue{char name[10];int timeSlice; //时间片的大小PCB mPcb;struct queue *next;}queue, *QUEUE;八、程序运行结果1、“最高优先数优先”调度算法(已在模板中给出)2、“轮转法”调度算法测试数据:进程名进程所需时间时间片aa 3 2bb 4 2cc 5 2dd 6 2ee 7 23、多级反馈队列调度算法测试数据:队列名时间片QueueA 2QueueB 4QueueA 8进程名进程所需时间aa 3bb 4cc 5dd 6ee 7九、结果分析与实验小结通过实验可知,“最高优先数优先”调度算法是通过最高优先数来排列进程的执行顺序,可以满足普遍的进程,但缺点较大,可能出现优先级低的进程长期无法执行。
“轮转法”调度算法则是规定每个进程在规定的时间片内运行进程,可以使进程非常公平地执行,但若出现优先级较高的程序则无法优先执行。
多级反馈队列调度算法则是通过较好地满足各种类型进程的需要来分配进程调度,是目前公认的一种比价好的进程调度算法。
实验二作业调度一、实验目的本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。
二、实验内容和要求1、为单道批处理系统设计一个作业调度程序1)编写并调试一个单道处理系统的作业等待模拟程序。
2)作业调度算法:分别采用先来先服务(FCFS)、最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
3)由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。
4)每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。
每个作业的最初状态总是等待W。
5)对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。
1、模拟批处理多道操作系统的作业调度1)编写并调试一个作业调度模拟程序。
2)作业调度算法:分别采用先来先服务(FCFS)和短作业优先调度算法。
3)在批处理系统中,要假定系统中具有的各种资源及数量,调度作业时必须考虑到每个作业的资源要求,所需要的资源是否得到满足。
作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理器运行。
作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。
但有时系统中现有的尚未分配的资源即可满足某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业中作出选择。
当作业正常运行完毕或因发生错误非正常终止时,作业进入完成状态,此时,系统将收回该作业所占用的全部资源,并清除有关的JCB。
并输出显示作业运行情况及作业输出结果。
三、实验主要仪器设备和材料实验环境硬件环境:IBM-PC或兼容机软件环境:C++、C语言编程环境四、实验方法1、编写并调试一个单道处理系统的作业等待模拟程序。
假设在单道批处理环境下有四个作业JOB1、JOB2、JOB3、JOB4,已知它们进入系统的时间、估计运行时间。
分别采用先来先服务(FCFS)、最短作业优先(SJF)、响应比高者优先(HRN)的调度算法,计算出作业的平均周转时间和带权平均周转时间。
五、程序流程图(一个实验有多个算法的应该分别给出)1.1 单道先来先服务算法1.2单道短作业优先算法1.3单道高相应比优先调度算法六、各程序之间的调用关系(1)单道作业调度(2)多道作业调度七、重要数据结构或源程序中疑难部分的说明,需附详细注释(1)单道作业调度typedef struct jcb{char name[10]; //作业名int startTime; //开始时刻int needTime; //所需时间int finishTime; //完成时刻int period; //周转时间float wPeriod; //带权周转时间float rp; //相应比: (等待时间+要求服务时间)/要求服务时间char state; //状态struct jcb *next;//下一个指针}jcb, *JCB;(2)多道作业调度typedef struct jcb{char name[10]; //作业名int startTime; //开始时刻int needTime; //所需时间int finishTime; //完成时刻int needMemory; //所需内存int needSource; //所需资源(磁带机台数)char state; //状态struct jcb *next;//下一个指针}jcb, *JCB;八、程序运行结果1.单道调度(1)单道先来先服务算法测试数据:JOB1 3JOB2 9JOB3 2JOB4 8(2)单道短作业优先算法测试数据:JOB1 20JOB2 49JOB3 25JOB4 67(3)单道高相应比优先调度算法测试数据:JOB1 4JOB2 9JOB3 5JOB4 72.多道调度注:测试数据均来自实验要求提供的数据,主存是100,磁带机是10 (1)多道先来先服务算法(2)多道短作业优先算法九、结果分析与实验小结通过本实验,在进行单道作业调度时,我们采用了三种调度算法,分别是FCFS算法,SJF算法和HRRN算法,这几个算法都有各自的优点,FCFS算法是针对顺序作业队列的,而SJF算法则是对短作业算法优先执行,HRRN算法是综合了两个的考虑,来进行平衡。
在多道作业调度过程中,则不仅要考虑所需时间,更要考虑所需内存和资源,因为在多道作业调度中,各个作业是并发执行的,所以当一个作业调度完成后,将会释放资源和内存,从而满足其他作业的调度。
通过这个实验,我感觉FCFS算法是作业调度的基础,而其他算法则是建立在它的基础中不断优化的算法。
实验三存储管理实验一、实验目的1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。
熟悉虚存管理的各种页面淘汰算法。