一、操作系统引论

  这学期开始操作系统课程,作为计算机专业的核心课程,这门课自然还是要好好滴学。按照之前的习惯,继续写博客梳理学到的知识,希望能够坚持下去吧!
  在正式课程开始之前,老师抛出了十个问题(遗憾的是,我一个都不会。呜呜呜~)。这十个问题反映了操作系统的功能,在此对十个问题进行下列举。希望本系列的最后一篇能够对十个问题进行详尽的回答。
  1. EXE、ELF是什么?运行一个EXE到底发生了什么?
  2. C语言的库函数printf、scanf等是怎么实现的?
  3. 512M的内存为什么能跑4G的游戏?
  4. 一个while(true)的计算程序运行时,CPU利用率是多少?
  5. 内存不能为written什么意思?是内存坏了?还是“写保护打开”?这个程序还能继续执行吗?该错误是谁先发现的呢?CPU或者内存?
  6. 需要相互之间通信的程序是怎么传送数据的呢?
  7. 为什么早期的IE浏览器,打开一个页面崩溃,其他页面也崩溃了?后续的一些浏览器是怎么解决这个问题的呢?
  8. 为什么程序有时运行正常,有时却报错了呢?
  9. 磁盘上被删除的数据还能被恢复吗?为什么?操作系统原本可以避免数据被恢复,但没有这么做,为什么呢?
  10. 怎么学好操作系统呢?(这个问题还不晓得能不能找到答案)

  按照我往常的管理,学东西前先问几个为什么?
    1. 为什么要学操作系统?
    2. 什么是操作系统?
    3. 操作系统能干什么?

  带着这三个问题,正式进入操作系统的学习。也希望这篇的末尾,能对这三个问题有一个粗浅的认识。
  古人云:一切的一切还要从历史的源头说起。操作系统的发展历经了三个阶段发展至今。这个过程也是充满曲折滴呀!下面来简单介绍一下,这篇文章主要从操作系统历史发展的角度初步的认识一下操作系统。

  第一阶段:没有操作系统——人工操作方式

  啥意思?全人干!计算机的定位就是执行程序得到结果。但程序如何输入到计算机里是一个问题。人工操作方式就是把程序变成穿孔的纸带,装入纸带输入机送入计算机中执行。且不谈穿孔多么费事,光说说执行效率如何呢?这种方式一个用户独占全机,在该用户进行I/O操作时(可以理解成换纸带),CPU在等待,又因为只有一个用户,此时所有的计算资源都被浪费。再发展发展,变成了脱机输入输出,就是将纸带变成磁带。磁带提前录入,CPU需要时可以高速调入内存。这种方式比人工操作快了不少,整个过程是由外围机控制的,所以叫脱机。但这种方式的优点更多体现在便捷,没有改变程序I/O是CPU空闲等待的本质。CPU的利用率依旧较低。

  第二阶段:单道批处理系统

  在之前的基础上改进,有什么问题改什么问题。因为程序有I/O时间,导致CPU的利用率不高。那在程序A进行I/O的时候(可能I/O的时间比较长),运行程序B不就行了?这就是单道批处理系统的思想!下图是单道批处理的运行流程图:
在这里插入图片描述
  系统中有一个监督程序,将作业装入内存后,控制权给到作业。当作业执行I/O的时候,控制权回到监督程序,调入另外一个作业执行。
  为啥叫单道批处理系统,就是因为在内存中始终保持一道作业。这就引起了两个主要缺点:一是作业I/O时,监督程序要负责将原来的作业拿出来,再把新的作业放到内存中。这个过程也要时间。CPU的资源也就浪费掉了。二是对大多数程序来说,计算机的内存还是比较大的,一次一个程序,未免有点儿内存浪费。

  第三阶段:多道批处理系统

  这一阶段又是解决上面的问题,程序在内存进进出出导致CPU利用率较低,还浪费内存。那把内存里多放几个程序不就OK嘛?这就是多道批处理系统的思想(也是名字由来,多道程序)。将程序排成队列,按照算法调度到内存中。程序A发生I/O的时候,立马换到程序B。这样保证了CPU的利用率保持很高的状态。整个运行流程如下图:
