武汉大学第一次操作系统实验
操作系统上机实验报告应成龙
课程设计(上机实验)报告
课程名称:操作系统原理上机实习
学生姓名:应成龙学号: 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:以最小的空间提供最多的功能。
操作系统实验报告3篇
课程设计说明书设计题目:操作系统课程设计班级:信息管理与信息系统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)执行计算:✧文本支持环境:在上述“短路计算信息”窗口,完成作业定义之后,点击“计算"按钮即可。
武汉大学操作系统大作业 - 2
武汉大学操作系统大作业 - 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消息。
武汉科技大学计算机操作系统教程实验
实验内容
1. Linux基本命令 Linux基本命令 练习和操作一些基本的Linux命令 命令, 练习和操作一些基本的Linux命令,包括操 作命令、管理命令、 作命令、管理命令、帮助命令和文本编辑 命令,并通过使用文本编辑程序完成程序 命令, 的录入达到能基本操作和使用Linux操作系 的录入达到能基本操作和使用Linux操作系 统的目的。 统的目的。
拷贝文件 命令: 命令:cp (copy) 格式: 格式:cp [option] filename1 filename2 cp [option] filename... directory cp -r directory1 directon2 功能: 功能:把一个文件的全部内容拷贝到另 一个文件, 一个文件,也可将一个或多个文件拷贝到 另一个目录中。 另一个目录中。
联机帮助手册 命令: 命令:man (manual) 格式: 格式:man command_name 功能:显示参考手册, 功能:显示参考手册,提供联机帮助 信息。 信息。 注释: 注释:-k 按制定关键字查询有关命令 例如: 例如:$ man tar
显示文件内容 命令: 命令:cat (catenae) 格式: 格式:cat filename 功能:显示出文件的内容。 功能:显示出文件的内容。 注释: 注释:当文件内容在屏幕上滚动显 可按Ctrl+S键屏幕滚暂停 键屏幕滚暂停,键继续显示 Ctrl+Q键继续显示。 键继续显示。 例如: 例如:$ cat filename
寻找文件 命令: 命令:find 格式: 格式:find pathname [option] expression 功能: 功能:在所给的路经名下寻找符合表达式相 匹配的文件。 匹配的文件。 选项: 选项:-name 表示文件名 -user 用户名,选取该用户所属的文件 用户名, -group 组名,选取该用户组属的文件 组名, -mtime n 选取n天内被修改的文件 选取n -newer fn 选取比文件名为fn更晚修改的 选取比文件名为fn更晚修改的 文件
操作系统实验报告
实 验 报 告
成绩
教 师:方敏
2016 年 12月 17日
班 级:
学 号:140607815
姓 名:黄杨
实验地点:E-Ⅲ区208
实验时间:2016.10.13—2016.12.17
实验一创建进程
【实验软硬件环境】
VC
【实验内容】
实验内容:父进程创建一个有名事件,由子进程发送事件信号,父进程获取事件信号后进行相应的处理
实验三信号通信
【实验软硬件环境】
VC++
【实验内容】
父进程创建一个有名事件,由子进程发送事件信号,父进程获取事件信号后进行相应的处理。
【实验程序及分析】
父进程程序:
// Processs.cpp : Defines the entry point for the console application.
return 0;
}
else{
fprintf(fp,"XiDian University");
fclose(fp);
printf("数据已经写入成功\n");
}
FILE *qp;
if((qp = fopen("D:\\Test1\\abc.txt","r"))== NULL){
printf("读文件打开失败!\n");
【实验原理】
父进程创建子进程,实现多个进程并发执行,提高计算机的运行效率。
【实验程序及分析】
试验程序源代码如下:
父进程部分代码:
// test1.cpp : Defines the entry point for the console application.
操作系统第一次作业
18.同步机构应遵循哪些基本准则为什么答:应遵循的准则:1.空闲让进。
因为当没有进程处于临界区时,表明临界资源空闲,此时应允许一个申请进入临界区的进程进入临界区,以便充分的利用临界资源,提高处理效率。
2.忙则等待。
因为当已有进程进入临界区时,表明临界资源正在被使用,此时申请进入临界区的进程必须等待,直至正在使用临界资源的进程释放临界资源才能被允许进入,这样才能实现对临界资源的互斥访问。
3.有限等待。
因为若要求申请临界资源的进程不能在有限的时间内访问临界资源,那么其它的申请访问的进程就要无限的等待,这会造成资源的严重浪费和处理效率十分低下,所以必须限定一个等待的时间。
4.让权等待。
因为当一个被批准进入临界资源的进程因为某些故障不能进入的时候,若不释放处理机,则不仅该进程得不到处理,而且其它的进程也无法进入使用临界资源,这会时进程陷入“忙等”的状态,并且利用率低,浪费资源。
28.在测量控制系统中的数据采集任务时,吧所采集的数据送往一单缓冲区;计算任务从该单缓冲区取出数据进行计算。
试写出利用信号量机制实现两任务共享单缓冲区的同步算法。
分析:在本题中,设置两个进程,进程collect(采集)和compute(计算)共享一个单缓冲区,collect负责循环的将采集的数据放入缓冲区,compute负责循环的从单缓冲区取出数据计算。
当缓冲区为空时,collect可将采集的数据放入缓冲区,否则等待;compute 必须当缓冲区有数据的时候才能从中取出数据计算,否则等待。
设置两个信号量empty和full,信号量empty表示单缓冲区是否为空,初始值为1;信号量full表示单缓冲区是否有数据,初始值为0。
代码:Var empty,full:semaphore:= 1,0;Buffer:array[1] of item;BeginParbeginCollect:beginRepeatWait(empty);Send data;Signal(full);Until false;EndCompute:beginRepeatWait(full);Compute data;Signal(empty);Until false;EndParendend。
武大数字实验报告
实验名称:数字电路基础实验实验日期:2023年10月25日实验目的:1. 理解数字电路的基本组成和工作原理。
2. 掌握组合逻辑电路和时序逻辑电路的设计方法。
3. 培养实际操作能力和分析问题的能力。
实验原理:数字电路是利用二进制数字信号进行逻辑运算、存储和控制等功能的一种电子电路。
它由逻辑门、触发器、计数器等基本元件组成。
本实验主要涉及组合逻辑电路和时序逻辑电路。
实验仪器与材料:1. 74LS系列集成电路2. 数字逻辑实验箱3. 示波器4. 逻辑分析仪5. 电源6. 导线实验内容:一、组合逻辑电路实验1. 实验一:逻辑门电路(1)使用与非门、或非门、异或门等基本逻辑门,设计并实现以下逻辑函数:- F(A, B) = A + B- G(A, B, C) = AB + C- H(A, B, C) = A'B'C + ABC(2)使用示波器观察输入输出波形,验证逻辑函数的正确性。
2. 实验二:编码器(1)设计并实现一个4-2线优先编码器。
(2)使用示波器观察输入输出波形,验证编码器的正确性。
3. 实验三:译码器(1)设计并实现一个2-4线译码器。
(2)使用示波器观察输入输出波形,验证译码器的正确性。
二、时序逻辑电路实验1. 实验一:触发器(1)设计并实现一个D触发器。
(2)使用示波器观察输入输出波形,验证D触发器的正确性。
2. 实验二:计数器(1)设计并实现一个4位同步计数器。
(2)使用示波器观察输入输出波形,验证计数器的正确性。
3. 实验三:寄存器(1)设计并实现一个8位双向移位寄存器。
(2)使用示波器观察输入输出波形,验证寄存器的正确性。
实验结果与分析:1. 组合逻辑电路实验通过实验,我们掌握了逻辑门电路的基本原理和操作方法,能够根据逻辑函数设计电路,并使用示波器验证电路的正确性。
2. 时序逻辑电路实验通过实验,我们了解了触发器、计数器和寄存器等时序逻辑电路的工作原理,掌握了时序逻辑电路的设计方法,并能够使用示波器观察电路的波形。
武汉理工操作系统试验报告
实验课成绩学生学号0121110680125武汉理工大学书告实验报学生操作系统实验课程名称院计算机科学与技术学院学开课刘军指导老师姓名名李帅学生姓软件1101 学生专业班级学期 2014 2013 —学年第一实验课程名称:操作系统vi 3.退出三、主要仪器设备及耗材 Ubuntu操作体统编辑器Vi第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)subdir命令建立一个子目录1 使用mkdir 文件的内容。
命令查看file12 使用cat或more 的后面:命令的用法附加到文件file13 将date file1的较详细的信息。
4 利用ls -l file1命令列出文件 ls -l命令查看工作目录内容。
命令将文件fa删除。
再利用利用5 rm fa? 命令查看这两个文件是否都还在工作目录中mv file1 file_a命令,然后用ls6 运行不在工作目录中在工作目录中,而file1file_a显然,只有二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)Free 显示系统中已用空闲内存数量Rm:删除文件或目录三、实验小结、建议及体会操作系Windows对比有些不同需要时间去适应。
通过这次实验对LinuxLinux系统常用的命令。
Linux初步掌握了一些统有了进一步的了解。
通过这仅一个周时间的一些最基本知识,我会在后的学习中不断完善和加以扩充的学习,我们只是了解了linux操作系统实验课程名称:实验项目名称编程CLinux下实验成绩实验课程名称:操作系统实验项目名称SHELL编程和后台批处理实验成绩六、实验小结、建议及体会系统下的编程有了进一步的了解。
也对通过这次实验熟悉了shellLinux编程,对Linux里面编有进一步的认识,如何使用命令来打开文件以及在编辑器vi终端方式使用的编辑器vi 写内容等,。
操作系统实验指导书
《操作系统》课程实验指导书信电工程学院2011年9月目录前言 (1)实验要求 (2)实验准备 (3)实验一处理机管理 (4)实验二存储管理 (7)实验三设备管理 (10)实验四文件管理 (14)前言“操作系统”是计算机及相关专业的必修课程,在学习计算机操作系统理论的同时,通过实验可以加强对操作系统基本原理的理解。
让学生通过上机实验验证计算机操作系统的难点,增加学生对计算机操作系统的领悟和掌握。
使学生对计算机操作系统的工作原理和工作过程有深刻的体会和理解,同时又锻炼了程序编制能力和学生创造能力。
本课程共设8个学时,实验主要由进程管理、存储管理、设备管理、文件管理等4个主要几个部分所组成。
其中验证类实验占25%、设计类实验占75%,每个实验2学时。
考虑由于学生C语言基础较并且不平衡,本课程实验安排了实验准备(由学生课下完成),主要了解掌握TurboC2.0编程环境、掌握C语言编程的基本编制方法和技巧,为后继的实验做准备。
这些实验能很好地解决配合操作系统课程教学来指导学生进行实践的问题。
实验要求1.学生按照实验要求,上机前写好上机实验预习报告,内容包括:实验的目的、内容、实验步骤(程序)。
2.上机实验时按实验要求完成每一个实验的内容。
3.课后认真书写实验报告。
实验报告采用统一的实验报告纸,实验封面包括:课程名称、实验名称、实验序号、班级、姓名、学号、实验时间。
实验报告书写规范,应包括:实验目的和要求、实验内容、实验步骤、实验记录(程序)。
4.遵守机房纪律,服从辅导员教师指挥,爱护实验设备。
5.实验课程不迟到。
如有事不能出席,所缺实验一般不补。
实验准备一.实验目的熟悉TurboC2.0基本编程环境掌握C语言的基本编程方法二.实验内容与要求(一)TurboC2.0的基本操作1、TurboC2.0的基本操作2、运行一个C语言程序的一般过程3、编辑并保存存一个C语言程序4、编译、链接源程序文件5、运行与查看程序结果(二)C语言程序的基本编程方法1、数据类型、运算符、表达式2、数据的输入、输出3、C语言程序的基本控制结构4、数组5、函数与程序结构6、指针7、结构与联合8、文件操作(可通过网络查找TurboC2.0用户说明书,并在其指导进行操作,并要求人手一本C语言程序设计教材并上机练习)实验一处理机管理一、掌握进程及进程调度的概念、三种基本状态及转换二、实验内容1、复习进程的概念、进程调度的含义、进程的三种基本状态及转换2、编制一个模拟进程调度的程序三、参考程序#include"stdio.h"#define running 1/*用running表示进程处于运行状态*/#define aready 2/*用aready表示进程处于就绪状态*/#define blocking 3/*用blocking表示进程处于等待状态*/#define sometimes 5/*用sometime表示时间片大小*/#define n 10/*假定系统允许进程个数为10*/struct{int name;/*进程标识符*/int status;/*进程状态*/int ax,bx,cx,dx;/*进程现场信息,通用寄存器内容*/int pc;/*进程现场信息,程序计数器内容*/int psw;/*进程现场信息,程序状态寄存器内容*/int next;/*下一个进程控制块的位置*/}pcbarea[n];/*定义模拟进程控制块区域的数组*/int PSW,AX,BX,CX,DX,PC,TIME;/*模拟寄存器*/int run;/*定义指向正在运行进程的进程控制块的指针*/struct{int head;int tail;}ready;/*定义指向正在运行进程的进程控制块的指针*/int block;/*定义指向等待队列的指针*/int pfree;/*定义指向空闲进程控制块队列的指针*/sheduling()/*进程调度函数*/{int i;if(ready.head==-1)/*空闲进程控制块队列的指针*/{printf("无就绪进程\n");return 0;}i=ready.head;/*就绪队列头指针赋给i*/ready.head=pcbarea[ready.head].next;/*就绪队列头指针后移*/if(ready.head==-1) ready.tail=-1;/*就绪队列为空,修正尾指针 ready.tail*/pcbarea[i].status=running;/**/TIME=sometimes;/*设置相对时钟寄存器*//*恢复该进程现场信息*/AX=pcbarea[run].ax;BX=pcbarea[run].bx;CX=pcbarea[run].cx;DX=pcbarea[run].dx;PC=pcbarea[run].pc;PSW=pcbarea[run].psw;/*修改指向运行进程的指针*/run=i;return 0;}/*进程调度函数结束*/create(int x)/*创建进程*/{int i;if(pfree==-1)/*空闲进程控制块队列为空*/{printf("无空闲进程控制块,进程创建失败\n");return 0;}i=pfree;/*取空闲进程控制块队列的第一个*/pfree=pcbarea[pfree].next;/*pfree后移*//*填写该进程控制内容:*/pcbarea[i].name=x;pcbarea[i].status=aready;pcbarea[i].ax=x;pcbarea[i].bx=x;pcbarea[i].cx=x;pcbarea[i].dx=x;pcbarea[i].pc=x;pcbarea[i].psw=x;if(ready.head!=-1){/*就绪队列不空时,挂入就绪队列方式*/pcbarea[ready.tail].next=i;ready.tail=i;pcbarea[ready.tail].next=-1;}else{/*就绪队列为空时,挂入就绪队列方式*/ready.head=i;ready.tail=i;pcbarea[ready.tail].next=-1;}return 0;}/*进程创建函数结束*/main(){/*系统初始化*/int num,j;run=ready.head=ready.tail=block=-1;pfree=0;for(j=0;j<n-1;j++)pcbarea[j].next=j+1;pcbarea[n-1].next=-1;printf("输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建10个进程):\n");scanf("%d",&num);while(num>0){create(num);scanf("%d",&num);}sheduling();if(num!=-1){printf("进程名进程状态寄存器内容:ax bx cx dx pc psw:\n");printf("%4d%10d%3d%3d%3d%3d%3d%3d\n",pcbarea[run].name,pcbarea[run].status,pcbarea[ run].ax,pcbarea[run].bx,pcbarea[run].cx,pcbarea[run].dx,pcbarea[run].pc,pcbarea[run ].psw);}}/*main结束*/实验二存储管理一、实验目的掌握分页存储管理的基本原理及分页存储管理中的地址变换过程二、实验内容1、复习分页想念管理的基本概念、基本原理、及地址变换过程2、编制一个模拟地址变换过程的程序三、参考程序/*页式虚拟存储管理中地址转换和缺页中断的模拟*/#include"stdio.h"#define n 64/*模拟实验中假定的页表长度*/#define length 10struct{int lnumber;/*页号*/int flag;/*表示该页是否在主存,"1"表示在主存,"0"表示不在*/int pnumber;/*该页所在主存块的块号*/int write;/*该页号是否被修改,"1"表示修改过,"0"表示末修改过*/ int dnumber;/*该页存放在磁盘上的位置,即磁盘块号*/}page[n];/*页表定义*/int m;/*m为该作业在主存中的主存块块数*/int page_length;/*页表实际长度*/int p[length];/*存放在主存中页的页号*/int head;/*主存中页号队列*/page_interrupt(lnumber)int lnumber;{int j;printf("发生缺页中断*%d\n",lnumber);/*淘汰页*/j=p[head];p[head]=lnumber;head=(head+1)%m;if(page[j].write==1)printf("将页%d写回磁盘第%d块\n",j,page[j].dnumber);page[j].flag=0;/*第j页存在标志改为"0"*/page[lnumber].pnumber=page[j].pnumber;page[lnumber].flag=1;/*第lnumber页存在标志改为"0"*/page[lnumber].write=0;/*第lnumber页修改标志改为"1"*/printf("淘汰主存块%2d中的页%2d从磁盘第%d块中调入页%2d\n",page[j].pnumber,j,page[lnumber].dnumber,lnumber);}/*缺页中断处理函数结束*/void command(laddress,write)unsigned laddress;int write;{int paddress,ad,pnumber,lnumber;kk:/*取出逻辑地址laddress的页号lnumber(高6位)和页内地址ad*/ lnumber=laddress>>10;ad=laddress&0x3ff;if(lnumber>=page_length){printf("不存在该页\n");}if(page[lnumber].flag==1)/*页在主存*/{pnumber=page[lnumber].pnumber;/*从页表中取得块号*/paddress=pnumber<<10|ad;/*合并块号和块内地址形成物理地址padress*/printf("逻辑地址是:%x 对应的物理地址是%x\n:",laddress,paddress);}if(write==1)/*如果需要写,修改页的修改标志位*/page[lnumber].write=1;else{page_interrupt(lnumber);/*缺页中断*/goto kk;}}/*命令处理函数结束*/void main(){int lnumber,pnumber,write,dnumber;unsigned laddress;int i;/*输入页表信息,页号从0开始,依次编号,创建页表page*/printf("输入页表信息,创建页表(若页号为-1,则结束输入\n");printf("输入页号和辅存地址");scanf("%d%d",&lnumber,&dnumber);i=0;while(lnumber!=-1){page[i].lnumber=lnumber;page[i].flag=0;page[i].write=0;page[i].dnumber=dnumber;i++;printf("输入页号和辅存地址");scanf("%d%d",&lnumber,&dnumber);}page_length=i;printf("输入主存号,主存块数要小于%d,(以-1结束):",i);scanf("%d",&pnumber);m=0;head=0;while(pnumber!=-1){if(m<=i){page[m].pnumber=pnumber;page[m].flag=1;p[m]=m;m++;}scanf("%d",&pnumber);}printf("输入指令性质(1-修改,0-不需要,其他--结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);while(write==0||write==1){command(laddress,write);/**/printf("输入指令性质(1-修改,0-不需要,其他--结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);}}/*函数结束*/实验三设备管理一、实验目的了解设备管理的基本原理、设备的分配与回收过程二、实验内容1、复习设备管理的基本概念、基本原理、常用的数据结构、分配策略及算法2、编制一个独占设备的分配和回收模拟程序三、参考程序/*独占设备的分配和回收模拟*/#include"stdio.h"#include"string.h"#define false 0#define true 1#define n 4#define m 10struct{char type[10];/*设备类名*/int count ;/*拥有设备台数*/int remain;/*现存的可用设备台数*/int address;/*该类设备在设备表中的起始地址*/}equiptype[n];/*设备类表定义,假定系统有N个设备类型*/struct{int number;/*设备绝对号*/int status;/*设备好坏状态*/int remain;/*设备是否已分配*/char jobname[4];/*占有设备的作业名*/int lnumber;/*设备相对号*/}equipment[m];/*设备表定义,假定系统有M个设备*/allocate(char J[],char type[],int mm){int i,t;/*查询该类设备*/i=0;while(i<n&&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;/*取出该类设备在设备表中的起始地址*/while(!(equipment[t].status==1&&equipment[t].remain==0))t++;/*填写作业名、相对号,状态改为已分配*/equiptype[i].remain--;equipment[t].remain=1;strcpy(equipment[t].jobname,J);equipment[t].lnumber=mm;}/*设备分配函数结束*/reclain(char J[],char type[]){int i,t,j,k,nn;i=0;while(i<n&&strcmp(equiptype[i].type,type)!=0)i++;if(i>=n)/*没有找天该类设备*/{printf("无该类设备,设备回收失败");return(false);}t=equiptype[i].address;/*取出该类设备在设备表中的起始地址*/ j=equiptype[i].count;/*取出该类设备的数量*/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;if(k==0)printf("该作业没有使用该类设备\n");}/*设备收回函数结束*/main(){char J[4];int i,mm,a;char type[10];/*设备类表初始化:*/strcpy(equiptype[0].type,"input");/*输入机*/equiptype[0].count=2;equiptype[0].remain=2;equiptype[0].address=0;strcpy(equiptype[1].type,"printer");/*打印机*/equiptype[1].count=3;equiptype[1].remain=3;equiptype[1].address=2;strcpy(equiptype[2].type,"disk");/*磁盘机*/equiptype[2].count=4;equiptype[2].remain=4;equiptype[2].address=5;strcpy(equiptype[3].type,"tape");/*磁带机*/equiptype[3].count=1;equiptype[3].remain=1;equiptype[3].address=9;/*设备表初始化:*/for(i=0;i<10;i++){equipment[i].number=i;equipment[i].status=1; //343434equipment[i].remain=0;}while(1){printf("\n0-退出,1-分配,2-回收,3-显示");printf("\n选择功能项(0-3):");scanf("%d",&a);switch(a){case 0:/*程序结束*/return(false) ;case 1:/*a=1分配设备*/printf("输入作业名、作业所需设备类和设备相对号");scanf("%s%s%d",J,type,&mm);allocate(J,type,mm);/*分配设备*/break;case 2:/*a=2回收设备*/printf("输入作业名和作业归还的设备类");scanf("%s%s",J,type);reclain(J,type);/*回收设备*/break;case 3:/*a=3输出设备类表和设备表的内容*/printf("\n输出设备类表\n");printf(" 设备类型设备总量空闲好设备\n");for(i=0;i<n;i++)printf("%9s%8d%9d\n",equiptype[i].type,equiptype[i].count,equiptype[i].remain); printf("输出设备表:\n");printf("绝对号好/坏已/未分配占用作业名相对号\n");for(i=9;i<m;i++)printf("%3d%8d%9d%12s%8d\n",equipment[i].number,equipment[i].status,equipment[i].remain,equipment[i].jobname,equipment[i].lnumber);}}}。
大一上册计算机操作系统实践课程笔记
大一上册计算机操作系统实践课程笔记1. 引言计算机操作系统是计算机科学中的重要学科之一,它负责管理和控制计算机硬件和软件资源,提供给用户和应用程序一个可靠、高效的工作环境。
在大一上册的计算机操作系统实践课程中,我们将学习操作系统的基本概念和原理,并通过实践操作来加深对操作系统的理解和掌握。
本文将就大一上册计算机操作系统实践课程的内容进行分析和总结,介绍具体的操作方法,分析性循序推理论点,并给出实践导向的结论。
2. 实验一:操作系统安装与配置在第一次实验中,我们学习了操作系统的安装与配置。
操作系统的安装是计算机系统使用的基础,而合理的配置则可以提高计算机的性能和稳定性。
在实验中,我们首先需要选择合适的操作系统版本,并将其安装到计算机上。
然后,通过对硬件设备和系统设置的调整,来优化系统的性能和使用体验。
通过实际操作,我们可以更好地理解和掌握操作系统的安装和配置过程,为后续的实验和学习奠定基础。
3. 实验二:进程管理进程管理是操作系统的核心功能之一,它负责管理和调度计算机中的进程,确保它们能够按照一定的顺序和优先级进行执行。
在第二次实验中,我们学习了进程的创建、调度和终止等基本操作。
通过实际操作,我们可以模拟和观察进程的执行过程,了解进程的状态转换和调度算法。
同时,我们还学习了进程间通信的方式和机制,如共享内存、消息队列和信号量等。
这些知识和技能对于理解和掌握操作系统的原理和功能非常重要。
4. 实验三:文件系统管理文件系统是操作系统中的另一个重要组成部分,它负责管理和组织计算机中的文件和目录,并提供对其的访问和操作。
在第三次实验中,我们学习了文件系统的创建、格式化和挂载等基本操作。
通过实际操作,我们可以了解文件系统的结构和组织方式,以及如何进行文件和目录的管理和访问。
同时,我们还学习了文件权限和属性的设置,以及文件系统的备份和恢复等技术。
这些知识和技能对于操作系统的使用和管理非常重要。
5. 实验四:存储管理存储管理是操作系统的另一个重要功能,它负责管理和分配计算机中的内存资源,以及提供对其的访问和操作。
《认识实习》实验报告
《计算机操作系统》实验报告姓名:唐青清学号:02122835 试验日期:2004年7月一、理论论述题:1、简述GNU及其GPL。
答:GNU就是GNU's Not Unix的缩写,GNU 的创始人Stallman 认为UNIX 虽然不是最好的操作系统,但是至少不会太差,而他自信有能力把UNIX 不足的地方加以改进,使它成为一个优良的操作系统,就是名为 GNU的一个同UNIX兼容的操作系统,并且开发这个系统的目的就是为了让所有计算机用户都可以自由地获得这个系统。
并且开发这个系统的目的就是为了让所有计算机用户都可以自由地获得这个系统。
任何人都可以免费地获得这个系统的源代码,并且可以相互自由拷贝。
GNU开始的策略就是先开发 UNIX 已经有的程序(因为计划中GNU将会是一个与UNIX兼容的操作系统,而UNIX下的标准使用界面已经非常完善了,所以先依照这个标准开发应用程序,将来 GNU 自己的系统核心一出来,就立即可以使用所有先前开发的GNU应用程序),因此会先有 emacs,GCC 等工具软件开发出来。
其中 GCC 更是GNU计划自立更生的一个重要步骤(不需要依靠商业软件来产生/编译整个GNU系统),如今这套程序开发工具已经很成熟了。
下一步要做的就是开发GNU的核心--Hurd了,只要Hurd一开发出来,GNU 就是一套能够自我开机,真正自给自足,完整的自由操作系统。
Hurd是基于Mach这个微内核(micro kernel)上的操作系统核心。
以后会使用尤他大学的Mach4(一个更为方便和快速的微内核),由于Hurd基于Mach,所以只要Mach移植到什么机器上,Hurd也立刻就是这种硬件平台的操作系统,就这一点而言,它是一种很前卫的操作系统。
GPL是通用性公开许可证(General Public License,简称GPL),GPL同其它的自由软件许可证一样,许可社会公众享有:运行、复制软件的自由,发行传播软件的自由,获得软件源码的自由,改进软件并将自己作出的改进版本向社会发行传播的自由。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编号:
武汉大学计算机学院
课程实验(设计)报告
专业(班):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;
}。