操作系统 #考研操作系统基础理论

在复习操作系统的时候随便写的一点笔记,现在稍微整理一下发个CSDN,以后可能还会有更新完善,有兴趣的朋友们可以随便看看点点关注哈哈哈哈哈。

一、操作系统概论

操作系统的发展:

这个地方像是上面说的直接死记硬背发展进程的话,可能很难理解为什么是这样一个发展过程,所以我是结合计算机组成原理来记忆的,阶段:

  1. 手工操作阶段,这时候还不能叫做操作系统,因为这时候,计算机还处于电子管时代(1946-1957),计算机非常的巨型,而且运算速度不快,都是由程序员手动的用打好孔的纸带去操作计算机,十分的不银杏
  2. 批处理阶段:一开始只有单道的批处理,引入了磁带,能存储程序,计算机也从原始的电子管升级到了晶体管体积减小,性能增强(1958-1964)。解决了手工操作阶段只能用原始的纸带输入然后等待输出的缺点。但是单道批处理系统不能实现程序的并发,在输入完,输出的时候,CPU必须等待输出完毕才能进行下一次的输入。为了解决这个问题,就出现了多道批处理系统,程序员能一次性输入很多数据,然后存在磁道里面,CPU在处理完第一个程序,I/O设备输出的时候,又可以处理已经存在磁带里面的其他程序,十分的银杏。这时候出现了高级语言
  3. 分时操作系统阶段:计算机领域出现中小规模集成电路(1965-1971仙童八叛徒YYDS),这时候计算机的性能更加优化,体积更小,部分有钱人已经能拥有个人电脑办公。半导体存储器取代磁心存储器,由于分时操作系统的出现,高级语言发展迅速。
  4. 实时操作系统,网络分布式操作系统,个人PC操作系统:出现了超大规模集成电路(1972至今),计算机的逻辑元件采用大规模和超大规模集成电路,产生了微处理器;并行、流水线、高速缓存和虚拟存储器等概念用在了这,这就是现代计算机的雏形,加上十分强大的操作系统,使得本属于军事领域的计算机,落户到每一个百姓的家中,现在每个人都离不开计算机——手机。这也是超大规模集成电路的功劳。

考研的重点一般就是进程管理和内存管理,但是文件管理和I/O设备管理也是十分重要的,咸鱼说,考了的话可以判断一定十分简单,所以也是必须要理解并且能够灵活运用的,考研复习一定要全面,不然考到就算很简单的知识点,该不会的还是不会,因为没有复习到。

接下来是我一轮复习的时候随便写的笔记,基本上比较详细的解释了概论这一章,大家看着玩玩就好:

2021.6.16

        操作系统是一种系统软件,计算机可以自下而上分成硬件、操作系统、应用软件和用户。 操作系统的特征是并发、共享、虚拟、异步。下面一一解释这几个名词的含义:

  • 并发和并行不一样,它是宏观上并行,微观上串行,有了早期的操作系统比如微软的DOS系统不能实现处理器的合理分配,没有办法实现并发,所以装有DOS系统的计算机上面一次性只能运行一个进程。
  • 共享就分为两种共享,一种是互斥共享,比如打印机,必须等一个进程使用完打印机才能让下一个打印机开始运行。同时访问方式就是类似于一个U盘(外设),两个QQ同时发送同一个文件而互不影响。
  • 在操作系统的很多地方都用到过虚拟技术,现在我学到的只有虚拟内存,但是还有处理器,I/O设备也可以虚拟。
  • 异步就是指进程在运行时是按照一种不可预知的情况走走停停的所以计算机操作系统可能出现与时间有关的错误。 接着就是操作系统的目标和功能——合理分配系统资源、作为用户和计算机之间的接口、扩充机器。

         合理分配系统资源分为四个大部分: 1.进程管理 2.内存管理 3.文件管理 4.I/O设备管理

  • 操作系统有了进程管理以后就能很好的在机器上面互不干扰的运行多个进程而进程多了以后就要求计算机拥有更大的内存,这时候就牵扯到内存的管理。
  • 内存管理涉及的各种算法以及虚拟内存使得操作系统的内存不在仅仅局限在物理内存的大小上。我们在计算机上面有很多数据,计算机的内存是一种快速设备,造价比较高昂,那么我们想要存储的数据放在哪里呢?
  • 很显然不能放在物理内存上面,要放在外存磁盘上,那这时操作系统就得有一种新的管理方法来管理外存上面的文件,让让这些文件合理的被运用,这就是文件管理。
  • 最后一种是设备管理,到时候学完了我再回来补充。

