操作系统实验名 称 实验六设备管理 姓 名 专 业 学 号 日 期 2015 年12月01日 指导老师一、实验目的1. 理解设备管理的概念和任务2. 掌握独占设备的分配、回收等主要算法的原理并编程实现 二、实验内容与要求该程序中1.在Windows系统中,编写程序实现对独占设备的分配和回收的模拟, 包括:建立设备类表和设备表、分配设备和回收设备的函数三、实验原理1•独占设备的分配、回收等主要算法的原理为了提高操作系统的可适应性和可扩展性,现代操作系统中都毫无例外地实现了 设备独立性,又叫做设备无关性设备独立性的含义是:应用程序独立于具体使 用的物理设备为了实现独占设备的分配,系统设置数据表格的方式也不相同,在实验中只要设 计合理即可这里仅仅是一种方案,采用设备类表和设备表1)数据结构设备物理名是否分 配占用进程001未分配002已分配J1003未分配设备类总台数空闲台 数设备表始址输入机21打印机11设备类表控制器标识符控制器状态:忙、闲与控制器相连的通道表指针控制器队列的队首指针控制器队列的队首指针设备表通道标识符通道状态:忙、闲与通道相连的控制器表首址通道队列的队首指针 通道队列的队首指针操作系统设置“设备分配表”,用来记录计算机系统所配置的独占设备类型、台 数以及分配情况。
设备分配表可由“设备类表”和“设备表”两部分组成,如下 图: 通道表控制器表 设备队列队首指针凡因请求本设备而未得到满足的进程,其PCB都应按照一定 的策略排成一个队列,称该队列为设备请求队列或简称设备队列其队首指针指 向队首PCB在有的系统中还设置了队尾指针设备状态当设备自身正处于使用状态时,应将设备的忙 /闲标志置“ 1”若与 该设备相连接的控制器或通道正忙, 也不能启动该设备,此时则应将设备的等待 标志置“ T与设备连接的控制器表指针 该指针指向该设备所连接的控制器的控制表 在设 备到主机之间具有多条通路的情况下,一个设备将与多个控制器相连接此时, 在DCT中还应设置多个控制器表指针2) 设备分配1) 当进程申请某类设备时,系统先查“设备类表” 2) 如果该类设备的现存台数可以满足申请要求,则从该类设备的“设备表”始址 开始依次查该类设备在设备表中的登记项,找出“未分配”的设备分配给进程3) 分配后要修改设备类表中的现存台数, 把分配给进程的设备标志改为 “已分配” 且填上占用设备的进程名4) 然后,把设备的绝对号与相对号的对应关系通知用户,以便用户在分配到的设 备上装上存储介质。
3) 设备回收当进程执行结束撤离时应归还所占设备, 系统根据进程名查设备表, 找出进程占 用设备的登记栏,把标志修改为“未分配” ,清除进程名同时把回收的设备台 数加到设备类表中的现存台数中设备分配程序的改进增加设备的独立性:为了获得设备的独立性,进程应使用逻辑设备名I/O这样, 系统首先从SDT中找出第一个该类设备的DCT若该设备忙,又查找第二个该类 设备的DCT,仅当所有该类设备都忙时,才把进程挂在该类设备的等待队列上, 而只要有一个该类设备可用,系统便进一歩计算分配该设备的安全性四、程序流程图开始Y设备是否存在NN是否添加控制器结束输入选择指令A输入设备类型输入设备名称输入控制器名称输入选择的通道显示所有设备信息添加成功删除设备设备独立性开始 ..输入选择指令I$输入设备名称设置成功申请设备#in clude using n amespace std;//数据结构typedef struct node{char n ame[10];char dev name[10]; struct node *n ext;}PCB;〃进程PCB * run;// 执行队列//typedef struct Node{char ide ntify[1O];〃 标识 int state;// 设备状态PCB *blocki ng;〃 阻塞队列指针}CHCT;〃通道控制表CHCT * CH1, * CH2;// 设置两个通道为 ch1,ch2//typedef struct NOde{char identify[10];// 标识 int state;// 设备状态 CHCT * chct;//CHCTPCB *blocking;// 阻塞队列指针 struct NOde *next;}COCT;// 控制器控制表COCT * cohead;typedef struct NODe{char identify[10];// 标识char type;// 设备类型int state;// 设备状态int times;// 重复执行次数PCB *blocking;// 阻塞队列指针COCT * coct;//COCT}DCT;// 设备控制表 typedef struct NODE{char type;// 类别char identify[10];// 标识DCT * dct;//DCT 设备控制表// 驱动入口地址struct NODE *next;}SDT;// 系统设备表SDT * head;SDT * checkdel;void Init(){PCB * ch1block,* ch2block,* co1block,* co2block,* co3block,* d1block,* d2block,* d3block,* d4block;// 进程控制块COCT * CO1,* CO2,* CO3;DCT *d1,*d2,*d3,*d4;SDT *s1,*s2,*s3,*s4; //================================================= run=(PCB *)malloc(sizeof(PCB));run->next=NULL;CH1=(CHCT *)malloc(sizeof(CHCT));CH2=(CHCT *)malloc(sizeof(CHCT)); strcpy(CH1->identify,"ch1");strcpy(CH2->identify,"ch2");CH1->state=0;CH2->state=0;ch1block=(PCB *)malloc(sizeof(PCB));ch1block->next=NULL; ch2block=(PCB *)malloc(sizeof(PCB));ch2block->next=NULL;CH1->blocking=ch1block;CH2->blocking=ch2block; cohead=(COCT *)malloc(sizeof(COCT)); cohead->next=NULL;CO1=(COCT *)malloc(sizeof(COCT));cohead->next=CO1;CO1->next=NULL;CO2=(COCT *)malloc(sizeof(COCT));CO1->next=CO2;CO2->next=NULL;CO3=(COCT *)malloc(sizeof(COCT));CO2->next=CO3;CO3->next=NULL;CO1->state=0;CO2->state=0;CO3->state=0; co1block=(PCB *)malloc(sizeof(PCB));co1block->next=NULL;co2block=(PCB *)malloc(sizeof(PCB));co2block->next=NULL;co3block=(PCB *)malloc(sizeof(PCB)); co3block->next=NULL;strcpy(CO1->identify,"co1");strcpy(CO2->identify,"co2");strcpy(CO3->identify,"co3");CO1->chct=CH1;CO2->chct=CH1;CO3->chct=CH2;CO1->blocking=co1block;CO2->blocking=co2block;CO3->blocking=co3block; //===================================================== d1block=(PCB *)malloc(sizeof(PCB));d2block=(PCB *)malloc(sizeof(PCB));d3block=(PCB *)malloc(sizeof(PCB));d4block=(PCB *)malloc(sizeof(PCB)); d1block->next=NULL;d2block->next=NULL;d3block->next=NULL;d4block->next=NULL;表示打印机设备 表示显示器设备 表示键盘设备 表示鼠标设备d2->coct=CO2;d3->coct=CO3; d4->coct=CO3; d1->state=0;// d2->state=0; d3->state=0;d4->state=0; d1->type='o';//o d2->type='o'; d3->type='i';//i d4->type='i';状态表示输出设备 output表示输入设备d1->blocking=d1block;d2->blocking=d2block;d3->blocking=d3block;d4->blocking=d4block;//================================head=(SDT *)malloc(sizeof(SDT)); head->next=NULL;s1=(SDT *)malloc(sizeof(SDT));s2=(SDT *)malloc(sizeof(SDT));s3=(SDT *)malloc(sizeof(SDT));s4=(SDT *)malloc(sizeof(SDT)); head->next=s1;s1->next=s2;s2->next=s3;s3->next=s4;s4->next=NULL;s1->dct=d1;s2->dct=d2;s3->dct=d3;s4->dct=d4; strcpy(s1->identify,"P");d1=(DCT *)malloc(sizeof(DCT)); strcpy(d1->identify,"P");//p d2=(DCT *)malloc(sizeof(DCT)); strcpy(d2->identify,"T");//t d3=(DCT *)。