实验一模拟进程状态转换及其PCB的变化一、实验目的:
自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。
二、实验内容及要求:
(1)、设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。
(2)、独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。(3)、合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。
(4)、设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。
(5)、代码书写要规范,要适当地加入注释。
(6)、鼓励在实验中加入新的观点或想法,并加以实现。
(7)、认真进行预习,完成预习报告。
(8)、实验完成后,要认真总结,完成实验报告。
三、实现:
数据结构
struct PCB{
char name;
int priority;
int needtime;
bool operator < (const PCB &b) const{ return priority>b.priority;
}
};
五状态进程模型
最高优先数优先调度算法流程图
四、运行结果:
图1 创建2个进程,因为这时cpu空闲所以内核调度,b优先级高先执行
图2 超时,因为这时cpu空闲所以内核调度,b优先级还是比a高所以先执行
图3 2个进程均被阻塞,其中一旦进程被阻塞就会引发调度
图4 唤醒1个进程,从阻塞队列取队首放到就绪队列队尾,由于这时cpu空闲所以内核调
度
五、源代码:
#include
#include
using namespace std;
int Ready_len=0;
int Blocked_len=0;
int CPU_state=0;
struct PCB{
char name;
int priority;
int needtime;
bool operator < (const PCB &b) const{
return priority>b.priority;
}
};
PCB Ready[100];
PCB Blocked[100];
PCB Cpu;
bool dispatch();
bool creat(int NUM){//创建一个新的进程
while(NUM--){
printf("输入进程名(一个字符)、所需时间(一个整数)、优
先级(一个整数): \n");
scanf("%s%d%d",&(Ready[Ready_len].name),&(Ready[Ready_len]. needtime),&(Ready[Ready_len].priority));getchar();
Ready_len++;
}
if(CPU_state==0)//如果CPU空闲,则调度
dispatch();
}
bool dispatch(){
if(CPU_state==0){
if(Ready_len!=0){
sort(Ready,Ready+Ready_len);
https://www.wendangku.net/doc/7c15644076.html,=Ready[0].name;Cpu.needtime=Ready[0].needtime;Cpu.p riority=Ready[0].priority;
if(Ready_len!=1)//就绪队列剔除队首元素
for(int indx=1;indx Ready[indx-1].name=Ready[indx].name;Ready[indx-1].needtime= Ready[indx].needtime;Ready[indx-1].priority=Ready[indx].pri ority; } Ready_len--; CPU_state=1; printf("***%c进程送往CPU执行\n",https://www.wendangku.net/doc/7c15644076.html,); Cpu.needtime--; Cpu.priority--; }else{ printf("***就绪队列为空,无法调度\n"); return false; } }else{ printf("***CPU忙,无法调度\n"); } } bool time_out(){ if(CPU_state==1){ if(Cpu.needtime==0) printf("***%c时间片用完,并且执行完毕,被释放\n",https://www.wendangku.net/doc/7c15644076.html,); else{ Ready[Ready_len].name=https://www.wendangku.net/doc/7c15644076.html,;Ready[Ready_len].needtime=Cp u.needtime;Ready[Ready_len].priority=Cpu.priority; Ready_len++; printf("***%c时间片用完\n",https://www.wendangku.net/doc/7c15644076.html,); } CPU_state=0; https://www.wendangku.net/doc/7c15644076.html,=0; Cpu.needtime=0; Cpu.priority=0; if(Ready_len!=0)//时间片用完,如果就绪队列不为空,则调度 dispatch(); }else{ printf("***没有进程在CPU中,无法超时\n"); } } bool event_wait(){ if(CPU_state==1){ Blocked[Blocked_len].name=https://www.wendangku.net/doc/7c15644076.html,;Blocked[Blocked_len]. needtime=Cpu.needtime;Blocked[Blocked_len].priority=Cpu.pri ority; Blocked_len++; printf("***%c被阻塞\n",https://www.wendangku.net/doc/7c15644076.html,); CPU_state=0; if(Ready_len!=0)//进程被阻塞,如果就绪队列不为空,则调度 dispatch(); }else printf("***没有进程在CPU中,无法阻塞\n"); } bool event_occur(){ if(Blocked_len!=0){ //sort(Blocked,Blocked+Blocked_len); Ready[Ready_len].name=Blocked[0].name;Ready[Ready_len].need time=Blocked[0].needtime;Ready[Ready_len].priority=Blocked[ 0].priority; Ready_len++; if(Blocked_len!=1)//阻塞队列剔除队首元素 for(int indx=1;indx Blocked[indx-1].name=Blocked[indx].name;Blocked[indx-1].nee dtime=Blocked[indx].needtime;Blocked[indx-1].priority=Block ed[indx].priority; } Blocked_len--; //printf("%d %d",Blocked_len,Ready_len); printf("***%c被唤醒\n",Ready[Ready_len-1].name); if(CPU_state==0)//如果CPU空闲,则调度 dispatch(); //printf("%d %d",Blocked_len,Ready_len); }else printf("***阻塞队列为空,无法唤醒\n"); } int main(){ int Cputime=1; while(1){ printf("\n1:New\t\t\t2:Dispatch\n"); printf("3:Timeout\t\t4:Event wait\n"); printf("5:Event occur\t\t0:exit\n"); printf("输入1--5实现相应的功能:\n"); int select; scanf("%d",&select);getchar(); switch(select){ case 1: int num; printf("输入要创建的进程数:\n"); scanf("%d",&num); getchar(); creat(num); break; case 2: dispatch(); break; case 3: time_out(); break; case 4: event_wait(); break; case 5: event_occur(); break; case 0: exit(0); break; } printf("****************************Cputime:%3d********* *******************\n",Cputime); printf("状态\t\t进程名\t\t需要时间\t\t优先级\n"); if(CPU_state){//显示CPU中的进程 printf("Running:\t%c\t\t",https://www.wendangku.net/doc/7c15644076.html,); printf("%d\t\t\t",Cpu.needtime); printf("%d\n",Cpu.priority); } if(Ready_len){//显示Ready队列中的进程 for(int a=0;a printf("Ready%d:\t\t",a); printf("%c\t\t",Ready[a].name); printf("%d\t\t\t",Ready[a].needtime); printf("%d\n",Ready[a].priority); } } if(Blocked_len){//显示Blocked队列中的程序 for(int b=0;b printf("Blocked%d:\t",b); printf("%c\t\t",Blocked[b].name); printf("%d\t\t\t",Blocked[b].needtime); printf("%d\n",Blocked[b].priority); } } printf("************************************************ *******************\n"); Cputime++; } } 实验一、进程控制实验 1.1 实验目的 加深对于进程并发执行概念的理解。实践并发进程的创建和控制方法。观察和体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。 1.2 实验说明 1)与进程创建、执行有关的系统调用说明进程可以通过系统调用fork()创建子进程并和其子进程并发执行.子进程初始的执行映像是父进程的一个复本.子进程可以通过exec()系统调用族装入一个新的执行程序。父进程可以使用wait()或waitpid()系统调用等待子进程的结束并负责收集和清理子进程的退出状态。 fork()系统调用语法: #include Exec 执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。如果exec 调用失败,它会返回-1。 wait() 系统调用语法: #include 实验2进程状态转换及其PCB的变化 1.目的 自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。 2. 内容及要求 1)设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 2)独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。 3)合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。 4)设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB 内容、组织结构的变化。 5)代码书写要规范,要适当地加入注释。 6)鼓励在实验中加入新的观点或想法,并加以实现。 7)认真进行预习,完成预习报告。 8)实验完成后,要认真总结,完成实验报告。 3.程序流程图 进程的三种基本状态及其转换如下图所示。 开始 输入要执行的指令 1?N 2?N 3?N 4? N 5?N 0?Y Y 结束 N 提示输入错误 就绪队列已 满? N 创建进程 Y 提示就绪队列 已满Y 有进程处于运行状态? Y 该进程执行一个时间片 后放回就绪队列 N 将就绪队列中优先级最高的进程放入运行队列 有进程处于运行状态? Y 该进程所需执行时间减1,并回到就绪队列 Cputime++ Y 有进程处于运行状态? Y 将该进程放入阻塞 队列 N 提示无运行的进程 输入事件发生的进程名称 阻塞队列中有该 进程? Y 将该进程放入就绪队列 N 提示该进程并 未阻塞 4.数据结构及说明 在本实验中,主要的数据结构是PCB 的数据结构,具体如下: struct process{ 第3章处理机管理 7.1实验内容 处理机管理是操作系统中非常重要的部分。为深入理解进程管理部分的功能,设计几个调度算法,模拟实现处理机的调度。 7.2实验目的 在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。也就是说能运行的进程数远远大于处理机个数。为了使系统中的各进程能有条不紊地运行,必须选择某种调度策略,以选择一进程占用处理机。要求学生设计一个模拟单处理机调度的算法,以巩固和加深处理机调度的概念。 7.3实验题目 7.3.1设计一个按先来先服务调度的算法 提示 (1)假设系统中有5个进程,每个进程由一个进程控制块(PCB)来标识。进程控制块内容如图7-1所示。 进程名即进程标识。 链接指针:按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列。指针指出下一个到达进程的进程控制块首地址。最后一个进程的链指针为NULL。 估计运行时间:可由设计者指定一个时间值。 达到时间:进程创建时的系统时间或由用户指定。调度时,总是选择到达时间最早的进程。 进程状态:为简单起见,这里假定进程有两种状态:就绪和完成。并假定进程一创建就处于就绪状态,用R表示。当一个进程运行结束时,就将其置成完成状态,用C表示。 (2)设置一个队首指针head,用来指出最先进入系统的进程。各就绪进程通过链接指针连在一起。 (3)处理机调度时总是选择队首指针指向的进程投入运行。由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行: 估计运行时间减1 用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。 (4)在所设计的程序中应有显示或打印语句,能显示或打印正运行进程的进程名,已运行是、还剩时间,就绪队列中的进程等。所有进程运行完成是,给出各进程的周转时间和平均周转时间。 先来先服务(FCFS)调度算法 /*源程序1.cpp,采用先来先无法法在Visual C++ 6.0下调试运行*/ /*数据结构定义及符号说明*/ #include 实验三:进程同步实验 一、实验任务: (1)掌握操作系统的进程同步原理; (2)熟悉linux的进程同步原语; (3 )设计程序,实现经典进程同步问题。 二、实验原理: (1)P、V操作 PV操作由P操作原语和V操作原语组成(原语是不可中断的过程) ,对信号量进行操作,具体定义如下: P( S):①将信- 号量S的值减1,即S=S-1; ②如果S30,则该进程继续执行;否则该进程置为等待状态,排入等待队列。 V( S):①将信号量S的值加1,即S=S+1 ; ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。 (2)信号量 信号量(semaphore )的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的 值仅能由PV操作来改变。 一般来说,信号量S30时,S表示可用资源的数量。执行一次P操作意味着请求分配一 个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S 的值加1;若S均,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。 (3)linux的进程同步原语 ①wait();阻塞父进程,子进程执行; ②#in clude 实验进程状态转换及其PCB的变化 一、程序流程图: 二、使用的数据结构及说明: 在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下: struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; 其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态: Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry 置1,否则置0。Struct PCB * next 用来指向同一队列中的下一个PCB块。 三、程序源代码: #include"stdlib.h" #include"stdio.h" #include"string.h" /********** globle structure and viable ******/ struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; struct PCB * Create_state; //创建状态 struct PCB * Run_state; //运行状态 struct PCB * Ready_state; //就绪状态 struct PCB * Block_state; //阻塞状态 struct PCB * Exit_state; //退出状态 int signal4=0; //标示进程4的完成状态 int signal5=0; //标示进程5的完成状态 void InsertQueue(struct PCB **head,struct PCB *node) /* insert node function */ { struct PCB * p,*q; node->next=NULL; if(*head==NULL) //如果队列为空 { *head=node; } Else //队列不空 { p=*head; q=p->next; while(q!=NULL) //找到最后的元素位置 { p=q; q=q->next; } p->next=node; //将节点插入队列 } 实验项目名称:进程的同步(实验一) 1、实验目的 (1) 掌握进程和线程基本概念和属性; (2) 掌握用PV操作解决并发进程的同步问题; (3) 掌握用于同步的信号量初值的设置; (4) 掌握如何处理共享资源的直接制约关系。 2、实验内容 (1) 设计一个模拟若干售票网点的售票程序。界面可以参考图1。还应设计多个后台售票线程并发运行。 图1售票 (2) 模拟:桌上有一只盘子,每次只能放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放桔子,一个女儿专等吃盘子里的苹果,一个儿子专等吃盘子里的桔子。只要盘子空则爸爸或妈妈都可以向盘子放一个水果,仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。放-取水果的几种情况如图2(a)~(f)所示,可以参照进行设计。 (a)盘子空时取水果 (b)父亲放入苹果 (c) 儿子取水果 (d) 女儿取水果 (e)儿子取走桔子 (f)盘子满时放水果 图2 放-取水果 (3) 自选其它能反映进程互斥问题的应用。 实验项目名称:处理机调度(实验二) 1、实验目的 (1) 掌握几种处理机调度算法的基本思想和特点; (2) 理解并发与并行的区别; (3) 比较几种算法的特点。 2、实验内容 编写程序模拟处理机调度,参照图3。 (1) 时间片轮转 (2) 动态优先权调度 (3) 高响应比优先调度 图3 模拟处理机调度 实验项目名称:银行家算法(实验三) 1、实验目的 银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 2、实验内容 (1) 设计进程对各类资源最大申请表示及初值确定。 (2) 设定系统提供资源初始状况。 (3) 设定每次某个进程对各类资源的申请表示。 (4) 编制程序,依据银行家算法,决定其申请是否得到满足。 具体设计可参照图4(a)~(c) 进行。 实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图 2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0; 实验一进程的状态及其转换 一、实验目的: 自行编制模拟程序,通过形象化的状态显示,加深理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。 二、实验内容及要求: 1)设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 2)独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状 态或其它)以及PCB的组织形式可自行选择。 3)合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控 制信息、资源需求及现场信息。 4)设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、 组织结构的变化。 三、程序流程图: 四、使用的数据结构及说明: 在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下: struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; 其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry置1,否则置0。Struct PCB * next 用来指向同一队列中的下一个PCB 块。 五、参考程序源代码: #include"stdlib.h" #include"stdio.h" #include"string.h" #include 河北大学工商学院 课程设计 题目:操作系统课程设计 学部信息学部 学科门类电气信息 专业计算机 学号2011482370 姓名耿雪涛 指导教师朱亮 2013 年6月19日 主要内容 一、设计目的 通过模拟操作系统的实现,加深对操作系统工作原理理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。 二、设计思想 实现一个模拟操作系统,使用VB、VC、CB等windows环境下的程序设计语言,以借助这些语言环境来模拟硬件的一些并行工作。模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。 设计模板如下图: 注:本人主要涉及设备管理模块 三、设计要求 设备管理主要包括设备的分配和回收。 ⑴模拟系统中有A、B、C三种独占型设备,A设备1个,B设备2个,C设备2个。 ⑵采用死锁的预防方法来处理申请独占设备可能造成的死锁。 ⑶屏幕显示 注:屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 设备管理模块详细设计 一、设备管理的任务 I/O设备是按照用户的请求,控制设备的各种操作,用于完成I/O 设备与内存之间的数据交换(包括设备的分配与回收,设备的驱动管理等),最终完成用户的I/O请求,并且I/O设备为用户提供了使用外部设备的接口,可以满足用户的需求。 二、设备管理函数的详细描述 1、检查设备是否可用(主要代码) public bool JudgeDevice(DeviceType type) { bool str = false; switch (type) { case DeviceType.a: { 实验题目进程的创建小组合作否姓名班级学号 一、实验目的 1、了解进程的创建。 2、了解进程间的调用以及实现。 3、分析进程竞争资源的现象,学习解决互斥的方法。 4、加深对进程概念的理解,认识并发执行的本质。 二.实验环境 Windows 系统的计算机一台,安装了Linux虚拟机 三、实验内容与步骤 1、fork()系统调用的使用例子 程序代码: #include wait(0); printf("parent process doesn't change the glob and loc:\n"); printf("glob=%d,loc=%d\n",glob,loc); exit(0); } 运行结果: 2、理解vofork()调用: 程序代码: #include 实验一模拟进程状态转换及其PCB的变化 一、实验目的: 自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。 二、实验内容及要求: (1)、设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 (2)、独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。(3)、合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。 (4)、设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。 (5)、代码书写要规范,要适当地加入注释。 (6)、鼓励在实验中加入新的观点或想法,并加以实现。 (7)、认真进行预习,完成预习报告。 (8)、实验完成后,要认真总结,完成实验报告。 三、实现: 数据结构 struct PCB{ char name; int priority; int needtime; bool operator < (const PCB &b) const{ return priority>b.priority; } }; 五状态进程模型 最高优先数优先调度算法流程图 四、运行结果: 图1创建2个进程,因为这时cpu空闲所以内核调度,b优先级高先执行 图2超时,因为这时cpu空闲所以内核调度,b优先级还是比a高所以先执行 图32个进程均被阻塞,其中一旦进程被阻塞就会引发调度 图4唤醒1个进程,从阻塞队列取队首放到就绪队列队尾,由于这时cpu空闲所以内核调 度 操作系统实验报告 集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289- 实验二进程调度1.目的和要求 通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。 2.实验内容 阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。 编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。 程序要求如下: 1)输出系统中进程的调度次序; 2)计算CPU利用率。 3.实验环境 Windows操作系统、VC++6.0 C语言 4设计思想: (1)程序中进程可用PCB表示,其类型描述如下: structPCB_type { intpid;//进程名 intstate;//进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态 intcpu_time;//运行需要的CPU时间(需运行的时间片个数) } 用PCB来模拟进程; (2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。队列类型描述如下: structQueueNode{ structPCB_typePCB; StructQueueNode*next; } 并设全程量: structQueueNode*ready_head=NULL,//ready队列队首指针 *ready_tail=NULL,//ready队列队尾指 针 山东大学操作系统实验报告4进程同步实验 计算机科学与技术学院实验报告 实验题目:实验四、进程同步实验学号: 日期:20120409 班级:计基地12 姓名: 实验目的: 加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥 操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。了解 Linux 系统中 IPC 进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。 实验内容: 抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个有纸,另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一过程重复进行。请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。 硬件环境: 处理器:Intel? Core?i3-2350M CPU @ 2.30GHz ×4 图形:Intel? Sandybridge Mobile x86/MMX/SSE2 内存:4G 操作系统:32位 磁盘:20.1 GB 软件环境: ubuntu13.04 实验步骤: (1)新建定义了producer和consumer共用的IPC函数原型和变量的ipc.h文件。 (2)新建ipc.c文件,编写producer和consumer 共用的IPC的具体相应函数。 (3)新建Producer文件,首先定义producer 的一些行为,利用系统调用,建立共享内存区域,设定其长度并获取共享内存的首地址。然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。 (4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。 运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。 实验 1.1、1.2 Linux Ubuntu的安装、创建新的虚拟机VMWare 实验1.3 Shell编程 1.实验目的与容 通过本实验,了解Linux系统的shell机制,掌握简单的shell编程技巧。 编制简单的Shell程序,该程序在用户登录时自动执行,显示某些提示信息,如“Welcome to Linux”, 并在命令提示符中包含当前时间、当前目录和当前用户名等基本信息。 2.程序源代码清单 #include } esle if(fork()==0){ printf("In the ps progress\n"); dup2(pfd[1],1); close(pfd[0]); close(pfd[1]); execlp("ps","ps","-ef",0); perror("execlp ps -ef"); } close(pfd[1]); close(pfd[0]); wait(&state); wait(&state); } 实验2.3 核模块 实验步骤: (1).编写核模块 文件中主要包含init_clock(),exit_clock(),read_clock()三个函数。其中init_clock(),exit_clock()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc中的入口。read_clock()负责产生/proc/clock被读时的动作。 (2).编译核模块Makefile文件 # Makefile under 2.6.25 文件管理系统模拟 1.实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 2.实验内容 为Linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条) login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 3.实验提示 (1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。 4.源代码 #include #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号 #define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小#define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5 //最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位0 空闲*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名8位*/ char property; /*属性1位目录0位普通文件*/ int size; /*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录起始盘块号*/ int next; /*子目录起始盘块号*/ int sign; /*1是根目录0不是根目录*/ }directitem[MSD+2]; }; struct opentable { struct openttableitem { char name[9]; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; /*文件的大小*/ }openitem[MOFN]; int cur_size; /*当前打文件的数目*/ }; struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目录*/ struct direct *cur_dir; /*当前目录*/ struct opentable u_opentable; /*文件打开表*/ int fd=-1; /*文件打开表的 广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室 2015年11月11日 实验课 操作系统成绩 程名称 实验项 进程管理与进程通信指导老师陈康民目名称 (***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***) 进程管理 (一)进程的创建实验 一、实验目的 1、掌握进程的概念,明确进程的含义 2、认识并了解并发执行的实质 二、实验内容 1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一 个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……', 父进程显示'parent ……',观察结果,分析原因。 三、实验步骤 1、编写一段程序,使用系统调用fork( )创建两个子进程。 代码: #include bca,bac, abc ,……都有可能。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。 代码:#include 《操作系统》课程实验 实验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变量和位置参数、环境变量。 7.学会使用bash的特殊字符和一般控制结构编写shell脚本。 要求:1.登录进入系统,修改个人密码。 2.使用简单命令:date,cal,who,echo,clear等,了解Linux命令格式。 3.进入vi。建立一个文件,如file.c。进入插入方式,输入一个C语言程序的各行内容,故意制造几处错误。最后,将该文件存盘。回到shell状态下。 4.运行gcc file.c -o myfile,编译该文件,会发现错误提示。理解其含义。 5.利用vi建立一个脚本文件,其中包括date,cal,pwd,ls等常用命令。然后以不同方式执行该脚本。 6.对主教材第2章中的适当例题进行编辑,然后执行。从而体会通配符、引号、输入输出重定向符、成组命令的作用;能正确使用自定义变量、位置参数、环境变量、输入/输出命令;能利用if语句、while语句、for语句和函数编写简单的脚本。 实验3:进程管理(4学时) 目的:1.加深对进程概念的理解,明确它与程序的区别,突出理解其动态性特征。 2.学会使用ps命令观察进程的状态,并分析进程族系关系。 3.学会使用系统调用对进程进行控制。操作系统实验-进程控制
实验2 进程状态转换及其PCB的变化
操作系统课程试验
操作系统进程同步实验报告
操作系统实验报告+进程状态转换
2014-2015(1)操作系统实验
操作系统实验报告--实验一--进程管理
实验一 进程状态转换
操作系统课程设计实验报告
操作系统实验报告(进程的创建)(DOC)
操作系统实验一模拟进程状态转换
操作系统实验报告
山东大学操作系统实验报告4进程同步实验
操作系统-Linux课程实验报告
操作系统文件管理系统模拟实验
操作系统实验_实验1
操作系统课程实验