【Linux系统编程复习】一些常见的问题7

61、操作系统中的时钟是什么

时钟(Clocks)也被称为定时器(timers),时钟/定时器对任何程序系统来说都是必不可少的。时钟负责维护时间、防止一个进程长期占用CPU时间等其他功能。时钟软件(clock software)也是一种设备驱动的方式。下面我们就来对时钟进行介绍,一般都是先讨论硬件再介绍软件,采用由下到上的方式,也是告诉你,底层是最重要的。

(1)时钟硬件

在计算机中有两种类型的时钟,这些时钟与现实生活中使用的时钟完全不一样。·比较简单的一种时钟被连接到110V或220V的电源线上,这样每个电压周期会产生一个中断,大概是50 - 60 HZ。这些时钟过去一直占据支配地位。·另外的一种时钟由晶体振荡器、计数器和寄存器组成,示意图如下所示

这种时钟称为可编程时钟,可编程时钟有两种模式,一种是一键式(one-shotmode),当时钟启动时,会把存储器中的值复制到计数器中,然后,每次晶体的振荡器的脉冲都会使计数器-1。当计数器变为0时,会产生一个中断,并停止工作,直到软件再一次显示启动。还有一种模式时方波(square-wave mode)模式,在这种模式下,当计数器变为0并产生中断后,存储寄存器的值会自动复制到计数器中,这种周期性的中断称为一个时钟周期。

62、设备控制器的主要功能

设备控制器是一个可编址的设备,当它仅控制一个设备时,它只有一个唯一的设备地址;如果设备控制器控制多个可连接设备时,则应含有多个设备地址,并使每一个设备地址对应一个设备。

设备控制器主要分为两种:字符设备和块设备

设备控制器的主要功能有下面这些:

●接收和识别命令:设备控制器可以接受来自CPU的指令,并进行识别。设备控制器内部也会有寄存器,用来存放指令和参数

●进行数据交换:CPU、控制器和设备之间会进行数据的交换,CPU通过总线把指令发送给控制器,或从控制器中并行地读出数据;控制器将数据写入指定设备。

●地址识别:每个硬件设备都有自己的地址,设备控制器能够识别这些不同的地址,来达到控制硬件的目的,此外,为使CPU能向寄存器中写入或者读取数据,这些寄存器都应具有唯一的地址。

●差错检测:设备控制器还具有对设备传递过来的数据进行检测的功能。

63、中断处理过程

中断处理方案有很多种,下面是《ARM System Developer's GuideDesigning and optimizing system Software》列出来的一些方案

●非嵌套的中断处理程序按照顺序处理各个中断,非嵌套的中断处理程序也是最简单的中断处理

●嵌套的中断处理程序会处理多个中断而无需分配优先级

●可重入的中断处理程序可使用优先级处理多个中断

●简单优先级中断处理程序可处理简单的中断

●标准优先级中断处理程序比低优先级的中断处理程序在更短的时间能够处理优先级更高的中断

●高优先级中断处理程序在短时间能够处理优先级更高的任务,并直接进入特定的服务例程。

●优先级分组中断处理程序能够处理不同优先级的中断任务

下面是一些通用的中断处理程序的步骤,不同的操作系统实现细节不一样

●保存所有没有被中断硬件保存的寄存器

●为中断服务程序设置上下文环境,可能包括设置TLB、MMU和页表为中断服务程序设置栈

●对中断控制器作出响应,如果不存在集中的中断控制器,则继续响应中断把寄存器从保存它的地方拷贝到进程表中

●运行中断服务程序,它会从发出中断的设备控制器的寄存器中提取信息

●操作系统会选择一个合适的进程来运行。如果中断造成了一些优先级更高的进程变为就绪态,则选择运行这些优先级高的进程

●为进程设置MMU上下文,可能也会需要TLB,根据实际情况决定加载进程的寄存器,包括PSW寄存器

●开始运行新的进程

