编写单通路IO系统中的设备分配程序实验报告.doc

上传人:大张伟 文档编号:5735087 上传时间:2020-07-25 格式:DOC 页数:26 大小:135KB
返回 下载 相关 举报
编写单通路IO系统中的设备分配程序实验报告.doc_第1页
第1页 / 共26页
编写单通路IO系统中的设备分配程序实验报告.doc_第2页
第2页 / 共26页
编写单通路IO系统中的设备分配程序实验报告.doc_第3页
第3页 / 共26页
编写单通路IO系统中的设备分配程序实验报告.doc_第4页
第4页 / 共26页
编写单通路IO系统中的设备分配程序实验报告.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《编写单通路IO系统中的设备分配程序实验报告.doc》由会员分享,可在线阅读,更多相关《编写单通路IO系统中的设备分配程序实验报告.doc(26页珍藏版)》请在三一文库上搜索。

1、合肥学院计算机科学与技术系实验报告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()等函数组成。绘制流程图如下:运行程序主函数运行进程申请设备显示SDT、COCT、DCT、CHCT、LUT五张表退出判断设备是否存在输出无法分配原因判断控制器是否忙输出无法分配原因输入所需设备名称(输入0退出申请)判断通道是否忙输出无法分配原因给予分配,输出分配信息YNYNYN输入0输入非0 流程图3、详细设计和编码通过以上的分析和初步设计,已经对本程序

4、作了初步了解。下面将对本程序的各个模块作详细的讲解。(1)主函数模块对各个表就行初始化,设置好各个表的状态,以及对各个步骤进行函数调用来实现本实验的要求。(2)显示表目模块调用print()函数,显示出SDT系统设备表、DCT设备控制表、COCT控制器控制表、CHCT通道表和LUT逻辑设备表五张表目,直接显示各表中的设备类型、设备名称和设备状态等信息。(3) 分配设备模块在此模块中,首先调用add_process()函数,要求用户输入所要申请的逻辑设备名称,然后根据逻辑设备名称查看LUT表中的该设备是否存在,若不存在,则直接退出分配,输出分配失败原因,若存在,则继续如下分析:a.分配设备。根据

5、LUT表找到设备表,然后根据SDT表中指向DCT表该设备的指针,检索到DCT设备控制表中该物理设备,检查该设备的状态信息Busy。若忙,则将要求I/O的进程插入到该设备的等待队列中等待;若不忙,则继续步骤(b)。b.分配控制器。根据设备控制表DCT中的控制器表指针,可找到与此设备相连的控制器表COCT,通过检查该表中的状态信息Busy。若忙,则将要求I/O的进程插入到等待该控制器的队列中等待;若不忙,则把该控制器分配给进程,继续步骤(c)。c.分配通道。首先根据控制器表COCT中的通道表指针找到与此控制器相连的通道表CHCT,从中了解此通道的状态信息Busy。若为忙,则把该进程插入等待通道的队

6、列CHL中;若通道空闲,则表明本次I/O请求所需之I/O设备和相应的控制器、通道都能得到,于是便可启动I/O设备开始数据传送。调用add_process()函数来实现上述步骤。分配完成后,将相应的设备、控制器和通道的状态信息Busy置1。结束分配程序。4、调试分析本次程序设计的核心内容在于设备的分配过程,一次分配只有在设备、控制器和通道三者都分配成功时,这次分配才算成功。该程序的核心逻辑关系是先分配设备再分配控制器最后分配通道。当三者都空闲并安全时,才可分配,最终启动该I/O设备进行数据传送。5、测试结果运行程序后,运行结果如下图1。图1进行初始化,运行结果如下图2图2图3各表的初始化状态如图

7、3。 图3进程分配设备结果如图3四、实验总结通过本次实验,充分的理解了单通道I/O设备分配程序,知道了设备表,控制器表,通道表以及其他表的数据结构,加深了对课本知识的理解,明白了设备分配的过程:先分配设备,接下来分配控制器,然后再分配通道,若成功就可以启动该I/O设备进行数据传送了。同时,通过和同学一起做这个实验,从中学习到了合作的经验,为以后的工作打下基础。经过编写程序,复习了C语言程序。五、附录源程序:#include#include#include#include#define NAME_NUM 10typedef struct _COCT_listchar nameNAME_NUM;s

