OS实验指导书

合集下载

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书实验⼀操作系统⽤户接⼝实验⼀、实验⽬的熟悉操作系统的命令接⼝、图形⽤户接⼝和程序接⼝。

⼆、实验内容:1、使⽤操作系统的命令接⼝。

使⽤Windows常⽤命令:dir 、md、copy、date、help,显⽰这些命令的结果,并解释这些命令的作⽤。

图1-1 命令控制台图1-2 windows常⽤命令图1-3 windows常⽤命令图1-4 windows常⽤命令使⽤图1-5 windows常⽤命令使⽤2、使⽤操作系统的程序接⼝。

VB环境下:编制⼀⼩程序,使其可通过某个系统调⽤来获得os 提供的某种服务,如打开控制⾯板:Shell "rundll32.exe Shell32.dll,Control_RunDLL", 1VC环境下:⽤C语⾔编制⼀个⼩程序,使其可通过Localtime( )系统调⽤来获得OS提供的时间和⽇期。

3、使⽤操作系统的图形⽤户接⼝(略)。

三、思考:OS向⽤户提供的命令接⼝、图形⽤户接⼝和程序接⼝分别适⽤于哪些场合?实验⼆进程创建与撤消⼀、实验⽬的1、加深对进程概念的理解和进程创建与撤消算法;2、进⼀步认识并发执⾏的实质。

⼆、实验内容本实验完成如下三个层次的任务:(1)系统级—以普通⽤户⾝份认识windows的进程管理。

通过windows的“任务管理器”观察进程的状态,进⾏进程的创建、切换和撤销。

(2)语⾔级—以普通程序员⾝份认识⾼级语⾔VC++/Java/VB的进程创建与撤销⼯具。

(3)模拟级—以OS设计师⾝份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。

三、实验步骤1、windows的进程管理当前状态图2-1 windows任务管理器切换前图2-2 windows任务管理器切换后图2-3 windows任务管理器撤销图2-4 windows任务管理器2、VC++进程创建与撤销⼯具Windows所创建的每个进程都从调⽤CreateProcess() API函数开始,该函数的任务是在对象管理器⼦系统内初始化进程对象。

OS操作系统课程实验指导书附运行截图

OS操作系统课程实验指导书附运行截图

OS操作系统课程实验指导书附运行截图实验1使用动态优先权的进程调度算法的模拟1、实验目的(1)加深对进程概念的理解(2)深入了解系统如何组织进程,创建进程(3)进一步认识如何实现处理机调度2、实验内容(1)实现对N个进程采用动态优先权优先算法的进程调度。

