THU《操作系统》学习笔记——原理1:操作系统概述


THU《操作系统》学习笔记—— 原理1:操作系统概述

前言

  博主在三天前已经自学修完了THU(清华大学)邓俊辉的《数据结构与算法》课程,今天2021/11/19开始了THU的《操作系统》课程的学习。在三天前的晚上,我花了半个小时研究了一会儿自己学校的课程表以及《操作系统》的课程表,排出了60天修完《操作系统》的计划。《操作系统》课程内容非常多,是一门困难、有挑战性且有趣的课程,我个人也对有挑战性的计算机专业课很感兴趣。我打算在学习这门课的过程中,同时抽出一些时间使用markdown将课程的重点,以及《现代操作系统》这本书上相关的内容记录下来,并做成博文发在个人博客上,这是为了自己更好地回顾,也为了分享给可能需要的人。总之加油叭🍭🍭

  (OS学习笔记分为原理和实验两个部分进行更新)


1.什么是操作系统

  1. 没有公认的精确定义
  2. 操作系统是一个控制程序
    1. 一个系统软件
    2. 控制程序执行过程,防止错误和计算机的不当使用
    3. 执行用户程序,给用户程序提供各种服务
    4. 方便用户使用计算机系统
  3. 操作系统是一个资源管理器
    1. 应用程序与硬件之间的中间层
    2. 管理各种计算机软硬件资源
    3. 提供访问计算机软硬件资源的高效手段
    4. 解决资源访问冲突,确保资源公平使用

1.1 操作系统的地位

  从内部结构上来讲,可以分成几个部分,其中操作系统在中间层,硬件在最下层,而应用在操作系统的上层,应用又可以分为系统应用和应用程序。我们一般把操作系统所在的一层称为内核态,而操作系统上面的则称为用户态。

  做操作系统的人,是在硬件基础上做操作系统,属于系统设计者;而写应用程序和系统应用的人,是利用操作系统提供的功能给出应用程序和系统应用,属于应用开发者;最后,应用程序的使用者属于用户。
内部结构

  操作系统实际上就是在硬件进行一层隔离,对上面的应用提供我们通常所见到的逻辑这些资源,比如进程、文件、地址空间,这些都是在操作系统之后给用户程序看到的情况。
操作系统隔离硬件层


1.2 操作系统软件的分类

  操作系统是一个软件,在软件划分当中,实际上可以把软件分为应用软件和系统软件,系统软件又可以把它分成系统应用和操作系统,而在操作系统中核心的内容是内核,而命令行由于它和操作系统内核关系非常密切,所以把它分到操作系统里,有时候也会把命令行认为是系统软件的一个组成部分。
操作系统软件的分类


1.3 操作系统软件的组成