操作系统还用于用户和计算机之间的接口。有命令接口和程序接口,命令接口又分为两种联机命令接口和脱机命令接口,

联机命令接口就是命令行,用户说一句,操作系统反馈一句。

脱机命令接口就是操作系统在提交作业的时候会同时提交一份用户说明书,在运行的时候按照说明书来运行,这就是批处理。

程序接口由一组系统调用组成,用户在GUI界面点击图标的时候就是使用了程序接口。 最后一个是扩充机器,没有操作系统的电脑称为裸机,操作系统相当于工人,有了工人操作系统,机器就有了更大的用处。 计算机刚刚被制造出来的时候是没有操作系统的,计算机是使用电子管制造而成,所以体型庞大,也只有专业人员才可以进行操控,一台计算机好几十吨,一般只有军事计算才能用得着。 一开始操作计算机是单通道,用打孔纸带的方式来操作计算机,这种方式很不方便,计算机一次性只能运行一道程序,而且由于计算机CPU的速度很快,而人工操作计算机的速度很慢,所以计算机CPU的利用率很低。这叫做单道批处理。 接着人们想到,用磁带这种相对更快的设备来代替手工操作,用把预先编写好的程序放到磁带中然后再给计算机读取,这时可以允许多个程序进入计算机,当一个程序由于I/O请求暂停运行的时候,CPU可以去运行其他的程序,效率提高了。但是这种系统不提供与用户的交互功能。 为了解决交互功能,人们又想到了分时操作系统,也就是把处理器运行的时间分成很多的时间片,把它们轮流分配给多个用户,因为时间片轮转的速度很快,所以用户会感觉自己独占一台计算机。分时操作系统有批处理的功能,也能进行交互,但是不能在一定的时间内(比时间片还短)及时的对外部的信息进行处理。 为了在及时的时间内对外部的信息进行处理,实时操作系统应运而生。实时操作系统分为软实时和硬实时,硬实时就是对于处理有着严格的规定,绝对要在规定的时间内完成处理,软实时能够偶尔的违反时间规定而不造成永久性的危害。 后来还有网络操作系统和个人PC,网络系统可以实现网络中资源的共享和PC之间的通信个人PC广泛应用于办工场合,这些了解就行。

2021.6.17

        操作系统概述还剩下两章,一章是操作系统的运行机制和体系结构,其实吧,弄懂了之后就感觉,也没有这么难。 操作系统的运行机制有四个都是在内核态进行的,分别是时钟管理,中断机制,原语和系统控制的数据结构以及处理。 时钟就相当于操作系统的心脏,时钟管理可以实现进程的切换,也可以通过定时器来给用户提供标准的系统时间。 运行机制最重要的一个地方就是中断机制,任何多任务操作系统都必须有中断机制因为在多任务的操作系统中,为了使处理机的利用率更高,会在进程I/O指令的时候,利用中断执行,然后把处理器分配给就绪的进程。 中断机制分为内中断和外中断,内中断又分为自愿中断和强制中断,自愿中断就是执行一个trap指令然后就进入内核态了,强迫中断分为两种一种是硬件故障比如缺页中断,一种是软件中断,比如除0操作。外中断分为两种,一种是外设请求比如键盘,打印机的使用,还有一种时候人的干涉。中断的过程有9步,从中断请求发起到中断完毕,执行的步骤是:

1.关闭中断,避免程序在进入中断的期间被打断

2.保存断点,以方便程序在返回时找到原进程位置

3.中断程序寻址,找到中断程序执行的位置。 (前3步都是硬件完成的)

4.保存现场和屏蔽字,进入程序时要保存现场,现场信息一般是指程序状态字寄存器和某些通用寄存器的内容。

5.开中断,使一些高优先级的进程可以相应。

6.执行中断服务程序,中断的目的

7.关闭中断,为中断返回做准备,避免在中断返回的时候被打断。

