操作系统概论

        硕士研究生毕业三年多了,自己在技术深度上成长颇浅,感觉自己对于一些技术理解的顶峰还维持在研究生阶段,还是有必要重读经典的;操作系统真是个太重要的东西,它是应用程序在计算机上运行起来的基石,给自己定下2019年的技术目标,深入研究操作系统,从重温经典开始;

        在2018年下半年中,我已经深入阅读了<<数字电路>>、<<计算机组成原理>>、<<汇编语言(王爽版)>>,<>。这些书籍让我对底层硬件有了更深刻的认识,尤其是<>,基本上用汇编语言实现了一个简易的操作系统雏形。印象比较深刻的是李忠老师对于实模式下程序加载器的源码实现,对于磁盘IO的输入输出指令的实现;保护模式下的内容章章精彩,每章都可以看做是操作系统课程的一个独立的模块,对32位保护模式的介绍,内存分段的扩充,GDT(GDTR)表的创建,32位保护模式下处理器采取的保护措施,尤其是特权级的概念,调用门的概念,有了这些概念自然而然就讨论到了任务(对应于操作系统中的进程),为了构建任务CPU提供了一系列的支持;任务的代码段、数据段、堆栈段、LDT,LDTR,TSS,TR,TCB,TCB_CHAIN等用于任务管理必要的概念,这些在操作系统领域就对应进程管理和内存管理的知识。随即切入到任务切换(对应于操作系统中的进程切换),任务切换有协同式和抢占式两种,协同式由任务主动发起任务切换,抢占式由硬件定时器中断定时发起任务切换。最后对内存分页分段做了精彩的介绍,有了这些铺垫知识,可以无缝切入到高级操作系统学习的课程中来。同时李忠老师也仅仅是对任务执行做了入门级别的介绍,高级操作系统教程刚好是对任务执行的深入讲述。

        2019年个人技术能力提升部分focus在操作系统领域,从阅读经典开始,<<操作系统精髓与设计原理>>,<<现代操作系统>>,<<操作系统概念>>这三本书齐头并进阅读,中间穿插郑刚老师的<<操作系统真像还原>>一书在虚拟裸机上实现个简易操作系统雏形当做实践部分的辅助;通过这几周的阅读,感觉<<操作系统精髓与设计原理>>一书讲的是最好的,内容详细而不啰嗦;并且不是一上来就讲最复杂完美的系统,而是从最简单的模型开始介绍,逐步在此基础上增加功能日臻趋于现代高级操作系统;同时每章后面都会拿现如今市面上最成功的windows,UNIX,LINUX来讲述该部分概念的实际实现,使抽象的概念立即形象亲切起来。

        现在阅读完了三本书的概述部分,总体上来说主要讲了以下几个问题,操作系统是什么、操作系统发展历史、计算机硬件基本组成、计算机系统的体系结构,现代操作系统基本构成;下面针对这些问题做一个简单的论述:

       1,操作系统是什么   

