1、编写单通路IO系统中的设备分配程序实验报告合肥学院计算机科学与技术系实验报告2009 2010学年第1 学期课程 操作系统原理实验名称编写单通路I/O系统中的 设备分配程序学生姓名 冯阿雷 毕秋平 高健 宁阳专业班级 07计本(1)班指导教师屠 菁2000 年 12 月一、实验目的 熟练掌握单通路I/O系统中的设备分配方法。二、实验内容本实验要求实现模拟单通路I/O系统中的设备分配程序,有如下要求:1、设计系统设备表SDT、设备控制表DCT、控制器表COCT、通道表CHCT和逻辑设备表LUT。2、提供给用户各表目的初态。3、回答信息: 能够分配时,给出设备号、控制器号、通道号, 否则,给出无法
2、分配的回答,插入相应的等待队列。三、实验步骤1、任务分析为单通路I/O系统设计系统设备表SDT、设备控制表DCT、控制器表COCT、通道表CHCT和逻辑设备表LUT五张表。用户可以查看各表目的内容,另外,程序为用户进程分配设备,并且输出分配结果,如果能够分配,则给出设备号、控制器号、通道号,否则,给出无法分配的回答,插入相应的等待队列。2、概要设计为实现本次实验任务要求,首先,定义SDT、DCT、COCT、CHCT、LUT五张表,调用input()函数初始化各表内容;其次,调用print()函数,实现对上述四张表的输出显示;最后,调用add_process()函数,为用户进程申请设备,如果分配
3、成功,给出设备号、控制器号、通道号,否则,给出无法分配的原因,并将该进程插入相应的等待队列中。本程序包含如下3个模块:(1)主模块,由函数main()组成。(2)显示表目模块,由函数print()组成。(3)分配设备模块,由函数add_process()、process_run()等函数组成。绘制流程图如下: 流程图3、详细设计和编码通过以上的分析和初步设计,已经对本程序作了初步了解。下面将对本程序的各个模块作详细的讲解。(1)主函数模块对各个表就行初始化,设置好各个表的状态,以及对各个步骤进行函数调用来实现本实验的要求。(2)显示表目模块调用print()函数,显示出SDT系统设备表、DCT
4、设备控制表、COCT控制器控制表、CHCT通道表和LUT逻辑设备表五张表目,直接显示各表中的设备类型、设备名称和设备状态等信息。(3) 分配设备模块在此模块中,首先调用add_process()函数,要求用户输入所要申请的逻辑设备名称,然后根据逻辑设备名称查看LUT表中的该设备是否存在,若不存在,则直接退出分配,输出分配失败原因,若存在,则继续如下分析:a.分配设备。根据LUT表找到设备表,然后根据SDT表中指向DCT表该设备的指针,检索到DCT设备控制表中该物理设备,检查该设备的状态信息Busy。若忙,则将要求I/O的进程插入到该设备的等待队列中等待;若不忙,则继续步骤(b)。b.分配控制器
5、。根据设备控制表DCT中的控制器表指针,可找到与此设备相连的控制器表COCT,通过检查该表中的状态信息Busy。若忙,则将要求I/O的进程插入到等待该控制器的队列中等待;若不忙,则把该控制器分配给进程,继续步骤(c)。c.分配通道。首先根据控制器表COCT中的通道表指针找到与此控制器相连的通道表CHCT,从中了解此通道的状态信息Busy。若为忙,则把该进程插入等待通道的队列CHL中;若通道空闲,则表明本次I/O请求所需之I/O设备和相应的控制器、通道都能得到,于是便可启动I/O设备开始数据传送。调用add_process()函数来实现上述步骤。分配完成后,将相应的设备、控制器和通道的状态信息B
6、usy置1。结束分配程序。4、调试分析本次程序设计的核心内容在于设备的分配过程,一次分配只有在设备、控制器和通道三者都分配成功时,这次分配才算成功。该程序的核心逻辑关系是先分配设备再分配控制器最后分配通道。当三者都空闲并安全时,才可分配,最终启动该I/O设备进行数据传送。5、测试结果 运行程序后,运行结果如下图1。图1进行初始化,运行结果如下图2图2图3各表的初始化状态如图3。 图3进程分配设备结果如图3四、实验总结通过本次实验,充分的理解了单通道I/O设备分配程序,知道了设备表,控制器表,通道表以及其他表的数据结构,加深了对课本知识的理解,明白了设备分配的过程:先分配设备,接下来分配控制器,
7、然后再分配通道,若成功就可以启动该I/O设备进行数据传送了。同时,通过和同学一起做这个实验,从中学习到了合作的经验,为以后的工作打下基础。经过编写程序,复习了C语言程序。五、附录源程序:#include#include#include#include#define NAME_NUM 10typedef struct _COCT_list char nameNAME_NUM; struct _COCT_list *next; COCT_list;typedef struct _CHCT char nameNAME_NUM;/ int state;/ COCT_list *COCT_head; C
8、OCT_list *COCT_tail; struct _CHCT *next; CHCT;typedef struct _DCT_list char nameNAME_NUM;/等待控制器队列的设备名字 struct _DCT_list *next; DCT_list;typedef struct _COCT char nameNAME_NUM;/ int state;/ CHCT *CHCT;/ DCT_list *DCT_head;/等待控制器队列的队首指针 DCT_list *DCT_tail;/ struct _COCT *next; COCT;/设备控制表typedef struc
9、t _Process char * nameNAME_NUM;/进程名字/ int num;/进程标志号 struct _Process *next; Process;typedef struct _DCT char nameNAME_NUM;/设备名字 char typeNAME_NUM;/设备类型 int adr;/设备地址 int state;/设备状态 COCT *coct;/指向控制器表的指针 Process *process_head;/等待进程的队首指针 Process *process_tail;/等待进程的队尾指针 int repeat;/重复次数 struct _DCT *
10、next; DCT;/系统设备表SDTtypedef struct _SDT char nameNAME_NUM; char typeNAME_NUM;/设备类型 DCT *DCT;/DCT指针 long adr;/驱动程序入口 SDT;typedef struct _LUT char nameNAME_NUM; char dct_nameNAME_NUM; int adr; struct _LUT *next; LUT;/默认状态下初始化书中p113的单通道I/ODCT *main_DCT;COCT *main_COCT;CHCT *main_CHCT;LUT *main_LUT;void
11、init_1();void init() puts(-); puts( 进行初始化工作 ,请您输入相关内容); /puts(n 如:与设备1有关的控制器名为控制器1,通道名为通道1,您应如下输入:); puts(n 如:与设备1有关的控制器名为控制器1,通道名为通道1,您应如下输入:); puts(n 请输入设备号: (此处输入:设备1); puts( 请输入控制器号: (此处输入:控制器1); puts( 请输入通道号: (此处输入:通道1); puts( 这样完成一次输入); puts(n 注意:当设备号为-1时,退出输入); puts(-); init_1();void init_1()
12、 DCT *dct; COCT *coct; CHCT *chct; LUT *lut; dct=(DCT *)malloc(sizeof(DCT); main_DCT=dct; dct-next=NULL; coct=(COCT *)malloc(sizeof(COCT); main_COCT=coct; coct-next=NULL; chct=(CHCT *)malloc(sizeof(CHCT); main_CHCT=chct; chct-next=NULL; lut=(LUT *)malloc(sizeof(LUT); main_LUT=lut; lut-next=NULL;void
13、 input() DCT *dct; DCT *dct_1; DCT *dct_2; COCT *coct; COCT *coct_1; CHCT *chct; CHCT *chct_1; LUT *lut; LUT *lut_1; char nameNAME_NUM; int a; while(1) a=0; puts(n+n); printf(请输入设备号:); scanf(%s,name); if(!strcmp(name,-1) break; dct_2=main_DCT; dct_1=main_DCT-next; while(dct_1!=NULL) if(!strcmp(dct_1
14、-name,name) printf(n该设备已存在,请重新输入:); scanf(%s,name); dct_1=main_DCT-next; dct_2=main_DCT; continue; / if(dct_1-next!=NULL) dct_1=dct_1-next; dct_2=dct_2-next;/ if(dct_1-next=NULL)/ break; if(dct_1=NULL) dct_1=dct_2; dct=(DCT *)malloc(sizeof(DCT); if(dct_1=NULL) dct_1=main_DCT; dct_1-next=dct; dct-nex
15、t=NULL; strcpy(dct-name,name); dct-adr=(int)&dct; dct-process_head=NULL; dct-process_tail=NULL; dct-repeat=5; dct-state=0; strcpy(dct-type,输入设备); printf(n请输入控制器号:); scanf(%s,name); coct_1=main_COCT-next; while(coct_1!=NULL) if(!strcmp(coct_1-name,name) dct-coct=coct_1; coct=coct_1; a=1; break; / if(
16、coct_1-next!=NULL) coct_1=coct_1-next;/ if(coct_1-next=NULL)/ break; if(coct_1=NULL) coct=(COCT *)malloc(sizeof(COCT); dct-coct=coct; strcpy(coct-name,name); coct-DCT_head=NULL; coct-DCT_tail=NULL; coct-next=NULL; coct-state=0; coct_1=main_COCT; while(coct_1-next!=NULL) coct_1=coct_1-next; coct_1-ne
17、xt=coct; if(a=1) puts( 控制器存在,不能指定通道。输入任意键进行下一设备的设置!); getch(); continue; printf(n请输入通道号:); scanf(%s,name); chct_1=main_CHCT-next; while(chct_1!=NULL) if(strcmp(chct_1-name,name) coct-CHCT=chct_1; chct=chct_1; break; / if(chct_1-next!=NULL) chct_1=chct_1-next;/ if(chct_1-next=NULL)/ break; if(chct_1=
18、NULL) chct=(CHCT*)malloc(sizeof(CHCT); coct-CHCT=chct; strcpy(chct-name,name); chct-COCT_tail=NULL; chct-next=NULL; chct-COCT_head=NULL; chct-state=0; chct_1=main_CHCT; while(chct_1-next!=NULL) chct_1=chct_1-next; chct_1-next=chct; puts( 为各设备确定逻辑设备名!n); dct=main_DCT-next; while(dct!=NULL) printf( 请输
19、入设备号为%s的逻辑设备名:,dct-name); scanf(%s,name); lut=main_LUT-next; lut_1=main_LUT; while(lut!=NULL) if(!strcmp(lut-name,name) printf( n 该设备名已近存在,请重新输入!n); printf( 请输入设备号为%s的逻辑设备名:,dct-name); scanf(%s,name); lut=main_LUT-next; lut_1=main_LUT; break; lut=lut-next; lut_1=lut_1-next; lut=lut_1; lut_1=(LUT *)m
20、alloc(sizeof(LUT); lut-next=lut_1; strcpy(lut_1-name,name); strcpy(lut_1-dct_name,dct-name); lut_1-next=NULL; dct=dct-next; void print() DCT *dct; CHCT *chct; COCT *coct; Process *process; DCT_list *dct_list; COCT_list *coct_list; LUT *lut; dct=main_DCT-next; puts(nnnnnnnnnnnnnnnnnnnnnnnnn); puts(-)
21、; puts(n DCT表n); puts(-); puts(|_设备标志符_| |_设备类型 _| |_设备地址_| |_控制表指针_| |_重复次数 _| |_ 状态 _|); while(dct!=NULL) printf(n|%10s |%10s |%10d |%10s |%10d |%10d |,dct-name,dct-type,dct-adr,dct-coct-name,dct-repeat,dct-state); if(dct-process_tail=NULL) printf(nn 设备%s 等待队列为空n,dct-name); if(dct-process_tail!=NU
22、LL) printf(nn 设备%s的进程等待队列的进程号为:n,dct-name); process=dct-process_head; while(process!=NULL) / printf( |_ %10s _|_ %10d _| ,process-name,process-num); printf( |_ %10s _| ,process-name); process=process-next; dct=dct-next; puts(n); puts(-); puts(n COCT表n); puts(-); puts(|_ 控制器名称 _| |_ 控制器状态 _| |_ 对应通道名
23、称 _|); coct=main_COCT-next; while(coct!=NULL) printf(n|%10s |%10d |%10s |,coct-name,coct-state,coct-CHCT-name); if(coct-DCT_tail=NULL) printf(nn 控制器%s等待队列为空!n,coct-name); if(coct-DCT_tail!=NULL) dct_list=coct-DCT_head; printf(nn 控制器%s的等待队列的设备号是:n,coct-name); while(dct_list!=NULL) printf( |_ %10s _|
24、,dct_list-name); dct_list=dct_list-next; coct=coct-next; puts(n); puts(-); puts(n CHCT表n); puts(-); puts(|_ 通道名称 _| |_ 通道状态 _| ); chct=main_CHCT-next; while(chct!=NULL) printf(n| %10s | %10d |n,chct-name,chct-state); if(chct-COCT_tail=NULL) printf(nn 通道%s的等待队列为空!,chct-name); if(chct-COCT_tail!=NULL) coct_list=chct-COCT_head; printf(nn 通道%s的等待队列是:n,chct-name); while(coct_list!=NULL) printf( |_ %10s _|,coct_list-name); coct_list=coct_list-next; chct=chct-next; puts(n); puts(-); puts(n LUT表n); puts(-); lut=main_LUT-next; printf( |_ 逻辑设备名_| |_ 物理设备名_|); while(lut!=NULL) printf(n |_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1