(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:进程标识数ID。

进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

进程已占用的CPU时间CPUTIME。

进程还需占用的CPU时间ALLTIME。

当进程运行完毕时,ALLTIME变为0。

进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK 个时间片后,将进入阻塞状态。

进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。

进程状态STATE。

队列指针NEXT,用来将PCB排成队列。

(3)优先数改变的原则:进程在就绪队列中停留一个时间片,优先数加1。

进程每运行一个时间片,优先数减3。

(4)假设在调度前,系统中有5个进程,它们的初始状态如下:ID 0 1 2 3 4PRIORITY 9 38 30 29 0CPUTIME 0 0 0 0 0ALLTIME 3 3 6 3 4STARTBLOCK 2 -1 -1 -1 -1BLOCKTIME 3 0 0 0 0STATE ready ready ready ready ready(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:RUNNING PROG:i READY-QUEUE:->id1->id2BLOCK-QUEUE:->id3->id4= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = =ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CUPTIME C0 C1 C2 C3 C4ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4BLOCKTIME B0 B1 B2 B3 B4STATE S0 S1 S2 S3 S43、实验结果(给出编写的程序源代码和运行结果的截图)【程序代码】#include#include#define N 5// 进程状态enum STATE { Ready, Run, Block, Finish };// PCB数据结构struct PCB {int id; // 标志数int priority; // 优先数int cpuTime; // 已占CPU时间int allTime; // 还需占CPU时间int blockTime; // 已被阻塞的时间int startBlock; // 开始阻塞时间STATE state; // 进程状态PCB *pre; // PCB的前指针PCB *nxt; // PCB的后指针};int id[N] = {0, 1, 2, 3, 4};int priority[N] = {9, 38, 30, 29, 0};int cpuTime[N] = {0, 0, 0, 0, 0};int allTime[N] = {3, 3, 6, 3, 4};int startBlock[N] = {2, -1, -1, -1, -1};int blockTime[N] = {3, 0, 0, 0, 0};void QuePush(PCB *process, PCB *queHead){process->pre = NULL;process->nxt = queHead->nxt;if (queHead->nxt != NULL) {queHead->nxt->pre = process;}queHead->nxt = process;}void quePop(PCB *process, PCB *queHead){if (process->pre != NULL) {process->pre->nxt = process->nxt;} else {queHead->nxt = process->nxt;}if (process->nxt != NULL) {process->nxt->pre = process->pre;}process->pre = process->nxt = NULL;}void queWalk(PCB *queHead){PCB *pro = queHead->nxt;if (pro == NULL) {printf("(没有进程啦)\");return;}while (pro != NULL){printf("id: %d, priority: %d, cpuTime: %d, alltime: %d,blockTime: %d,state:%d,startblock: %d\", pro->id, pro->priority, pro->cpuTime, pro->allTime, pro->blockTime, pro->state, pro->startBlock);pro = pro->nxt;}}int readyQueNum; // 就绪队列的进程数量PCB readyQueHead; // 就绪队列的头部PCB *readyMaxProcess; // 就绪队列中优先级最高的进程void readyQuePush(PCB *process){readyQueNum ++;process->state = Ready;QuePush(process, &readyQueHead);}PCB* readyQuePop(){readyQueNum --;quePop(readyMaxProcess, &readyQueHead);return readyMaxProcess;}// 每个时间片,更新就绪队列里进程的信息void readyQueUpdate(){int maxPriority = -1;PCB *pro = readyQueHead.nxt;if (pro == NULL) {// 就绪队列没有进程readyMaxProcess = NULL;return;}while (pro != NULL){pro->priority ++;if (pro->priority > maxPriority) {maxPriority = pro->priority;readyMaxProcess = pro;}pro = pro->nxt;}}// 返回就绪队列最高优先级的值int readyMaxPriority(){return readyMaxProcess->priority;}// 查看就绪队列里进程的信息void readyQueWalk(){printf("就绪队列里的进程信息为:\");queWalk(&readyQueHead);}#define EndBlockTime 3 // 进程最长被阻塞时间int blockQueNum; // 阻塞队列的进程数量PCB blockQueHead; // 阻塞队列的头部PCB *blockMaxProcess; // 阻塞队列中优先级最高的进程// 进程插入到阻塞队列void blockQuePush(PCB *process){blockQueNum ++;process->blockTime = 0;process->state = Block;if (process->blockTime != -1) {QuePush(process, &blockQueHead);}}// 优先级最高的进程出列PCB* blockQuePop(){blockQueNum --;quePop(blockMaxProcess, &blockQueHead);return blockMaxProcess;}// 每个时间片,更新阻塞队列里进程的信息void blockQueUpdate(){int maxPriority = -1;PCB *pro = blockQueHead.nxt;while (pro != NULL){pro->blockTime ++;if (pro->blockTime >= EndBlockTime) {PCB *process = pro;pro = pro->nxt;// 阻塞时间到,调入就绪队列blockQueNum --;quePop(process, &blockQueHead); readyQuePush(process);} else if (pro->priority > maxPriority) {// 更新阻塞队列里优先级最高的进程指针maxPriority = pro->priority; blockMaxProcess = pro;pro = pro->nxt;}}}// 查看阻塞队列里进程的信息void blockQueWalk(){printf("阻塞队列里的进程信息为:\"); queWalk(&blockQueHead);}// 初始化数据void initData(){// 初始化就绪队列和阻塞队列readyQueNum = blockQueNum = 0; readyMaxProcess = blockMaxProcess = NULL;readyQueHead.pre = readyQueHead.nxt = NULL; blockQueHead.pre = blockQueHead.nxt = NULL; // 初始化进程进入就绪队列int i, maxPriority = -1;for (i = 0; i < N; i ++){// 分配一个PCB的内存空间PCB *pro = (PCB *)malloc(sizeof(PCB));// 给当前的PCB赋值pro->id = id[i];pro->priority = priority[i];pro->cpuTime = cpuTime[i];pro->allTime = allTime[i];pro->blockTime = blockTime[i];pro->startBlock = startBlock[i];if (pro->allTime > 0) {// 插入到就绪队列中readyQuePush(pro);// 更新就绪队列优先级最高的进程指针if (pro->priority > maxPriority) {maxPriority = pro->priority; readyMaxProcess = pro;}}}}// 模拟cpu执行1个时间片的操作void cpuWord(PCB *cpuProcess){cpuProcess->priority -= 3;if (cpuProcess->priority < 0) {cpuProcess->priority = 0;}cpuProcess->cpuTime ++;cpuProcess->allTime --;// 显示正执行进程的信息:printf("CPU正执行的进程信息为:\");printf("id: %d, pri: %d, alltime: %d\", cpuProcess->id,cpuProcess->priority, cpuProcess->allTime);}int main(){int timeSlice = 0; // 模拟时间片int cpuBusy = 0; // 模拟cpu状态PCB *cpuProcess = NULL; // 当前在cpu执行的进程initData(); // 初始化// 模拟进程调度while (1){if (readyQueNum == 0 && blockQueNum == 0 && cpuBusy == 0) { // 就绪队列、阻塞队列和cpu无进程,退出break;}if (cpuBusy == 0) {// cpu空闲,选择一个进程进入cpuif (readyQueNum > 0) {// 选择绪队列优先级最高的进程cpuProcess = readyQuePop();} else {// 就绪队列没有进程,改为选择阻塞队列优先级最高的进程cpuProcess = blockQuePop();}cpuProcess->cpuTime = 0;cpuProcess->state = Run;cpuBusy = 1;cpuProcess->startBlock --;}timeSlice ++;printf("\第%d个时间片后:\", timeSlice);// 模拟cpu执行1个时间片的操作cpuWord(cpuProcess);if (cpuProcess->allTime == 0) {cpuProcess->state = Finish;// 释放已完成进程的PCBfree(cpuProcess);cpuBusy = 0;}// 更新就绪队列和阻塞队列里的进程信息blockQueUpdate();readyQueUpdate();// 查看就绪队列和阻塞队列的进程信息readyQueWalk();blockQueWalk();if ((cpuProcess -> startBlock) > 0) {blockQuePush(cpuProcess);cpuProcess = readyQuePop();}else {if (cpuBusy == 1 && readyQueNum > 0 && cpuProcess->priority < readyMaxPriority()){readyQuePush(cpuProcess);cpuProcess = readyQuePop();}}}printf("\模拟进程调度算法结束2145115 刘成路\");return 0;}【运行截图】实验2使用动态分区分配方式的模拟1、实验目的(1)了解动态分区分配方式中使用的数据结构和分配算法(2)加深对动态分区存储管理方式及其实现过程的理解。

os实验指导书(新)

os实验指导书(新)

操作系统教程实验指导书目录实验一 WINDOWS进程初识 (3)1、实验目的 (3)2、实验内容和步骤 (3)3、实验结论 (4)4、程序清单 (4)实验二进程管理 (7)背景知识 (7)1、实验目的 (10)2、实验内容和步骤 (10)3、实验结论 (12)4、程序清单 (12)实验三进程同步的经典算法 (17)背景知识 (17)1、实验目的 (18)2、实验内容和步骤 (18)3、实验结论 (19)4、程序清单 (20)实验四存储管理 (24)背景知识 (24)1、实验目的 (28)2、实验内容和步骤 (28)3、实验结论 (34)4、程序清单 (34)实验五文件和设备管理 (39)背景知识 (39)1、实验目的 (41)2、实验内容与步骤 (41)3、实验结论 (44)实验一WINDOWS进程初识1、实验目的(1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。

(2)掌握WINDOWS API的使用方法。

(3)编写测试程序,理解用户态运行和核心态运行。

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中的程序拷贝过来,编译成可执行文件。

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书一、实验说明1、实验目的实验是操作系统原理课程中不可缺少的重要教学环节,实验目的是使学生理论联系实际,使学生在实践探索中去发现问题、去解决问题,提高了学生获取知识和应用技术的能力,培养了学生分析和解决问题的能力。

《操作系统原理》要求理论与实践相结合,本门实验课程是对《操作系统原理》课堂教学的一个重要补充,与理论学习起着相辅相成的作用,是实施《操作系统原理》教学的一个重要组成部分。

通过本实验课的实践学习,可以增强本专业的学生对系统实现的认识。

对加深理解和掌握操作系统相关原理有重要帮助。

2、实验要求进一步了解和掌握操作系统原理,提高系统设计的能力。

对每一实验题目,应独立完成,并要求:·上机前,学生必须做好充分的实验准备工作,掌握与实验相关的背景知识,用任一种高级语言编写程序。

·上机时,认真调试,并观察、记录程序运行过程中出现的现象和问题。

·上机后,分析实验结果并写出实验报告。

3、实验报告要求每个实验(包括选做的)均应编写实验报告,学生实验后要写出严谨的、实事求是的、文字通顺的、字迹公整的实验报告。

实验报告应包括以下内容:(1)实验题目(2)实验目的(3)实验内容●程序中使用的数据结构及符号说明●流程图●源程序清单并附上注释(4)实验结果及分析●运行结果(必须是上面程序清单所对应输出的结果)●对运行情况所作的分析以及本次调试程序所取得的经验。

如果程序未能通过,应分析其原因。

二、实验内容实验一熟悉使用计算机系统一、实验名称:熟悉使用计算机系统二、实验目的与要求通过对Windows操作系统的使用,熟悉Windows操作系统中的基本概念,如单用户、多任务、进程和文件等,熟悉Windows中命令行方式下常用命令的使用方法;进一步熟悉TC语言与开发环境,为以后的实验打好基础。

三、实验内容1.开机后,熟悉Windows的界面(桌面、任务栏、开始按钮<点击后出现“开始”菜单>、我的电脑图标、回收站、我的文档)。

OS实验指导

OS实验指导

操作系统实验指导目录1、Windows 2000 进程观测………………………………………2、Windows 2000进程控制……………………………………….3、Windows 2000线程同步……………………………………….4、Windows 2000内存结构……………………………………..5、Windows 2000虚拟内存………………………………………6、Windows 2000线程间通信实验一Windows 2000进程观测一、背景知识Windows 2000可以识别的应用程序包括控制台应用程序、GUI应用程序和服务应用程序。

控制台应用程序可以创建GUI,GUI应用程序可以作为服务来运行,服务也可以向标准的输出流写入数据。

不同类型应用程序间的惟一重要区别是其启动方法。

Windows 2000是以NT的技术构建的,它提供了创建控制台应用程序的能力,使用户可以利用标准的C++工具,如iostream库中的cout和cin对象,来创建小型应用程序。

当系统运行时,Windows 2000的服务通常要向系统用户提供所需功能。

服务应用程序类型需要ServiceMail() 函数,由服务控制管理器(SCM) 加以调用。

SCM是操作系统的集成部分,负责响应系统启动以开始服务、指导用户控制或从另一个服务中来的请求。

其本身负责使应用程序的行为像一个服务。

通常,服务登录到特殊的LocalSystem账号下,此账号具有与开发人员创建的服务不同的权限。

当令C++ 编译器创建可执行程序时,编译器将源代码编译成OBJ文件,然后将其与标准库相链接。

产生的EXE文件是装载器指令、机器指令和应用程序的数据的集合。

装载器指令告诉系统从哪里装载机器代码。

另一个装载器指令告诉系统从哪里开始执行进程的主线程。

在进行某些设置后,进入开发者提供的main() 、ServiceMain() 或WinMain() 函数的低级入口点。

机器代码中包括有控制逻辑,它所做的事包括跳转到Windows API函数,进行计算或向磁盘写入数据等。

嵌入式os实验指导书

嵌入式os实验指导书

实验一嵌入式Linux系统安装与配置1、实验目的•熟悉Linux系统安装方法•熟悉VMware虚拟机下Linux系统环境的配置2、实验设备PC 机、Redhat9.0 VMware6.0。

3、实验内容•安装虚拟机VMware。

•安装Redhat9.0•VMware虚拟机下的Redhat环境配置一、准备如下安装文件:1.VMware.Workstation.5.5中文版(虚拟机)带注册机2.FC4-i386-disc1.iso3.FC4-i386-disc2.iso4.FC4-i386-disc3.iso5.FC4-i386-disc4.iso6.FC4-i386-rescuecd.iso二、VMware软件的安装1.双击安装文件,按照提示进行下一步2.需要输入注册码时,运行注册机目录下的keygen..exe,点击generate,serial框中的即为注册码。

3.安装完成后,运行汉化补丁目录下的HF_Vmware5.5进行汉化三、Fedora Core 4 Linux发行版的安装1.在VMware软件中,新建虚拟机->下一步,选择典型->下一步,选择linux->下一步,选择linux安装的位置->下一步,使用桥接网络->下一步,完成2.编辑虚拟机->设置,选择cdrom1,使用iso映像,选中FC4-i386-disc1.iso,确定3.启动此虚拟机,进入linux安装界面4.选择skip,跳过光盘检测5.按next,选择简体中文,按next,下一步6.安装类型选择定制,下一步7.选择手工分区,下一步,弹出警告框,选择是8.新建,选择文件类型为swap,大小为1000MB,确定。

9.新建,选择文件类型为ext3,挂载点为/,大小为“使用全部可用空间”,确定,分区结果如下图所示:10.下一步,下一步,选择无防火墙,弹出警告框,点击继续11.下一步,设置用户口令,输入两次,必须相同,至少为6个字符12.下一步,选择软件包组界面,选择全部(7G左右,保证硬盘空间充足,避免今后使用时出现一些问题)13.按照提示,点击下一步,开始安装14.第一张盘FC4-i386-disc1.iso安装完后,有提示音15.编辑虚拟机->设置,选择cdrom1,使用iso映像,选中FC4-i386-disc2.iso,确定,继续第二张盘的安装16.完成四张盘的安装后,自动重启,进入系统17.按提示点击下一步,设置自己的用户名,系统默认有个超级用户root18.在提示输入用户名时,可以输入自己设置的用户名和密码(进入系统后,使用用户权限,安全),也可以输入root用户,密码为在第11步里设置的(进入系统后,使用超级用户权限)四、VMvare tools的用途:1.在Linux中方便地访问Windows系统下的文件(通过目录/mnt/hgfs)2.增强桌面图形性能,屏幕分辨率3.鼠标可以在Windows系统和虚拟机之间方便切换五、VMware tools的安装1.打开VMware软件,启动已安装的Linux系统,通过菜单虚拟机->安装vmware工具,点击install2.在Linux桌面上,点鼠标右键,打开终端3.输入以下命令:mount –t iso9660 /dev/cdrom /mnt4.cd /mnt5.cp VMwareTools-5.5.0-18463.tar.gz /tmp6.cd /tmp7.umount /dev/cdrom8.tar zxvf VmwareTools-5.5.0-18463.tar.gz9.cd vmware-tools-distrib10../vmware-install.pl11.一路回车12.虚拟机->虚拟机设置->选项->共享文件夹->添加(名称d,主机文件夹D:\,名称e,主机文件夹E:\),确定13.reboot三、验证是否安装成功1、鼠标是否能方便地在Windows和虚拟机之间切换2、在Linux中能否通过目录/mnt/hgfs访问Windows下的文件实验二 Linux基本命令的使用(2-3次)【实验目的】一、了解Linux系统中的用户管理、文件和目录管理二、掌握Linux系统中用户管理相关、文件和目录管理相关及其它常用命令【实验内容】1、超级用户与普通用户相互切换在Linux下将root用户的密码修改为Linux#1;创建用户user01,user02,user03,创建用户组group1,group2;将用户user01、user02划归group1组,将用户user03划归group2组2、在/tmp目录下建立test1和test2目录文件,然后在test目录下创建一个test.c和hello.txt文件,再将test.c复制到test2目录中,将hello.txt移动到test2目录中,最后删除test1目下的test.c文件。

os实验指导书1.docx

os实验指导书1.docx

实验4存储管理1、实验目的存储管理的主要功能Z—是合理地分配空间。

请求页式管理是一种常用的虚拟存储管理技术。

本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的技术特点,常握请求页式存储管理的页面置换算法。

2、实验内容(1)通过随机数产生一个指令序列,共320条指令。

指令的地址按下述原则生成:①50%的指令是顺序执行的;②50%的指令是均匀分布在前地址部分;③50%的指令是均匀分布在后地址部分。

具体的实施方法是:①在[0, 319]的指令之间随即选取一起点m;②顺序执行一条指令,即执行地址为m+1的指令;③在前地址[0, m+1]中随机选取一条指令并执行,该指令的地址为H ;④顺序执行一条指令,其地址为H十1;⑤在后地址[N + 2, 319]中随机选収一条指令并执行;⑥重复上述步骤①-⑤,直到执行320次指令。

(2)将指令序列变换为页地址流设:①页面大小为lk;②用户内存容量为4页到32页;③用户虚存容量为32k。

在用户虚存中,按每k存放10条指令排在虚存地址,即320条指令在虚存中的存放方式为:第0条-第9条指令为第0页(对应虚存地址为[0, 9]);第10条-第19条指令为第一页(对应虚存地址为[10, 19]);• • • • • •第310条~第319条指令为第31页(对应虚地址为[310, 319])。

按以上方式,用户指令可组成32页。

(3)计算并输岀下述各种算法在不同内存容量下的命屮率。

①先进先出的算法(FIFO);②最近最少使用算法(LRR);③最佳淘汰算法(OPT)先淘汰最不常用的页地址;④最少访问页面算法(LFR);⑤最近最不经常使用算法(NUR) o其中③和④为选择内容。

命中率二1-页面失效次数/页地址流长度在本实验屮,页地址流长度为320,页而失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。

3、随机数产生办法,Linux或UNTX系统提供函数strand()和rand(),分别进行初始化和产生随机数。

软件学院OS操作系统原理实验指导书_lisheng_110907

软件学院OS操作系统原理实验指导书_lisheng_110907

目录实验一熟悉Ubuntu环境 (1)实验二 shell脚本 (10)实验三进程控制 (14)实验四进程间通信--信号量机制实验 (18)实验五进程间通信--进程的管道通信实验 (24)实验六进程间通信--消息的发送与接收实验 (28)实验七进程通信--共享存储区通信 (34)实验六死锁避免的算法 (40)实验七存储管理 (42)一、常用页面置换算法 (42)二、动态分区分配算法(选做) (51)实验八模拟进程调度算法 (53)实验九文件操作 (54)实验一熟悉Ubuntu环境【实验目的】1.了解Ubuntu系统基本操作方法,学会独立使用该系统。

2.熟悉Ubuntu下如何编辑、编译和运行一个C语言程序。

3.学会利用gcc、gdb编译、调试C程序。

【预习内容】1.预习Ubuntu下各种应用程序的使用。

2.预习常用的SHELL命令。

3.预习vi编辑器和emacs编辑器使用方法。

4.预习Ubuntu下C程序编辑、编译和运行过程。

【实验内容】一、登陆Linux进入,再选择Ubuntu登陆窗口,输入用户名: students ,输入密码: 111111 ,进入Ubuntu图形桌面环境。

二、熟悉Ubuntu图形桌面环境桌面包含上方的菜单栏和下方的任务栏。

菜单栏包含“应用程序菜单”、“位置”、“系统”。

通过主菜单可访问应用程序。

(1) “应用程序”菜单“应用程序”菜单包含“办公”、“附件”、“互联网”、“图形”、“游戏”等。

“办公”包含了文字处理及电子表格等应用程序。

“附件”下包含了“搜索工具”、“计算器”、“文本编辑器”和“终端”等应用程序。

(2)“位置”菜单“位置”菜单包含“主文件夹”、“桌面”等信息。

(3)“系统”菜单“系统”菜单包含“首选项”和“系统管理”等信息。

(4)启动终端模拟器GNOME终端模拟器用一个窗口来模拟字符终端的行为。

终端常常被称为命令行或者shell,Linux 中绝大部分工作都可以用命令行完成。

os实验指导书(+实验提示)

os实验指导书(+实验提示)

操作系统实验指导书主编:杜俊俐计算机学院操作系统课程组2010年2月 20日前言操作系统是计算机系统中的核心系统软件,负责控制和管理整个系统的资源并组织用户协调使用这些资源,是计算机高效的工作。

操作系统课程是计算机科学与技术专业核心课程。

由于操作系统是最优秀、最复杂和最庞大的软件之一,所以,真正领会操作系统课程所介绍的感念、原理、方法和技巧等,是十分困难的。

经验表明,学习尤其是真正体会和掌握操作系统的最好方式是对它进行充分的实验。

为此,培养计划中为操作系统课程安排了16学时实验。

为了更好地发挥实验深入理解课程知识的学习作用及知识应用的实践方法,将课程中重要知识点设计成七个实验。

通过这些实验有助于学生全面、透彻的理解操作系统原理中的核心知识。

目录第一章、概述 (4)第二章、实验要求及注意事项 (5)第三章、实验项目 (6)实验一:进程创建与撤消 (6)实验二:进程调度 (7)实验三:进程通信 (8)实验四:分区式储器管理 (9)实验五:请求页式存储管理 (10)实验六:磁盘调度算法 (11)实验七:磁盘文件操作 (12)第四章、参考文献 (13)附录A:实验报告规范 (14)第一章、概述操作系统课程是计算机科学与技术专业核心课程。

《高级语言程序设计》、《数据结构》等课程为其前趋课程。

该课程理论性强,难以理解。

通过课程的实验,能帮助学生深透理解并真正领会操作系统课程所介绍的感念、原理、方法和技巧等。

实验学时为16,共分七个实验分别进行。

实验一:进程创建与撤消、实验二:进程调度、实验三:进程通信、实验四:分区式储器管理、实验五:请求页式存储管理、实验六:磁盘调度算法、实验七:磁盘文件操作。

其中实验五需4学时,其余均为2学时。

这七个实验对操作系统原理中的进程管理、存储器管理、文件系统等重要知识进行训练。

实现语言为Visual C++ 6.0,系统平台为Windows。

第二章、实验要求及注意事项实验环境要求:硬件:普通PC386以上微机;软件:windows操作系统;开发语言:Visual C++ 6.0;实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果,实验后认真书写符合规范格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。

操作系统实验指导书(完整版)

操作系统实验指导书(完整版)

《计算机操作系统实验》指导书(第二版)实验一LINUX的安装与使用 (2)实验二进程管理与通信 (27)实验三存储管理——页面置换算法模拟 (51)实验四文件管理 (56)实验五LINUX服务器配置(选做) (62)实验报告撰写指导 (72)韶关学院信息工程学院计算机系教师:陈正铭2007-9-10实验一LINUX的安装与使用【实验目的】1、了解与掌握RED HAT LINUX 9.0的安装过程。

2、熟悉LINUX的命令及使用格式与常用基本命令。

【实验内容】1、使用图形化安装模式安装RED HAT LINUX 9.0。

2、使用WINDOWS操作系统中的远程登录程序telnet.exe 登录LINUX。

3、练习使用LINUX的常用基本命令如ls、cd、who、pwd、ps、pstree、top等。

4、掌握WINDOWS和LINUX之间的文件共享方法。

【实验指导】一、Red Hat Linux 9光盘启动安装过程1、准备工作(1)购买或下载Redhat9的安装光盘(3张盘)或镜像文件,下载地址:校园网FTP站点。

或从红帽子主站下载∶/(2)在硬盘中至少留2个分区给安装系统用,挂载点所用分区推荐4G以上,交换分区在256M 左右比较适合,文件系统格式不论,反正安装过程会重新格式化。

(假如使用虚拟机vm安装建议最少留6G存储空间)(3)记录下你电脑中下列设备型号∶鼠标、键盘、显卡、网卡、显示器。

及网络设置用到的IP地址、子网掩码、默认网关和DNS名称服务器地址等信息。

2、安装红帽子Red Hat Linux 9将光驱设为第一启动盘,放入第一张安装光盘后重新启动电脑,如果你的光驱支持自启动, 如无意外将出现如下图:直接按回车键后将出现如下图1 ,如果你不处理30秒后也会自动进入。

在图1中提示:是否测试安装CD的内容的完整性,选―OK‖开始测试安装CD;选―Skip‖不测试安装CD开始安装出现图6所示,如果是第一次安装当然要测试安装CD,选―OK‖后回车,出现如下图2选―Test‖测试安装光盘的文件,选―Eject CD‖测试光盘以外的安装文件,这里我选择―Test‖后回车,出现如下图3正在测试第一张安装CD,测试完后显示如下图4所示看到上图最后一行英文―It is OK to install from this med ia‖说明这张安装CD是OK的,按―Enter‖键回车后,显示如下图5所示选择―Continue‖并回车开始安装。

OS操作系统课程实验指导书附运行截图

OS操作系统课程实验指导书附运行截图

实验1使用动态优先权的进程调度算法的模拟1、实验目的(1)加深对进程概念的理解(2)深入了解系统如何组织进程,创建进程(3)进一步认识如何实现处理机调度2、实验内容(1)实现对N个进程采用动态优先权优先算法的进程调度。

(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:进程标识数ID。

进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

进程已占用的CPU时间CPUTIME。

进程还需占用的CPU时间ALLTIME。

当进程运行完毕时,ALLTIME变为0。

进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。

进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。

进程状态STATE。

队列指针NEXT,用来将PCB排成队列。

(3)优先数改变的原则:进程在就绪队列中停留一个时间片,优先数加1。

进程每运行一个时间片,优先数减3。

(4)假设在调度前,系统中有5个进程,它们的初始状态如下:ID 0 1 2 3 4PRIORITY 9 38 30 29 0CPUTIME 0 0 0 0 0ALLTIME 3 3 6 3 4STARTBLOCK 2 -1 -1 -1 -1BLOCKTIME 3 0 0 0 0STATE ready ready ready ready ready(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:RUNNING PROG:iREADY-QUEUE:->id1->id2BLOCK-QUEUE:->id3->id4= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = =ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CUPTIME C0 C1 C2 C3 C4ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4BLOCKTIME B0 B1 B2 B3 B4STATE S0 S1 S2 S3 S43、实验结果(给出编写的程序源代码和运行结果的截图)【程序代码】#include<stdio.h>#include<stdlib.h>#define N 5// 进程状态enum STATE { Ready, Run, Block, Finish };// PCB数据结构struct PCB {int id; // 标志数int priority; // 优先数int cpuTime; // 已占CPU时间int allTime; // 还需占CPU时间int blockTime; // 已被阻塞的时间int startBlock; // 开始阻塞时间STATE state; // 进程状态PCB *pre; // PCB的前指针PCB *nxt; // PCB的后指针};int id[N] = {0, 1, 2, 3, 4};int priority[N] = {9, 38, 30, 29, 0};int cpuTime[N] = {0, 0, 0, 0, 0};int allTime[N] = {3, 3, 6, 3, 4};int startBlock[N] = {2, -1, -1, -1, -1};int blockTime[N] = {3, 0, 0, 0, 0};void QuePush(PCB *process, PCB *queHead){process->pre = NULL;process->nxt = queHead->nxt;if (queHead->nxt != NULL) {queHead->nxt->pre = process;}queHead->nxt = process;}void quePop(PCB *process, PCB *queHead){if (process->pre != NULL) {process->pre->nxt = process->nxt;} else {queHead->nxt = process->nxt;}if (process->nxt != NULL) {process->nxt->pre = process->pre;}process->pre = process->nxt = NULL;}void queWalk(PCB *queHead){PCB *pro = queHead->nxt;if (pro == NULL) {printf("(没有进程啦)\n");return;}while (pro != NULL){printf("id: %d, priority: %d, cpuTime: %d, alltime: %d,blockTime: %d,state:%d,startblock: %d\n", pro->id, pro->priority, pro->cpuTime, pro->allTime, pro->blockTime, pro->state, pro->startBlock);pro = pro->nxt;}}int readyQueNum; // 就绪队列的进程数量PCB readyQueHead; // 就绪队列的头部PCB *readyMaxProcess; // 就绪队列中优先级最高的进程void readyQuePush(PCB *process){readyQueNum ++;process->state = Ready;QuePush(process, &readyQueHead);}PCB* readyQuePop(){readyQueNum --;quePop(readyMaxProcess, &readyQueHead);return readyMaxProcess;}// 每个时间片,更新就绪队列里进程的信息void readyQueUpdate(){int maxPriority = -1;PCB *pro = readyQueHead.nxt;if (pro == NULL) {// 就绪队列没有进程readyMaxProcess = NULL;return;}while (pro != NULL){pro->priority ++;if (pro->priority > maxPriority) {maxPriority = pro->priority;readyMaxProcess = pro;}pro = pro->nxt;}}// 返回就绪队列最高优先级的值int readyMaxPriority(){return readyMaxProcess->priority;}// 查看就绪队列里进程的信息void readyQueWalk(){printf("就绪队列里的进程信息为:\n");queWalk(&readyQueHead);}#define EndBlockTime 3 // 进程最长被阻塞时间int blockQueNum; // 阻塞队列的进程数量PCB blockQueHead; // 阻塞队列的头部PCB *blockMaxProcess; // 阻塞队列中优先级最高的进程// 进程插入到阻塞队列void blockQuePush(PCB *process){blockQueNum ++;process->blockTime = 0;process->state = Block;if (process->blockTime != -1) {QuePush(process, &blockQueHead);}}// 优先级最高的进程出列PCB* blockQuePop(){blockQueNum --;quePop(blockMaxProcess, &blockQueHead);return blockMaxProcess;}// 每个时间片,更新阻塞队列里进程的信息void blockQueUpdate(){int maxPriority = -1;PCB *pro = blockQueHead.nxt;while (pro != NULL){pro->blockTime ++;if (pro->blockTime >= EndBlockTime) {PCB *process = pro;pro = pro->nxt;// 阻塞时间到,调入就绪队列blockQueNum --;quePop(process, &blockQueHead);readyQuePush(process);} else if (pro->priority > maxPriority) {// 更新阻塞队列里优先级最高的进程指针maxPriority = pro->priority;blockMaxProcess = pro;pro = pro->nxt;}}}// 查看阻塞队列里进程的信息void blockQueWalk(){printf("阻塞队列里的进程信息为:\n");queWalk(&blockQueHead);}// 初始化数据void initData(){// 初始化就绪队列和阻塞队列readyQueNum = blockQueNum = 0;readyMaxProcess = blockMaxProcess = NULL;readyQueHead.pre = readyQueHead.nxt = NULL;blockQueHead.pre = blockQueHead.nxt = NULL;// 初始化进程进入就绪队列int i, maxPriority = -1;for (i = 0; i < N; i ++){// 分配一个PCB的内存空间PCB *pro = (PCB *)malloc(sizeof(PCB));// 给当前的PCB赋值pro->id = id[i];pro->priority = priority[i];pro->cpuTime = cpuTime[i];pro->allTime = allTime[i];pro->blockTime = blockTime[i];pro->startBlock = startBlock[i];if (pro->allTime > 0) {// 插入到就绪队列中readyQuePush(pro);// 更新就绪队列优先级最高的进程指针if (pro->priority > maxPriority) {maxPriority = pro->priority;readyMaxProcess = pro;}}}}// 模拟cpu执行1个时间片的操作void cpuWord(PCB *cpuProcess){cpuProcess->priority -= 3;if (cpuProcess->priority < 0) {cpuProcess->priority = 0;}cpuProcess->cpuTime ++;cpuProcess->allTime --;// 显示正执行进程的信息:printf("CPU正执行的进程信息为:\n");printf("id: %d, pri: %d, alltime: %d\n", cpuProcess->id,cpuProcess->priority, cpuProcess->allTime);}int main(){int timeSlice = 0; // 模拟时间片int cpuBusy = 0; // 模拟cpu状态PCB *cpuProcess = NULL; // 当前在cpu执行的进程initData(); // 初始化// 模拟进程调度while (1){if (readyQueNum == 0 && blockQueNum == 0 && cpuBusy == 0) { // 就绪队列、阻塞队列和cpu无进程,退出break;}if (cpuBusy == 0) {// cpu空闲,选择一个进程进入cpuif (readyQueNum > 0) {// 选择绪队列优先级最高的进程cpuProcess = readyQuePop();} else {// 就绪队列没有进程,改为选择阻塞队列优先级最高的进程cpuProcess = blockQuePop();}cpuProcess->cpuTime = 0;cpuProcess->state = Run;cpuBusy = 1;cpuProcess->startBlock --;}timeSlice ++;printf("\n第%d个时间片后:\n", timeSlice);// 模拟cpu执行1个时间片的操作cpuWord(cpuProcess);if (cpuProcess->allTime == 0) {cpuProcess->state = Finish;// 释放已完成进程的PCBfree(cpuProcess);cpuBusy = 0;}// 更新就绪队列和阻塞队列里的进程信息blockQueUpdate();readyQueUpdate();// 查看就绪队列和阻塞队列的进程信息readyQueWalk();blockQueWalk();if ((cpuProcess -> startBlock) > 0) {blockQuePush(cpuProcess);cpuProcess = readyQuePop();}else {if (cpuBusy == 1 && readyQueNum > 0 && cpuProcess->priority < readyMaxPriority()){readyQuePush(cpuProcess);cpuProcess = readyQuePop();}}}printf("\n模拟进程调度算法结束2145115 刘成路\n");return 0;}【运行截图】实验2使用动态分区分配方式的模拟1、实验目的(1)了解动态分区分配方式中使用的数据结构和分配算法(2)加深对动态分区存储管理方式及其实现过程的理解。

最新《操作系统》实验讲义--OS实验指导书

最新《操作系统》实验讲义--OS实验指导书

《操作系统》实验讲义计算机科学与工程学院2015年3月实验一Linux初步实验预备知识一、创建实验平台如果实验室里的计算机安装了Windows操作系统,则可以先安装VMWare软件(一般使用工作站版本)并启动它,来创建一个虚拟机,然后在其中安装Linux操作系统。

这样就可以从虚拟机中启动Linux系统,并完成相应的实验。

VMWare软件和Linux操作系统的安装十分简单,这里就不做介绍。

二、Linux下的proc文件系统在Linux操作系统中,提供了一套非常有用的在用户态检查内核状态和系统特征的机制,这就是proc文件系统。

该文件系统安装在/proc 目录中。

比起Windows的任务管理器来,proc文件系统的功能更强大:它能提供更多的系统信息,能修改部分系统信息,还能通过编程来扩充其中的内容。

该文件系统将进程的地址空间、系统的硬件信息(包括CPU、内存状态以及网卡等各种硬件设备)、系统相关机制(中断、I/O)等内容全部设置成虚拟的Linux文件。

它以一种特殊的文件系统的方式,为访问系统内核数据的操作提供接口。

也就是说,这个文件系统中所有的文件都是特殊文件,这些特殊文件一般与外部设备无关,所涉及到的介质通常室内存和CPU。

当从一个特殊文件“读”出时,所读出的数据都是由系统内部按一定的规则临时生成的,或从内存中收集、加工出来的,反之亦然。

换言之,这些文件的内容都不存在任何存储设备上,而是在读/写的时候才根据系统中的有关信息生成出来,或映射到系统中的有关变量或数据结构中。

/proc 目录中的每个文件都有一组分配给它的非常特殊的文件许可权,并且每个文件属于特定的用户标识,这里面的文件仅仅包含以下几种权限(除非root用户特别授权):●只读任何用户都不能更改该文件,它用于表示系统信息。

●root写/proc 目录中的一些文件是可写的,但通常只能由root用户来写。

●root读有些文件对一般系统用户是不可见的,而对root用户是可见的。

OS实验指导

OS实验指导

OS课程设计实验指导每人至少选做3个实验:实验一:Linux系统基本操作(必选)熟练掌握unix环境下的常用命令、系统命令的用法,能熟练运用vi文本编辑器编辑文件。

学习unix shell的初步知识。

实验二:Linux进程调度常见算法模拟实现用c语言编写常用进程调度算法的模拟程序,如时间片轮转、优先数调度。

提示:用4个基本系统调用实现进程的创建、执行和自我终止:①fork()。

创建一个子进程。

用它创建的子进程是fork调用者进程(即父进程)的复制品,即进程映象。

除了进程标识数以及与进程特性有关的一些参数外,其它与父进程相同,与父进程共享文本段和打开的文件,并都受进程调度程序的调度。

如果创建进程失败,则fork()返回值为-1:若创建进程成功,则从父进程返回值是子进程号,从子进程返回的值是0,返回值在R0。

m=fork()。

②wait()。

父进程处于阻塞(或等待)状态,等待子进程执行完成终止后继续工作。

其返回值R0为等待子进程的子进程号。

n=wait()。

③exit()。

子进程自我终止,释放所占资源,通知父进程可以删除自己。

此时它的状态变成P_state=SZOMB。

④getpid()。

获得进程的标识数(进程号),一般是正整数。

P=getpid()。

编程示例:例1. 编写一个程序,父进程生成一个子进程,父进程等待子进程wait(),子进程执行完成后自我终止exit(),并唤醒父进程。

父、子进程执行时打印有关信息。

main(){ int i,j,k;if (i=fork()) // 非零值{ j=wait();printf(“Parent process!\n”);printf(“i=%d k=%d\n,i,k);}else{ k=getpid();printf(“Child process!\n”);printf(“i=%d k=%d\n,i,k);}}例2. 编写一个程序,输入两个整数并求和输出,然后创建一个子进程,当进程调度程序调度到父进程或子进程时特输出不同的信息。

操作系统指导书

操作系统指导书

《计算机操作系统》实验指导书适用专业:计算机科学与技术信息与计算机江南大学物联网工程学院2015年4月前言计算机操作系统(Operating System简称OS)是计算机中最重要的系统软件,也是最活跃的学科之一,是计算机相关本科专业的核心课程。

通过本课程的学习使学生掌握操作系统的基本概念、技术、原理,具备一定的从不同层次分析与使用操作系统功能的能力。

了解计算机操作系统方面的新技术、新理论与新发展。

本实验指导书,是根据《操作系统》课程教学大纲的要求而编写的,目的是让学生能够进一步了解操作系统的基本概念、原理,通过综合性、验证性和设计性等实验,熟练掌握操作系统的运行机理和各种算法思想,尤其是操作系统的核心功能。

同时还希望通过实验进一步提高学生的动手能力和综合运用先修课程的能力。

由于编写仓促,难免有错误和不足之处,恳请读者不吝赐教。

目录前言 (1)实验一进程调度 (3)实验二作业调度实验 (6)实验三银行家算法 (9)实验四存储管理 (13)实验一进程调度实验学时:4学时实验类型:设计实验要求:必修一、实验目的多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。

因而引起进程调度。

本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。

二、实验内容1.优先权法、轮转法简化假设1)进程为计算型的(无I/O)2)进程状态:ready、running、finish3)进程需要的CPU时间以时间片为单位确定2.算法描述1)优先权法——动态优先权当前运行进程用完时间片后,其优先权减去一个常数。

2)轮转法三、流程图产生n 需的时间片数,已占用CPU 的时间片数置为0按进程产生的先后次序拉成就绪队列链=0? 撤销该进程就绪队列为空吗?=轮转时间片数?NYYY 结束N开始键盘输入进程数n ,和调度方法的选择优先权法? 轮转法产生n 个进程,对每个进程产生一个PCB ,并用随机数产生进程的优先权及进程所需的CPU 时间 按优先权大小,把n 个进程拉成一个就绪队列 撤销进程就绪队列为空?结束NYY四、实验要求1.产生的各种随机数的取值范围加以限制,如所需的CPU时间限制在1~20之间。

os实验指导书

os实验指导书

操作系统实验指导书操作系统是一门理论性和时间性都很强的课程。

要学好操作系统的设计原理,除了听课、看书、做习题外,最好的方法就是在实践中进行,包括使用操作系统、阅读和分析已有操作系统的源代码、自己设计小型系统/模块或模拟算法等。

本教材安排的实验内容按深度可分为五个层次,即:使用级、观察级、系统管理级、源码阅读级和实现级。

(1)使用级:是指如何使用操作系统,包括对命令(以及菜单和shell)、系统调用和系统文件的使用。

(2)观察级:是指通过使用级的接口,从外部观察操作系统的内部工作过程和结构。

(3)系统管理级:是指系统或设备的安装、配置和性能调整。

(4)源码阅读级:是指对现有操作系统部分内核源代码的阅读。

(5)实现级:是指编程模拟实现操作系统某些功能模块。

实验的操作平台是Red Hat Linux 9.0虚拟机。

实验报告要求:实验目的实验内容实验步骤实验结果实验分析总结实验1 linux编程基础内容:a 用vi编写helloworld程序,用gcc编译运行.b 编写test程序,创建子进程用exec执行helloworld程序。

要求:通过查询网络,自己完成。

选做题用vi对200字文本进行编辑(复制、查找、替换等)。

文件编辑器vi 使用vi是在UNIX 上被广泛使用的中英文编辑软件。

vi是visual editor的缩写,是UNIX提供给用户的一个窗口化编辑环境。

进入vi,直接执行vi编辑程序即可。

例:$vi test.c显示器出现vi的编辑窗口,同时vi会将文件复制一份至缓冲区(buffer)。

vi先对缓冲区的文件进行编辑,保留在磁盘中的文件则不变。

编辑完成后,使用者可决定是否要取代原来旧有的文件。

1、vi的工作模式vi提供二种工作模式:输入模式(insert mode)和命令模式(command mode)。

使用者进入vi后,即处在命令模式下,此刻键入的任何字符皆被视为命令,可进行删除、修改、存盘等操作。

os课程实验指导书

os课程实验指导书

《—操作系统—》实验指导书计算机科学与技术教研室编写适用专业:计算机科学与技术计算机专升本厦门理工学院计算机科学与技术系(部)2009年9 月前言了解Windows原理,并能使用系统函数等进行进程创建与撤、通信、调度,主存储器管理、文件结构、安全管理。

为了使学生更好地理解和深刻地把握这些知识,并在此基础上,使学生掌握操作系统的基本概念、基本原理、设计方法和实现技术,具有初步分析实际操作系统的能力,设置了一定数量的实验为综合性、设计性实验。

实验一: Windows 控制台命令——系统管理1.实验目的(1)掌握命令行窗口的显示设置。

(2)学会系统的基本配置。

(3)显示系统基本信息。

、(4)掌握系统配置管理。

(5)任务管理。

2.实验工具一台装有WindowsXP或Winddows2003的机器(这里默认是WindowsXP).3.预备知识·cmd:启动Windows命令窗口。

·chcp:活动控制台代码页。

·prompt:显示更改Windows命令提示符·color:设置命令行窗口颜色。

·title:命令行窗口标题。

·date:显示或设置日期。

·time:显示或设置系统时间。

·w32tm:时间服务。

·doskey:创建宏。

·systeminfo:显示系统信息。

·mem:显示内在分配。

·tasklist:显示任务进程。

·at:结束任务进程。

命令的具体参数和使用方法参见本次实验参考资料部分。

4.实验内容1)进入Windows命令行窗口执行“开始”→“运行”→cmd2)设置活动代码页步骤一:输入命令chcp936.步骤二:输入命令ver,步骤三:输入命令chcp步骤四:输入命令ver步骤五:比较结果3)显示更改Windows命令提示符输入命令prompt$v$g,4)改变Windows命令行窗口的前景和背景色输入命令color fc5)改变命令行窗口的标题输入命令title” Windows命令行窗口”C:Documents and settings\Administrato r﹥color fc C: Documents and settings\Administrato r6)显示或设置系统日期?输入date7)显示或设置系统时间?输入命令time,8)显示当前时区设置输入命令w32tm/tz,9)创建宏输入命令doskey ls=dir/w,10)显示系统信息输入命令systeminfo |more11)显示内存分配输入命令mem12)命令tasklist:显示任务进程输入命令tasklist13)命令taskkill:结束任务进程输入命令taskkill5.实验提高1)基本命令的使用进入Windows控制台窗口并为控制台窗口设置文字和背景颜色,改变控制台窗口的名称,显示系统日期和时间并为系统设置新的时间和日期,改变Windows命令行提示符,获得Windows的版本号。

