[操作系统]设备分配中的数据结构:设备控制表(DCT)、控制器控制表(COCT)、通道控制表(CHCT)和系统设备表(SDT)

您所在的位置:网站首页 设备分配的顺序有哪些 [操作系统]设备分配中的数据结构:设备控制表(DCT)、控制器控制表(COCT)、通道控制表(CHCT)和系统设备表(SDT)

[操作系统]设备分配中的数据结构:设备控制表(DCT)、控制器控制表(COCT)、通道控制表(CHCT)和系统设备表(SDT)

2024-07-13 11:18:08| 来源: 网络整理| 查看: 265

在多道程序环境下,系统中的设备供所有进程共享。为防止诸进程对系统资源的无序竞争,特规定系统设备不允许用户自行使用,必须由系统统一分配。每当进程向系统提出I/O请求时,只要是可能和安全的,设备分配程序便按照一定的策略,把设备分配给请求用户(进程)。

在有的系统中,为了确保在CPU与设备之间能进行通信,还应分配相应的控制器和通道。

设备分配中的数据结构

---- 在进行设备分配时,通常都需要借助于一些表格的帮助。在表格中记录了相应设备或控制器的状态及对设备或控制器进行控制所需的信息。

在进行设备分配时所需的数据结构(表格)由:设备控制表(DCT)、控制器控制表(COCT)、通道控制表(CHCT)和系统设备表(SDT)等。

设备控制表(DCT)

系统为每一个设备都配置了一张设备控制表,用于记录本设备的情况:

----- 设备类型:type、设备标识符:deviceid、设备状态:等待/不等待 忙/闲、指向控制器表的指针、重复执行次数或时间、设备队列的队首指针。

设备控制表中,除了有用于指示设备类型的字段type和设备标识字段deviceid外,还应含有下列字段:

----- 设备队列队首指针。凡因请求本设备而未得到满足的进程,其PCB都应按照一定的策略排成一个队列,称该队列为设备请求队列或设备队列。

----- 设备状态。当设备自身正处于使用状态时,应将设备的忙/闲标志置“1”。若与该设备相连接的控制器或通道正忙,也不能启动该设备,此时应将设备的等待标志置“1”。

----- 与设备连接的控制器表指针。该指针指向与该设备所连接的控制器的控制表,在设备到主机之间具有多条通路的情况下,一个设备将与多个控制器相连接。此时,在DCT中还应设置多个控制器表指针。

----- 重复执行次数。由于外部设备在传送数据时,较易发生数据传送错误,因而在许多系统中,如果发生传送错误,并不立即认为传送失败,而是

令它重新传送,并由系统规定设备在工作中发生错误时应重复执行的次数。

控制器控制表、通道控制表和系统设备表

1)控制器控制表(COCT,Controller control table)。系统为每一个控制器都设置了一张用于记录本控制器情况的控制器控制表。其中记录了:

>控制器标识符-controllerid、控制器状态-忙/闲、与控制器连接的通道表指针、控制器队列的队首指针、控制器队列的队尾指针。

2)通道控制表(CHCT,Channel control table)。每个通道都配有一张通道控制表。其中记录了:

> 通道标识符-channelid、通道状态-忙/闲、与通道连接的控制器表的指针通道队列的队首指针、通道队列的队尾指针。

3)系统设备表(SDT,System device table)。这是系统范围的数据结构,其中记录了系统中全部设备的情况。每个设备占一个表目,其中包括有

>设备类型、设备标识符、设备控制表及设备驱动程序的入口等项。

设备分配时应考虑的因素 设备的固有属性

---- 在分配设备时,首先应考虑与设备分配有关的设备属性。设备的固有属性可分成三种:独占性,指这种设备在一段时间内只允许一个进程独占,即“临界资源”;共享性,指这种设备允许多个进程同时共享;可虚拟性,设备本身虽是独占设备,但经过某种技术处理,可以把它改造成虚拟设备。

根据设备的固有属性应采取不同的分配策略: 1)独占设备。对于独占设备,应采用独享分配策略,即将一个设备分配给某进程后,便由该进程独占,直至该进程完成或释放该设备,然后系统才能再将该设备分配给其他进程使用。缺点:设备得不到充分利用,而且还可能引起死锁。 2)共享设备。对于共享设备,可同时分配给多个进程使用,此时需注意对这些进程访问该设备的先后次序进行合理的调度。 3)可虚拟设备。由于可虚拟设备是指一台物理设备在采用虚拟技术后,可变成多台逻辑上的虚拟设备,因而说,一台可虚拟设备是可共享的设备, 可以将它同时分配给多个进程使用,并对访问该(物理)设备的先后次序进行控制。