操作系统概论_第1张图片    

           

          如上图所示是从用户到计算机底层硬件的分层架构,从中可以看出操作系统所处的位置。它的主要目的是方便应用程序的编写和执行。它位于应用程序之下,硬件之上,起着进程管理、内存管理、文件管理的作用。

       1.1,从扩展机器功能的角度讲,操作系统封装了底层硬件的访问细节,给上层应用提供抽象的方便调用的统一接口。

       1.2,从资源管理的角度讲,应用程序的执行可以抽象为进程,进程执行需要很多的资源,有CPU执行时间、内存地址空间、磁盘存储空间、IO设备支持等。操作系统以多路复用的方式实现对资源的管理。多路复用有时间上的多路复用和空间上的多路复用两种,时间上的多路复用比如操作系统控制CPU执行时间在各个进程之间切换;空间上的多路复用比如操作系统控制进程内存分配,磁盘分配,IO分配等。

       2,操作系统发展历史

            2.1,真空管和穿孔打卡时代

                     那个时候的计算机只能由一个程序员独占使用,通常的使用方式是这样的:程序员进入计算机机房,在门牌号上写上本人占用该计算机,然后将0101字符穿孔打卡到纸带上输入计算机,计算机运行完将结果输出到纸带上让程序员带走,程序员把门牌号上的名字去掉;此时下一个程序员可以进来使用该计算机。

 

            2.2,晶体管和批处理时代

                     除了运行的程序不同以外,每个程序员做的都是一些例行公事的操作。此时由一个专业的程序员独自管理该计算机,每个用户把自己的纸带送给这个专业的程序员,该程序员将所有的纸带组合到一个纸带上,并标记出每个程序的开始和结束标识,计算机挨个串行地执行该纸带上的程序,最终将结果输出;纸带上的输出也是每个程序的输出,有开始和结束标识,最后由专业程序员将纸带上的结果再减掉给到每个用户。

                    注意此时虽然计算机可以批量处理,但是本质上每个程序还是串行执行

 

            2.3,集成电路芯片和多道程序设计时代

                     在批处理程序过程中,每个进程如果全部是内存操作那也无妨。关键是有些进程会等待IO,此时宝贵的CPU资源就被浪费了。此时计算机科学家们将多个进程同时放到内存中,给它们分时地分配时间片。如果有一个正在执行的进程被IO阻塞,那么操作系统可以将CPU时间片切换到另一个就绪的进程让其执行。等到IO完成,IO会给CPU发中断,CPU将被阻塞的那个进程重新调度起来执行。这样做显著提升了CPU的使用率。                     

 

            2.4,个人计算机时代

                     当今社会人们和计算机做交互,所以出现了分时系统,分时系统允许程序员和计算机做友好的人机交互。分时系统本质上还是多道程序设计系统。

 

       3,计算机硬件基本组成

             计算机硬件由CPU,存储器,输入输出设备组成,通过总线将各个部件连接起来。

             3.1,CPU

                      CPU的主要作用是取指令和执行指令,CPU运算器、控制器、中断系统、寄存器组成。指令的执行过程如下:

                                                           取指令------>分析译码指令----->执行指令------>响应中断

指令存放在磁盘中,由程序加载器将其加载到内存,程序计数器(程序计数器是操作系统中的抽象概念,具体到不同的CPU有不同的实现;比如在X86体系中由CS:IP寄存器指向,在奔腾系列体系中由PC寄存器指向)指向下一条要执行的指令。控制器的取指令单元将程序计数器指向的指令取到指令寄存器(指令寄存器用来存放当前正在执行的指令),同时将程序计数器指向下一条指令的的起始地址。分析译码指令部件分析该指令的操作码,寻址操作数。指令执行部件执行指令。指令执行完毕之后CPU会去判断有没有中断请求,如果有中断请求则保护现场,转去执行中断处理程序,执行完毕后再继续返回来取指令和分析指令。如果没有中断请求则继续取指令执行指令。

                      中断是整个现代操作系统的基础。如果没有中断,根本没有多道程序处理和用户实时交互。通过中断可以触发进程切换,响应用户输入以实现人机交互,异常处理保护等。                      

 

             3.2,存储器

                      存储器本质上是用来存储程序和数据的,我们所有的程序和数据最终都存储在磁盘上面。存储器设计主要需要考虑容量、速度、价格三者之间的协调,然而这三者如果分布式领域经典的CAP理论,没有一种存储介质可以同时满足容量大、速度快、价格低这三方面的优势,所以人们必须在三者之间做出权衡以选择最合适的存储介质。

                      操作系统概论_第2张图片

                     存储器层次结构如上图所示,最下层的磁盘和磁带是靠电磁特性做出来的存储容量极大的非易失性存储设备,我们所有的程序和数据的起点和终点都在这一层上面。内存、高速缓存、寄存器都是速度快的易失性存储设备。内存是磁盘的缓存,磁盘中的指令和数据被加载到内存供CPU执行或者访问。基于程序的时间局部性和空间局部性原理设计处理高速缓存,这里的高速缓存是硬件层面的东西,操作系统不感知。寄存器是访问速度最快的存储设备,其速度和CPU一样快。

                    寄存器非常重要,寄存器从大的方面可以分为如下三类:

                    3.2.1,通用寄存器

                                通用寄存器是最普通的寄存器,可以存储常用的数据、地址等。

 

                    3.2.2,段寄存器

                                段寄存器在X86体系中有代码段寄存器CS,数据段寄存器DS,堆栈段寄存器SS,附加段寄存器ES。CS指向正在执行的代码段起始地址,DS指向数据段起始地址,SS指向堆栈段起始地址,ES段寄存器可以另作他用。

                                在X86体系中,一般CS寄存器和IP寄存器配合使用指向将要执行指令的起始地址,IP寄存器指向代码段中正在执行指令的偏移地址。对于数据的访问DS寄存器可以和通用寄存器结合起来使用。对于堆栈段的访问,SS寄存器和SP寄存器结合起来,SP寄存器指向堆栈顶。

 

                    3.2.3,控制和状态寄存器

                               这里我着重介绍一下状态寄存器EFLAGES,EFLAGES寄存器记录算数逻辑运算的结果,当前程序的模式状态、中断允许标识等。该寄存器非常重要,可以用于做程序条件跳转。

                   CPU中的寄存器非常重要,它记录了进程的运行状态。CS:IP记录了当前进程执行到哪一步了,DS寄存器记录了当前进程数据访问到哪一步了,SS:SP记录了当前进程堆栈访问到哪一步了。EFLAGES寄存器记录了进程执行过程的中间结果。在进程切换的时候,需要将进程的这些寄存器通通保护起来,下次再切换到该进程的时候可以从这些寄存器中恢复进程终止时的状态。

 

             3.3,输入输出设备