8.恢复现场和屏蔽字,将现场和屏蔽字恢复到之前的状态

9.开中断,中断返回 我们如果要管理系统资源,比如处理机的分配,进程的切换,就要用到系统调用,执行系统调用的内容必须要在核心态,但是在用户态是可以进行系统调用的,要分清。

就像在用户态能发生缺页异常,这个异常会导致一个中断,接着如何处理这个中断的内容,就是操作系统该考虑的问题了,也就是内核态该考虑的问题。访管指令发生在用户态,它虽然使操作系统进入内核态,但是归根结底是在用户态发生的指令,所以他不是特权指令。 最后是操作系统的体系结构,操作系统一开始是一种大内核的体系结构,然后在不断的发展中,科学家们发现了弊端,这个弊端就是——当操作系统的服务不断增加的时候,进程管理、内存管理,文件管理和外设管理的界限变得越来越模糊并且难以维护,因为很多普通用户能实现的不会影响到操作系统的服务也在内核里面,所以接着人们把这些不会影响到操作系统运行的服务从操作系统里面分出来,形成微内核体系。分出来的功能相互独立,交互则利用微内核进行通信。微内核体系有效的分离了内核与内核,服务与服务,使接口更加清晰,维护的难度大大降低。

最后我们来整理一遍,操作系统的概念,分为特征,目标和功能,发展,运行机制,体系结构。 特征:并发,共享,虚拟,异步。 目标和功能:1,合理分配系统资源2.作为用户和计算机之间的接口,3.作为扩充机器 发展:批处理系统,分时操作系统,实时操作系统,网络操作系统,个人PC 运行机制:中断机制,系统调用 体系结构:大内核,微内核

二、进程管理

2021.6.18

        介绍完计算机操作系统的五大概念(特征,目标和功能,发展,运行机制,体系结构)以后,我们进入进程管理这一章,之前我有粗略的看过一遍,这一章大概讲的就是如何实现之前说的操作系统特征里面的并发(进程之间并发执行),共享(进程之间通信),虚拟(虚拟处理机),并且用同步机制解决操作系统进程异步的问题。 操作系统作为系统资源的管理者,理所应当的要进行进程的管理,在进程的管理当中其实就已经综合了后面所说的内存管理,文件管理,I/O设备管理。进程管理是操作系统最宏观的、需要进行合理分配的部分。进程管理包含了

1.进程与线程的概念以及控制

2.处理机的分配

3.进程的互斥和同步

4.进程的死锁。

这从很多个方面介绍了操作系统对于进程的合理分配做出的贡献。当年苹果的操作系统在进程并发方面其实是优于微软的(微软的DOS系统一次性只能有一个进程运行),但是因为DOS系统免费,而且IBM公司是一家当时非常有名的公司,他们生产的计算机采用微软的DOS系统,卖个人计算机的同时把DOS系统以很便宜的价格同时给了消费者,在DOS系统上面有着很多的一些办公软件,而这些办公软件在苹果操作系统上面不兼容。所以即使微软只能一次性运行一个进程,但是仍然有很多用户使用,这也为微软推出Windows3.0提供了充足的时间。 虽然进程管理包含了很多综合的知识,但是在此篇文章,我们仅仅只谈进程管理的进程部分,不详细的谈内存管理和文件管理的part。 因为进程管理是一个微观上比较大的概念(虽然宏观上只有4个要点),所以我们这一次把进程管理分成4篇日志来详细解读,(自己的理解)。 首先,说到进程,我们要先知道他的概念,进程跟程序不同的地方就在于它是一个动态的概念,为什么这么说呢,因为程序是死的,是写好的,代码编译的时候经过链接,形成可执行文件放在外存。而它在将要运行的时候,操作系统通过创建原语,把它从外存调到内存里面来,然后分配一个唯一的PID然后创建一个空白的PCB,接着给进程分配所需要的系统资源,然后初始化PCB,如果就绪队列能接收新进程,那么就把这个进程插入就绪队列(把进程插入就绪队列的过程其实就是把PCB插入队列的过程)。这里体现了进程的动态性