OS实验指导书

OS实验指导书

实验一UNIX/LINUIX入门实验学时:2学时实验类型:验证型一、实验目的了解UNIX/LINUX运行环境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c语言程序的编写、编译、调试和运行方法。

二、实验内容熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。

练习UNIX/LINUX的文本行编辑器vi的使用方法熟悉UNIX/LINUX下c语言编译器cc/gcc的使用方法。

用vi编写一个简单的显示“Hello,World!”c语言程序,用gcc编译并观察编译后的结果,然后运行它。

三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。

四、L inux 常用命令Linux 系统常用命令格式:command [option] [argument1][argument2] ...其中option以“-”开始,多个option可用一个“-”连起来,如“ls -l -a” 与“ls -la”的效果是一样的。

根据命令的不同,参数分为可选的或必须的;所有的命令从标准输入接受输入,输出结果显示在标准输出,而错误信息则显示在标准错误输出设备。

可使用重定向功能对这些设备进行重定向。

命令在正常执行结果后返回一个0值,如果命令出错可未完全完成,则返回一个非零值(在shell中可用变量$?查看)。

在shell script中可用此返回值作为控制逻辑的一部分。

帮助命令:例如:info info 可以获取如何使用info的详细信息。

磁盘操作:系统操作:网络通信:文件操作:实验二进程管理实验学时:2学时实验类型:验证型、设计型一、实验目的加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。