上面我们罗列了一些大致的中断步骤,不同性质的操作系统和中断处理程序能够处理的中断步骤和细节也不尽相同,下面是一个嵌套中断的具体运行步骤

64、什么是设备驱动程序

在计算机中,设备驱动程序是一种计算机程序,它能够控制或者操作连接到计算机的特定设备。驱动程序提供了与硬件进行交互的软件接口,使操作系统和其他计算机程序能够访问特定设备,不用需要了解其硬件的具体构造。

65、什么是 DMA

DMA的中文名称是直接内存访问,它意味着CPU授予IO模块权限在不涉及CPU的情况下读取或写入内存。也就是 DMA可以不需要CPU的参与。这个过程由称为DMA控制器(DMAC)的芯片管理。

由于DMA设备可以直接在内存之间传输数据,而不是使用CPU作为中介,因此可以缓解总线上的拥塞。

DMA通过允许CPU执行任务,同时 DMA系统通过系统和内存总线传输数据来提高系统并发性。

66、直接内存访问的特点

DMA方式有如下特点:

●数据传送以数据块为基本单位

●所传送的数据从设备直接送入主存,或者从主存直接输出到设备上

●仅在传送一个或多个数据块的开始和结束时才需CPU的干预,而整块数据的传送则是在控制器的控制下完成。

DMA方式和中断驱动控制方式相比,减少了CPU对IO操作的干预,进一步提高了CPU与I/O设备的并行操作程度。

DMA方式的线路简单、价格低廉,适合高速设备与主存之间的成批数据传送,小型、微型机中的快速设备均采用这种方式,但其功能较差,不能满足复杂的IO要求。

67、如何破坏死锁

和死锁产生的必要条件一样,如果要破坏死锁,也是从下面四种方式进行破坏。

(1)破坏互斥条件

我们首先考虑的就是破坏互斥使用条件。如果资源不被一个进程独占,那么死锁肯定不会产生。如果两个打印机同时使用一个资源会造成混乱,打印机的解决方式是使用假脱机打印机(spooling printer),这项技术可以允许多个进程同时产生输出,在这种模型中,实际请求打印机的唯一进程是打印机守护进程,也称为后台进程。后台进程不会请求其他资源。我们可以消除打印机的死锁。

后台进程通常被编写为能够输出完整的文件后才能打印,假如两个进程都占用了假脱机空间的一半,而这两个进程都没有完成全部的输出,就会导致死锁。

因此,尽量做到尽可能少的进程可以请求资源。

(2)破坏保持等待的条件

第二种方式是如果我们能阻止持有资源的进程请求其他资源,我们就能够消除死锁。一种实现方式是让所有的进程开始执行前请求全部的资源。如果所需的资源可用,进程会完成资源的分配并运行到结束。如果有任何一个资源处于频繁分配的情况,那么没有分配到资源的进程就会等待。

很多进程无法在执行完成前就知道到底需要多少资源,如果知道的话,就可以使用银行家算法;还有一个问题是这样无法合理有效利用资源。

还有一种方式是进程在请求其他资源时,先释放所占用的资源,然后再尝试一次获取全部的资源。

(3)破坏不可抢占条件

破坏不可抢占条件也是可以的。可以通过虚拟化的方式来避免这种情况。

(4)破坏循环等待条件

现在就剩最后一个条件了,循环等待条件可以通过多种方法来破坏。一种方式是制定一个标准,一个进程在任何时候只能使用一种资源。如果需要另外一种资源,必须释放当前资源。

另一种方式是将所有的资源统一编号,如下图所示

进程可以在任何时间提出请求,但是所有的请求都必须按照资源的顺序提出。如果按照此分配规则的话,那么资源分配之间不会出现环。

68、死锁类型

(1)两阶段加锁

虽然很多情况下死锁的避免和预防都能处理,但是效果并不好。随着时间的推移,提出了很多优秀的算法用来处理死锁。

