目录

数据结构在操作系统中的应用

目录

数据结构在操作系统中的应用

在计算机科学中是一门综合的专业基础课,研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等。

它和计算机的硬件,特别是计算机软件的研究有着密切的关系,是介于数学

,

计算机硬件和软件三者之间的一门核心课程。无论是汇编程序还是操作系统

,

都涉及到是数据元素在存储器中的分配问题。数据结构不仅涉及到图论,表,树的理论,现在还扩充到网络,集合代数论,格,关系等方面。它对操作系统的发展起推波助澜的作用,是操作系统的重要基础。

操作系统是配置在计算机硬件上的第一层软件,是一组程序的集合,其他所有的软件如汇编程序等等,都将依赖操作系统的支持,取得它的服务。

同时,操作系统也离不开一定软件的支持,它的数据如何分配,软件所采取的数据结构,算法,都将大大影响到本系统的能。无论是汇编程序还是操作系统,都涉及到是数据元素在存储器中的分配问题,所以不能把数据结构和操作系统视为两个独立无关的学科,而是应该把它们挂钩起来。

下面就操作系统中几个具体问题谈谈数据结构在其中的作用。

首先

,

进程在共享临界资源发生的死锁问题。

Os

的目标是提高系统的资源利用率和增加系统的吞吐量。如何使并发执行的的诸进程之间能有效地共享资源和相互合作,从而让程序的执行具有可再现,避免进程在争用临界资源时给系统造成混乱,是进程同步的主要任务。但多个进程之间并不知道其它进程的存在,死锁现象可能会出现。

这就需要我们在

0s

中采取适当的软件,保证诸进程能互斥的访问临界资源

.

最有代表的避免死锁的方法,是

Dijkstra

的银行家算法,其中设置了若干数据结构

.

现将有关算法描叙如下:

一,银行家算法中的数据结构

1

.可利用资源向量

Available

它是一个含有

m

个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源数目,其数值随该类资源的的分配和回收而动态地改变。如果

Available[j]=k

表示系统中现有

Rj

类资源

k

个。

2

.最大需求距阵

Max

这是一个

n*m

的矩阵,它定义了系统中

n

个进程中的每一个对

m

类资源的最大需求。如果

Max[i,j]=k,

表示进程

i

需要

Rj

类资源的最大数目为

k

3

.分配矩阵

Allocatian

这是一个

n*m

的矩阵,它定义了系统中每一类资源当前已分配的资源数。如果

Allocation[i,j]=k

,表示进程

i

当前已分得

Rj

类资源数目为

k

4

.需求矩阵

Need

它是一个

n*m

的矩阵,用以表示每一个进程尚需的各类资源数,如果

Need[i,j]=k

表示进程

i

还需要

Rj

类资源

k

,

方能完成任务;

Need[i,j]=Max[i,j]-Allocatian[i,j]

,

银行家算法设

Request i

是进程

Pi

的请求向量。如果

Request[j]=k

,表示进程

Pi

需求

k

Rj

类型的资源。当

Pi

发出资源请求后,系统按下述步骤进行检查:

(1)

如果

Request(2)

如果

Request(3)

系统试探把要求的资源分配给进程

Pi,

并修改下面数据结构中的数值;

Available:=Available-Request I

Allocatian:=Allocatian i Request I

Need i:=Need i-Request I

(4)

系统执行安全型算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程

P I

,以完成本次分配;否则,将试探分配作废,恢复原来的资源方配状态

,

让进程

P i

等待。

.

安全算法系统所执行的安全算法可描述如下:

(1)

设置两个向量

(a)

工作向量

Work.

它表示系统可提供给进程继续运行所需要的各类资源数目,它含有

m

个元素,执行安全算法开始时,

Work:=Aailable(b)Finish.

它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先

Finish[i]:=false

;当有足够的资源分配给进程时,令

Finish[i]:=true.(2)

从进程集合中找到一个能满足下述条件的进程:

(a)Finish[i]=false(b)Need i

如找到,执行步骤

(3)

;否则,执行步骤

(4)

(3)

当进程

Pi

获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work:=Work Allocatian I

Finish[i]:=true

go to step 2(4)

如果所有进程的

Finish[i]=true

,则表示系统处于安全状态;否则,系统处于不安全状态。

处理死锁的基本方法之一的检测死锁中的数据结构类似前面银行家算法中的数据结构:

(1)

可利用资源向量

Aailable

。它表示了

m

类资源中每一种资源的可用数目。

(2)

把不占用资源向量的

Allocatian

