武汉大学第一次操作系统实验
- 格式:docx
- 大小:89.26 KB
- 文档页数:7
课程设计(上机实验)报告
课程名称:操作系统原理上机实习
学生姓名:应成龙学号: 1403140126 所在学院:计算机科学与技术
专业:计算机科学与技术
指导教师:钱景辉
2016 年1月5日
课程设计(上机实验)报告填写说明
1.本报告作为指导教师对学生课程设计(上机实验)评分的依据材料之一。
此报告应在指导教师指导下,由学生在课程设计(上机实验)结束时完成,以班为单位收齐后按时交给指导教师批阅;
2.本报告内容必须用黑墨水笔工整书写或按信息学院统一设计的电子文档标准格式(可从信息学院网页上下载)打印(小4号宋体,1.5倍行距),禁止打印在其它纸上后剪贴;
3.本报告中的“设计说明书”应按论文的格式成文,并直接书写(或打印)在本报告“设计说明书”栏目内。
其内容可以结合设计题目的内容和要求,根据自己在本课程设计(上机实验)阶段所完成的工作,阐明自己所采取的设计思想和方法(硬件的设计及其电原理图分析介绍,和/或软件的算法和数据结构及其主要模块介绍、程序在测试用例下的测试运行结果等)、完成本课程设计的心得体会、设计中的不足及改进设计的设想或建议等。
说明书的篇幅应不少于2000字。
4.对硬件类课程设计,应绘制或打印硬件设计图纸或实验原理图,作为设计报告的附件。
5.软件类课程设计(上机实验)的软件文档(含软件清单和程序运行的有关结果)可以单独打印成册或上传到指导教师指定计算机,作为课程设计报告的附件。
课程设计(上机实验)报告的附件是指导教师对学生课程设计(上机实验)评分的另一个依据。
课程设计(上机实习)报告
课程设计(上机实习)报告
指导教师意见。
操作系统实验操作系统实验是计算机科学与技术领域非常重要的一门实验课程。
通过操作系统实验,学生可以深入了解操作系统的基本原理和实践技巧,掌握操作系统的设计和开发方法。
本文将介绍操作系统实验的一般内容和实验室环境要求,并详细说明一些常见的操作系统实验内容。
一、实验内容1. 实验环境搭建:操作系统实验通常在实验室中进行。
为了完成实验,学生需要搭建一个操作系统实验环境。
实验环境通常由一个或多个计算机节点组成,每个计算机节点需要安装操作系统实验所需要的软件和驱动程序。
2. 操作系统整体结构分析:学生首先需要通过文献研究和课堂学习,了解操作系统的整体结构和基本原理。
在实验中,学生需要分析和理解操作系统的各个模块之间的功能和相互关系。
3. 进程管理实验:进程是操作系统中最基本的运行单位。
在这个实验中,学生可以通过编写程序并使用系统调用来实现进程的创建、销毁和调度。
学生需要熟悉进程状态转换和调度算法,理解进程间通信和同步机制。
4. 内存管理实验:内存管理是操作系统中非常重要的一个模块。
学生需要实现虚拟内存管理、页面置换算法以及内存分配和回收策略。
通过这个实验,学生可以深入了解虚拟内存管理的原理和实际应用。
5. 文件系统实验:文件系统是操作系统中负责管理文件和目录的模块。
在这个实验中,学生需要实现基本的文件系统功能,如文件的创建、读取和修改。
学生还可以实现进程间的文件共享和保护机制。
6. 设备管理实验:设备管理是操作系统中与硬件设备交互的一个重要模块。
在这个实验中,学生需要实现设备的初始化、打开和关闭功能。
学生还可以实现设备驱动程序,完成对硬件设备的控制。
二、实验室环境要求1. 计算机硬件:实验室需要配备一定数量的计算机节点。
每个计算机节点需要具备足够的计算能力和内存容量,以满足操作系统实验的要求。
2. 操作系统软件:实验室中的计算机节点需要安装操作系统软件,通常使用Linux或者Windows操作系统。
此外,还需要安装相关的开发工具和编程语言环境。
课程实验报告课程名称:操作系统课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院课程设计任务书一.课设目的1.掌握Linux操作系统的使用方法;2.了解Linux系统核代码结构;3.掌握实例操作系统的实现方法。
二.课设容1.掌握Linux操作系统的使用方法,包括键盘命令、系统调用;掌握在Linux下的编程环境。
(一)编一个C程序,其容为实现文件拷贝的功能;(二)编一个C程序,其容为分窗口同时显示三个并发进程的运行结果。
要求用到Linux下的图形库。
gtk/qt2.掌握系统调用的实现过程,通过编译核方法,增加一个新的系统调用。
另编写一个应用程序,调用新增加的系统调用(实现的功能为文件拷贝)。
3.掌握增加设备驱动程序的方法。
通过模块方法,增加一个新的设备驱动程序,其功能可以简单(实现字符设备的驱动)。
4.了解和掌握/proc文件系统的特点和使用方法(选做)(一)了解/proc文件的特点和使用方法(二)监控系统状态,显示系统中若干部件使用情况(三)用图形界面实现系统监控状态。
5.设计并实现一个模拟的文件系统(选做)多用户的多级目录的文件系统设计。
多用户、多级目录、login (用户登录)、系统初始化(建文件卷、提供登录模块)、文件的创建、文件的打开、文件的读、文件的写、文件关闭、删除文件、创建目录(建立子目录)、改变当前目录、列出文件目录、退出。
三.课设说明Linux系统版本:Fedora 5.0 6.0 …ubuntu 10.04 11.10核版本:linux-2.6.x四.考核要求1.必须独立完成课程设计容,不分小组,不能有相同的拷贝。
2.上机考试:学生根据老师提出的要求,演示所完成的系统;并回答老师的问题。
3.第三周五下午2:00全体到实验室做中期检查,只检查1、2题;第四周周五下午2:00:最后检查。
按学号次序逐个检查。
4.评分方法:完成1、2题,得60-65分;完成1、2、3题,得65-75分;完成1、2、3、4(5)题,得80--100分;报告:10分(倒扣分)上交:课程设计报告(打印/电子档),容包括调试记录和程序清单(附注释)。
Chapter 1:导论计算机系统可以大致分为4个部分:硬件,操作系统,系统程序与应用程序,用户操作系统是配置在计算机硬件上的第一层软件,是对硬件的首次扩充,它位于硬件与其他软件之间,是所有其他软件运行的基础。
对操作系统的公认的定义:操作系统是一直在计算机上运行的程序(通常称为内核)操作系统是计算机系统中的一个系统软件,它管理和控制计算机系统中的硬件和软件资源。
裸机:没有配置软件的计算机,即计算机硬件虚拟机:覆盖了软件的机器最基本的操作系统类型有三种:批处理操作系统,分时操作系统,实时操作系统批处理系统:单道批处理系统,多道批处理系统在单处理机系统中,多道程序运行的特点是多道、宏观上并行和微观上串行.分时系统:时间片轮转,设置多路卡,(用户能在很短时间内获得响应)人机交互,共享主机,方便用户上机实时系统:系统能及时响应外部事件的请求,在规定的时间范围内完成对该事件的处理,并控制实时任务协调一致地运行.(响应时间由控制对象决定,可靠性高)在主机控制下进行的输入/输出操作称为_联机输入输出_操作。
(联机批处理,脱机批处理,联机I/O,脱机I/O)作业是用户在一次解题或一个事务处理过程中要求计算机系统所做的工作集合,包括用户程序、所需的数据及命令等操作系统的4个基本特征:并发,共享,虚拟,不确定(并发和共享互为存在条件)计算机系统的两种运行状态:核心态(kernel mode),0,用户态(user mode),1Chapter2:操作系统结构用户接口:命令行接口(联机命令接口,脱机命令接口)、批处理接口以及图形用户接口(GUI)系统调用(system calls):系统调用在运行程序和操作系统之间提供接口运行程序和操作系统之间的参数传递有3种常用方法:寄存器中的参数传递,参数存在内存的一张表中表地址作为寄存器的参数传递,程序把参数压入栈由操作系统弹出系统调用的类型:大致可分为5类:进程控制,文件管理,设备管理,信息维护,通信系统调用与过程调用的区别:系统调用在核心态下运行,子程序在用户态下运行;系统调用通过中断机构进入以实现运行状态的改变,子程序直接调用不涉及运行状态改变系统结构:MS—DOS:以最小的空间提供最多的功能。
课程设计说明书设计题目:操作系统课程设计班级:信息管理与信息系统2011级学号:姓名:山东科技大学2013年12 月25 日课程设计任务书学院信息科学与工程专业信息学管理与信息系统班级2011-1姓名一、课程设计题目:操作系统课程设计二、课程设计主要参考资料(1)Abraham Silberschatz & Peter Baer Galvin & Greg Gagne. Operating System Concepts(第七版影印版). 高等教育出版社. 2007.3.(2)计算机操作系统(第三版)西安电子科技大学出版社(3)三、课程设计应解决的主要问题:(1)CPU调度算法的模拟实现(2)死锁相关算法的实现(3)磁盘调度算法的实现四、课程设计相关附件(如:图纸、软件等):(1)程序源代码(2)五、任务发出日期:2013-10-1 课程设计完成日期:2014-1-1指导教师签字:指导教师对课程设计的评语成绩:指导教师签字:年月日设计1 CPU调度算法的模拟实现一、设计目的1、根据系统的资源分配策略所规定的资源分配算法2、利用编程语言,模拟实现先来先服务(FCFS)、最短作业优先(非抢占SJF)、非抢占优先调度算法、时间片轮转调度算法(RR)3、针对模拟进程,利用CPU调度算法进行调度4、进行算法评价,计算平均周转时间和平均等待时间二、设计要求1、调度所需的进程参数由输入产生(手工输入或者随机数产生)2、输出调度结果3、输出算法评价指标三、设计说明1、定义public类:class program{public:char name;//进程名int atime;//进程到达的时间int stime;//进程服务的时间int btime;//进程开始执行的时间int ftime;//进程完成的时间int rtime;//进程的周转时间float qrtime;//进程的带权周转时间};2、冒泡排序:class program t;for( i=1;i<m;i++)for(int j=0;j<m-i;j++)if(p[j].atime>p[j+1].atime){t=p[j];p[j]=p[j+1];p[j+1]=t;}3、流程图:(1)①先来先服务调度流程图:②主要程序p[0].btime=p[0].atime;p[0].ftime=p[0].atime+p[0].stime;p[0].rtime=p[0].ftime-p[0].atime;p[0].qrtime=(float)p[0].rtime/p[0].stime;for(i=1;i<m;i++){if(p[i].atime>p[i-1].ftime){p[i].btime=p[i].atime;}else{p[i].btime=p[i-1].ftime;}p[i].ftime=p[i].btime+p[i].stime;p[i].rtime=p[i].ftime-p[i].atime;p[i].qrtime=(float)p[i].rtime/p[i].stime;}①短作业优先进程(非抢占优先权)调度流程图:②(SJF)主要代码int k=0,x=0;for(i=k+1;i<m;i++){for(j=k+1;j<m;j++){if(p[j].atime<p[k].ftime){x++;}elsebreak;}int min=k+1;if(x>1){for(j=k+2;j<=x+k;j++){if(p[j].stime<p[min].stime){min=j;}}t=p[min];p[min]=p[k+1];p[k+1]=t;p[k+1].ftime=p[k].stime+p[k+1].stime;}k++;x=0;}③优先权调度算法(非抢占):int k=0,x=0;for(i=k+1;i<m;i++){for(j=k+1;j<m;j++){if(p[j].atime<p[k].ftime){x++;}elsebreak;}int min=k+1;if(x>1){for(j=k+2;j<=x+k;j++){if(p[j].youxianquan<p[min].youxianquan){min=j;}}t=p[min];p[min]=p[k+1];p[k+1]=t;p[k+1].ftime=p[k].stime+p[k+1].stime;}k++;x=0;}①时间片轮转调度算法:②主要算法int time=p[0].atime;int Max=p[0].stime1;for(i=0; i<m; i++){p[i].stime2=p[i].stime1;if(p[i].stime1>Max)Max=p[i].stime1; }for(int j=0; j<Max; j++){for(i=0; i<m; i++){if(p[i].stime2==0)continue;if(p[i].atime<=time){p[i].stime2-=1;time+=1;}elsei=-1;if(p[i].stime2==0)p[i].ftime=time;}}4、输出p[0].btime=p[0].atime;p[0].ftime=p[0].atime+p[0].stime;p[0].rtime=p[0].ftime-p[0].atime;p[0].qrtime=(double)p[0].rtime/p[0].stime;for(i=1;i<m;i++){if(p[i].atime>p[i-1].ftime){p[i].btime=p[i].atime;}else{p[i].btime=p[i-1].ftime;}p[i].ftime=p[i].btime+p[i].stime;p[i].rtime=p[i].ftime-p[i].atime;p[i].qrtime=(float)p[i].rtime/p[i].stime;}cout<<"进程******到达时间**服务时间**开始执行时间*完成时间**周转时间**带权周转时间"<<endl;for(i=0;i<m;i++){cout<<setiosflags(ios::left)<<setw(10)<<p[i].name<<setw(10)<< p[i].atime<<setw(10)<<p[i].stime<<setw(13)<<p[i].btime<<setw(10) <<p[i].ftime<<setw(10)<<p[i].rtime<<setw(13)<<p[i].qrtime<<endl;}}四、运行结果及分析1、先来先服务(FCFS)测试数据2、短作业优先(SJF)测试数据3、优先权(非抢占)测试数据4、时间片轮转(RR)测试数据五、总结通过这次试验,我进一步的理解了冒泡排序的算法,而且,对进程作业先来先服务、短进程优先、非抢占优先、按时间片轮转调度算法以及进程调度的概念和算法,有了更深入的认识!初步理解了操作系统对于作业处理的基本思想!了解到算法很重要,又更加明白算法本身可以节约时间。
实验一:哲学家就餐问题通信0701张开越U200713562一、实验目的:1.熟练使用VC++6.0编译环境,调试并正确运行程序。
2.理解哲学家就餐问题中出现的问题,进而掌握死锁的必要条件。
3.理解源程序中产生和防止死锁的算法,及相关窗口操作。
4.(选做)为哲学家就餐问题提供解决方案,并用C语言实现。
二、实验原理:1.问题描述:有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。
2.防止死锁发生的分配方式:仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。
这样要么一次占有两只筷子(所有线程需要的资源)进行下一步的吃通心粉,然后释放所有的资源;要么不占用资源,这样就不可能产生死锁了。
3.产生死锁的分配方式:当筷子(资源)可用时,先分配左边的筷子,等待一会后再分配右边的筷子,由于这个过程中,左边的筷子一直没有释放,就有可能产生死锁了。
4.程序运行说明:程序运行过程中会弹出一个MessageBox提示操作者操作:1.第一个对话框用于选择运行模式a.选择yes 表示采用的是运行的防止死锁的方式,这样的话整个程序可以一直运行下去,不会产生死锁。
b.选择no 表示运行产生死锁的方式会弹出第二个对话框。
2.第二个对话框用于选择运行时,线程运行的时间a. 选择res 线程时间比较短,很快就可以死锁b.选择no 线程时间跟选择yes 时候的时间差不多,产生死锁的时间稍微长一点。
三、实验过程及分析1.伪码代码:1)不发生死锁的方式(要么一下占用两支筷子,要么不占用)var mutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick); //先改变左手筷子信号量p(mutexrightchopstick); //马上改变右手筷子信号量GetResource(leftchopstick,rightchopstick);eating;v(mutexleftchopstick);v(mutexrightchopstick);end2)发生死锁的方式(一旦可以占用筷子,就马上占用)var mutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick); //改变左手筷子信号量GetResource(leftchopstick); //获取左手筷子p(mutexrightchopstick); //改变右手筷子信号量GetResource(rightchopstick); //获取右手筷子eating;v(mutexleftchopstick);v(mutexrightchopstick);end2.代码分析:1)不发生死锁的方式:先确定两只筷子均没被占用才获取筷子,这样就打破了死锁的必要条件。
电力系统分析上机实验姓名:班级:学号:实验一电力系统分析综合程序PSASP概述一、实验目的了解用PSASP进行电力系统各种计算的方法。
二、PSASP简介1.PSASP是一套功能强大,使用方便的电力系统分析综合程序,是具有我国自主知识产权的大型软件包。
2.PSASP的体系结构:第一层是:公用数据和模型资源库,第二层是应用程序包,第三层是计算结果和分析工具。
3.PSASP的使用方法:(以短路计算为例)1)。
输入电网数据,形成电网基础数据库及元件公用参数数据库,(后者含励磁调节器,调速器,PSS等的固定模型),也可使用用户自定义模型UD。
在此,可将数据合理组织成若干数据组,以便下一步形成不同的计算方案。
✧文本支持环境:点击“数据”菜单项,执行“基础数据”和“公用参数"命令,可依次输入各电网元件的参数。
✧图形支持环境:在“编辑模式下",利用工具箱,输入电网接线图。
作图时,若元件参数尚未输入,会自动弹出相关数据录入窗口,此时输入数据即可。
注意:两种环境下,均应先输入母线数据,再处理其他元件!!!2).方案定义:从基础数据库中抽取数据组,组合成不同方案,以确定电网的规模,结构和运行方式.✧文本支持环境:点击“计算"菜单项,执行“方案定义”命令.✧图形支持环境:“运行模式”下,点击“作业”菜单项,执行“方案定义”命令。
3)数据检查:对确定的电网结构进行检查,检查网架结构的合理性,计算规模是否超出范围.✧文本支持环境:点击“计算”菜单项,执行“数据检查”命令。
✧图形支持环境:“运行模式”下,点击“作业”菜单项,执行“数据检查”命令.4)作业定义:给出计算控制信息,明确具体的计算任务。
✧文本支持环境:点击“计算"菜单项,执行“短路”命令。
✧图形支持环境:“运行模式”下,点击“作业”菜单项,执行“短路”命令。
5)执行计算:✧文本支持环境:在上述“短路计算信息”窗口,完成作业定义之后,点击“计算"按钮即可。
武汉大学操作系统大作业 - 2Fork、Pthread实验报告一、学习目标1.学习fork函数和pthread函数的使用,阅读源码,分析两个函数的机理。
2.在系统中创建一个三层次父子进程树,并具有两层次线程,并打印运行中各个执行体的处理器使用、内存使用等基本信息。
二、基本原理1、fork函数fork函数的函数原型是pid_t fork( void)。
fork()函数的响应函数是 sys_fork()、sys_clone()、sys_vfork()。
这三个函数都是通过调用内核函数 do_fork() 来实现的。
使用do_fork()函数创建一个进程大致分为如下几个过程:(1)向系统申请在内存中分配一个 task_struct 数据结构,即进程控制块PCB,do_fork()中通过使用alloc_task_struct()实现。
task_struct是LINUX内核用以管理进程的结构体,它包含了进程状态、PID、内核栈等等执行进程所必须要的资源。
(2)对PCB进行初始化操作。
通过执行*p=*curren,将父进程(当前进程)的PCB内容拷贝到新进程中去,重新设置 task_struct 结构中那些与父进程值不同的数据成员,为进程分配标志号。
根据参数中传入的 clone_flags 参数值,决定是否要拷贝父进程task_struct 中的指针 fs 、files 指针等所选择的部分。
(3)将新进程加入到进程链表中去,并拷贝父进程的上下文来初始化子进程上下文。
启动调度程序,通过wake_up_process(p)唤醒子进程,并放入就绪队列当中。
父进程返回子进程的PID,子进程返回0。
通过do_fork()函数以及示例代码运行结果,可以了解到fork()函数的如下特点:(1)fork函数返回值Pid_t 是在头文件sys/types.h中定义的宏,在调用fork后会返回两个值,如果是子进程则返回值为0,如果是父进程则返回值大于0(为子进程的PID),如果创建进程失败则返回值小于0。
课程名称:高级操作系统任课老师:何炎祥姓名:张琼露学号:2011282110226高级操作系统学院:计算机学院专业:信息安全任课老师:何炎祥学号:姓名:完成日期:2013年10月15日思考题记得更改,只选择其中的五道题目,一些内容可以删除的,搜集的资料很多,大家们可以自行选择。
(其中1、2、7答案基本固定)其它题目大家们选择的时候不要选重了。
否则就是相同的作业了,选的时候说下。
我选了6和8。
1.验证Lamport’s Algorithm算法的正确性,即该算法是否能保证(1)在任何时刻,最多只有一个进程位于临界段(安全性);(2)若位于临界段的进程在有限时间内退出临界段,则其它请求进入临界段的进程总会进入(可用性)。
答:第一个分布式互斥算法是由Lamport(1978)提出的,他利用了前述的时间定序方案去统一定序所有对临界段的请求,并按先来先服务的次序为请求的进程服务。
他的方案在每次进出临界段时候需要3*(n-1)条消息。
该算法的基本假定如下:(1)进程Pi发送的请求消息形如Request(Ti,i),其中Ti=Ci,是进程Pi发送此消息时候对应逻辑时钟的值(时戳)。
(2)每个进程管理着一个请求队列,最初它为空,该队列包含用关系“=》”定序的请求消息。
该算法可描述为:(1)当进程Pi请求进入临界段时候,它将Request(Ti,i)发送给系统中所有其它的进程,同时也将此消息置入它自己的请求队列中;(2)当进程Pj受到这条Request(Ti,i)消息后,它便将此消息置入自己的请求队列中,并返回一个带有时戳的Reply消息;(3)当下面两个条件都成立时候,Pi才允许进入临界段:①Pi自己的Request(Ti,i)消息位于它自己请求队列的队首;②Pi已收到来自其他每一进程发送过来的时戳迟于Ti的Reply消息。
(4)当退出临界段时候,进程Pi从自己的请求队列中去掉自己发出的Request(Ti,i)消息,并给其他每个进程发送一条带有时间戳的Release消息。
编号:
武汉大学计算机学院
课程实验(设计)报告
专业(班):2014级计算机科学与技术4班
学号:*************
*名:***
课程名称:操作系统设计
任课教师:
2016年11月21日
实习题目:设计一个按优先数调度算法实现处理器调度的程序
实习内容及设计思想:
1、设计思路:
1、定义数据结构
2、提示接受用户的输入:进程名、运行时间、优先级,暂存到一个二维数组中
3、将二维数组根据优先级排序
4、将有序数组插入到就绪队列中
5、运行队首进程,显示正在运行的进程,遍历输出就绪队列中的进程
6、运行完毕后,修改运行时间、优先级
若该进程结束,修改状态,从队首移除
若该进程未结束,从队首移除,插入队尾
2、主要数据结构:
1、进程pcb:
进程名name
运行时间time
优先级prio
状态status(就绪1或结束0)
指向下一进程的指针next
2、就绪队列queue:
队首指针front
队尾指针rear
3、暂存用户输入temp[5][3]
运行时间temp[][0]
优先级temp[][1]
进程名temp[][2]
3、主要代码结构及代码段分析:
while(q->rear!=NULL){//队列不为空时循环
printf("正在运行PCB%d\n",q->front->name);//运行队首进程并显示
if(q->front!=q->rear)//如果就绪队列中不止剩当前运行进程
{
s=q->front->next;//从当前运行进程之后遍历输出就绪队列中的进程
while(s!=q->rear)
{
printf("->PCB%d",s->name);
s=s->next;
}
printf("->PCB%d\n",q->rear->name);//输出队尾进程
}
q->front->time--;//当前进程运行结束
q->front->prio--;//修改该进程运行时间和优先级
if(q->front->time==0)//当前进程运行时间结束
{
q->front->status=0;//修改状态
if(q->front==q->rear)//队列只剩一个
q->front=q->rear=NULL;//就绪队列清空
else
q->front=q->front->next;//从就绪队列中取出
}
else//当前进程未结束
if(q->front!=q->rear)//队列不止一个进程
{
q->rear->next=q->front;//插入队尾
q->rear=q->front;
q->front=q->front->next;//从队首删除
}
}
上机实习所用平台及相关软件:windows10、codeblocks 调试过程:
1、测试数据设计:
2、测试结果分析:
可以正确排序用户输入,遍历输出就绪队列
总结:
1、实习中遇到的问题及解决方法:
一开始没有注意到需要按照优先级简历就绪队列,没有设置暂存数组;
之后设置了暂存数组temp[5][2],没有保存用户输入的进程名,直接用遍历的i+1,
作为进程名,遍历输出就绪队列时永远是顺序;
从就绪队列移除和遍历输出进程时分情况讨论,有时捋不清造成空指针。
2、实习中产生的错误及原因分析:
空指针和没有满足需求,主要是对题目理解和算法流程构建不到位。
3、实习体会及收获
第一个实验较简单,只需了解根据优先级时间片轮转的进程调度情况
源代码:
]=t[0];temp[j+1][1]=t[1];temp[j+1][2]=t[2];
}
/* for(i=0;i<5;i++)
{ for(j=0;j<3;j++)
printf("%d ",temp[i][j]);
printf("\n");
}*/
for(i=0;i<5;i++)//将排序好的数组插入就绪队列
{
pcb *p;
p=(pcb *)malloc(sizeof(pcb));
p->name=temp[i][2];
p->status=1;//初始状态为就绪
p->next=NULL;
p->time=temp[i][0];
p->prio=temp[i][1];
if(q->rear==NULL)//若队列为空,插入第一个进程
q->front=q->rear=p;
else
{
q->rear->next=p;
q->rear=p;
}
}
/*s=q->front->next;
while(s!=q->rear)
{
printf("->PCB%d",s->name);
s=s->next;
}
printf("->PCB%d\n",q->rear->name);
for(i=0;i<5;i++)
{ for(j=0;j<3;j++)
printf("%d ",temp[i][j]);
printf("\n");
}*/
while(q->rear!=NULL){//队列不为空
printf("正在运行PCB%d\n",q->front->name);
if(q->front!=q->rear)//如果就绪队列中不止剩当前运行进程{
s=q->front->next;//从当前运行进程之后开始遍历
while(s!=q->rear)
{
printf("->PCB%d",s->name);
s=s->next;
}
printf("->PCB%d\n",q->rear->name);
}
q->front->time--;//当前进程运行结束
q->front->prio--;
if(q->front->time==0)//当前进程运行时间结束,从就绪队列中取出{
q->front->status=0;
if(q->front==q->rear)//队列只剩一个
q->front=q->rear=NULL;
else
q->front=q->front->next;
}
else//当前进程未结束,插入队尾
if(q->front!=q->rear)//队列不止一个
{
q->rear->next=q->front;//插入队尾
q->rear=q->front;
q->front=q->front->next;//从队首删除
}
}
system("PAUSE");
return 0;
}。