二、实验内容(1)进程创建编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一UNIX/LINUIX入门实验学时:2学时实验类型:验证型一、实验目的了解UNIX/LINUX运行环境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c语言程序的编写、编译、调试和运行方法。

二、实验内容●熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。

●练习UNIX/LINUX的文本行编辑器vi的使用方法●熟悉UNIX/LINUX下c语言编译器cc/gcc的使用方法。

用vi编写一个简单的显示“Hello,World!”c语言程序,用gcc编译并观察编译后的结果,然后运行它。

三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。

四、L inux 常用命令Linux 系统常用命令格式:其中option以“-”开始,多个option可用一个“-”连起来,如“ls -l -a” 与“ls -la”的效果是一样的。

根据命令的不同,参数分为可选的或必须的;所有的命令从标准输入接受输入,输出结果显示在标准输出,而错误信息则显示在标准错误输出设备。

可使用重定向功能对这些设备进行重定向。

命令在正常执行结果后返回一个0值,如果命令出错可未完全完成,则返回一个非零值(在shell中可用变量$?查看)。

在shell script中可用此返回值作为控制逻辑的一部分。

帮助命令:例如:info info 可以获取如何使用info的详细信息。

磁盘操作:系统操作:网络通信:文件操作:实验二进程管理实验学时:2学时实验类型:验证型、设计型一、实验目的加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。