Shell–命令行接口

  • 通过键盘操纵
  • 方便用户进行命令输入

    GUI–图形用户接口

  • WIMP(视窗(Windows)、图标(Icon)、选单(Menu)、指标(Pointer))
  • 直接操作和所见即所得

    Kernel–操作系统的内核

  • 执行各种资源管理等功能

    1.4 操作系统内核特征

    1.并发

  • 计算机系统中同时存在多个运行的程序,需要OS管理和调度

      具体意思为:如果有多个应用程序交替运行,需要知道当前每一个应用都执行到什么位置,当前正在执行的是哪一个应用。如果发生应用切换,那么切换到下一个应用时,下一个应用上次执行到什么位置,这次就该从上次执行的位置开始。当时的状态是什么样,这些都由操作系统来维护。

    2.共享

  • “同时”访问
  • 互斥共享

      共享是指多个应用并发运行的时候,宏观上要体现出它们同时在访问资源的情况,而微观上要实现它们的互斥访问。比如两个应用同时访问内存,这时我们要知道这两个应用分别访问了哪块内存,它们之间不能访问错了,即一个应用需要保护的内存资源不能让另一个应用访问,在微观上操作系统需要对它做很好的隔离。在数据总线上任何一个时刻,只有一个应用去访问存储单元,这就是微观上的互斥。

    3.虚拟

  • 利用多道程序设计技术,让每个用户都觉得能有一个计算机都在专门为他提供服务。

      多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序(早期的操作系统)控制之下,相互穿插的运行。

      如何做到让每个用户都觉得整个计算机都在专门为他提供服务,实际上就是由于每个应用程序交替运行的交替频率非常高,让用户在用的时候感觉不太出来这台机器还有其他用户在用。不过若负载大到一定程度,用户是可以感觉到的。

    4.异步

  • 程序的执行不是一贯到底,而是走走停停,向前推进的速度不可预知。
  • 只要运行环境相同,操作系统要保证程序运行的结果也相同

    清华ucore教学操作系统内核


    2. 操作系统的演变

  • 单用户系统(1945-1955)

      操作系统=装载器+通用子程序库

      问题:昂贵组件的低利用率

      利用率=执行时间/(执行时间+读卡时间)

  • 批处理系统(1955-1965)

      由于当时的计算机非常昂贵,人们很自然地要想办法减少机时的浪费。通常采用的解决方法就是批处理系统。

      批处理系统的做法是:把输入和打印的设备换成周边设备,而不是用昂贵的计算机来做。而CPU执行这一部分,要让它尽可能快,让这一部分顺序快速地执行。为了让它能快,把若干个作业放在一起,他们在执行的时候还是顺序执行,结果一块顺序打印。

      ps:由《现代操作系统》的描述所说,在真正的批处理系统上是:批量作业的这些卡片被读进磁带,然后磁带被送到机房里并装到磁带机上。随后,操作员装入一个特殊的程序(现代操作系统的前身),它从磁带上读入第一个作业并运行,其输出写到第二盘磁带上,而不打印。每个作业结束后,操作系统自动地从磁带上读入下一个作业并运行。当一批作业完全结束后,操作员取下输入和输出磁带,将输入磁带换成下一批作业,并把输出磁带拿到一台1401机器上进行脱机(不与主计算机联机)打印。若真实情况为书上所说,那么该课程这个部分可能有误,最后不是顺序打印,而准确应该称为顺序输出(到第二盘磁带)。

    批处理图示

  • 多道程序设计系统(1965-1980)

      多道程序设计系统的出现再一次提高了效率,它的原理是保持多个工作在内存中并且在各工作间复用CPU。举个例子:有一个个作业开始按顺序执行,其中有一个做I/O(输入输出操作),做I/O时程序通过系统调用(System Call)进入操作系统里来布置相应的I/O设备进行I/O操作,那在进行I/O操作的过程当中,计算机系统和CPU就会进入等待,等到I/O结果返回为止。为了不浪费掉这段等待的时间,多道程序设计系统是让系统同时存在多个作业,然后在第一个作业空闲的时候,执行第二个作业,等到第一个作业的I/O结果返回之后,系统再切回来继续执行第一个作业。这时候在内存里的程序则由原来的顺序执行,变为了多道程序的交替执行。交替的条件是前一个正在执行的程序主动让出CPU的使用权,有了这一条件以后CPU就可以变成是连续的,尽可能地处于运行状态了,那么效率就又可以进一步提高了。
    多道系统图示

  • 分时系统(1970至今)

      分时系统与多道程序设计系统一样,仍然是在做多个程序的交替执行,但是交替的条件不一样了,变为了时钟中断。即每一个作业执行一段时间之后,硬件会产生一个时钟中断,时钟中断时会暂停当前进程的执行,之后由操作系统去调度让另一个程序继续执行,等它的时间再一个时钟中断后又让下一个程序执行。
      看到这你可能会疑惑,这个利用时钟中断来交替执行程序有什么作用吗?我举个例子:如果我有一个作业在前边,并且要花很长时间来计算,而后边又来一个作业仅仅是做编译测试,也许编译还不一定能通过。如果是分时系统,每个作业算一点,这个做编译的作业很快就能退出了。之后经过各程序的交替执行,耗时短的作业都算完了,当系统只剩下这个耗时长的作业时,它就可以一直算下去了。这样一来,就可以减少用户等待的时间。

      那么分时系统的性能是在什么地方做提升呢?它的提升并不是在于提高CPU的效率,具体是因为在CPU中加入这种调度之后,它的性能从某种角度来说会下降。它的性能提升是由于让一些短时间的作业公平性能更好了,节省了短时间用户的时间,从这个角度来讲仍然是提高效率的。到了分时系统,CPU效率就基本上提升到极致了。
    分时系统图示

  • 个人计算机操作系统

      在个人计算机操作系统里,效率已经不再是关注的重点了,而易用性成为个人计算机操作系统的重点。在个人操作系统中,因为网络的出现,计算机变成了一个沟通和交流的系统了,因此,安全的问题在操作系统里的重要程度就有所上升。
    个人计算机操作系统介绍

  • 分布式操作系统

      分布式操作系统是有了网络之后,在多台机器之间需要有数据的共享和协调,然后在一台机器里,也可能使用多个CPU,那么这个时候多个CPU和多台机器的互联使用,这时候可能提高的结果使得我们系统的可用性和可靠性进一步提高。

      我们经常见到的一种典型场景是:若干个用户通过网络链接在一起,有服务器提供一些共性的资源的分享,各个用户在自己的机器上进行相应的处理,这使得整个网络可以开始去处理一些实时的信息,比如说我们在这样的系统里面,就可以去买车票,网购等。

    分布式操作系统介绍


    3.操作系统的结构

    3.1 简单结构

      最早的时候操作系统实际上是一种简单的结构,对下直接控制硬件,对上提供用户应用程序所需要的服务。中间的功能实际上实现得很简单,在BIOS里有一层对硬件进行管理的驱动程序,然后在操作系统内部把这一层的功能做了更进一步的完善,这种完善形成了系统里的驱动。然后还有一些常驻的服务系统程序,最上边是应用程序。应用程序可以使用操作系统提供的设备驱动服务,也可能会直接使用底层BIOS提供的服务。在这个结构下,它没有进行模块化的划分,在实现时操作系统的代码也主要是由汇编语言来写的。基于这种情况,操作系统只能用在一个平台上,到其他平台上是不能使用的。所以这样的话,每一个操作系统是针对特定的一个硬件平台来写的,在这个阶段有很多种操作系统,在PC机上主要是DOS系统,它只能用在X86的系统上。
    简单结构


    3.2 分层结构

      分层结构实际上是随着Unix系统不断地发展完善形成的。在分层结构当中,操作系统的功能被分为若干层,最底下一层是硬件,最上面一层是用户接口,在中间实际上是按照功能的丰富和完善程度分为了N层,每一层只使用下一层提供的服务。这种分层结构使得各层的依赖关系得到一定的限制,使得操作系统可靠性能够进一步提高。但分层结构随着层次的增加,各种层次依赖关系也会越来越复杂,复杂之后的结果是操作系统内核里的东西越来越多,效率也就越来越下降。

      分层结构最大的贡献在于,它把可移植性作为操作系统的一个重要目标。以前是对一个特定的硬件平台需要对他写一套全新的操作系统,现在只需要把整个操作系统代码分为两部分,一个是与硬件平台无关的部分,这部分用高级语言来实现,而另一部分是与硬件平台密切相关的部分,这一部分仍用汇编语言来实现。做了这种划分之后操作系统的移植只需要改汇编代码的部分。

    分层结构


    3.3 微内核结构(Microkernel)

      因为分层结构层次多会变得效率低,微内核结构希望能把内核提供的一些服务放到用户态,这样的话能提高系统的效率,所以做了一种尝试。微内核结构把尽可能多的内核的功能放到用户态,在内核里只保留进程间通信和底下对硬件的支持。在这种结构中,如果用户态应用程序想使用传统内核中提供的系统服务功能,它需要先绕到内核再回到用户态,这样做之后它的安全性和可扩展性就会大幅度提高,但是这也会有问题,即性能会有大幅度下降。

      我们现在用到的操作系统,是微内核结构和分层结构的一个混合体。在这种情况下,我们可以注意到操作系统里有一部分的内容,在某一个版本里是放到内核里面,而到了另一个版本里又把它放到用户态去了。
    微内核结构


    3.4 外核结构(Exokernel)

      外核是针对微内核结构的进一步改进。它的做法是在内核里放更少的东西,内核只是起到资源的保护和隔离的作用,然后把资源管理的任务交给用户态的应用代码去完成。而原来操作系统的功能是由用户态的函数库来提供。

      在外核结构中的硬件资源上边只有一层薄薄的安全绑定,在这个安全绑定里,它控制哪些资源归哪一个系统使用,而相应的资源管理由各自的系统自己维护。在这种情况下,我们可以在一个系统上支起不同的操作系统服务。
    外核结构


    3.5 VMM(虚拟机管理器)

      在虚拟机管理器结构里,硬件之上加了一层VMM(虚拟机管理器),它负责把真实的硬件虚拟成若干个虚拟的硬件,然后操作系统在这上面来实现传统操作系统的功能。VMM的功能就是负责决定每一个虚拟机可以使用哪一些硬件资源。有了这个管理器之后,传统的操作系统与硬件和应用之间的关系就会发生一个变化。原来的操作系统是直接底下接触硬件,上面对应用提供服务,而这是VMM和硬件打交道,操作系统和VMM打交道,但是操作系统有一部分还是直接和硬件打交道。这个时候的区别就在于VMM负责资源的隔离,操作系统负责资源的管理。
    虚拟机管理器


    总结:

      第一讲的主题是操作系统概述,这一讲主要介绍了操作系统的概念、操作系统的历史演变、操作系统的结构。我认为了解操作系统的这些基本概念还是很重要的,因为你不可能在不了解操作系统的情况下还想能做出一个自己的小型操作系统。不过可能会有许多人对于去学习去记住这些很长的概念很反感,或者是说感到棘手,觉得不好记住,或者记了就忘。我建议大家对于概念的学习,可以使用费曼学习法,把概念看几遍感觉懂了之后,说给别人听,如果没有人愿意倾听你也可以想象着说给别人听。除了费曼学习法之外,你还可以尝试画图,把你学到的东西尝试用画图的方法表示出来。或者,有条件的话你也可以像我一样在个人网站发篇文章记录一下?总之,找到自己适合的学习方法是最重要的。

      接下来学习OS(操作系统 Operating System)的道路还很长,OS是一门困难的课程,但如果学会了之后,当你可以用你自己的代码自由操纵一台机器时,会是一件很有成就感的事情。当然OS也是不完善的,目前为止每种OS都还存在着缺陷,所以我们在写OS实验时也会常常经历不少Bug。OS很可能是我们本科学过的课程里代码量最庞大的,比如清华Ucore教学实验OS就有1万+行代码,当然这比起其他OS代码量算很少的了。

      OS虽然看起来是很困难的,但是凭着我们的恒心和时间的投入,也是可以在一个学期可以理解OS的原理和简单实现的。所以,如果你也是还未开始学习OS,但近期打算开始学习OS的人,那么我们大家一起共勉,一起在学习OS的道路上加油吧!🍭🍭

    第一讲小结


  • 文章作者: 金毛败犬
    版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 金毛败犬 !
    评论
      目录