操作系统实验3
操作系统实验,实验3, 进程管理 (1)
在图形界面上利用终端通过命令“su - ”切换到超级用户,编辑文件 “job”; 按组合键[Ctrl+Alt+F2]切换到第二个虚拟终端(超级用户); 输入命令“at –f job now+1 minute”,设置1分钟后执行at调度内容; 稍等后观察at调度的执行效果,再切换到第一个虚拟终端观察at调度 的执行效果;
切换到第一个虚拟终端观察at调度的执行效果(5分钟后系统将执行重 启调度任务)。
[操作要求2] 设置一个调度,要求1分钟后执行文件job中的作业。 文件job的内容为: find /home/jkx/ -name “*.c” > /home/jkx/fdresult wall user jkx, all code files have been searched out! Please check out. [操作步骤]
续表
守 护 进 程 innd Usenet新闻服务器 功 能 说 明
linuxconf
lpd named netfs network
允许使用本地WEB服务器作为用户接口来配置机器
打印服务器 DNS服务器 安装NFS、Samba和NetWare网络文件系统 激活已配置网络接口的脚本程序
nfsd
portmap postgresql routed sendmail
事件(例如xinetd和lpd)
启动守护进程有如下几种方法
在引导系统时启动 人工手动从shell提示符启动
系统启动script的执行期间 被启动(/etc/rc.d) 任何具有相应执行 权限的用户
使用crond守护进程启动
执行at命令启动
守护进程一般由系统在开机时通过脚本或root
操作系统实验
操作系统实验报告——OS Lab班级:姓名:学号:实验1 实验环境的使用本次实验主要学习了OS Lab的基本使用方法;练习编译、调试了EOS操作系统内核以及EOS应用程序。
无论是EOS操作系统内核还是EOS应用程序,开始时它们都只是一些源代码文件。
当编译器、链接器、软盘镜像编辑器等工具,对它们的源代码文件进行逐步转化后,它们就变成了可以在虚拟机(或者裸机)运行的EOS操作系统内核与EOS应用程序。
思考与练习思考生成EOS SDK文件夹的目的和作用。
查看EOS SDK文件夹中的内容,明白文件夹的组织结构和各个文件的来源和作用。
查看EOS应用程序包含了SDK文件夹中的哪些头文件,是如何包含的?答:操作系统通过向开发者提供SDK来开放其API,开发者在为操作系统编写应用程序时,通过使用SDK来调用API。
如果要为操作系统开发应用程序,就需要首先获得操作系统的SDK。
SDK为了向开发者提供操作系统的API,往往会包含头文件、导入库文件和动态链接库文件。
头文件的主要作用是导出操作系统使用的一些数据类型(例如操作系统中使用的结构体类型)和API函数的声明,一般会被放在SDK中的Inc(Include)文件夹中导入库文件(Import Library)是根据操作系统需要导出的API函数而生成的特定格式的二进制文件导入库文件。
导入库文件的主要作用是告诉应用程序的可执行文件,其调用的API 函数在操作系统中的地址,一般会被放在SDK中的Lib(Library)文件夹中。
动态链接库文件(Dynamic Link Library)是包含了操作系统导出的API函数的可执行代码的二进制文件。
动态链接库文件的格式一般与可执行文件是相同的,只是不能直接执行,一般会被放在SDK中的Bin(Binary)文件夹中。
在IDE 环境成功生成EOS的二进制文件后,会自动生成EOS SDK。
IDE环境会首先新建一个SDK文件夹,然后将eos.h(导出API函数的声明)、eosdef.h(导出数据类型的定义)和error.h(导出错误码)三个头文件复制到SDK文件夹中的INC文件夹中,将生成的四个二进制文件都复制到BIN 文件夹中(EOS SDK为了简单,将导入库文件也放入了BIN 文件夹,而没有使用LIB文件夹)。
哈工大《操作系统》实验3
向kernel/printk.c中添加日志打印功能,将以下代码添加到原文件中:
在kernel/fork.c、kernel/sched.c和kernel/exit.c中,找到正确的状态转换点,并添加合适的状态信息,把它输出到log文件之中。
fork.c的修改如下:
exit.c的修改如下:
sched.c的修改如下:
在虚拟机上运行ls -l /var”或“ll /var”查看process.log是否建立,及它的属性和长度;
修改时间片
include/linux/sched.h宏INIT_TASK中定义的:
0,15,15, 分别对应state、counter和priority,将priority值修改,即可实现对时间片大小的调整。
0,15,15, 分别对应state、counter和priority,
priority值修改,即可实现对时间片大小的调整。
在修改时间片将priority由15改为150后,Process 9~20 中Turnaround, Waiting, CPU Burst, I/O Burst变化不大,原因可能是程序中I/O操作占用的时间对于总时间影响的权重过大,导致处理时间体现的并不明显。
或者变化不大的原因是,子进程连续占用cpu的时间要比时间片大很多。
操作系统实验三 时间片轮转法完成进程调度
实验三:时间片轮转法完成进程调度一、实验目的:(1)加深对进程的理解(2)理解进程控制块的结构(3)理解进程运行的并发性(4)掌握时间片轮转法进程调度算法实验内容:(1)建立进程控制块(2)设计三个链队列,分别表示运行队列、就绪队列和完成队列(3)用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB信息。
(4)每一个时间片结束输出各进程的进程号,CPU时间(即已经占用的CPU时间),所需时间(即还需要的CPU时间),以及状态(即用W表示等待,R表示运行,F表示完成)实验程序:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{char name[10];/*进程标识符*/int prio;/*进程优先数*/int round;/*进程时间轮转时间片*/int cputime; /*进程占用CPU时间*/int needtime; /*进程到完成还要的时间*/int count;/*计数器*/char state; /*进程的状态*/struct node *next; /*链指针*/}PCB;PCB *finish,*ready,*tail,*run; //队列指针int N,t; //进程数,时间片的大小void firstin(){run=ready;//就绪队列头指针赋值给运行头指针run->state='R'; //进程状态变为运行态ready=ready->next; //就绪队列头指针后移到下一进程}void prt1(char a)//输出标题函数{if(toupper(a)=='P')//优先级法printf("进程名占用CPU时间到完成还要的时间轮转时间片状态\n");} void prt2(char a,PCB *q)//进程PCB输出{if(toupper(a)=='P')//优先级法的输出printf("%4s %8d %12d %14d %8c\n",q->name,q->cputime,q->needtime,q->roun d,q->state);}void prt(char algo)//输出函数二、三、{PCB *p;prt1(algo);//输出标题if(run!=NULL)//如果运行指针不空prt2(algo,run);//输出当前正在运行的PCBp=ready;//输出就绪队列PCBwhile(p!=NULL){prt2(algo,p);p=p->next;}p=finish;//输出完成队列的PCBwhile(p!=NULL){prt2(algo,p);p=p->next;}getchar(); //按住任意键继续}void insert(PCB *q)//时间片轮转的插入算法{PCB *p1,*s,*r;s=q;//待插入的PCB指针p1=ready;//就绪队列头指针r=p1;//*r做pl的前驱指针while(p1!=NULL)if(p1->round<=s->round){r=p1;p1=p1->next;}if(r!=p1){r->next=s;s->next=p1;}else{s->next=p1;//否则插入在就绪队列的头ready=s;}}void create(char alg)//时间片轮转法创建链表进程PCB{PCB *p;int i,time;char na[10];ready=NULL;finish=NULL;run=NULL;printf("输入进程名及其需要运行的时间(中间以空格隔开):\n"); for(i=1;i<=N;i++){p=new PCB;scanf("%s %d",&na,&time);strcpy(p->name,na);p->cputime=0;p->needtime=time;p->state='W';//进程的状态p->round=0;if(ready!=NULL)insert(p);else{p->next=ready;ready=p;}}printf("*************时间片轮转法进程调度过程*************\n"); prt(alg);run=ready;ready=ready->next;run->state='R';}void timeslicecycle(char alg)//时间片轮转法{while(run!=NULL){run->cputime=run->cputime+t;//处理时间加trun->needtime=run->needtime-t;//完成需要时间减trun->round=run->round+t;//运行完将其变为完成态,插入完成队列if(run->needtime<=0)//当进程完成时{run->next=finish;finish=run;run->state='F';run=NULL;if(ready!=NULL)//就绪队列不空,将第一个进程投入进行firstin();}else{run->state='W';//将进程插入到就绪队列中等待轮转insert(run);//将就绪队列的第一个进程投入运行firstin();}prt(alg);}}void main()//主函数{char algo='P';//算法标记printf("输入进程的个数:");scanf("%d",&N);//输入进程数printf("定义时间片大小:");scanf("%d",&t);//输入时间片大小create(algo);//创建进程timeslicecycle(algo);//时间片轮转法调度}//main()四、实验结果:五、实验小结:时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。
计算机操作系统实验教程
计算机操作系统实验教程徐 慧中国矿业大学(北京)机电与信息工程学院计算机系二0 0四年四月实验简介 (2)实验一进程管理 (3)一、实验目的 (3)二、实验预备内容 (3)三、实验内容 (3)四、预备知识 (3)五实验指导 (4)实验二进程间的通信 (5)一、实验目的 (5)二、实验预备内容 (5)三、实验内容 (5)四、实验预备知识 (5)五、实验指导 (9)实验三存储管理 (10)一、实验目的 (10)二、实验内容 (10)三、实验预备知识 (10)四、实验指导 (13)实验四文件系统设计 (14)一、实验目的 (14)二、实验内容 (14)三、实验提示 (14)四、实验指导 (14)实验简介1.学时:16学时2.先修课程:计算机导论 ,高级语言程序设计 , 数据结构3.课程性质:专业基础必修课4.适合专业:计算机科学与技术5.内容简介:操作系统上机课程通Linux操作系统各自的编程接口,提供编程实例,由此加深学生对操作系统工作原理的领会和对操作系统实现方法的理解,并且使学生在程序设计方面得到基本的训练。
上机课程主要针对课本重点内容,以提高学生的动手能力,加深学生对相关的内容的理解而展开的实验课程。
在Linux环境下提供了关于操作系统的命令接口程序shell的编制、存储管理相关内容的实路、作业调研系统以及虚拟磁盘文件系统管理4个实验。
实验环境是基于Linux操作系统的。
在计算机软硬件课程的设置上,它起着承上启下的作用。
其特点是概念多、较抽象和涉及面广,其整体实现思想和技术又往往难于理解。
6.参考书:张尧学,史美林 《计算机操作系统课程设计实验指导》 清华大学出版社 2000年实验一 进程管理一、实验目的(1)加深对进程概念的理解,明确进程的程序的区别;(2)可进一步认识并发执行的实质;(3)分析进程争用资源的现象,学习解决进程互斥的方法;(4)了解LINUX系统中进程通信的进本原理;二、实验预备内容(1)阅读LINUX 的sched.h源码文件,加深对进程管理概念的理解;(2)阅读LINUX的fork.c源码,分析进程的创建过程;三、实验内容(1)进程创建编写一段程序,使用系统调用fork()创建两个子进程.(2)进程的控制修改以编写的程序,将每个进程输出一个字符改为输出一句话,观察程序执行时屏幕上出现的现象;(3)编写一段程序实现软中断;(4)进程的管道通信;四、预备知识现代操作系统的重要特点是程序的并发执行,及系统所拥有的资源被共享和系统用户随机地使用系统。
《操作系统》课程实验内容和实验要求
实验内容和实验要求实验1:安装Linux系统(4学时)目的:1.学会在操作系统安装之前,根据硬件配置情况,制订安装计划。
2.学会在安装多操作系统前,利用硬盘分区工具(如PQMagic)为Linux准备分区。
3.学会Linux操作系统的安装步骤和简单配置方法。
4.学会Linux系统的启动、关闭步骤,初步熟悉Linux系统的用户界面。
内容:1.安装并使用硬盘分区工具(如PQMagic),为Linux准备好分区。
2.安装Linux系统(如红旗Linux桌面版)。
3.配置Linux系统运行环境。
4.正确地启动、关闭系统。
5.对图形界面进行一般操作。
要求:1.制订安装计划。
2.如果在机器上已安装了Windows系统,而且没有给Linux预备硬盘分区,则安装硬盘分区工具(如PQMagic),运行它,为Linux划分出一块“未分配”分区。
3.在光驱中放入Linux系统安装盘,启动系统。
按照屏幕提示,选择/输入相关参数,启动安装过程。
4.安装成功后,退出系统,取出安装盘。
重新开机,登录Linux系统。
5.对Linux系统进行配置,如显示设备、打印机等。
6.利用鼠标对图形界面进行操作。
说明:1.本实验应在教师的授权和指导下进行,不可擅自操作,否则可能造成原有系统被破坏。
2.如条件不允许每个学生亲自安装,可采用分组进行安装或课堂演示安装的方式。
实验2:Linux 应用及shell编程(4学时)目的:1.掌握Linux一般命令格式和常用命令。
2.学会使用vi编辑器建立、编辑文本文件。
3.了解shell的作用和主要分类。
4.学会bash脚本的建立和执行方式。
5.理解bash的基本语法。
6.学会编写简单的shell脚本。
内容:1.正确地登录和退出系统。
2.熟悉使用date,cal等常用命令。
3.进入和退出vi。
利用文本插入方式建立一个文件。
4.学会用gcc编译器编译C程序。
5.建立shell脚本并执行它。
6.学会使用shell变量和位置参数、环境变量。
操作系统实验指导书(新)
目录实验一 WINDOWS进程初识 (3)1、实验目的 (3)2、实验内容和步骤 (3)3、实验结论 (5)4、程序清单 (5)实验二进程管理 (6)背景知识 (6)1、实验目的 (12)2、实验内容和步骤 (12)3、实验结论 (16)4、程序清单................... 错误!未定义书签。
实验三进程同步的经典算法 .. (17)背景知识 (17)1、实验目的 (19)2、实验内容和步骤 (19)3、实验结论 (22)4、程序清单................... 错误!未定义书签。
实验四存储管理 (23)背景知识 (23)1、实验目的 (31)2、实验内容和步骤 (31)3、实验结论 (48)4、程序清单................... 错误!未定义书签。
实验五文件和设备管理 (49)背景知识 (49)1、实验目的 (53)2、实验内容与步骤............. 错误!未定义书签。
3、实验结论................... 错误!未定义书签。
实验一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++源程序的文件名。
实验三 Linux操作系统安全实验 (一)
实验三Linux操作系统安全一、实验目的及要求(一)实验目的通过实验熟悉Linux环境下的用户管理、进程管理以及文件管理的相关操作命令。
掌握linux操作系统中相关的系统安全配置方法,建立linux操作系统的基本安全框架。
(二)实验要求根据实验中介绍的Linux操作系统的各项安全性实验要求,详细观察记录设置前后系统的变化,给出分析报告。
使用RPM对系统的软件进行管理,验证系统内软件的完整性,并分析结果。
试比较Linux下网了服务安全设置与Windows下安全设置异同。
二、实验环境安装Red hat9.0操作系统的计算机一台三、实验内容1、账户和口令安全2、文件系统管理安全3、查看和更改PAM模块设置4、RPM软件管理5、系统安全配置四、实验步骤任务一账户和口令安全1、查看和添加账户(1)在X_Windows窗口中单击鼠标右键,选择“信件中断”,输入下面的命令行:[root@localhost root]#useradd mylist利用useradd命令新建名为mylist的新账户。
(2)输入命令行:[root@localhost root]#cat/etc/shadow利用cat查看系统中的账户列表。
用su命令切换到新建的账户,重复步骤(2),检查shadow文件的权限设置是否安全。
设置安全时,普通用户mylist应该没有查看该系统文件的权限。
在终端中出现如下的提示:Cat:/etc/shadow:权限不够2、添加和更改密码(1)在终端输入[root@localhost root]#passwd mylist为新建账户添加密码。
注意:系统管理员无需输入原来密码即可以利用passwd命令添加或改变任意用户的密码,但普通用户只能改变自己的密码。
(2)输入后依次出现如下提示:Changjing passwd for user mylist.New passwd:Retype new passwd:Passwd:all authentication tokens updated susscessfully.输入密码,Linux系统不会将输入显示出来。
操作系统-实验三-进程管理-实验报告
计算机与信息工程学院实验报告一、实验内容1.练习在shell环境下编译执行程序(注意:①在vi编辑器中编写名为sample.c的c语言源程序②用linux自带的编译器gcc编译程序,例如:gcc –o test sample.c③编译后生成名为test.out的可执行文件;④最后执行分析结果;命令为:./test)注意:linux自带的编译程序gcc的语法是:gcc –o 目标程序名源程序名,例如:gcc –o sample1 sample1.c,然后利用命令:./sample 来执行。
如果仅用“gcc 源程序名”,将会把任何名字的源程序都编译成名为a.out的目标程序,这样新编译的程序会覆盖原来的程序,所以最好给每个源程序都起个新目标程序名。
2.进程的创建仿照例子自己编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示“a”,子进程分别显示字符“b”和“c”。
观察记录屏幕上的显示结果,并分析原因。
3.分析程序实验内容要在给出的例子程序基础上,根据要求进行修改,对执行结果进行分析。
二、实验步骤1. 利用fork()创建一个小程序(1)编写程序#include <sys/types.h>main (){int i=5;pid_t pid;pid=fork();for(;i>0;i--){if (pid < 0)printf("error in fork!");else if (pid == 0)printf("i am the child process, my process id is %d and i=%d\n",getpid(),i);elseprintf("i am the parent process, my process id is %d and i=%d\n",getpid(),i);}for(i=5;i>0;i--){if (pid < 0)printf("error in fork!");else if (pid == 0)printf("the child process, my process id is %d and i=%d\n",getpid(),i);elseprintf("the parent process, my process id is %d andi=%d\n",getpid(),i);}}(2)运行程序(3)分析程序在这里,主程序先运行,在屏幕上输出一个a,之后两个子程序分别运行而输出c和b。
《操作系统》课程实验报告
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境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.目的和要求MS-DOS和Windows是市场上普及率很高的操作系统,本实验的目的是让读者从操作系统理论的观点加深对现代操作操作系统的接口设计的理解。
2.实验内容①熟悉DOS的基本命令,包括md,cd,copy,move,del,deltree,type 等的使用a、当前目录下建立子目录MYTEMP和MYTEMP2,将当前目录设定为MYTEMP;b、在当前目录下创建新文件B.BAT,其内容为:清除屏幕内容,显示当前DOS版本;c、使用type命令显示B.BAT的内容,检查正确后,执行它;d、拷贝B.BAT到路径MYTEMP中;e、删除MYTEMP2中的文件B.BAT,删除目录MYTEMP2;f、使用deltree命令删除MYTEMP②理解WINDOWS下的编程接口原理,了解WINAPI,利用WINAPI实现WINDOWS 下的打印。
a、登录进入Windowsb、在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”-“MicrosoftVisual C++ 6.0”命令,进入Visual C++ 窗口。
c、在File菜单单击New Workspace...命令,创建PrintApp.dsw项目文件。
d、在File菜单单击New C++ Soure file命令,创建新的原文件。
e、输入如实验运行结果中所示的源代码,调试、编译并运行。
f、观察执行结果,理解各个函数的功能。
3.实验环境Windows操作系统和Visual C++6.0专业版或企业版实验二复习用C语言编制程序一、实验内容选择一个计算机系统,熟悉该系统的操作命令,且掌握该计算机系统的使用方法。
二、实验目的配合操作系统课程的学习,模拟实现操作系统的功能,有助于对操作系统的理解。
操作系统功能的模拟实现可以在计算机系统的终端上进行,也可以在一台微型计算机上进行。
操作系统实验进程调度
实验三进程调度一. 实验目的加深理解并模拟实现进程(作业)调度算法。
1)熟悉常用的进程调度算法, 如FCFS、SPF、FPF、高响应比优先、时间片轮转;2)结合所学的数据结构及编程知识, 选择三种进程调度算法予以实现。
二. 实验属性该实验为设计性实验。
三. 实验仪器设备及器材普通PC386以上微机四. 实验要求本实验要求2学时完成。
1)本实验要求完成如下任务:2)编程实现单处理机系统中的进程调度, 要求从FCFS、SPF、FPF、高响应比优先、时间片轮转算法中至少选择三个;3)最后编写主函数对所做工作进行测试。
实验前应复习实验中所涉及的理论知识和算法, 针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。
实验后认真书写符合规范格式的实验报告(参见附录A), 并要求用正规的实验报告纸和封面装订整齐, 按时上交。
五: 实验具体设计此程序模拟了两种调度算法, FCFS和SPF, 首先FCFS就是按照进程的创建顺序依次顺序进行, 流程图为:进程顺序执行SPF:每次都进行循环, 选出在该时间刻运行时间最短的进程优先执行。
1.程序代码具体详解:2.创建一结构体作为进程控制器typedef struct PCB{int ID;char state;int arrivetime;int starttime;int finishtime;int servicetime;struct PCB *next;}pcb;定义全局变量作为计时器int time;//计时器创建进程链表:从txt文件中读取数据, 构造一条不含头结点的单链表void Create_process(){ifstream inFile;inFile.open("test.txt");inFile>>n;inFile.get();int i=0;for (;i<n;i++){p=(pcb *)malloc(sizeof(pcb));inFile>>p->ID;inFile>>p->arrivetime;inFile>>p->servicetime;p->starttime=0;p->finishtime=0;p->state='F';p->next=NULL;if(head==NULL){head=p;q=p;time=p->arrivetime;}if(p->arrivetime < time)time=p->arrivetime;q->next=p;q=p;}若执行FCFS算法, 按顺序遍历链表void fcfs1(){int i;p=head;for(i=0;i<n;i++){if(p->state=='F')q=p;run_fcfs1(q);}p=p->next;}}void run_fcfs1(pcb *p1){time = p1->arrivetime > time? p1->arrivetime:time;p1->starttime=time;printf("\n现在时间: %d,开始运行作业%d\n",time,p1->ID);time+=p1->servicetime;p1->state='T';p1->finishtime=time;printf("ID号到达时间开始运行时间服务时间完成时间\n");printf("%d%10d%12d%12d%12d\n",p1->ID,p1->arrivetime,p1->starttime,p1->servicetime,p 1->finishtime);}若执行SPF算法, 每次都从链表头开始遍历链表, 找出arrivetime<=time并且运行时间最短的节点, 执行该节点进程, 最后再删除该节点。
操作系统实验
操作系统实验报告(一)Linux基本操作与编程(验证性 2学时)1、实验目(de):1)熟悉Linux操作系统(de)环境和使用.2)了解LINUX系统(de)安装过程.(注:表示可选择)3)掌握Linux环境下(de)命令操作.2、实验内容:(1)完成LINUX系统(de)登录,启动终端.进行下列操作并记录结果(要求:结果以屏幕截图表示).1)运行pwd命令,确定你当前(de)工作目录.2)利用以下命令显示当前工作目录(de)内容: ls –l3)运行以下命令: ls –al4)使用mkdir命令建立一个子目录subdir.5)使用cd命令,将工作目录改到根目录(/)上.6)使用ls-l命令列出/dev(de)内容.7)使用不带参数(de)命令cd改变目录,然后用pwd命令确定你当前(de)工作目录是哪里8)使用命令cd ../..,你将工作目录移到什么地方(2)在LINUX下查看你(de)文件.1)利用cd命令,将工作目录改到你(de)主目录上.2)将工作目录改到你(de)子目录subdir,然后运行命令: date > file1 将当前日期和时间存放到新建文件file1中.3)使用cat命令查看file1文件(de)内容.4)利用man命令显示date命令(de)用法: man date5)将date命令(de)用法附加到文件file1(de)后面:man date >> file16)利用cat命令显示文件file1(de)内容.7)利用ls -l file1命令列出文件file1(de)较详细(de)信息.运行ls -l/bin 命令显示目录(de)内容.8)利用ls -l/bin|more命令行分屏显示/bin目录(de)内容.9)利用cp file1 fa命令生成文件file1(de)副本.然后利用ls -l命令查看工作目录(de)内容.10)用cd命令返回你(de)主目录,输入命令ls –l后,解释屏幕显示(de)第一列内容(de)含义.(3)编写能输出“Hello world”问候语(de)C程序,并在终端中编译、执行.要求记录所使用(de)命令及结果.操作步骤:1)在文本编辑器中,编写C程序如下:include ""main(){ printf("hello"); }2) 在终端中,用gcc命令进行编译,生成可执行文件a.gcc –o a3) 在终端中执行a (de)命令如下:./a(4)编写一个程序:显示信息“Time for Play”,并能在后台运行一段时间(自定义)后,弹出信息提醒用户.要求记录所使用(de)命令及结果.(提示:使用sleep(s)函数)3、实验结果分析:(对上述实验内容中(de)各题结果,进行分析讨论.并回答下列问题)(1)进程包括哪些特征间断性, 失去封闭性, 不可再现性, 动态性, 并发性, 独立性(2)在Linux中,如何设置前、后台命令和程序(de)执行命令后直接加 & ,这个命令就在后台执行;正在运行(de)命令,使用Ctrl+z ,就挂起; jobs命令,可以现实后台,包括挂起(de)命令;使用 bg %作业号就可以把挂起(de)命令在后台执行;使用 fg %作业号就可以把后台命令调到前台(3)你所使用(de)Linux系统(de)内核版本是多少用什么命令查看内核版本目前你所了解(de)各发行版本(de)情况如何Linux version (gcc version (Red Hat (GCC) ) 1 SMP Tue Jan 2911:48:01 EST 2013(4)你对Linux系统有什么认识linux是一款开放性(de)操作系统,也可以说成是开放(de)源代码系统,这些代码可以完全自由(de)修改可以再任何(de)计算机上去运行它,也就是“可移植性”,其次大家都知道,linux是由UNIX(de)概念所开发出来(de),所以它也继承了UNIX(de)稳定和效率(de)特点4、总结:你对本次实验有什么体会或看法.操作系统实验报告(二)文件访问权限设置与输入输出重定向(2学时)一、实验目(de)1、掌握linux(de)文件访问权限设置.2、熟悉输入输出重定向和管道操作.二、实验内容1、启动进入红帽linux系统2、设置文件权限:在用户主目录下创建目录test,进入test目录,用vi 创建文件file1,并输入任意(de)文字内容.用ls -l显示文件信息,注意文件(de)权限和所属用户和组.对文件file1设置权限,使其他用户可以对此文件进行写操作:chmod o+w file1.用ls -l查看设置结果.取消同组用户对此文件(de)读取权限:chmod g-r file1.查看设置结果.用数字形式来为文件file1设置权限,所有者可读、可写、可执行;其他用户和所属组用户只有读和执行(de)权限:chmod 755 file1.设置完成后查看设置结果.3、输入、输出重定向和管道(1) 输出重定向用ls命令显示当前目录中(de)文件列表:ls –l.使用输出重定向,把ls命令在终端上显示(de)当前目录中(de)文件列表重定向到文件list中:ls –l > list.查看文件list中(de)内容,注意在列表中会多出一个文件list,其长度为0. 这说明shell是首先创建了一个空文件,然后再运行ls命令:cat list.再次使用输出重定向,把ls命令在终端上显示(de)当前目录中(de)文件列表重定向到文件list中.这次使用追加符号>>进行重定向:ls –l >> list.查看文件list(de)内容,可以看到用>>进行重定向是把新(de)输出内容附加在文件(de)末尾,注意其中两行list文件(de)信息中文件大小(de)区别:cat list.重复命令ls –l > list.再次查看文件list中(de)内容,和前两次(de)结果相比较,注意list文件大小和创建时间(de)区别.(2) 管道who |grep root命令(de)结果是命令ls –l |wc –l结果是4、退出linux系统操作步骤:在主菜单上选择“注销” ->关闭计算机.三、实验结果与讨论(根据实验结果回答下列问题)1. 文件(de)权限如下:-rw-r—r-- 1 root root 19274 Jul 14 11:00回答:-rw-r—r-- (de)含义是什么答:是LINUX/FTP(de)简易权限表示法:对应于本用户-所在组-其他人(de)权限,每一个用执行(x)-读取(r)-写入(w)如本题若是说自己可以读取写入不可以执行,所在组和其他人只能读取.2、文件(de)所有者添加执行权限(de)命令是答:chmod u+x 、赋予所有用户读和写文件权限(de)命令是四、答:chmod a+w,a+r 个人体会(你对本次实验有什么体会或看法)操作系统实验报告(三)文件和目录管理一、实验目(de)1) 掌握在Linux系统下(de)文件和文件系统(de)概念及命令;2) 掌握Linux系统下(de)目录操作.二、实验内容1. 进入linux终端后,用命令(de)操作结果回答下列问题:1)vi(de)三种工作模式是其中不能进行直接转换(de)是什么模式到什么模式命令模式、文本输入模式、末行模式命令模式不能直接到末行模式2)在vi中退出时,保存并退出(de)操作步骤是Ese:wq3)用vi 创建myfile1文件,并在其中输入任意文字一行,创建myfile2文件,任意输入文字3行.请问执行命令:cat <myfile1 >myfile2 后,myfile2中还有几行内容该命令(de)作用是用命令操作验证你(de)回答.myfile2中还有1行内容该命令(de)作用是替换myfile(de)内容4)请用至少两种不同(de)命令创建一个文本文件(),在其中写入“我是2014级学生,我正在使用Linux系统.”,记录命令及执行结果.1、Vi创建2、5)用___pwd________命令可查看所创建文件(de)绝对路径,写出它(de)绝对路径__/root_________;用___ls -l________命令查看该文件(de)类型及访问权限,其访问权限(数字和字母)分别是多少__-rw- r- - r- - 6 4 4______________.6)若将该文件(de)访问权限修改为:所有者有读写权限;其他用户只读;同组用户可读写,请写出命令,并记录结果.7)查找my开头(de)所有文件,可___find my_________命令,写出命令并记录结果8)在/home下创建子目录user,并在其中创建2个文件,名为file1和file2,file1(de)内容是/root目录(de)详细信息;file2(de)内容任意,最后将这两个文件合并为file3文件,请先写出命令序列,并在终端中验证,记录结果.2. 文件及目录操作,写出操作所使用(de)命令,并记录结果.在终端中完成下列命令操作,并记录结果在root用户主目录下创建一个mydir子目录和一个myfile文件,再在mydir下建立d1和d2两个子目录.查看mydir和myfile(de)默认权限查看当前myfile和mydir(de)权限值是多少将myfile文件分别复制到root 和dd1(de)主目录中将root主目录中(de)myfile改为yourfile通过从键盘产生一个新文件并输入I am a student查找文件是否包含student字符串三、实验结果与分析,回答下列问题:1、能够创建文件(de)命令有哪些vi 和cat>name2、能够查看当前目录(de)绝对路径(de)命令是pwd3、Linux中按用户属性将用户分成哪些类型根据文件(de)访问权限,用户又被分成哪些类型能够查看文件访问权限(de)命令是用户同组其他可读可写可执行 cat f1四、小结(本次实验(de)体会或小结)操作系统实验报告(四)作业调度算法模拟(验证性2学时)1、实验目(de):1)掌握作业调度(de)主要功能及算法.2)通过模拟作业调度算法(de)设计加深对作业管理基本原理(de)理解.3)熟悉Linux环境下应用程序(de)编程方法.2、实验内容:(1)作业调度算法(FCFS)编程模拟:编制一段程序,对所输入(de)若干作业,输入、输出数据样例如下表所示.按FCFS算法模拟调度,观察、记录并分析调度(de)输出结果情况.输入输出样例1:FCFS算法include <>include <>define SIZE 5struct Job_type{char no[2]; o,&job[i].tb,&job[i].tr);printf("输入作业顺序:\n");for(i=0;i<SIZE;i++)printf("\t%s\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr);}void fcfs(){ int i,j,t=0,tw=0,tt=0;for(i=0;i<SIZE-1;i++)for(j=i+1;j<SIZE;j++)if(job[i].tb>job[j].tb){x=job[i];job[i]=job[j];job[j]=x;}printf("FCFS调度结果:\n");printf("开始时间作业号到达时间运行时间完成时间等待时间周转时间\n");for(i=0;i<SIZE;i++){printf(" %d",t);t=t+job[i].tr;tw=t-job[i].tb-job[i].tr; b; o,job[i].tb,job[i].tr,t,tw,tt);}}void main(){load();fcfs();}(2)作业调度算法(SJF)编程模拟:编程实现由短作业优先算法,分别用下面两组输入、输出数据样例进行模拟,观察分析运行结果.输入输出样例2:SJF算法输入输出A 0 4B 0 3C 0 5D 0 2E 0 1A 0 6 10 10B 0 3 6 6C 0 10 15 15D 0 1 3 3E 0 0 1 1include <>include <>define SIZE 5struct Job_type{char no[2]; o,&job[i].tb,&job[i].tr);printf("输入作业顺序:\n");for(i=0;i<SIZE;i++)printf("\t%s\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr);}void sjf()n=i; pl[i].pfn=ERR;}for(i=1;i<total;i++){ pfc[i-1].next=&pfc[i];pfc[i-1].pfn=i-1;}pfc[total-1].next=NULL;pfc[total-1].pfn=total-1;freepf_head=&pfc[0];}void FIFO(int total){ int i,j;pfc_type p,t;initialize(total);busypf_head=busypf_tail=NULL;for(i=0;i<page_len;i++){if(pl[page[i]].pfn==ERR){ diseffect+=1;if(freepf_head==NULL){p=busypf_head->next;pl[busypf_head->pn].pfn=ERR; freepf_head=busypf_head;freepf_head->next=NULL;busypf_head=p;}p=freepf_head->next;freepf_head->next=NULL;freepf_head->pn=page[i];pl[page[i]].pfn=freepf_head->pfn;if(busypf_tail==NULL)busypf_head=busypf_tail=freepf_head; else{ busypf_tail->next=freepf_head;busypf_tail=freepf_head;}freepf_head=p;}}printf("FIFO:%d",diseffect);}main(){ int i; int k;printf(“请输入页(de)引用序列:\n”); for(k=0;k<page_len;k++)scanf("%d",&page[k]);for(i=4;i<=7;i++){printf("%2d page frames ",i);FIFO(i);}参考程序LRU算法,略三、实验结果分析:(对上述实验各题所使用(de)原始数据、调试数据与状态(包括出错)及最终结果进行记录并分析.)随着块数(de)增加,缺页数目也减少,4个实验中3个实验(de)块数增加到了5以后,即使块数再增加,缺页数目也是保持不变.只有实验4,块数增加到7以后,缺页数目又再次减少了四、总结:你对本次实验有什么体会或看法.。
《操作系统》课程综合性的实验报告
《操作系统》课程综合性的实验报告一、实验目的本次《操作系统》课程的综合性实验旨在通过实际操作和实践,深入理解操作系统的基本原理、功能和运行机制。
具体目标包括熟悉操作系统的进程管理、内存管理、文件系统管理以及设备管理等核心模块,提高对操作系统的整体认知和应用能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10 专业版开发工具:Visual Studio 2019编程语言:C++三、实验内容及步骤(一)进程管理实验1、创建多个进程使用 C++中的多线程库,创建多个进程,并观察它们的并发执行情况。
通过设置不同的优先级和资源需求,研究进程调度算法对系统性能的影响。
2、进程同步与互斥实现生产者消费者问题,使用信号量、互斥锁等机制来保证进程之间的同步和互斥。
观察在不同并发情况下,数据的正确性和系统的稳定性。
(二)内存管理实验1、内存分配与回收模拟内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
通过随机生成内存请求,观察不同算法下内存的利用率和碎片情况。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小和页表结构,观察页面置换算法(如 FIFO、LRU 等)对内存访问性能的影响。
(三)文件系统管理实验1、文件操作创建、读取、写入和删除文件,了解文件系统的基本操作和数据结构。
2、文件目录管理实现文件目录的创建、遍历和搜索功能,研究目录结构对文件访问效率的影响。
(四)设备管理实验1、设备驱动程序模拟编写简单的设备驱动程序,模拟设备的输入输出操作,如键盘输入和屏幕输出。
2、设备分配与调度研究设备分配算法,如先来先服务和优先级算法,观察设备的使用情况和系统的响应时间。
四、实验结果与分析(一)进程管理实验结果分析1、在创建多个进程的实验中,发现高优先级进程能够更快地获得CPU 资源,系统响应时间更短。
但过度提高某些进程的优先级可能导致其他进程饥饿。
2、对于进程同步与互斥问题,正确使用信号量和互斥锁能够有效地保证数据的一致性和系统的稳定性。
操作系统 实验
实验一Windows进程观测一、实验目的通过对Windows编程,进一步熟悉操作系统的基本概念,较好地理解Windows的结构。
1-1运行结果(如果运行不成功,则可能的原因是什么?) :_________________1-2运行结果:____:__________在网络百度到解决方法:Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:[Project] --> [Settings] --> 选择"Link"属性页,在Project Options中将/subsystem:console改成/subsystem:windows1-3运行结果:__________________1-4运行结果:__二实验心得:(1)通过实验我知道了操作系统是用来控制及指挥电脑系统运作的软件程序。
操作系统管理和控制系统资源。
计算机的硬件、软件、数据等都需要操作系统的管理。
操作系统通过许多的数据结构,对系统的信息进行记录,根据不同的系统要求,对系统数据进行修改,达到对资源进行控制的目的。
(2)windows进程的组成:a一个私有的虚拟地址空间b一个可执行程序c一个已经打开句柄的列表d一个被称为访问令牌的安全区e一个被称为进程id的唯一标识实验二 Windows进程控制一、实验目的1) 通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。
2) 通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。
请回答:Windows所创建的每个进程都是以调用_____ CreateProcess()_____API函数开始和以调用_____ ExitProcess()______ 或___ TerminateProcess()___API函数终止。
2-1步骤5:编译完成后,单击“Build”菜单中的“Build 2-1.exe”命令,建立2-1.exe可执行文件。
操作系统实验报告实验3_1
操作系统实验报告实验3_1一、实验目的本次实验的主要目的是深入理解操作系统中进程管理的相关概念和原理,通过实际操作和观察,掌握进程的创建、调度、同步与互斥等关键机制,提高对操作系统内核工作原理的认知和实践能力。
二、实验环境本次实验在装有 Windows 10 操作系统的计算机上进行,使用了Visual Studio 2019 作为开发工具,编程语言为 C++。
三、实验内容与步骤(一)进程创建1、编写一个简单的 C++程序,使用系统调用创建一个新的进程。
2、在父进程和子进程中分别输出不同的信息,以区分它们的执行逻辑。
```cppinclude <iostream>include <windowsh>int main(){DWORD pid;HANDLE hProcess = CreateProcess(NULL, "childexe", NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pid);if (hProcess!= NULL) {std::cout <<"Parent process: Created child process with PID "<< pid << std::endl;WaitForSingleObject(hProcess, INFINITE);CloseHandle(hProcess);} else {std::cerr <<"Failed to create child process" << std::endl;return 1;}return 0;}```(二)进程调度1、设计一个多进程并发执行的程序,通过设置不同的优先级,观察操作系统对进程的调度情况。
2、记录每个进程的执行时间和等待时间,分析调度算法的效果。
```cppinclude <iostream>include <windowsh>DWORD WINAPI ProcessFunction(LPVOID lpParam) {int priority =(int)lpParam;DWORD start = GetTickCount();std::cout <<"Process with priority "<< priority <<"started" << std::endl;for (int i = 0; i < 100000000; i++){//执行一些计算操作}DWORD end = GetTickCount();DWORD executionTime = end start;std::cout <<"Process with priority "<< priority <<" ended Execution time: "<< executionTime <<" ms" << std::endl;return 0;}int main(){HANDLE hThread1, hThread2;int priority1 = 1, priority2 = 2;hThread1 = CreateThread(NULL, 0, ProcessFunction, &priority1, 0, NULL);hThread2 = CreateThread(NULL, 0, ProcessFunction, &priority2, 0, NULL);if (hThread1!= NULL && hThread2!= NULL) {SetThreadPriority(hThread1, THREAD_PRIORITY_LOWEST);SetThreadPriority(hThread2, THREAD_PRIORITY_NORMAL);WaitForSingleObject(hThread1, INFINITE);WaitForSingleObject(hThread2, INFINITE);CloseHandle(hThread1);CloseHandle(hThread2);} else {std::cerr <<"Failed to create threads" << std::endl;return 1;}return 0;}```(三)进程同步与互斥1、实现一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。
网络操作系统 实验作业3参考答案
实验作业3【问题与思考】1、在Linux系统中,哪个文件定义了用户的信息________。
A. /etc/passwdB./etc/usersC./etc/infoD./etc/resolv.conf2、在Linux系统中,如何获取命令“iostat”的帮助信息_______。
A.man iostat B.? –k iostatC.help iostat D.sos -iostat3、下列哪个命令可以将输出到标准输出设备上的信息保存到文件 /tmp/user.dat 中________。
A. > /tmp/user.datB. < /tmp/user.datC. ! /tmp/user.datD. % /tmp/user.dat4、Linux系统中,哪个文件保存了用户账户的加密口令信息_______。
A./etc/securityB./etc/shadowC./etc/passwdD. /etc/inittab5、在Linux中,命令解释器是哪个。
A、管道B、分级文件系统C、字符型处理器D、 shell6、在Linux中,要删除abc目录及其全部内容的命令为。
A、rm abcB、rm -r abcC、rmdir abcD、rmdir -r abc7、请选出创建用户ID是200,组ID是1000,用户主目录为/home/user01的新用户user01的正确命令是:。
A、adduser -u:200 -g:1000 -h:/home/user01 user01B、adduser -u=200 -g=1000 -d=/home/user01 user01C、useradd -u 200 -g 1000 -d /home/user01 user01D、useradd -u 200 -g 1000 -h /home/user01 user018、Linux操作系统中的shell是。
A、命令解释器B、程序设计语言C、脚本编辑器D、编译器9、CentOS系统中用户默认的Shell是。
山东大学操作系统实验报告
操作系统实验报告计算机科学与技术学院目录一、进程控制实验 ...................................................................................................1.1 实验目的................................................................................................................1.2示例实验...................................................................................................................1.2.1实验内容................................................................................................................1.3独立实验...................................................................................................................1.3.1实验内容................................................................................................................1.3.2实验步骤................................................................................................................1.3.3实验演示结果........................................................................................................1.3.4实验代码................................................................................................................二、进程调度算法实验 .................................................................................................2.1 实验目的................................................................................................................2.2示例实验...................................................................................................................2.2.1实验内容................................................................................................................2.2.2实验演示结果........................................................................................................2.3独立实验...................................................................................................................2.3.1实验内容................................................................................................................2.3.2实验步骤................................................................................................................2.3.3实验演示结果........................................................................................................2.3.4实验代码................................................................................................................二、进程同步实验 ...................................................................................................3.1 实验目的................................................................................................................3.2示例实验...................................................................................................................3.2.1实验内容................................................................................................................3.2.2实验演示结果........................................................................................................3.3独立实验...................................................................................................................3.3.1实验内容................................................................................................................3.3.2实验步骤................................................................................................................3.3.3实验演示结果........................................................................................................3.3.4实验代码................................................................................................................三、内存页面置换算法实验 ...................................................................................4.1 实验目的................................................................................................................4.2示例实验...................................................................................................................4.2.1实验内容................................................................................................................4.2.2实验演示结果........................................................................................................4.3独立实验...................................................................................................................4.3.1实验内容................................................................................................................4.3.2实验步骤................................................................................................................4.3.3实验演示结果........................................................................................................4.3.4实验代码................................................................................................................四、磁盘移臂调度算法实验 ...................................................................................5.1 实验目的................................................................................................................5.2示例实验...................................................................................................................5.2.1实验内容................................................................................................................5.2.2实验演示结果........................................................................................................5.3独立实验...................................................................................................................5.3.1实验内容................................................................................................................5.3.2实验步骤................................................................................................................5.3.3实验演示结果........................................................................................................5.3.4实验代码................................................................................................................一、进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告三【实验题目】预防进程死锁的银行家算法【实验目的】通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
【实验内容】问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。
假设有系统中有n个进程P1, …,P n,有m类可分配的资源R1, …,R m,在T0时刻,进程P i分配到的j类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。
程序要求如下:1)判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。
2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后。
3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全输出安全的进程序列,不安全提示信息。
实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int Available[MaxNumber];int Max[MaxNumber][MaxNumber];int Allocation[MaxNumber][MaxNumber];int Need[MaxNumber][MaxNumber];int Request[MaxNumber];int SafeOrder[MaxNumber];2)进程调度的实现过程如下:变量初始化;接收用户输入n,m,(输入或者默认的)Allocation ij,Need ij;按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;如果安全,提示用户输入下一时刻进程P k的资源请求Request(R1, … ,R m);如果不安全或者无新请求则退出。
【实验要求】1)上机前认真复习银行家算法,熟悉资源分配和安全检查过程;2)上机时独立编程、调试程序;3)根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。
【源代码】// YinHangJia.cpp#include <string.h>#include <iostream.h>#define MaxNumber 10//---------------- test -------------------------/*int R = 3;int P = 5;int A vailable[MaxNumber]={3,3,2}; // 系统可用资源char Name[MaxNumber]={'A','B','C'}; // 资源的名称int Max[MaxNumber][MaxNumber]={ {7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3} }; // 各进程所需各类资源的最大需求int Allocation[MaxNumber][MaxNumber]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; // 进程Pi分配到的j类资源为int Need[MaxNumber][MaxNumber]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}}; // 它还需要j类资源int Request[MaxNumber]; // 某个进程Pk会提出请求int Work[MaxNumber]={0}; // 存放系统可提供资源int SafeOrder[MaxNumber]; // 安全序列//*///-------------------Test------------------------///*int R ; // 总资源数int P ; // 总进程数int A vailable[MaxNumber]; // 系统可用资源char Name[MaxNumber]; // 资源的名称int Max[MaxNumber][MaxNumber]; // 各进程所需各类资源的最大需求int Allocation[MaxNumber][MaxNumber]; // 进程Pi分配到的j类资源为int Need[MaxNumber][MaxNumber]; // 它还需要j类资源int Request[MaxNumber]; // 某个进程P会提出请求int Work[MaxNumber]={0}; // 存放系统可提供资源int SafeOrder[MaxNumber]; // 安全序列// */void DataInput();void DataShow();int Bank(); // 不安全返回0,安全返回非0void ChangeDataShow();int GetRequest();//------------------------main()---------------------------------------------int main(int argc, char* argv[]){DataInput();// DataInput();DataShow();Bank();while( 1 == GetRequest());return 0;}//------------------------main()-----------------------------------------------//------------------------DataInput()------------------------------------------void DataInput(){int i=0,j=0;cout<<"请输入总进程数:";do{cin>>P;if (P>MaxNumber) cout<<endl<<"总进程数超过了程序允许的最大进程数,请重新输入:"<<endl;}while (P>MaxNumber);cout<<endl;cout<<"请输入资源的种类数:";do {cin>>R;if (R>MaxNumber)cout<<endl<<"资源的种类数超过了程序允许的最大资源种类数,请重新输入:"<<endl;}while (R>MaxNumber);cout<<endl;cout<<"请依次输入各类资源的名称,可用数量:"<<endl;for(i=0;i<R;i++)cin>>Name[i]>>A vailable[i];cout<<endl;cout<<"请依次输入各进程所需要的最大资源数量:"<<endl;for (i=0;i<P;i++){for (j=0;j<R;j++){cin>>Max[i][j];}}cout<<endl;cout<<"请依次输入各进程已经占据的各类资源数量:"<<endl;for (i=0;i<P;i++){for (j=0;j<R;j++){do{cin>>Allocation[i][j];if ( Allocation[i][j]>Max[i][j] )cout<<endl<<"i<<j<<已占有的资源数量超过了声明的最大资源数量,请重新输入:"<<endl;}while ( Allocation[i][j]>Max[i][j] );}}cout<<endl;for (i=0;i<P;i++)for(j=0;j<R;j++)Need[i][j]=Max[i][j]-Allocation[i][j]; // 还需要的资源数}//------------------------DataInput()------------------------------------------//------------------------DataShow()-------------------------------------------void DataShow() // 显示输入的数据{cout<<"-------------------资源分配情况-----------------------"<<endl;int i,j;cout<<" Max Allocation Need A vailable"<<endl;cout<<"进程ID ";for(j=0;j<4;j++){for(i=0;i<R;i++)cout<<Name[i]<<" "; // 输出资源IDcout<<" ";}cout<<endl;for(i=0;i<P;i++){cout<<" "<<i<<" "; // 进程IDfor(j=0;j<R;j++)cout<<Max[i][j]<<" "; // 最大需要的资源数cout<<" ";for(j=0;j<R;j++)cout<<Allocation[i][j]<<" "; // 已分配的资源数cout<<" ";for(j=0;j<R;j++)cout<<Need[i][j]<<" "; // 还需要的资源数if(0==i){cout<<" ";for(j=0;j<R;j++)cout<<A vailable[j]<<" "; // 系统当前可用的资源}cout<<endl;}}//------------------------DataShow()-------------------------------------------//-------------------------------Bank()----------------------------------------int Bank(){cout<<"-----------利用安全性算法检查此时系统是否安全,如下------------"<<endl;int i,j,k,m=0;bool Finish[MaxNumber];for(i=0;i<R;i++){Work[i]=A vailable[i];}for( k=0;k<MaxNumber;k++ ){Finish[k] = false; // 初始化finish 为falseSafeOrder[k] = 0; // 初始化安全序列为0}// 输出cout<<" Work Allocation Need Work+Allocation"<<endl;cout<<"进程ID ";for(j=0;j<4;j++){for(i=0;i<R;i++)cout<<Name[i]<<" "; // 输出资源IDcout<<" ";}cout<<" Finish ";cout<<endl;//处理for(i=0;i<P;i++) // 对每个进程{if( !Finish[i] ) // 如果没有完成{Finish[i] = true; // 先设定为true,后面再判断真假for(j=0;j<R;j++) // 对每个资源{if( Need[i][j] > Work[j] ) // 所需的资源大于剩下的资源,不能分配{Finish[i]=false;break;}}if( Finish[i] ) // 如果分配,释放资源{SafeOrder[m++] = i; // 添加到安全序列// 输出cout<<" "<<i<<" "; // 进程名for(j=0;j<R;j++) cout<<Work[j]<<" "; // 可用的资源数cout<<" ";for(j=0;j<R;j++) cout<<Allocation[i][j]<<" "; // 已分配的资源数cout<<" ";for(j=0;j<R;j++) cout<<Need[i][j]<<" "; // 还需要的资源数cout<<" ";for(j=0;j<R;j++) // 重置可用资源数{Work[j]=Work[j]+Allocation[i][j];}for(j=0;j<R;j++) cout<<Work[j]<<" "; // 最大需要的资源数cout<<" true" ;cout<<endl;i=-1; // 从第一个进程开始检查,因为下一循环中,先i++,所以这里i=-1 }//}//}//{if( !Finish[i]) // 如果不能完成{cout<<endl;cout<<"进程"<<i<<": Need(";for(k=0;k<R;k++) cout<<Need[i][k]<<" ";cout<<") > Work(";for(k=0;k<R;k++) cout<<Work[k]<<" ";cout<<")"<<endl;}}for(i=0;i<P;i++){if( !Finish[i]) // 如果还有未完成的{cout<<" 系统不安全!"<<endl;//不成功系统不安全return 0; // 函数返回}}//全部完成,输出安全序列cout<<"--------------------------------------------------------"<<endl;cout<<" 存在一个安全序列{";for(i=0;i<P;i++){cout<<SafeOrder[i]; //cout<<SafeOrder[i]<<" ";if(i<P-1) cout<<",";}cout<<"} ,故系统是安全的!"<<endl;//全部完成,输出安全序列cout<<endl;cout<<endl;return 1;}//-------------------------------Bank()----------------------------------------//----------------------------ChangeDataShow()---------------------------------void ChangeDataShow() // 显示输入的数据{int i,j;cout<<" 系统先假定可以为该进程分配资源,并修改相关数据,如下所示"<<endl;cout<<"--------------------------------------------------------"<<endl;cout<<" Allocation Need A vailable"<<endl;cout<<"进程ID ";{for(i=0;i<R;i++)cout<<Name[i]<<" "; // 输出资源名字cout<<" ";}cout<<endl;for(i=0;i<P;i++){cout<<" "<<i<<" "; // 进程名for(j=0;j<R;j++) cout<<Allocation[i][j]<<" "; // 已分配的资源数cout<<" ";for(j=0;j<R;j++) cout<<Need[i][j]<<" "; // 还需要的资源数if(0==i){cout<<" ";for(j=0;j<R;j++) cout<<A vailable[j]<<" "; // 系统当前可用的资源}cout<<endl;}}//----------------------------ChangeDataShow()---------------------------------//------------------------------GetRequest()-----------------------------------int GetRequest(){cout<<endl;int k;int p=-1;// int p=MaxNumber;for( k=0;k<MaxNumber;k++ )Request[k] = 0; // 初始化Request 为0cout<<" 如果存在请求资源的进程,请输入该进程ID (0-"<<P-1<<"),结束请输入-1 : ";cin>>p;if(p == -1 )// if(p == MaxNumber )return 0;// /*while( p<0 || p>=P ) // 不在范围之内,小于0 and 大于进程数(P代表进程的个数){cout<<" 您的输入不正确,请重新输入请求资源的进程ID (0-"<<P-1<<")!结束请输入-1"<< endl;cin>>p;if(p == -1 )return 0;}// */cout<<" 请依次输入请求的各资源数:";//cout<<" 请依次输入请求的各资源数:"<< endl;//for( k=0;k<R;k++ ) cout<<Name[k]<<" ";//cout<< endl;for( k=0;k<R;k++ ) cin>>Request[k];// /*bool safe=true;for( k =0;k<R;k++){if(Request[k]>Need[p][k] ){ safe = false; cout<<"出错,因为所需要的资源已超过所宣布的最大值!"<<endl; break;} }if( safe )for( k =0;k<R;k++){if(Request[k]>A vailable[k]){safe = false;cout<<" 尚无足够资源,需等待!"<<endl; break;}}if( safe )for( k=0;k<R;k++ ){A vailable[k] -=Request[k];Need[p][k] -=Request[k];Allocation[p][k] +=Request[k];}if(safe){ChangeDataShow();//*/if( 0 == Bank() ) // 不安全{for(k=0;k<R;k++){A vailable[k] +=Request[k];Need[p][k] +=Request[k];Allocation[p][k] -=Request[k];}}}return 1;}//------------------------------GetRequest()----------------------------------- 【效果截图】Test1用书上例子为测试数据运行如下:以作业为测试数据:。