设备分配算法

---- 对设备进行分配的算法,与进程调度的算法有些相似之处,但前者相对简单,通常只采用以下两种分配算法: 1)先来先服务。当有多个进程对同一设备提出I/O请求时,该算法是根据诸进程对某设备提出请求的先后次序,将这些进程排成一个设备请求队列,设备分配程序总是把设备首先分配给队首进程。 2)优先级高者优先。在进程调度中的这种策略,是优先权高的进程优先获得处理机。如果对这种高优先权进程所提出的I/O请求也赋予高优先权,显然有助于这种进程尽快完成。

在利用该算法形成设备队列时,将优先权高的进程排在设备队列前面,而对于优先级相同的I/O请求,则按先来先服务原则排队。

设备分配时的安全性

---- 从进程运行的安全性考虑,设备分配有以下两种方式。 1)安全分配方式。在这种分配方式中,每当进程发出I/O请求时,便进入阻塞状态,直到其I/O操作完成时才被唤醒。 在采用这种分配策略时,一旦进程已经请求(获得)某种设备(资源)后便阻塞,使该进程不可能再请求其他任何资源,因此,这种分配方式已经摒弃了造成死锁的四个必要条件之一的"请求和保持"条件,从而使设备分配是安全的。缺点:进程进展缓慢,即CPU与I/O设备是串行工作的。

2)不安全分配方式。在这种分配方式中,进程在发出I/O请求后仍继续运行,需要时又发出第二个I/O请求、第三个I/O请求等。仅当进程所请求的设备已被另一进程占用时,请求进程才进入阻塞状态。这种分配方式的优点是:一个进程可同时操作多个设备,使进程推进迅速。

缺点:分配不安全,因为它可能具备“请求和保持”条件,从而可能造成死锁。因此,在设备分配程序中,还应再增加一个功能,以用于对本次的设备分配是否会发生死锁进行安全性计算,仅当计算结果说明分配是安全的情况下才进行设备分配。

独占设备的分配程序 基本的设备分配程序

---- 当某进程提出I/O请求后,系统的设备分配程序可按下述步骤进行设备分配:

1)分配设备

-- 首先根据I/O请求中的物理设备名,查找系统设备表(SDT),从中找出该设备的DCT(设备分配表),再根据DCT中的设备状态字段,可知

该设备是否正忙。若忙,便将请求I/O进程的PCB挂在设备队列上;否则,便按照一定的算法来计算本次设备分配的安全性。如果不会导致系统

进入不安全状态,便将设备分配给请求进程;否则,仍将其PCB插入设备等待队列。

2)分配控制器

-- 在系统把设备分配给请求I/O的进程后,再到其DCT(指向控制器表的指针)中找出与该设备连接的控制器的COCT(控制器控制表),从COCT

的状态字段中可知该控制器是否忙碌。若忙,便将请求I/O进程的PCB挂在该控制器的等待队列上;否则,便将该控制器分配给进程。

3)分配通道

-- 通过COCT中与控制器连接的通道表指针,找到与该控制器连接的通道的CHCT(通道控制表),再根据CHCT内的状态信息,可知该通道是否

忙碌。若忙,便将请求I/O的进程挂在该通道的等待队列上;否则,将该通道分配给进程。

-- 只有在设备、控制器和通道三者都分配成功时,这次的设备分配才算成功。然后,便可启动该I/O设备进行数据传送。

设备分配程序的改进

---- 仔细研究上述基本的设备分配程序后可以发现:

进程是以物理设备名来提出I/O请求的;采用的是单通路的I/O系统结构,容易产生“瓶颈”现象。

为此,应从以下两方面对基本的设备分配程序加以改进,以使独占设备的分配程序具有更强的灵活性,并提高分配的成功率。

1)增加设备的独立性

-- 为了获得设备的独立性,进程应使用逻辑设备名请求I/O。这样,系统首先从SDT中找出第一个该类设备的DCT。

若该设备忙,又查找第二个该类设备的DCT,仅当所有该类设备都忙时,才把进程挂在该类设备的等待队列上;