8、truct _COCT_list *next; COCT_list;typedef struct _CHCTchar nameNAME_NUM;/int state;/COCT_list *COCT_head;COCT_list *COCT_tail;struct _CHCT *next; CHCT;typedef struct _DCT_listchar nameNAME_NUM;/等待控制器队列的设备名字struct _DCT_list *next; DCT_list;typedef struct _COCTchar nameNAME_NUM;/int state;/CHCT *CHCT;

9、/DCT_list *DCT_head;/等待控制器队列的队首指针DCT_list *DCT_tail;/struct _COCT *next; COCT;/设备控制表typedef struct _Processchar * nameNAME_NUM;/进程名字/int num;/进程标志号struct _Process *next; Process;typedef struct _DCTchar nameNAME_NUM;/设备名字char typeNAME_NUM;/设备类型int adr;/设备地址int state;/设备状态COCT *coct;/指向控制器表的指针Process

10、*process_head;/等待进程的队首指针Process *process_tail;/等待进程的队尾指针int repeat;/重复次数struct _DCT *next; DCT;/系统设备表SDTtypedef struct _SDTchar nameNAME_NUM;char typeNAME_NUM;/设备类型DCT *DCT;/DCT指针long adr;/驱动程序入口 SDT;typedef struct _LUTchar nameNAME_NUM;char dct_nameNAME_NUM;int adr;struct _LUT *next; LUT;/默认状态下初始化书