进程最重要的一点就是并发性,就是因为想要在操作系统上面运行多个进程,所以才会出现这么多巧妙的方法来对不同的进程进行管理,接着就是独立性,每个进程有着独立的PCB,记录着不同的进程的信息。还有异步性,记得操作系统课的时候做过实验,不停地快速的在Linux操作系统上并发执行打印ABC这个程序,出来的结果有时候是ABC有时候是CAB有时候是BCA,这说明在操作系统中,进程是异步的,他们按照不可预知的方向前进。

最后一个特点是结构性,进程是由程序段,数据段和PCB组成的,其中最重要的部分就是PCB,其中包含了很多关于进程的重要信息,比如处理机使用率、进程状态、进程优先级、PID、UID,保存的现场信息等等。

然后就是进程的五状态模型(后来还有7状态模型,添加了两个挂起态,分别是阻塞挂起和就绪挂起),分别是新建,就绪,运行,挂起和终止态。说到五个状态,最重要的就是三台模型下状态的转换,在创建进程,分配好资源以后,程序会放在就绪队列里面,然后等到处理机空闲的时候,就会把就绪队列里面的进程交给处理机处理,进程处在运行态的时候,可以向就绪态和阻塞态转变,转向就绪态的原因可能是进程分配的时间片到了,或者是进程被更高优先级的进程抢占了,运行态转向阻塞态的原因可能是要进行I/O操作,或者是读磁盘(总称使用外设),又或者是等待某种系统资源。

顺便说一句,操作系统从某种状态转到阻塞态,要么是想使用外设,要么是等待某种系统资源的分配(被其他进程占用),而这两种原因都是动态的(显而易见的事情)都是主动的,所以这种状态只能是运行态,因为就绪态是静止的,并没有运行,所以就绪态不可能直接转化成阻塞态,而得到了系统资源,或者I/O操作完成以后进程获取到了足够的资源,又会回到就绪态,等待处理机的分配,这时候就会涉及到处理机的分配算法,这要到下一章讲了。 然后就是进程的控制,,,,,,,,,我想睡觉了,明天再继续写叭睡觉了累死了

进程的控制分成进程的创建、终止、切换、阻塞和唤醒。其中唤醒和阻塞这两种操作是成对存在的,在进程在等待某种外设的分配或者系统资源以及I/O操作的时候会进入阻塞态,在得到资源或者I/O操作完毕的时候会被唤醒重新挂在就绪队列上。

我们先来介绍进程的创建,进程的创建由创建原语一气呵成,创建的过程是(按照王道书上的过程)1.为进程分配一个空闲的PCB。2.为进程分配系统资源。3.初始化PCB也就是分配PID以及进程信息,CPU使用情况,优先级等信息。4.把初始化好的进程挂在就绪队列上等待处理机的分配。这些都是由原语一气呵成的完成的,原语有着不可以被中断的性质,因为要是在创建进程的时候被中断的话会引起一些系统错误。顺便说一句,进程控制都是在核心态运行的,因为如果在用户态,用户可以对进程的这种基本性质进行操作的话,如果操作不当,会有很大的安全隐患。

接着介绍进程的终止,也是用原语完成(终止原语)。过程1.找到要终止进程的PCB。2.如果这个进程的PCB里面的state状态是运行态的话,就把它杀死,设置为终止态3.如果这个进程有子进程,就把子进程也全部终止。4.释放进程所占用的内存,分配给父进程或操作系统。5.最后撤销进程的

PCB 然后是进程的阻塞还有唤醒

先介绍阻塞(进程的控制都是由原语来完成的),1.找到进程的PCB。2.保护现场,然后把状态由运行态改为阻塞态。3.把PCB挂载到阻塞队列,然后将处理机资源给其他的就绪进程。

唤醒1.找到进程的PCB。2.将进程从阻塞队列中移除。3.将进程插入就绪队列 进程的切换其实进程的切换也就是一个进程从运行态到就绪态或者阻塞态的转换,因为被切换的进程肯定是还要继续被分配处理机的所以在切换进程的时候一定要保存进程的环境。

然后我们现在正式介绍进程的切换。进程切换用的是切换原语,进程切换要做的事情:1.把进程上下文信息保存在PCB中。2.更新PCB信息。3.把被切换进程的PCB挂载在相应的队列(要么是阻塞队列要么是就绪队列)。4.选择另外一个进程执行并更新这个进程的PCB。5.更新内存管理的数据结构。6.恢复处理机上下文。