而只要有一个该类设备可用,系统便进一步计算分配该类设备的安全性。

2)考虑多通路情况

-- 为了防止在I/O系统中出现“瓶颈”现象(通道不足),通常都采用多通路的I/O系统结构。

此时对控制器和通道的分配同样要经过几次反复,即若设备(控制器)所连接的第一个控制器(通道)忙时,应查看其所连接的第二个控制器(通道),

仅当所有的控制器(通道)都忙时,此次的控制器(通道)分配才算失败,才把进程挂在控制器(通道)的等待队列上。

而只要有一个控制器(通道)可用,系统便可将它分配给进程。

代码实现: 结构体声明 struct sdt//系统设备表 { char name;//设备名称 char type;//设备类型 struct sdt *next; }; struct block//阻塞设备 { char pname;//申请设备进程名 char ename;//设备名 struct block *next; }; struct chct//通道 { char name;//通道名称 int state;//通道状态 struct block *next;//通道被占用造成的阻塞队列 }; struct coct//控制器表 { char name;//控制器名称 int state;//控制器状态 struct chct *chct;//设备通道 struct block *next;//控制器被占用造成的阻塞队列 }; struct dct//设备控制表 { int state; //设备状态 struct sdt *sdt;//系统设备 struct coct *coct;//设备控制器 struct block *next;//设备被占用造成的阻塞队列 }; 定义 sdt *s[20];//设备 dct *d[20];//设备控制 coct *co[20];//控制器 chct *ch1,*ch2;//通道1,通道2 block *b; int e=4;//设备数,初始为4 int c=3;//控制器数,初始为3 初始化 void init()//初始化 { for(int i=0;istate=0; d[i]->sdt=s[i]; d[i]->next=new(block); d[i]->next->next=NULL; } s[0]->name='k'; s[1]->name='m'; s[2]->name='t'; s[3]->name='p'; s[0]->type='i'; s[1]->type='i'; s[2]->type='o'; s[3]->type='o'; for(int i=1;istate=0; co[i]->next=new(block); co[i]->next->next=NULL; } co[1]->name='1'; co[2]->name='2'; co[3]->name='3'; ch1=new (chct); ch2=new (chct); ch1->name='1'; ch1->state=0; ch1->next=new(block); ch1->next->next=NULL; ch2->name='2'; ch2->state=0; ch2->next=new(block); ch2->next->next=NULL; co[1]->chct=ch1; co[2]->chct=ch2; co[3]->chct=ch2; d[0]->coct=co[1]; d[1]->coct=co[1]; d[2]->coct=co[2]; d[3]->coct=co[3]; } 增加设备 void add() { int i; char a; char b; coutnext=NULL; e++; coutcoct=co[c+1]; c++; coutchct=ch2; coutnext->next!=NULL) { coutnext->pnamenext->enameename==d[b]->sdt->name) { d[b]->state=1; break; } } d[b]->coct->state=1; d[i]->coct->chct->state=1; block *p; p=d[i]->coct->chct->next; while(p->next->pname != d[i]->coct->chct->next->next->pname) p=p->next; p->next = p->next->next; break; } if(d[i]->coct->next->next!=NULL) { coutpnameenamesdt->name) d[b]->state=1; } d[i]->coct->state=1; d[i]->coct->chct->state=1; block *q; q=d[i]->coct->next; while(q->next->pname != d[i]->coct->next->next->pname) q=q->next; q->next = q->next->next; break; } if(d[i]->next->next!=NULL) { coutcoct->state=1; d[i]->coct->chct->state=1; block *r; r=d[i]->next; while(r->next->pname != d[i]->next->next->pname) r=r->next; r->next = r->next->next; break; } else { for(int j=0;jcoct->chct->next->next!=NULL) { coutnext->pnamenext->enamechct->state=1; block *p; p=d[j]->coct->chct->next; while(p->next->pname != d[j]->coct->chct->next->pname) p=p->next; p->next = p->next->next; break; } if(d[j]->coct->next->next!=NULL) { coutpnameenamecoct->chct->state=1; block *q; q=d[j]->coct->next; while(q->next->pname != d[j]->coct->next->next->pname) q=q->next; q->next = q->next->next; break; } if(d[j]->next->next!=NULL) { coutstate=1; block *r; r=d[j]->next; while(r->next->pname != d[j]->next->next->pname) r=r->next; r->next = r->next->next; break; } } if(j==e) cout


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