:=

0

记入表

L

,

Li

L

(3)

从进程集合中找到一个

Request(a)

将其资源分配图简化,释放出资源,增加工作向量

Work:=Work Allocatian

(b)

将它记入

L

表中。

(4)

若不能把所有进程都记入

L

表中,则表明系统状态

S

的资源分配图是不可能完全转化的。因此,该系统状态将发生死锁。

Work:=Aailable

L

:=

{Li | Allocatian i=0

Request i=0 }for all Li

/ L dobeginfor all Request ibeginWork

:=

Work Allocatian

Li

L

endenddeadlock:=

(L={P1,P2,……,Pn});

其次,

os

四大功能的存储器管理,设备管理,处理机管理还有文件管理,也大大利用了数据结构的有关知识。例如,存储器动态分区分配中,常用的数据结构形式有以下两种:

1

)空闲分区表,

2

)空闲分区链。这两种结构在分区分配算法如首次适应算法

FF

,循环首次适应算法,最佳适应算法中反复使用。

下面就以上三个算法谈谈空闲分区链在其中的运用:

1

.首次适应算法

FF

。在此算法中,空闲区链按起始地址递增顺序排列,在进行内存分配时,从链首开始顺序查找,直到找到一个能满足其大小要求的空闲区为止。然后,再按照作业的大小,从该分区划出一块内存给请求者,余下的空闲分区仍留在空闲链中。本算法的特点是底地址端造留许多碎片,高地址端集中了大空闲区。这样有利于给后到的大作业分配大的内存空间。

2

.循环首次适应算。该算法是由首次循环算法演变而来,空闲区链仍按起始地址递增顺序排列只是不再每次从链首开始查找,而是从上次找到的空闲区的下一个空闲区开始查找,直到找到第一个能满足要求的空闲分区,并从中划出一块大小相等的内存空间分配给作业。若最后一个(链尾)空闲区,其大小仍不能满足要求,则返回链首继续查找。本算法的特点是空闲区分布均匀,大空闲区少。与首次适应算法相比,该算法减少了查找的开销,但也造就了大空闲区的缺乏。

3

.最佳适应算法。空闲区按分区大小递增顺序链接,该算法每次找到的空闲区都是最小满足要求的分区。然而,,每次分配后所留下的部分总是最小的,这样,在存储器中会留下许多难以利用的小空闲区。特点,碎片多而小。通过对以上三个算法的比较,我们知道,根据需要设置适当的数据结构和算法的操作系统,能够在一定程度上提高系统的效率。

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

在虚拟存储器的页面置换算法中,比较流行的最近最久未使用

LRU

置换算法,就是利用归栈来实现的。

它利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将改页面的页面号从栈中移出,将它压如栈顶。因此,栈顶始终是最新被访问页面的页面号,而栈底则是最近最久未被使用页面的页面号。

假定现有一进程所访问的页面的页面号序列为:

4

7

0

7

1

0

1

2

1

2

6

随着进程的访问,栈中页面号的情况如下图所示。在访问页面时发生

6

次缺页,此时页面

4

是最近最久未被访问的页,应将它置换出去。

4 7 0 7 1 0 1 2 1 2 647407470417040174107421074120742107462107

还有,数据结构在缓冲管理中都有重要作用。在现代

os

中,几乎所有的

I/O

设备在与处理机(内存)交换数据时,都使用了缓冲区。因为提高

I/O

速度和设备的利用率,在很大程度上都需要借助于缓冲技术来实现。 如何组织好这些缓冲区 ,并提供获得和释放的缓冲区的手段,同样需要考虑到数据结构。

目前广泛流行公用缓冲池,池中的缓冲区可供多个进程共享。它把相同类型的缓冲区链成一个队列,形成了以下三个队列:(

1

空缓冲队列

emq

。这是由空缓冲区所链成的队列。其队首指针

F

emq

)和队尾指针

L

emq

)分别指向该队列的首缓冲区和尾缓冲区。

读后感结论:操作系统需要分配、组织、调配各个硬件资源,比如说文件系统需对磁盘上数据进行组织,进程的管理是针对程序对各个资源的分配问题而诞生的,还有内存的管理中堆、栈的划分。在这些过程中采用了各种数据结构和算法。可想而知:数据结构和算法的重要。数据结构和算法,我想是我们的前辈们在处理这些硬件资源过程中,总结的方法和经验。

学习建议:不要单纯的去学数据结构和算法,而是在应用中,遇到相应的问题,在去看采用何种数据结构,采取何种算法。