然后就是进程之间的通信,在操作系统中,进程之间的通信是很有必要的。进程的通信分成共享储存,消息传递和管道通信。懂的都懂看书就完事了不想敲了。 接下来就是线程,一对一多对多和一对多模型。

2021.6.21

        现在我们来聊聊线程,什么是线程呢?在登录QQ的时候,如果一边想QQ聊天,一边想跟另外一个人视频通话,这里就要牵扯到线程,在引入线程这个概念之前,进程是拥有资源和独立调度调度的基本单位,在引入线程之后,进程还是“拥有资源”的基本单位,但是独立调度的基本单位变成了线程。 线程相对于进程有很多方便的地方,引入线程以后,进程里面也可以有很多线程的存在了,增加了操作系统的并发性,提高了系统的吞吐量。进程之间的切换系统开销比较大,但是同一进程的不同线程切换开销比较小,只需要保存和设置少量寄存器,而且同一进程的不同线程共享进程的物理地址,所以这些线程之间的通信很方便。线程的属性可以见数P36。 引入线程的原因是:线程的切换开销比进程切换的开销小,引入线程以后在切换的时候会降低进程的切换频率。 线程的实现方式,用户级线程,内核级线程和组合式线程,分别对应多对一模型,一对一模型和多对多模型。这里多对多模型是最好用的。既不会导致线程的阻塞,又不会使操作系统开销过大。

三、内存管理

        2021.6.6

        今天还比较满意,基本上把内存管理的连续内存分配和非连续内存分配基础弄通了,不过后续还需要巩固加强记忆。了解了一个进程到底是怎么样运行的,和连续内存分配的缺陷以及非连续内存管理的优点所在(优点就是可以在内存里面装入最少的程序块同时能保证整个进程能够运行,只让少部分现在要运行的进程块进去内存,不运行的放在外存。内存的二级页表管理方式,把页表的空间建立地址映射形成上一级页表,为下一级页表的储存空间建立索引(一个页表项对应一个页),在进程运行的时候只需要把第一级页表(很小,详情见书p158)放入内存,就可以寻找到外存块中的进程数据,仅把需要的数据放入内存,从而使一个看起来需要很大内存的进程也能在实际物理内存很小的情况下运行,大大节省了内存空间)还有很多细节就不详细说了。

今天看了一下午的浪潮之巅,让我印象最深刻的是乔布斯当年在苹果如此低落的时候,的举措,先是看准了市场发行AirPods,接着,苹果电脑也是凭借其独特的内存管理技术,在与IBM的PowerPC的竞争中取得优势。现在看来,这个内存管理技术的确很不错。接下来还有基本段式存储和更厉害的内存虚拟技术,很期待能学懂。

2021.6.8

        段式存储和段页式存储,段页式存储很简单,就是在段式存储的基础上,把每个连续的段分成若干个页以实现非连续存储,从而减少内存的外部碎片,页式存储的原理我们在上一条说说已经写过了,所以我们如果要了解段页式存储,就要先了解段式存储。 段式存储把进程按逻辑顺序分成若干个段,然后存储在内存当中,程序员有直接对段操作的权限。在逻辑上把段地址划分成两部分,第一部分是段的段号:用来查询段表中段在物理地址中的基址和此段在物理内存中的长度,也就是段长,第二部分是段内偏移量:通过段表找到段基址以后,再加上逻辑地址中的段内偏移量从而找到物理地址。 在查找物理地址的过程中,先通过段表寄存器比较段表长度M和段号S,如果S≥M就判断越界,产生中断来处理,要是没越界,就通过段表始址来确定段表在内存中的位置,然后判断偏移量是否大于段长,要是大于则越界。(因为段式分布每一个段的长度都不一样,所以在寻址的时候有越界的风险)要是不大于就通过基址+偏移量计算出在主存中的物理地址。 基本段式管理相对于页式管理的优势就是每一段是按逻辑分配的,所以更有利于进程的共享信息保护等,但是当每一段内存过大的时候,就会产生外部碎片(因为一段很大的连续的内存空间对于内存还是要求太高了)。所以我们想到,在分段的时候引入页表,把连续的段分成不连续的页,减小内存的负担,并且又可以有逻辑的进行内存的共享和保护。 在段页式管理时,也跟上面一样有段表寄存器但是逻辑地址跟基本段式分配有所区别:分为段号S、页号P、页内偏移量W(也就是把一个段分成了若干个页)。 在段页式管理方式时,也要通过段表寄存器来比较段号S和段表长度M来判断是否访问越界,如果没有越界则通过段表始址和段号*段表长度找到段。(在这里再次把整个连续的段分成页)。(此时段表的内容是对应页的长度和页表始址)比较逻辑地址中的页号和段表中的页表长度,如果页号P≥段表里面的页表长度,那么越界中断。如果没有越界中断则通过页表始址(页表存放块号),找到内存中页所在的位置,再通过块号和页内偏移量形成物理地址。很清晰。