操作系统概论_第3张图片

                       输入输出设备简称IO设备,是程序和数据的起点和终点。每种IO设备上面有设备控制器,设备控制器中有端口(寄存器),这些端口规定了程序和设备打交道的方式,端口按照用途可以分为地址端口、数据端口和控制/状态端口。程序不直接和IO设备打交道,而是和设备控制器打交道,更具体地说是程序和设备控制器中的端口打交道,端口将指令交给设备控制器,设备控制器再负责和具体的IO设备交互。

                       虽然程序直接和端口打交道了,但是直接用in/out指令访问端口依然十分细节和繁琐,因此我们为每种设备写了一套设备驱动程序,设备驱动程序给操作系统访问IO设备提供了一套优雅简洁抽象的接口。

                       随着IO设备数的增多,操作系统还是要感知到多种设备驱动程序,因此操作系统在各种设备驱动程序上面又封装了一层更加抽象通用的接口-----------文件,因此文件就是输入输出,对任务IO设备的访问都可以抽象为对文件的访问。这里着重解释一下为什么说网络访问也是文件?对于一个单台计算机而言,网络也可以理解为它的输入输出,它通过网络和其他计算机上的进程通信。网络也有自己的网络设备驱动程序,因此对网络的访问也可以抽象为对文件的访问。

 

             3.4,总线

                     计算机中CPU,内存,IO设备都是通过总线以分时复用的方式连接起来的。总线按照功能可以分为地址总线、数据总线和控制/状态总线。CPU对任务数据或者指令的访问都是通过地址信息、数据信息和状态/控制信息完成的。

 

       4,计算机系统的体系结构

             4.1,单处理器系统

                      单处理器系统是指只有一个CPU的计算机,在同一个时间片内只有一个进程可以处于运行状态,其他进程都处于非运行状态。

 

             4.2,多处理器系统

                      多处理器系统是指在同一个计算机内有多个CPU的系统,这多个CPU共享同一份物理内存。此时在该计算机中可以有多个进程同时处于运行状态,对物理内存的共享访问也更复杂。现在比较流行的一种做法是将多个CPU集成到同一个芯片上面,叫做多核处理器。

 

             4.3,集群系统

                      集群系统也叫做分布式系统,是通过网络技术将多台服务器连接在一起并处于同一个局域网内而形成的系统。集群系统中有N台计算机,每一台计算机有可以是多核的。集群系统可以是对称的,也可以是非对称的。对于对称集群系统,集群中任何一个节点的地位都是等价的,外围系统不管访问集群中哪一个节点,所得到的结果都是一样的,各个节点之间互为主备,互相监控。对于非对称集群系统,两个节点为一组,一主一备。分布式系统又是另一个很大的领域,其核心问题是解决数据存储的分布式一致性问题,关于分布式系统理论就不在这里讨论了。

                      现在公司使用的数据库系统我理解本质意义上还是一个单点的数据库系统,虽然做了LDC改造,但是同一个ZONE内的读写还是只能访问到单台数据库上,只有在发生异常或者主库性能很差的时候才会开启主备切换,切到备库去访问。还无法做到单ZONE的读写访问本ZONE内任意一台服务器都是一致的的地步。

 

       5,现代操作系统基本构成

            在第一代计算机时代时,是没有操作系统的概念的。操作系统是随着时间的发展慢慢成长起来的,现代操作系统基本上分为进程管理,内存管理,文件管理,安全和保护五个部分的内容,下面分别予以阐述:

            5.1,进程管理

                     操作系统最基本的功能就是方便用户程序的执行,操作系统将执行中的程序抽象为进程的概念。所以肯定要有进程管理部分,另外组成进程的代码和数据肯定要位于内存地址空间中,所以肯定要有内存管理。进程本身也是一段程序和数据,这部分程序和数据在没有执行的时候存储在磁盘上面,在要执行的时候需要加载到内存里面,所以需要对磁盘进行管理,对磁盘的管理可以抽象为对文件的管理。进程在执行的过程中彼此应该是互相隔离的,另外对于操作系统内核也应该提供相应的保护机制,所以自然而然就引入了安全和保护的话题。

                    在进程管理这一部分中,就单个进程来说,操作系统需要提供进程创建,进程调度,进程执行,进程终止等一系列的功能。就多个进程来说,操作系统需要提供进程通信的机制,在进程通信的同时势必涉及对共享内存区域的访问,所以需要有一定的进程同步机制,进程同步又带来了死锁、并发的问题。

                    所以进程管理可以分为进程创建、进程调度、进程执行、进程终止、进程通信、进程同步、并发、死锁等内容。

 

            5.2,内存管理

                     进程的执行需要将指令和数据加载进内存,内存空间又是有限的,不同的进程间内存空间又是隔离的,所以操作系统需要有一系列的手段来对进程运行时内存进行管理。主要是记录该内存空间的哪一部分正在被使用以及被谁使用,决定进程的哪一部分会被调入内存或者调出内存,根据需要动态的分配和释放内存。

 

            5.3,文件管理

                     进程所依赖的指令和数据是存储在磁盘上面的,进程执行过程中需要有输入输出,对这些输入输出的访问都可以抽象为对文件的访问,因此操作系统需要以文件的形式对磁盘和输入输出进行管理。

 

            5.4,安全和保护

                     进程对计算机资源的访问是有限制的,计算机资源也是需要被保护的,操作系统需要提供一种机制来实现对计算机系统资源的保护。

 

              这是对操作系统的概述,下面简单讲讲操作系统的启动过程。计算机一加电或者一复位,程序计数器固定指向BIOS的顶部区域,那里是一条跳转指令,跳转到BIOS的底部开始执行硬件检查操作。内存是由动态电容做的RAM组成的,属于易失性存储介质。但是内存中有一部分区域是由ROM组成的,ROM是只读存储器,该部分指令一经烧录进去就永久保存了,BIOS就存储在这块ROM中。 BIOS最后将磁盘主引导扇区(磁盘第一个扇区)512B的内容复制到内存0X7C00处,再将程序计数器跳转到0X7C00处开始执行磁盘主引导扇区代码。磁盘主引导扇区的主要作用是加载操作系统内核,磁盘主引导扇区构成如下:

              446字节的引导程序及其参数

              64字节的分区表

              2字节结束标记

              64字节的分区表中存放了4个分区信息,每个分区表16字节。分区表标记了磁盘某个指定分区的起始结束扇区号,分区类型符,分区是否是活动分区等基本信息。446字节的引导程序通过分区表找出活动分区,将活动分区第一个扇区(OBR引导扇区)的数据复制到内存,OBR引导扇区存放的是操作系统内核程序加载器,然后由内核加载器将操作系统内核程序加载进内存,并将程序寄存器指向操作系统内核代码入口地址处,接着开始执行内核代码,启动整个操作系统。

你可能感兴趣的:(操作系统概论)