二、实验内容(1)进程创建编写一段程序,使用系统调用fork()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

(2)进程控制修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。

(3)进程的管道通信编写程序实现进程的管道通信。

使用系统调用pipe()建立一个管道,二个子进程P1和P2分别向管道各写一句话:Child 1 is sending a message!Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)。

三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。

四、实验报告要求●实验目的●实验内容●实验要求●实验设计(功能设计、数据结构、程序框图)●实验结果及分析●运行结果●感想●参考资料五、补充材料管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信。

无名管道由pipe()函数创建:#include <unistd.h>int pipe(int filedis[2]);参数filedis返回两个文件描述符:filedes[0]为读而打开,filedes[1]为写而打开。

filedes[1]的输出是filedes[0]的输入。

下面的例子示范了如何在父进程和子进程间实现通信。

#define INPUT 0#define OUTPUT 1void main() {int file_descriptors[2];/*定义子进程号*/pid_t pid;char buf[256];int returned_count; a/*创建无名管道*/pipe(file_descriptors);/*创建子进程*/if((pid = fork()) == -1) {printf("Error in fork\n");exit(1);}/*执行子进程*/if(pid == 0) {printf("in the spawned (child) process...\n");/*子进程向父进程写数据,关闭管道的读端*/close(file_descriptors[INPUT]);write(file_descriptors[OUTPUT], "test data", strlen("test data"));exit(0);} else {/*执行父进程*/printf("in the spawning (parent) process...\n");/*父进程从管道读取子进程写的数据,关闭管道的写端*/close(file_descriptors[OUTPUT]);returned_count = read(file_descriptors[INPUT], buf, sizeof(buf));printf("%d bytes of data received from spawned process: %s\n", returned_count, buf);}}实验三一个进程启动另一个程序的执行实验学时:2学时实验类型:设计一、实验目的编写Linux环境下,fork()与exec()的结合使用实现一个进程启动另一个程序的执行的基本方法,掌握exec()的几种调用方法。