说白了,其实操作系统内存管理其实就是想各种办法在物理上面把需要连续存放的东西变成不需要连续存放的东西,然后按一定方法使用户在逻辑上面感觉他们是连续的。

2021.6.9

        静态链接是在生成可执行程序的时候就把库中的内容加入到程序中。载入时动态链接是在将功能模块读入内存时把动态库中调用到的相关模块的内容载入内存。运行时动态链接是在执行程序调用到模块内容时再将动态库中的相应模块载入到内存。这里有两个时间问题。一是载入时间,二是执行时间。静态链接由于是在一开始就把所有模块都加载进入内存,所以如果模块很多的话效率就会被大大拉低。载入时动态链接是分别载入,当把一个模块载入内存时检查有调用关系的模块载入,比静态链接节省了许多开销。运行时动态链接则是把当前模块调用的模块推迟到调用的时候再载入。三者之间的关系就像是机枪,冲锋枪和手枪机枪在一开始就把所有子弹装好,开枪的时候很快,但也很笨重。冲锋枪则是将子弹分弹夹存好,轻便了许多,但是会有一段装填时间。手枪就更加轻便了,但是弹夹容量更小,装填的频率又变高

2021.6.10

内存管理的最后一节也是比较常考的一节就是内存的虚拟。 内存的虚拟是一种在逻辑上对内存进行扩充的一种管理形式,内存的虚拟涉及页面的换入换出。之前介绍的基本分页式管理和基本分段式管理以及段页式存储管理都是传统存储管理,虽然也能在逻辑上节省存储空间,但是不具备换出功能,如果要多次使用相同的页面,但是又有许多不同的页面也需要存在于内存等待被运行,而此时之前存在于内存的页仍然占据内存空间,此时新的需要运行的页因为内有足够的内存空间,就无法被调入内存,只有当前一个进程运行完毕的时候才能调入,所以此时需要一种更加合理的分配方式来扩充内存,这时候我们引入了虚拟技术。 虚拟技术必须使用离散分配的内存管理方式,使用更高级的管理方式——请求分页管理方式,这个管理方式有更加高级的页表机制,页表中相对基本分页式管理增加了4个字段,分别是状态位、访问字段、修改位和外存地址。分别对应着1.表明该页是否调入内存2.在内存中被访问了多少次3.是否被修改,以便调出时回写4.顾名思义,表示外存地址,在页调入内存的时候寻找该页位置的时候使用。 在内存中没有该运行的页的时候,会产生缺页中断,这个中断是一种内部中断,之后在复习中断的时候会有说明内部中断和外部中断的区别。在请求分页存储中,假如给一个进程分配的内存块是m个,那么在该进程运行的期间至少会经历m此缺页,因为一开始内存块是空的,没有从外存调入任何页,在进程有新的相关部分要运行的时候,就需要把页从外存调入,占满空的、系统分配的内存块,所以至少m次中断。 还有地址变换机构,就不在这里详细说了,在书上P184有一个导图说的很清楚。 接着就要说考研的重头戏,页面置换算法了,傻子都知道,这一章十分重要(其实前面也十分重要哈哈哈)。

