一、前言
最近看了一篇将Unix和Linux历史的帖子,虽然有点水,但是还是放个链接吧花了一天时间,终于把unix、linux、ios、android区别大致联系搞清楚,好像很复杂的,这个帖子写的比较口水话,但是对于了解Unix与Linux的发展与历史还是蛮有帮助的,看了这篇帖子之后,尽管知道了Unix与Linux从无到有的过程,但是发现自己对操作系统这个东西的认识更加模糊了,因为前期大致读过《深入理解计算机系统》和《操作系统》两本书,了解过一些操作系统的内容,但由于是非科班出身,有很多本质的概念并不理解,所以这里就回顾了上面两本书中的一些内容,再加上网上的一些资料,对操作系统和操作系统内核这两个概念进行了整理。
二、操作系统理解
一句话理解操作系统:操作系统就是为用户(使用计算机的人)提供服务,使用户能在计算机上使用各种应用程序(QQ、浏览器)来操作计算机资源(如QQ需要使用显示器资源、用浏览器下载资料需要硬盘资源,同时所有这些应用程序都需要使用CPU这个最主要的资源)。
可以从两方面理解上面这句话,一方面从操作系统本身来理解。其实说起操作系统这个概念,作为非科班出身的我们大多都是比较模糊的,同时感觉跟这个东西就很近,因为在每台计算机中都有一个操作系统,你运行的任何应用软件都离不开操作系统,为什么离不开操作系统呢?其实说白了,一台计算机就是一组资源,你运行在计算机上的应用程序本质上是离不开计算机的各种资源(如处理器、内存、I/O设备等),只是为了方便,人们就构造了操作系统这种东西,因为每一台计算机的各种资源都来自不同的厂家,它们有不同的标准,有不同的差别,所以你针对某一类的I/O设备开发的应用程序就不能在另一台装有不同I/O设备的计算机上运行,而操作系统就完美的消除了这种差别与无法扩展的缺点,所以从逻辑上来说,操作系统位于应用程序与计算机资源的中间层
同时,作为中间层,必须要干好中间层的工作,所以总的来说,操作系统有两个基本功能:
(1)防止硬件被失控的应用程序滥用;
(2)向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备
另一方面,从计算机CPU(处理器)来看,操作系统实际上不过是一组计算机程序(可以理解成很多个应用程序的集合,而这些应用程序基本都是与硬件打交道的),与其他计算机程序类似(不管是你自己写的HelloWord小程序还是像QQ这样的应用程序,以及大型的服务器程序),它们都给处理器提供指令,然后处理器就执行这些指令,完成这些程序的功能,最大的区别在于操作系统和其他程序的意图不同:操作系统程序通过控制处理器使用其他计算机资源,并控制其他程序的执行时机,这促使处理器完成系统任务的调度。但是(刚刚也说明了,操作系统除了和其他程序的意图不同,其他都一样,所以)处理器为了做任何一件这样的事情(指的是执行另一个程序),都必须停止执行操作系统程序,转而去执行其他程序(这其实是进程切换),因为既然操作系统也是一个程序(进程),而任何处理器同时只能处理一个进程,所以操作系统同样和其他程序(进程)一样需要调度,只是操作系统是处于主动调度的位置,而其他程序是被动的由操作系统的控制来实现调度。
三、操作系统内核
关于操作系统和操作系统内核这两个概念,很多人尝试去区分与解释,但是发现很难得解释的完全(包括我自己,这里只是把我自己的理解整理出来,有什么不对的地方,希望大家批评指正,共同进步)。
查看了一些网上和CS系列书籍中的关于操作系统内核的概念解释,总结之后,我的理解是:
(1)操作系统包括操作系统内核(这是必然的),也就是说内核程序是操作系统所包含的一组计算机程序中的一个子集,所以内核程序也是一组计算机程序,而这些内核程序是操作系统中最常使用基本模块,直接与硬件打交道,主要由用于管理存储器、文件、外设和系统资源的那些部分组成。
(2)内核程序一直占据内存中的一段内存,这样处理器可以随时调用这些内核程序;
(3)而操作系统除了内核程序外,还有包括其他一些基本组件,如文本编辑器、编译器、用来与用户进行交互的程序等
对于第(2)点,可以引入《深入理解计算机系统》这本书中关于“虚拟存储器”(P12)解释的一幅图来说明,如下:
上图中,关于进程的虚拟地址空间的说明中,最上面的子区域“内核虚拟存储器”就是用来存储内核程序和数据的,这个地址空间是一个固定的结构,所以对于每一个应用程序(进程)来说,都具有同样结构的虚拟地址空间,这就可以保证每个进程都能调用操作系统内核程序来完成自己的功能。
下面再用一幅图说明操作系统内核是操作系统的一组子程
上图中,操作系统的内核包围硬件,同时,其外层是系统调用接口,这就是操作系统中除内核以外的其他组件。
下面整理两个网友关于操作系统与操作系统内核的解释,个人觉得解释的还是比较好的:
(1)内核,是操作系统的基础模块,用于管理系统资源。例如提供对软件层面的抽象(例如对进程、文件系统、同步、内存、网络协议等对象的操作和权限控制),和对硬件访问的抽象(例如磁盘,显示,网络接口卡(NIC));操作系统,在内核的基础上有延伸,包括了提供基础服务的系统组件。
(2)内核,就是计算机学科意义上的操作系统,直接与硬件交互,提供CPU时间片管理、中断、内存管理、IO管理等等;一般意义上的操作系统包含的东西要更多一些,至少要有用户交互的基本程序,比如一个命令行界面和基本的指令(文件遍历、进程管理等等),或者图形界面的桌面和文件浏览器。
四、总结
总的说来,一个操作系统包含了内核(是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件)以及其他计算机系统所必须的组件(如函数库、编译器、调式工具、文本编辑器、网站服务器,以及一个Unix的使用者接口(Unix shell)等,这些都是操作系统的一部分,而且每一个模块如编译器都是一个单独的进程,运行在操作系统中)。所以一个内核不是一套完整的操作系统,拿Linux来说,Linux这个词本身只表示Linux内核,但现在大家已经默认的把Linux理解成整个Linux系统,这是由于历史原因造成的(具体可以看本文前言中提到的那篇文章),也就是说人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和应用程序的操作系统(也被称为GNU/Linux),而基于这些组件的Linux软件被称为Linux发行版。一般来讲,一个Linux发行版本出来包括Linux内核之外,还包含大量的软件(套件),比如软件开发工具,数据库,Web服务器(例如Apache),X Window,桌面环境(比如GNOME和KDE),办公套件(比如OpenOffice、org)等等。