操作系统(一)—— 操作系统的作用
概述
本文是介绍操作系统文章的第一篇,主要介绍计算机的硬件和软件构成,以及软硬件是如何配合工作的,操作系统在其中扮演的角色,本系列文章主要介绍操作系统的几个核心的问题,比如操作系统的内存管理,文件系统,进程调度等,由于我并不是一个专业的操作系统工程师,😄,所以写作的时候不会写很多书面语言,会使用通俗易懂的方式讲解。
计算机组成
概括的说计算机是由硬件和软件组成的,软件是运行在硬件上的,就像人的灵魂需要依托于人的身体一样,所以要想搞明白操作系统这个系统软件的作用,就要先了解一下计算机的硬件,下面就先介绍一下经典计算机的基本硬件组成。
计算机硬件
下图是个人计算机的一些基本组成部分。
(图片来源:现代操作系统)
图中的硬件可以划分为如下几个部分:
- CPU
- 内存
- io设备
- 总线
下面就逐一简单介绍一下上面的几个部分
CPU
cpu是计算机的“大脑”,就像人的大脑一样,我们都希望我们的脑子转的快一点,cpu也是如此,我们希望cpu运行的越快越好,这样当我们让cpu去运行一个程序的时候就可以更快的完成,为了让cpu更块的运行程序,计算机科学家们做了如下的工作。
- 采用“流水线”工作模型。要了解流水线方式,我们先说一下非流水线的方式,cpu的运行方式是从内存中取出一条指令,之后经过解码、之后再执行,也就是说要经过三步,如果把cpu比作一个加工厂,那这个加工厂必须要一个步骤一个步骤去做,在取指令的时候,无法进行解码和执行操作,流水线的方式就是相当于cpu中有3个模块,可以类比三个工厂,同时做这三件事,就是说cpu可以同时取出多条指令,然后进行解码,就是说执行不用等待了,前面两个工厂会源源不断的生产解好码的程序,这样就高效很多,所以叫做流水线的方式。
- 提高cpu频率。这个就是我们在很多地方经常听到的“摩尔定律”,这个定律说芯片中晶体管的数量每18个月翻一翻,摩尔是因特尔公司的联合创始人。在过去的几十年中cpu的速率从几十KHz到现在的4GHz,提升了数10万倍,但是从2004年之后,摩尔定律基本就失效了,cpu的频率再也没有发生质的提升。
- 多个cpu一起执行。既然单核cpu的频率无法获得大的提升了,那就搞多核一起处理,相信大家都听说过我们国家的天河一号,超级计算机,下面我贴一下天河一号所使用核数。
(数据来源:百度百科)
- 使用多级缓存。现在的cpu单核频率达到4GHz,内存的速度远远跟不上cpu的速度,所以就在cpu中搞了很多的寄存器和高速缓存,cpu运行的时候先去高速缓存中查看有没有自己需要指令和数据,如果有就直接使用高速缓存的,如果没有再去内存中获取,这个下一部分讲内存的时候还会详细介绍。
除了非常简单的cpu之外,多数cpu都有两种模式,即内核态和用户态,运行在内核态模式的cpu可以运行所有的cpu指令和访问计算机所有的硬件,相反,运行在用户态时只允许访问所有指令集的子集和访问所有功能的子集,一般情况下,用户态时访问i/o和内存保护的所有指令时禁止的,在个人电脑和服务器上操作系统运行在内核态。
用户态到内核态的切换
上面介绍了cpu的两种模式,那在用户态模式下如何切换到内核态,下面就逐一介绍。
- 系统调用:当应用程序在用户态运行时,由于本身的特权级别比较低,所以很多功能不能自己完成,这个时候就需要调用操作系统暴露的接口,为什么要调用操作系统的接口,因为操作系统运行在内核态,可以执行所有的功能,举例,如果程序中执行printf("hello world")这条指令,处于用户态的程序就会发生系统调用,操作系统会打印hello world。
- 异常:处于用户态的程序运行过程中出现了自己无法处理的异常,就需要处于内核态的操作系统去处理,操作系统怎么处理呢,操作系统会kill掉程序,比如程序中执行了int a = 1/0;这种操作系统就会执行kill掉用户程序,如果发生了缺页异常(对于什么时缺页异常不是很明白的胖友不用着急,这个是操作系统内存管理方面的知识,后续会讲解),操作系统会处理缺页异常,当处理成功之后会让程序继续执行。
- 中断:当外围设备完成用户请求之后,就会对操作系统发起一个中断,由于中断是一个优先级比较高的操作,所以操作系统会先暂停当前用户态正在执行的程序,而优先处理中断,举例:比如当有个用户态的程序去读取磁盘上的文件,由于读取比较耗时,操作系统一般都会去让别的程序执行,但是一旦读取文件完成,磁盘就会向操作系统发出一个中断操作,操作系统会先暂停当前正在运行的程序优先处理这个。
内存
内存是我们日常生活中的叫法,其实平时我们说的我的电脑内存8G,指定是主存,除了主存之外还有很多的缓存,看下面的计算机存储层次结构
(图片来源:现代操作系统)
理想情况下,我们都希望我们的存储设备越快越好,而且价格便宜,但是现实世界往往是鱼和熊掌不可兼得,往往比较快的缓存价格就越贵,所以就有了分层的存储体系结构,下面就逐一介绍一下上面的各层级缓存。
- 寄存器:使用和cpu相同的材料制作,速度和cpu相同,但是价格昂贵,寄存器可分为通用寄存器,专用寄存器,控制寄存器。这里举几个例子,说明每种寄存器中保存的是什么数据。cpu用来保存关键变量和临时结果的寄存器使用的是通用寄存器;用来记录程序执行到什么地方的程序计数器保存在专用寄存器中。
- 高速缓存:由于寄存器和主存的速度差的还是太多,所以在寄存器和主存之间又高了个高速缓存。在现代cpu中,很多都实现了多级高速缓存,比如itel i7,就使用了3级高速缓存,L1缓存(可分为L1 d cache:缓存数据。L1 i cache:缓存指令),L2缓存,L3缓存,下面我贴一下itel缓存图。
- 主存:我们在平时使用计算机时,运行的软件都是需要先从磁盘加载到内存中才可以运行的,现在使用的内存基本上都是8G,或者16G等,但是在早期的计算机中内存只有几百kb,如何有效的利用内存,以及内存满了之后如何处理,早期的计算机科学家在这方面做了很多的工作,操作系统有一个很重要的功能就是内存管理。
- 磁盘缓存:如果内存需要每一个数据都访问一次磁盘,那效率太低了,因为磁盘对于随机读写的效率非常低,这是由磁盘的工作方式导致,所以就搞了一个磁盘缓存,在从磁盘读取数据时,根据局部性原理把目标数据附近的数据都读取出来放入磁盘缓存中,写的时候也是一样。
I/O设备
所谓的I/O设备,其实就是输入输出设备,可以与计算机进行数据传输的硬件,包括键盘,鼠标,打印机,磁盘等。I/O设备分为电子部分和设备部分,其中设备部分就是硬件,电子部分就是控制设备的软件,简称I/O控制器或者适配器。在我们使用显卡等程序的时候,都需要安装显卡驱动,这个其实就是一种驱动程序,驱动程序是和I/O控制器进行交互的,由于I/O控制器有多种,所以每个不同的I/O控制器就需要不同的设备驱动器来与之对话,通常设备驱动器都是装在操作系统,在内核态运行,因为这个是需要操作硬件的权限。
以上介绍了I/O硬件,I/O软件,也就是I/O控制器,还有与控制器交互的设备驱动器,有了上面3个东东,那怎么实现输入和输出,一般来说有下面三种方式。
- 忙等待:用户程序发起一个系统调用,然后设备驱动器启动I/O,并启动一个死循环检测该设备的响应,当I/O结束时,设备驱动器把数据放入特定的地方并返回,之后操作系统将控制权交给控制程序。
- 中断:在上面的忙等待中设备驱动器启动了一个死循环一直去检测,这很浪费CPU资源,而中断就是为了解决这种问题,具体的做法就是当设备驱动器启动I/O之后,操作系统就会安排别的进程进行执行,把当前进程挂起,当I/O完成时设备会发起一个中断,这时设备驱动器会返回,操作系统就会知道I/O完成了。
- 直接存储器访问(DMA):CPU直接存取I/O设备过于浪费时间,于是引入DMA方便处理,它就像CPU的小助手,独立于CPU,可以实现对几乎所有I/O设备的访问,读写。很多时候,都是主板自带一个DMA控制器,这样CPU直接访问它就可以了。
磁盘是一种很重要的I/O设备,这里单独介绍一下。
几个概念解释一下:
盘片:磁盘并不是一个盘,而是很多个盘片。
磁头:每个磁盘分为上下两面,都可以存数据,而磁头就是从磁盘读数据的,类似于那种老式的留声机,一个盘片有两个磁头。
磁道:每个盘片同心圆半径相同的圆形。
扇区:将磁道划分为若干个小的区域,称为扇区
柱面:所有磁片中半径相同的同心磁道构成“柱面",意思是这一系列的磁道垂直叠在一起,就形成一个柱面的形状。简单地理解,柱面就是磁道。
存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
磁盘寻址方式:×× 磁道(柱面),×× 磁头,×× 扇区
寻址时间:1.寻道时间。2.旋转延迟。3.数据传输时间。寻址时间主要取决于前两个。
详细信息参考:磁盘、柱面、磁道、磁头、扇区
总线
总线,英文为bus,也就是公共汽车,用于在计算机中传输数据。在传统的设计方式中,采用南北桥的架构,架构图如下:
(图片来源:程序员的自我修养)
北桥芯片:由于3D游戏和多媒体的发展,导致图形芯片(就是我们常用的显卡芯片)需要和cpu,内存进行大规模的通信,慢的io总线无法满足这种需求,所以就设计出来高速处理的北桥芯片,协调内存,cpu,显卡。
南桥芯片:由于像鼠标,键盘等I/O设备运行较慢,直接连接到北桥芯片,这样北桥芯片又要处理高速设备,又要处理低速设备,比较复杂,所以就设计出来南桥芯片,鼠标,键盘,磁盘连接到南桥芯片,之后南桥芯片将他们汇总连接到北桥芯片,早期系统总线采用PCI结构,而低速设备采用ISA总线。
现代的计算机已经不再采用上面的结构,而是下面的结构
(图片来源:知乎)
在最新的架构中,已经不再分南北桥,而是将南北桥合并称为I/O桥。
操作系统扮演的角色
上面介绍了CPU,内存,硬盘等硬件,而且大致介绍了下这些硬件的功能,那操作系统在其中扮演什么角色呢?事实上,操作系统把cpu抽象成了进程,把内存抽象成了虚拟地址,把硬盘抽象成文件系统,那相应的就会衍生出如下功能。
- 进程调度:cpu的资源有限,怎么有效的调度各个进程,让cpu尽可能处于忙碌状态,尽快完成各个任务就变成一个很重要的问题。
- 虚拟地址(内存)管理:内存资源有限,怎么合理的分配内存资源给各个进程就变的尤为重要,并且确保进程之间的内存资源隔离防止出现混乱也同样重要。
- 文件管理:如何有效的组织文件系统,可以更快的寻找到所需的文件,合理的利用磁盘资源都是操作系统要做的事情。
总结
这篇文章作为操作系统的第一篇,写的有点虎头蛇尾,因为操作系统依赖于硬件,所以需要先介绍一下硬件,由于操作系统本身很复杂,在第一篇文章中不能过多涉及具体的内容,所以看上去有些虎头蛇尾。由于我本身不是科班出身,在大学时没有学过操作系统,在实际的工作中,已经和锁,信号量,LRU算法,数据库索引结构,脏页刷新等这些打过交道,但是并不知道,这些东西在操作系统中早就讲过,觉得很神奇,所以要打好基础很重要。要不然就显得很无知。
参考:
《现代操作系统》
《程序员的自我修养》