二、实验内容父进程从终端读取要执行的命令,并交给子进程执行。

父进程等待子进程结束,并打印子进程的返回值。

提示:从终端读取要执行的命令可用fgets()实现。

三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。

四、实验报告要求●实验目的●实验内容●实验要求●实验设计(功能设计、数据结构、程序框图)●实验结果及分析●运行结果●感想●参考资料五、补充材料一个进程如何来启动另一个程序的执行?在Linux中要使用exec()类的函数实现在一个进程来启动另一个程序。

exec类的函数不止一个,但大致相同,在Linux中,它们分别是:execl,execlp,execle,execv,execve 和execvp,下面以execlp为例,其它函数究竟与execlp有何区别,请通过manexec命令来了解它们的具体情况。

一个进程一旦调用exec类函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。

如果你的程序想启动另一程序的执行但自己仍想继续运行的话,怎么办呢?那就是结合fork与exec()的使用。

下面一段代码显示如何启动运行其它程序:#include <stdio.h>char command[256];int main(){int rtn; /*子进程的返回数值*/int errorno;while(1) {/* 从终端读取要执行的命令*/printf( ">" );fgets( command, 256, stdin );command[strlen(command)-1] = 0;if ( fork() == 0 ) {/* 子进程执行此命令*/errorno=execlp(command, command, NULL, NULL);/* 如果exec函数返回,表明没有正常执行命令,打印错误信息*/perror( command );exit(errorno);}else {/* 父进程,等待子进程结束,并打印子进程的返回值*/wait ( &rtn );printf( " child process return %d\n", rtn );}}return 0;}表1 exec()族调用相关函数fork,execle,execlp,execv,execve,execvp 表头文件#include<unistd.h>定义函数int execl(const char * path,const char * arg,....); 函数说明execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。

返回值如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

范例#include<unistd.h>main(){execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char* )0);}执行/*执行/bin/ls -al /etc/passwd */-rw-r--r-- 1 root root 705 Sep 3 13 :52/etc/passwd相关函数fork,execl,execle,execv,execve,execvp 表头文件#include<unistd.h>定义函数int execlp(const char * file,const char * arg,……);函数说明execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。

返回值如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

错误代码参考execve()。

范例/* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */#include<unistd.h>main(){execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char*)0);}执行-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd相关函数fork,execl,execle,execlp,execve,execvp 表头文件#include<unistd.h>定义函数int execv (const char * path, char * const argv[ ]);函数说明execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。

相关文档
最新文档