例如在数据库系统中,一个经常发生的操作是请求锁住一些记录,然后更新所有锁定的记录。当同时有多个进程运行时,就会有死锁的风险。

一种解决方式是使用两阶段提交(two-phase locking)。顾名思义分为两个阶段,一阶段是进程尝试一次锁定它需要的所有记录。如果成功后,才会开始第二阶段,第二阶段是执行更新并释放锁。第一阶段并不做真正有意义的工作。

如果在第一阶段某个进程所需要的记录已经被加锁,那么该进程会释放所有锁定的记录并重新开始第一阶段。从某种意义上来说,这种方法类似于预先请求所有必需的资源或者是在进行一些不可逆的操作之前请求所有的资源。

不过在一般的应用场景中,两阶段加锁的策略并不通用。如果一个进程缺少资源就会半途中断并重新开始的方式是不可接受的。

(2)通信死锁

我们上面一直讨论的是资源死锁,资源死锁是一种死锁类型,但并不是唯一类型,还有通信死锁,也就是两个或多个进程在发送消息时出现的死锁。进程A给进程B发了一条消息,然后进程A阻塞直到进程B返回响应。假设请求消息丢失了,那么进程A在一直等着回复,进程B也会阻塞等待请求消息到来,这时候就产生死锁。

尽管会产生死锁,但是这并不是一个资源死锁,因为A并没有占据B的资源。事实上,通信死锁并没有完全可见的资源。根据死锁的定义来说:每个进程因为等待其他进程引起的事件而产生阻塞,这就是一种死锁。相较于最常见的通信死锁,我们把上面这种情况称为通信死锁(communication deadlock)。

通信死锁不能通过调度的方式来避免,但是可以使用通信中一个非常重要的概念来避免:超时(timeout)。在通信过程中,只要一个信息被发出后,发送者就会启动一个定时器,定时器会记录消息的超时时间,如果超时时间到了但是消息还没有返回,就会认为消息已经丢失并重新发送,通过这种方式,可以避免通信死锁。

但是并非所有网络通信发生的死锁都是通信死锁,也存在资源死锁,下面就是一个典型的资源死锁。

当一个数据包从主机进入路由器时,会被放入一个缓冲区,然后再传输到另外一个路由器,再到另一个,以此类推直到目的地。缓冲区都是资源并且数量有限。如下图所示,每个路由器都有10个缓冲区(实际上有很多)。

假如路由器A的所有数据需要发送到B,B的所有数据包需要发送到D,然后D的所有数据包需要发送到A。没有数据包可以移动,因为在另一端没有缓冲区可用,这就是一个典型的资源死锁。

(3)活锁

某些情况下,当进程意识到它不能获取所需要的下一个锁时,就会尝试礼貌的释放已经获得的锁,然后等待非常短的时间再次尝试获取。可以想像一下这个场景:当两个人在狭路相逢的时候,都想给对方让路,相同的步调会导致双方都无法前进。

现在假想有一对并行的进程用到了两个资源。它们分别尝试获取另一个锁失败后,两个进程都会释放自己持有的锁,再次进行尝试,这个过程会一直进行重复。很明显,这个过程中没有进程阻塞,但是进程仍然不会向下执行,这种状况我们称之为活锁(livelock)。

(4)饥饿

与死锁和活锁的一个非常相似的问题是饥饿(starvvation)。想象一下你什么时候会饿?一段时间不吃东西是不是会饿?对于进程来讲,最重要的就是资源,如果一段时间没有获得资源,那么进程会产生饥饿,这些进程会永远得不到服务。

我们假设打印机的分配方案是每次都会分配给最小文件的进程,那么要打印大文件的进程会永远得不到服务,导致进程饥饿,进程会无限制的推后,虽然它没有阻塞。

69、计算密集任务和IO密集任务

●计算密集型任务

特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。

虽然可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

●I0密集型任务

涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。

对于lO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是lO密集型任务,比如Web应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值