操作系统的学习1

上一周我学习了操作系统的第一、二章,第一章主要是相关的描述性的语言,包括操作系统的发展历史,以及描述了各种任务机制的操作系统。第二章把进程之间的同步和互斥学完了,对于前面几节的相关概念有了更深层次的了解,尤其是进程的特性,以及进程状态之间的转换过程等等。对于接下来的进程同步的问题所涉及到的信号量机制,因为它的算法采用PASCAL语言描述,有的地方理解的还不到位,好在最后对于同步的几个经典问题都理解了实现算法,以及使用信号量和信号量集实现的不同之处。

我基本上把进程的定义、特征、状态转换、同步互斥、以及进程同步的几个经典问题搞清楚,所以这一周的前几天我接着将操作系统的第二、三、四章学完。

首先学了管程机制的实现,管程的引入是为了防止同步操作的使用不当从而导致死锁,管程的使用会至少引用两个队列,分别是管程外面的进入队列,管程内部阻塞或挂起队列,其中又使用了条件变量,因条件不同其队列数量也不同,表明因什么条件而什么。最后分析了用管程解决生产者和消费者问题,算法中使用了两个条件变量(notfullnotempty),这样就能避免将waitsignal分散到不同程序中而容易导致死锁的问题了。

接着学习了进程间的通信,这其中包括三大类:共享存储器系统、消息传递系统、管道通信系统。第一种又分为共享数据结构(少量信息)和共享存储区(大量数据)两种方式,第二种是应用最广泛的一种机制,它是以一种格式化的消息为单位的,收方方分别使用发送和接收原语来操作。

线程概念的引入是为了缓解进程调度过程的开销以及时空复杂度,它是将进程的两个特性(拥有资源的实体和能够独立调度)分开,进程依然是拥有资源的实体,而线程则完成相关的调度。线程的状态基本上与进程相一致,线程间通信则可以采用互斥锁、条件变量、信号量等等。最后在线程实现这一小节引入了轻型进程的概念,它是实现用户级线程与内核联系的纽带。

第三章主要讲了处理机调度与死锁,开始讲了处理机调度的层次,包括高级调度(又称作业调度或长程调度)、低级调度(进程调度或短程调度)、中级调度(中程调度,实际上是存储器管理中的对换功能)。接下来是调度队列模型,当OS引入中级调度后,进程的状态便可以有外在就绪和外存阻塞两种状态,而相应的调度队列就可以划分为就绪队列、阻塞队列、外存就绪队列、外存阻塞队列、后备队列。

在进程的调度算法中,首先要明确进程相关的几个时间概念:到达时间、服务时间、开始执行时间、完成时间、周转时间、带权周转时间,明白了这些概念后我们就可以评价相应调度算法的优劣了,常见的算法有:先来先服务算法(FCFS)、短作业(进程)优先算法(SJ(P)F)、高优先权调度算法、高响应比调度算法、基于时间片的轮转调度算法。在高响应比优先算法中我们要明确其响应比的定义是什么Rp(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间,响应时间也就是周转时间,这些算法各有优缺点,我们要根据系统的需要来选择相应的调度算法。本章还讲了两个实时调度算法:最早截止时间优先算法(EDF)算法和最低松弛度优先(LLF)算法,它是根据不同的标准来排不同的调度队列,这两个算法中我只学习了第二个,只要明确松弛度的定义,调度队列便很好排了,松弛度的定义如下:必须完成时间-其本身的运行时间-当前时间,只需建一个时间轴,再明确公式中的相关概念就行了,必须完成时间就是在某一时刻之前必须完成,其本身的运行时间就是假如进程已经运行一段时间了,则这个概念就是进程要求服务时间减去已经运行的时间,当前时间就不用说了,调度算法会不断的进行松弛度的比较,将松弛度高的排在低的之前。

本章最后几节讲了死锁的相关知识,包括产生死锁的原因和必要条件,预防死锁的方法,死锁的检测和解除。死锁的原因可归结为两点:竟争资源和进程推进顺序非法,推进顺序非法则是因为进程请求和释放资源的间隔性,不同进程之前的请求和释放顺序推进顺序可能会使系统进入不安全状态,这个在安全性算法中会进行检测。产生死锁的必要条件有四个:互斥条件、请求和保持条件、不剥夺条件、环路等待条件,死锁的预防就是破坏后三个条件的一个或几个。死锁预防的经典算法就是银行家算法,因为这个算法与银行的现金贷款的发放很相似,这个算法中使用了四个数据结构:可用资源向量Available、最大需求矩阵Max、分配矩阵Allocation、需求矩阵Need,结合安全性算法则可以保证进程的推进不会进入不安全状态。死锁的检测和解除则涉及到了资源分配图和死锁定理,死锁的解除则涉及到剥夺资源和撤消进程。

第四章学习了存储器管理,主要的内容包括程序的装入和链接、内存空间的分配、虚拟存储器的原理、段/页存储管理、内存分配算法、段/页转换算法等。我们首先要弄清楚程序从无到有,再到运行的整个过程,首先是源码的编写,接着是编译,再下来是链接,再到最后的装入,总的来说可以分为三步,将这三步按不同的结合方式可以得到静态和动态的链接和装入。内存的分配在早期一般采用的都是连续分配方式,其包括单一连续分配、固定分区分配、动态分区分配、动态重定位分区分配四种,这四种方式都是将内存以分区为基本单位来将程序装入内存的,这就要区别于目前所采取的段页式分配方式了,其中动态分区分配中又涉及到空闲分区表和空闲分区链两个数据结构

对换概念的引入也间接引入了虚拟存储器,这是为了缓解主存容量不够大的问题,将一部分短时间不访问的页转换到虚拟存储器中,这其中又涉及到页面置换的内容,以及相应的页面置换算法,有最佳置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使用置换算法(LRU)、Clock置换算法、改进型Clock置换算法、页面缓冲算法,其中大部分算法都需要硬件支持,包括移位寄存器和特殊栈。

在段/页式存储管理中我们首先要知道什么是段什么是页,以及划分的依据,页的概念是将一个进程的逻辑地址空间分成若干个大小相等的片,而应的内在空间则划分为与页大小相等的(物理),一般在32位系统中将前20位划分为页号P,后12位划分为位移量W,也称为页内地址,相应的将进程映射到内存的页面映像表称页表,在分段系统中也有段表,在逻辑地址到物理地址变换过程中不会用到硬件中的页表寄存器,为了避免每次访问相应的页都要访问两次内存空间,系统有相应的硬件(联想寄存器,也称快表)提供支持,用于存放当前访问的那些页,使用快表机制后能将因地址变换而损失的速度减少到10%以下,而为了缓解页表过长的问题,系统双引入了多级页表机制,相应的分段系统中有也相似的过程,包括也有段表寄存器,也要涉及到地址变换的过程,因为段是根据代码的逻辑功能要划分的,一般也比较大,不会频繁的访问不同段的数据,因此不需要提供专门的寄存器(快表)来存储访问的段(书中没提到,这是我猜的)。现在的系统一般都采用段页式结合的方式来取两种分配方式的优点,如分页式有解决内存碎片的问题,而分段式则更容易实现信息的共享和保护。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值