11、中p113的单通道I/ODCT *main_DCT;COCT *main_COCT;CHCT *main_CHCT;LUT *main_LUT;void init_1();void init()puts(-);puts( 进行初始化工作 ,请您输入相关内容);/puts(n 如:与设备1有关的控制器名为控制器1,通道名为通道1,您应如下输入:);puts(n 如:与设备1有关的控制器名为控制器1,通道名为通道1,您应如下输入:);puts(n 请输入设备号: (此处输入:设备1);puts( 请输入控制器号: (此处输入:控制器1);puts( 请输入通道号: (此处输入:通道1);puts(

12、 这样完成一次输入);puts(n 注意:当设备号为-1时,退出输入);puts(-);init_1();void init_1()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 *)

13、malloc(sizeof(LUT);main_LUT=lut;lut-next=NULL;void 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(

14、dct_1!=NULL)if(!strcmp(dct_1-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=d

15、ct;dct-next=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(coct_1-n

16、ext!=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-next=coct;if(a=1)puts( 控制

17、器存在,不能指定通道。输入任意键进行下一设备的设置!);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=NULL)chct=(CHCT*)malloc(sizeof(CHCT);coct

18、-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( 请输入设备号为%s的逻辑设备名:,dct-name);scanf(%s,name);lut=main_LUT-nex

19、t;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 *)malloc(sizeof(LUT);lut-next=lut_1;strcpy(lut_1-name,name);strcpy(lut_1-d

20、ct_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(-);puts(n DCT表n);puts(-);puts(|_设备标志符_| |_设备类型 _| |_设备地址_| |_控制表指针_| |_重复次数 _| |_ 状态 _|);

21、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!=NULL)printf(nn 设备%s的进程等待队列的进程号为:n,dct-name);process=dct-process_head;while(process!=NULL)/printf(

22、 |_ %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(|_ 控制器名称 _| |_ 控制器状态 _| |_ 对应通道名称 _|);coct=main_COCT-next;while(coct!=NULL)printf(n|%10s |%10d |%10s |,coct-name,coct-state,coct-CHCT-name);

23、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 _| ,dct_list-name);dct_list=dct_list-next;coct=coct-next;puts(n);puts(-);puts(n CHCT表n);puts(-);puts(|_ 通道名称 _| |_ 通道状态 _

24、| );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_

25、list-next;chct=chct-next;puts(n);puts(-);puts(n LUT表n);puts(-);lut=main_LUT-next;printf( |_ 逻辑设备名_| |_ 物理设备名_|);while(lut!=NULL)printf(n |_ %10s _| | %10s _|,lut-name,lut-dct_name);lut=lut-next;void free_main()DCT *dct;DCT *dct1;COCT *coct;COCT *coct1;CHCT *chct;CHCT *chct1;LUT *lut;LUT *lut1;DCT_li

26、st *dct_list1;DCT_list *dct_list2;COCT_list *coct_list1;COCT_list *coct_list2;Process *process1;Process *process2;dct=main_DCT-next;while(dct!=NULL)dct1=dct-next;process1=dct-process_head;while(process1!=NULL)process2=process1-next;free(process1);process1=process2;free(dct);dct=dct1;coct=main_COCT-n

27、ext;while(coct!=NULL)coct1=coct-next;dct_list1=coct-DCT_head;while(dct_list1!=NULL)dct_list2=dct_list1-next;free(dct_list1);dct_list1=dct_list2;free(coct);coct=coct1;chct=main_CHCT-next;while(chct!=NULL)chct1=chct-next;coct_list1=chct-COCT_head;while(coct_list1!=NULL)coct_list2=coct_list1-next;free(

28、coct_list1);coct_list1=coct_list2;free(chct);chct=chct1;lut=main_LUT-next;while(lut!=NULL)lut1=lut-next;free(lut);lut=lut1;free(main_DCT);free(main_COCT);free(main_CHCT);free(main_LUT);void add_DCT_list(COCT *coct1,char *dct_name);void add_COCT_list(CHCT *chct1,char *coct_name);void add_process()cha

29、r process_nameNAME_NUM;char lut_nameNAME_NUM;char DCT_nameNAME_NUM;LUT *lut;DCT *dct;COCT *coct;CHCT *chct;Process *process;puts(nnnnnnnnnnnnnnnnnnnnnnnnnn);puts();puts();puts( 输入进程信息 );puts(nnn);puts( 如果进程名为-1,将切换到进程运行状态!);while(1)printf(nnn 请输入进程名:);scanf(%s,process_name);if(!strcmp(process_name,-

30、1)break;printf( 请输入逻辑设备名:);scanf(%s,lut_name);puts(_);lut=main_LUT-next;while(lut!=NULL)if(!strcmp(lut-name,lut_name)strcpy(DCT_name,lut-dct_name);break;lut=lut-next;if(lut=NULL)printf(n 没有找到该设备,请确认该设备正确安装!n);if(lut!=NULL)dct=main_DCT-next;while(dct!=NULL)if(!strcmp(dct-name,DCT_name)if(dct-process_

31、head!=NULL)process=(Process *)malloc(sizeof(Process);dct-process_tail-next=process;dct-process_tail=process;if(dct-state=1)printf(n 设备正占用着,进程进入等待队列!,dct-name);add_DCT_list(dct-coct,dct-name);if(dct-state=0)printf(n 设备%s空闲,能使用!-设备成功分配,dct-name);add_DCT_list(dct-coct,dct-name);dct-state=1;process-next

32、=NULL;strcpy(process-name,process_name);if(dct-process_head=NULL)process=(Process *)malloc(sizeof(Process);dct-process_head=process;dct-process_tail=process;if(dct-state=1)printf(n %s设备正占用着,进程进入等待队列!,dct-name);add_DCT_list(dct-coct,dct-name);if(dct-state=0)printf(n 设备%s空闲,能使用!-设备成功分配,dct-name);add_D

33、CT_list(dct-coct,dct-name);dct-state=1;process-next=NULL;strcpy(process-name,process_name);dct=dct-next;void add_DCT_list(COCT *coct1,char *dct_name)COCT *coct;DCT_list *dct_list;coct=coct1;if(coct-state=1)printf(n 控制器%s被占用着不能分配!将进入等待队列中!,coct-name);dct_list=(DCT_list *)malloc(sizeof(DCT_list);coct-

34、DCT_tail-next=dct_list;coct-DCT_tail=dct_list;dct_list-next=NULL;strcpy(dct_list-name,dct_name);add_COCT_list(coct-CHCT,coct-name);if(coct-state=0)printf(n 控制器%s空闲,能分配使用!-控制器成功分配,coct-name);coct-state=1;dct_list=(DCT_list *)malloc(sizeof(DCT_list);coct-DCT_head=dct_list;coct-DCT_tail=dct_list;dct_list-next=NULL;strcpy(dct_list-name,dct_name);add_COCT_list(coct-CHCT,coct-name);void add_COCT_list(CHCT *chct1,char *coct_name)CHCT *chct;COCT_list *coct_list;chct=chct1;if(chct-state=1)printf(n 通道%s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1