在这里插入图片描述
  这种方式优点就是资源利用率高、系统的吞吐量大。但也有缺点:作业要排队,平均的运转周期长。多道批处理程序只有在程序I/0的时候才会切换程序,如果上一个程序一直不I/O,那么下一个程序就无法被执行。有失公平性。另外用户和程序之间没什么交互(这个看上去不重要,但对大多数非计算机专业的人来讲,良好的人机交互才是使用的根本。侧面反映了windows为啥比Linux更广泛)。

  现阶段:分时系统

  上阶段的问题主要两个:有的程序排不上队无法执行,和用户的交互太少(也可以理解成一口气执行完了,没有根据交互情况做对应处理)。那分时系统的解决策略就是给每个程序一个时间片,时间片内执行自己程序。时间一到,切换到下一个。这样每个程序都能够执行。这样CPU还是一直在工作,保证了资源利用率。多道批处理系统的两个问题也得到解决。
  分时系统的工作过程不像是我们想的那样切换只发生在程序间,其实每两个时间片之间都要返回到操作系统程序中。这样做的目的是为了保存上一个程序的一些状态,以免再次轮到的时候无法顺利执行。同时也为即将运行的程序恢复执行环境。底层的实现是用结构体完成的,叫PCB(process control block,进程控制块),后面也会介绍。
  分时系统相较于多批道处理系统来说有四个特征:多路性(不同程序可能来自不同终端,且都能够得到很好的执行)、独立性(有操作系统做保障,每个程序独立存放和运行)、及时性(用户给出请求在下一个属于该程序的时间片就能给到响应)、交互性(不属于该程序的时间片就可以进行I/O交互)。
  还有另外一种叫做实时系统,这个用在嵌入式中比较多。分时系统中只有在特定时间片才能响应,实时系统中有了就能够立即响应。实时系统对于可靠性的要求会更高,而且也不提供太多的用户交互(嵌入到机器里面的,用户看不到摸不着,自然也没啥交互)。
  可以看的出来,从第二阶段以后都有了操作系统的参与。能够通过操作系统提供的性能来更好的帮助系统的实现。上面的名字都不叫操作系统,那我们给一个操作系统的定义:操作系统是一组能够有效地组织和管理计算机硬件和软件资源,合理地对各类作业进行调度,以及方便用户使用的程序的集合。所以,操作系统是软件!下面来更深入的了解一下操作系统吧!

  操作系统的基本特性

  操作系统有四个基本特性:并发、共享、虚拟、异步。下面来分别介绍一下:

  并发

  并发总是和并行被绑在一起说,那二者之间有什么区别呢?
  并行是指两个或多个事件在同一时刻发生、并发指两个或多个事物在同一时间间隔内发生。举个例子,同一个CPU分时处理程序,不同程序在一段时间内都得到执行,就可以说这几个程序并发。并行指多个CPU同时工作,程序被同时执行。
  那并发有什么用呢?为了提高CPU的利用率,把I/O时间也利用上。为每个程序建立进程,而进程就可以通过并发执行达到很好的效果,提高系统资源的利用率,增加系统的吞吐量。

  共享

  在操作系统环境下的共享(学名叫资源共享或资源复用)指系统中的资源可供内存中多个并发执行的进程共同使用。共享的方式有两种:互斥共享方式,同时访问方式
  互斥共享方式指在一段时间内只能有一个进程对资源进行访问,该进程结束后其他进程可以访问。把这种资源称为临界资源(物理设备、栈、变量、表格都属于临界资源)
  同时访问方式:一段时间内多个进程可“同时“访问,这个同时是宏观意义上的,微观上还是轮流使用,可以理解成也是分时复用。不过相比互斥共享来讲,是同一时刻了。
  并发和共享是最基本的两个特征。它们之间相互影响,相互制约

  虚拟

  操作系统中的虚拟技术包括时分复用、空分复用。时分复用一个具体例子就是分时系统,不同时间片分配给不同的进程。但外界看不到,像被虚拟一样的。空分复用典型的例子是虚拟存储器,用到的程序被拿到主存中。这段空间随运行情况被不断复用。

  异步

  操作系统中异步主要体现在进程执行过程中的不确定性。进程I/0时间的长短,什么时候能够得到CPU服务。这些都是不确定,不可预知的。

  操作系统的主要功能:

  谈功能就要从我们希望它干什么事儿说起。我们引入操作系统的主要目的是为多道程序的运行提供良好的运行环境,以保证多道程序能有条不紊、高效地运行,并能最大程度地提高系统中各种资源的利用率,方便用户的使用。所以主要有以下几个功能:处理机管理功能、存储器管理功能、设备管理功能、文件管理功能、与用户交互的接口以及现代操作系统的新要求。我们一一介绍下:

  处理器管理功能

  处理机的运行是以进程为基本单位的,所以所谓的管理好处理器就是管理好进程。进程到后面还会更详细的介绍,这里埋个伏笔,简单介绍下几个概念。
  进程控制:把要运行的程序叫做作业,会为每个作业分多个进程,即这些进程的资源提供给这个作业。系统是分时系统,当时间到达时,进程需要切换作业,把资源给其他的。过程的实现就是进程控制。因此进程控制的主要功能是为作业创建进程、撤销(终止)已结束的进程,以及控制进程在运行过程中的状态转换(有什么状态,后面会介绍滴~)
  进程同步:多个进程要想流畅的运行,就需要实现同步(否则的话,都要使用这个资源,冲突了就不好了)。常用来协调同步的方式有两种:进程互斥方式和进程同步方式。这与前面互斥及同步概念相似,都涉及到对于临界资源的访问。同步的实现使用了信号量机制。
  进程通信:一组合作的进程完成同一任务时需要通信以及数据传递。这个过程也应该是有条不紊的,需要管理的参与。
  调度:调度分作业调度和进程调度。作业的概念前面解释过了,就是程序。一个作业会有多个进程。作业调度就是按照一定算法从一堆待处理的程序中选出要执行的。进程调度就是为这个作业分配进程。从时间的角度上看,先作业调度,再进程调度。

  存储器管理功能

  存储器可太重要了,程序慢的很大一部分原因就是来回读写内存的时间太长了。所以管理好存储器能够大大提升性能。存储器的主要任务是为多道程序的运行提供良好的环境,提高存储器的利用率,方便用户使用、并能从逻辑上扩充内存(虚拟存储器嘛~)。
  内存分配:为每个程序分配内存空间,通过分配管理减少那些碎片化(不可用)空间。提供动态分配的可能(C语言里面时不时的malloc)。分配包括静态分配和动态分配,静态就是分多大就是多大,而且不许动。动态分配最开始是确定的,但后续可以追加,也可以移动。
  内存保护:保护每道程序的独立性,就是不让程序A去访问程序B的内存,更不能让普通用户程序去访问操作系统本身的内存。内存保护的实现是设置两个界限寄存器,一旦发生地址溢出,立马就中断执行对应的中断程序。
  地址映射:多道程序的背景下,编译链接后的可执行程序地址都是从0开始的。但真实的物理地址不是这样的,所以需要逻辑地址和物理地址之间的转换。
  内容扩充:这个内容扩充不是实际的内容扩充,而是虚拟存储器的方式,通过调度表面上提高内存大小(具体的内容查查虚拟存储器就明白了呀~)

  设备管理功能

  存储器和I/0设备可是占了计算机的半边天,要好好管理呀!设备管理的主要任务就是完成用户进程对于I/0设备的请求,完成指定的I/O操作。并且尽可能提高I/0的速度。
  缓冲处理:CPU和I/O之间的速度相差太多了,所以大多在之间设置缓冲区来提高CPU的利用率,进而提高系统吞吐量。
  设备分配:I/0设备那么多,哪个来完成任务呢?这就需要设备分配啦,设备分配的时候肯定要查询状态,同时也会保存一些信息滴(具体内容在此不展开了)。设备用完了,当然也要及时回收。
  设备处理:又称设备驱动程序,用于实现CPU和设备之间的通信(通常是设备控制器)。设备处理过程是首先检查I/0请求的合法性,判断是否处于空闲状态,启动设备完成操作。以上是CPU向I/0发送数据,倒过来的I/O中断也属于设备处理。通道(后面会介绍)程序也通过这个建立通道。

  文件管理功能

  在Linux中有种说法:一切皆文件。文件主要两种:用户文件和系统文件。我们肯定不希望我们文件中的数据是可以随意读写的,所以文件管理很重要。
  文件存储空间的管理:为一个文件分配空间,那么多文件,人工肯定不行。通过文件管理提高对于外存的利用率。
  目录管理:文件那么多,如何能在最短的时间找到我要的那个呢?遍历肯定行不通,所以在文件建立的时候就要按照一定规则建立目录,帮助索引。
  文件的读/写管理和保护:读写管理就是能让我顺利的在想读的时候读,想写的时候写。保护这个不用说,安全嘛,懂得都懂。

  操作系统与用户之间的接口

  这里面的用户有两种:普通用户,程序员。对于普通用户,不懂计算机但能够上网完成应用(像windows)就是因为操作系统提供的接口易上手。对于程序员的话,也不是每个程序员都能使用底层编程的。像一些高级语言的,都是在系统封装之后进行接口的调用。
  现代操作系统的新功能包括系统安全、网络的功能和服务、支持多媒体就不详细说了,感兴趣的自己去查查吧~

  操作系统最开始的时候只有几十K大小,但现在windows的代码听说超过几千万行。那这么庞大的软件结构是如何设计演变过来的呢?下面就来聊聊操作系统结构设计的发展史吧。大致可以分成两个大阶段:

  第一阶段:传统操作系统结构

  1.1无结构操作系统:最开始的比较小,管理比较容易。所以只注重于功能的实现,程序间来来回回的引用比较乱。初期OK,但也很快被淘汰。
  1.2模块化结构操作系统:通过对于功能的区分,将每块功能实现模块化。比如整个操作系统分成进程管理、存储器管理、文件管理。进程管理又细分进程控制、进程调度等等等。模块化的优点就不说了,说说缺点:模块之间的切分太难了,而且开发时各模块并行进行,造成各种决定的无序性,无法使开发的每一步建立在可靠的基础上。
  1.3分层式结构操作系统:既然上面无序,不可靠。那就从底层开始,一层一层的开发。确保这一层的功能完全实现了,再开发后面的。好处也不说了,这样的坏处就是效率太低,每执行一个功能都要从上到下穿越好多层(因为它也不知道这层能不能完成这个功能)

  第二阶段:微内核阶段

  在介绍这个之前,先介绍两种技术:客户/服务器模式、面对对象
  客户/服务器模式(CS模式),一方申请,一方应答。交互过程一来一回。一般服务器的资源更多。
  面对对象就是把一切抽象成对象,通过对象封装可以提高隐蔽性。对象重用也可以提高产品质量和生产率。
  微内核结构就是通过精心设计的,能实现现代操作系统最基本核心功能的小型内核。内核不是完成的操作系统,但可以通过扩展内核完成所有的操作系统功能。微内核中将一切都设定为进程,将进程分为客户和服务器两类。分别叫做用户态和内核态。微内核负责两种状态间的通信。用户态提出申请可切换至内核态完成更多的功能。操作系统及其庞大,微内核利用面对对象技术中的抽象、隐蔽原则控制系统的复杂性、利用对象、封装、继承确保操作系统的正确性、可靠性、易修改性、易扩展性。微内核技术有很多优点:系统的扩展性很好(内核确定,剩下的全可以扩展),系统可靠性更强(内核比较小,经过精心设计更加稳定)、可移植性强(所有与硬件设备相关的代码均放在硬件隐藏层,大多数是软件,与平台无关,移指代价较小),CS模式的加入更适合分布式系统,面对对象增强各方面性能。但确定也比较明显,状态来回的切换都是要花费时间的。最佳的方案是根据需要裁剪内核,实现最佳的性价比。(内核的扩展是如何完成的呢?Linux下pip install 算是内核的扩展吗?)

  写到这儿这篇文章已经接近六千字了,我们对于操作系统有了个初步的了解。我们回到最初的三个问题:
  1. 为什么要学操作系统?
操作系统是一门基础课程,通过学习操作系统可以了解程序在计算机中是如何执行的。在不同的执行阶段,程序的状态是什么样子的。学好操作系统,计算机就不再是一台机器,就变成了会说话的“人”吧。hhh
  2. 什么是操作系统? 和 3.操作系统能干什么?
  两个问题一起回答,操作系统是一组软件,通过操作系统对上可以为用户提供更方便的软件接口,屏蔽硬件的复杂性。对下可以最大限度地发挥硬件性能。操作系统的核心就是对于资源的高效管理。

  这篇文章的完成时间比我想象要久的多,可见操作系统内容的庞大。引论的内容繁多,没有引发我太多深度的思考。不过也更加发现了其中的有趣之处,引发了更多的问题,留下了更多的好奇。希望在后续的过程不断学习,不断进步吧!

因作者水平有限,如有错误之处,请在下方评论区指出,谢谢!

猜你喜欢

转载自blog.csdn.net/gls_nuaa/article/details/117757300