前面主要是告诉我们,为什么要实现虚拟内存,虚拟内存跟之前的分配方式相比有什么优点。现在是如何实现虚拟内存管理,其实这是考研的重点,但我并不觉得这是难点,只有时钟算法和改进型时钟算法有一丁点难度,时钟替换算法我们暑假再详细了解,现在先把前面的LRU,FIFO,OPT算法搞明白。 LRU全称为Least Recently Used 算法,也就是在操作系统实现请求分页式储存的时候的换出算法,顾名思义最近最久未使用算法就是在内存块满的时候,往前看(由访问字段A记录最长时间没有访问的页),把最长时间没有访问的页面由调入的页面替代,同时把这一页调出内存,调出的时候要看修改位,不同的操作系统修改位0,1表示的意义不同,在内存中的页被修改的时候就需要写回外存,要是没有修改过,直接覆盖就完事了。 FIFO也差不多,就是在分配的内存块满、新的页面到来的时候把最先进入内存的页面最先置换出去,换出时候的细节规则和LRU一致。FIFO算法会出现Belady异常,在平常情况下,系统分配给进程的内存块如果增加,那么缺页次数一定会减少,但是FIFO算法在分配的内存块增加以后,缺页次数可能反而增加,这就是Belady异常。 最后介绍一种理想中的算法OPT算法这种算法的全称是OPTimal replacement,这是一种不可能实现的算法,因为这种算法要把以后最长时间不访问或者用不访问的页面置换出去,因为我们不知道以后的页面是以什么顺序访问的,所以我们无法知道,到底哪个页面最远,所以是不可能实现的。 接下来还有页面分配策略、抖动和工作集,明天学了再写叭,今天就这些,晚安。

四、文件管理

2021.6.23

        经过了今天下午大概两个小时的学习,我好不容易弄懂了文件管理里面的逻辑地址和物理地址管理的区别和相同点。逻辑地址其实就是程序员能见到,并且感觉到的地址。物理地址就是操作系统在文件管理的时候分配存储空间的时候要关心的地址。 然后用户的逻辑结构也分了很多种,大体来说分为无结构文件和有结构文件,有结构文件又可以分成顺序文件、索引文件和索引顺序文件。顺序文件又有顺序存储和链接存储两种方式,其中顺序存储在逻辑上看来是相邻的,链式存储是通过结构体里面的一个指针来指明下一个文件的地址,所以在用户看来也是不相邻的。顺序存储逻辑上是相邻的。 但是顺序文件存在弊端,就是如果想快速的查找某个文件的话文件就必须是定长的不是定长的话,顺序文件也没有意义。但是通常情况下,文件如果设置为定长,是对存储空间的一种很大的浪费,因为文件有大有小如果定长的话,一个小文件分配一个很大的空间,那么就很浪费。为了解决这个问题,文件系统引入了索引文件,索引文件最重要的一个点就是索引表,索引表中的每一项对应逻辑地址里面的一个文件,所以要找文件只需要查找索引表,索引表其实就可以看成顺序存储的文件(就是前面讲过的顺序文件,顺序文件的优势就是方便查找,所以把索引表设置成顺序文件就是为了能够方便查找索引文件下文件所在的位置)这样一来,无论是定长的文件还是可变长的文件都可以通过索引表很快的查到。但是这时又出现了一个问题,如果文件过大,索引表也会很大,因为索引表是顺序存储的,所以查找的时间会变长很多。 这时我们就引入索引顺序文件。索引顺序文件把顺序文件分成了若干个组,然后再用索引表的每一个表项对应一个组而不是仅仅一个文件,这时索引表的大小就大幅度缩小了,查找速度指数减少。因为索引表是顺序文件,而每一个表项对应着一个组,所以在索引表所索引的文件当中,组和组之间是肯定要有序的,但是组内可以无序,因为通过索引表查到一个组之后,在组内按照顺序查找文件,并不需要有序。 按我的理解,引入逻辑地址的概念其实不是为了操作系统方便存储,而是方便用户进行查找、插入、增加和删除的,在逻辑地址上面做了这些操作,然后操作系统会按照一定的分配方式在物理地址上面添加相应的东西。所以下一章我们来聊物理上操作系统是怎么存放文件的。

2021.6.23

        然后是物理地址,程序员在逻辑上面决定了文件的存储方式(根据物理地址能算出逻辑地址),那文件在物理上是怎么存储的呢,在物理上如何更加有效地对磁盘非空闲块进行管理呢,这就牵扯到文件系统的文件分配方式。 物理地址上的文件分配有连续分配,链接分配和索引分配三种方式,三种方式各有各的优缺点。 先说一下预备知识,大的文件需要占用比较大的存储空间,磁盘和内存对存储空间的管理差不多,内存是按页分配的,磁盘是按块来分配的,(都是小块的连续的空间)操作系统在看一整个大文件的时候,会把所占磁盘空间按照块大小拆分成一个一个的小块存放在磁盘中。这时就要有一个分配方法来分配这些被拆分的小块。这就是我们要介绍的文件分配方式。 先说顺序分配方式,顺序分配方式就是顺序的把拆分的小块放在磁盘中连续的存储空间这种方法能有最快的读取速度,但是很容易产生碎片,并且当添加文件内容的时候要移动整个磁盘内的文件块,会产生比较大的开销。 所以引入链接分配来解决,连接分配分成隐式链接和显式链接(在考试的时候没有特别指出的话就都是隐式链接)。隐式链接在每一个文件块的后面都有一个指针指向下一个文件块(最后一块是-1),通过这种指针把整个文件连接起来,因为有链接指针把盘块链接起来,所以盘块可以是不连续的。这样一来对于文件的增删改比较方便,只要在最后一个文件块的后面插一个块就好了。然后就是目录(一个目录项就是一个FCB),在创建新文件的时候,目录项里面会增加一个新条目,也就是一个指针,这个指针指向文件的首块,初始化为NULL,表示空文件,然后写程序通过空闲块的管理找到一个空闲的块,再将该块链接到文件的尾部,以便写入,文件通过块到块的顺序来读块。因为这是一种指针的方式来管理,所以在招某个块的时候只能从头到尾一个个找,不能随机访问,很浪费时间。然后链接方式就有了一种变体,交显式链接,这种链接方式把链接各个物理块的指针提取出来放到一张链接表里面,,在整个磁盘里面只设置一张,叫文件分配表,每个表项中存放下一个块的链接指针,文件的第一个盘块号记录在目录当中,后续的盘块可以通过FAT找到。显示分配因为有FAT所以可以直接访问。FAT看起来好像还行,但是缺点是实现起来比较困难。 接着我们来介绍文件分配中最重要的一个点,索引分配是啥呢?每个文件都有一个索引块,然后每个索引块相应的条目指向文件的第i个块,要读第i个块,可以根据索引块的第i个条目来查询要读的块。但是当一个文件过大的时候,每一个块都要对应索引块中的一个条目,这样就会导致索引表过大,当索引表的大小过大,超过一个盘块的时候,就会出现问题,这时候我们用一定的方法来保证即使文件过大,索引块也能正常使用。这些方法有1.链接方法 2.多层索引 3.混合索引 首先我们来说连接方法,连接方法就是在文件后面加一个链接指针指向下一个索引块,这样就可以实现稍微大一点的文件也能正常的使用索引块索引,但是当文件过大的时候,比如盘块大小是1KB,索引块的一个条目是4B,每一个索引块能存放1KB/4B=256个条目,一个文件有256*256KB=64MB。则改文件有256*256个块,每一个块对应索引块中的一个条目,每一个索引块有256个条目,所以需要256*256/256=256个索引块才能存放这么多文件,通过链接存储的方式,加入要访问第255块的话,要从0号磁盘块开始访问,得有256次I/O操作,很费时间,所以我们为了加速对磁盘的访问,引入了多层索引。 多层索引只有最后一层的索引块是指向文件块的,前面几层索引块都是指向下一层索引块。假设条件还是上面的条件,第一层索引256个索引块每一个条目分别指向下一级索引块。下一层索引块每一个条目又指向文件块,在读取某个文件的时候只需要先读取第一个索引块的内容,然后再读取第二个,然后从第二个索引块的条目中找到目标内存块,一共3次I/O操作,比链接方式快很多。 但是当内存过小的时候还是按照这种多级索引,存储效率就会变低,假如一个文件只有1KB但是还是采取二级索引,二级索引一级索引块占1KB二级索引块占256KB ,光索引表就比文件大了这么多,所以这时候就要使用混合索引的方式来存储。 混合索引很简单,详情见书P269。

五、I/O设备管理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值