引言

在人类编写的软件里面,还没有哪一种,是如此的重要的,以至于其的出现,深刻的影响了整个程序界的走向,可以说,一个操作系统的进化史就能在很大程度的代表了程序世界的发展轨迹

本质上,操作系统与其他软件并无任何的区别,都是逻辑+数据,然后它是如此之重要,所以人们把它与其他软件分离开来

操作系统称呼为系统软件,其他基于操作系统的软件称呼为应用软件

然而这种划分,常常给初学者带来困惑与恐惧,使得他们不敢,不愿意用对待平常软件的平常心去对待它,这是很不好的

在正式开始之前

  无论你是否相信,所有的软件功能都是能够使用硬件实现的,就像是组装积木,硬件就像是简单的三角形,圆形木块,软件就是利用那些三角形,圆形拼成房子,汽车,拼成模拟的世界

   软件其实是一个过程,一个拼装积木的过程,那么如果有一天,你想要一个房子,而有人给你提供了一个房子形状的积木(硬件),那么拼装的过程(软件)就不再需要了

  软件存在的意义就在于,我们的技术有限,硬件无法提供一个完整的积木,只能使用软件,对那些零散的积木去进行拼装

  操作系统是一个软件,应用程序同样是软件,都是一种过程

  它们之间的关系,与高级语言中 语言 与 编译器 的关系类似

参考: http://blog.csdn.net/only_lonely/archive/2010/03/16/5386552.aspx

应用软件说 : 哥们,帮我跟硬盘说下,我要XXX文件 –> 与机器无关的,抽象的语意

操作系统对应用软件说 : 好的,您稍等 –> 与机器无关的,抽象的语意

操作系统对硬件说: 硬盘编号9527,把你的磁盘转动三圈半... ... –> 与机器有关的,具体的语意

当硬件操作完毕

操作系统对应用软件说 : "您要的文件在这里,请拿好" –> 与机器无关的,抽象的语意

事实就是如此简单

注意:

操作系统的核心就是抽象掉硬件的细节,为更高层软件服务,这才是它的精髓

所谓的进程,线程,内存管理,系统与应用软件分层,这些都只是操作系统为了更好的完成任务,而创造出的一种概念,一种行为方式

为了让你更好的明白,理解操作系统的核心,请你忽略,无视掉那些纷繁的概念,好的,现在,我们有一个操作系统,纯净的,不含一丝杂质的操作系统,没有进程,没有线程,没有那该死的内存管理,没有那该死的R3与R0之分,它唯一拥有的只是一个叫做 中断 的东西,好了~一切拖沓的铺垫都已经结束,让我们开始吧

一 操作系统是死的!

在很多人的眼睛里,操作系统是富有活力的,精力四射的,它无处不在,时刻运行,时刻准备为你提供服务

其实,这是一种错误的理解,要理解这种错误,需要从CPU的工作方式说起

就在不久之前,我们每台电脑上只有一个CPU,而每个CPU同一时刻内,只能做一件事情

你可以想象一下,当CPU正在处理你的应用程序的时候.操作系统怎么办呢?

答案很简单,操作系统的代码没有被运行,它就安静的躺在那里,像一具尸体

注意:操作系统并不是像很多人认为的那样,是一个无处不在的管家,它只在有需要的时候运行

操作系统只在需要的时候运行?

什么是需要的时候呢?

很简单,当应用程序或硬件呼叫它的时候,有一种被硬件支持的方式 "中断" 高效地实现了应用程序(硬件)调用操作系统(硬件)的服务

什么是中断? 百度一下,你就知道,如果你把它当成函数调用,我也不十分介意

http://baike.baidu.com/view/121718.htm

好的,现在我们有了一个尸体般的操作系统,当你调用它的时候,它为你服务,当你永远不调用它(这是可能的),它将永远不被执行,这就是最简单的操作系统(现在已经被淘汰,但历史上真的曾经存在),没有线程,没有进程,没有该死的内存管理,你看见了,只要你愿意,一切都可以如此简单

请看下面的一个简单代码

    while(true)

     {

          // do something bad

      }

在我们仅拥有的"纯净"操作系统中,这样的应用程序代码将会是一个灾难,你的机器将会陷入瘫痪,

毫无疑问,这样做是不好的~

而且有个特别有意思的地方,操作系统的发展可以简单的被认为,就是为了更好的解决上述代码所带来困扰

是的,没错!

   while(true)

     {

          // do something bad

      }

这是一段神奇的代码,操作系统的一次又一次的发展,进化,就是为了减缓,降低上面代码带来的杯具~

二 中断让尸体动起来

如前所述,操作系统就像尸体,你不去用中断去刺激它,它永远不会动一下

那如何让尸体(操作系统)动起来,像个正常的人一样?

很简单,不断的用中断,去刺激它就行,

感谢万能的计算机,让这个世界上,有一种中断叫时间中断

何谓时间中断?

就是每隔一个固定的时间,触发一个中断,打断CPU的执行序列,去执行操作系统的代码

嗯,现在好了~尸体已经动起来了

可是,一个动起来的尸体,有什么用呢?

让我们再来看一下那段神奇的代码

while(true)

     {

          // do something bad

    }

当你的计算机陷入到上述代码不能自拔的时候,操作系统有机会借由时间中断,抢夺过CPU的拥有权,从而使得它有机会终止那个错误的程序,或者安排另一个程序运行

安排另一个程序运行

我希望读者不要忽视这句话,安排是个动词,是一个人才能做到的事情,而不是一具尸体可以做到的,通过时间中断,尸体般的操作系统,做到了人才能做到的事情,这在医学上叫做什么呢? 借尸还魂?

这是问题的一个方面,另一个方面是 "另一个程序运行",嗯~有意思了哦,

做一个恶毒的假设,如果你的电脑在听音乐的时候不能看小说,在打字的时候,不能听音乐,在挂QQ的时候,无法浏览网页,你会想砸掉电脑,另买一个吗?(要是我,我会有那种冲动),CPU一个时刻只能运行一个程序,正是有了时间中断,快速的切换,才能够让我们的电脑看上去,好像能够同时运行多个程序

接下来的,要引出一个内存的概念

别害怕,这里要说的是一个最基本的内存的概念.

什么是内存,内存就是一个地方,存放着程序的代码,数据,让CPU去存取,操作

嗯,回到刚才的话题,时间中断制造出了多任务的假象,可以使得计算机好像是能同时运行多个程序

只有一个问题,那多个运行的程序,存放在哪里呢?

它们连同操作系统(操作系统也是个软件)存放在同一个内存里

让我们再看一下,那段悲情的代码

while(true)

     {

          // do something bad

    }

while(true)的问题,通过时间中断解决了,可是那句 do something bad 呢?

你知道的,连同操作系统在内的所有程序都存在内存里面

如果,那句 do something bad 恰巧把操作系统代码所在的内存中的内容给破坏

当下一个时间中断降临时,将会发生什么?

2012 ... ...

三 面包,有了~奶酪,也有了

如果,这个世界上,有某种东西,可以让每个应用程序之间独立运行,不受干扰,

如果,这个世界上,有某种东西,可以使得就算应用程序设计的再糟糕,再乱来,也无法破坏其他应用程序所拥有的内存

是的,那不是幻想,是真实存在那种东西,那种东西是一系列技术的集合,笼统的我们把它叫做虚拟内存技术.

嗯,面包有了,奶酪也有了,一瞬间,世界变的美好起来了,不是吗?

有关于虚拟内存技术的实现细节,拜托,如果要说,那可以再写5000字

有兴趣的童鞋,可以baidu或者google

值得一提的事是,从虚拟内存地址到真实内存地址的映射,是由硬件提供的~

抽象硬件,给应用程序更好的接口,这本是操作系统的责任,现在却由硬件完成,这再一次证明了,硬件与软件之间,没有明显的界限

出于娱乐的目的,我们再看一下,那段神奇的代码

while(true)

     {

          // do something bad

    }

你可以在do something bad 中任意加上你认为足够胡闹的代码,然后测试一下,看它能不能干掉你的操作系统

四 一点声明

本文并不是严谨的论文,仅仅是从一个方面,粗浅的讲述了一下操作系统的发展历程,本文没有涉及到的内容,概念有很多,但是,只要把握操作系统的核心--"抽象硬件,为应用程序提供更方便的接口",从这里出发,不要心怀畏惧,一切都会很简单 :-)

五 windows下的一个小例子

  当按下键盘上A键时,键盘(硬件)触发一个中断,操作系统运行,检索出是哪个键按下,然后把按键信息发送到当前激活的窗口的消息循环,然后,当该程序运行的时候(时间中断),从消息循环中取出消息,识别,而后处理... ... :-)

 

only_lonely 原创,欢迎转载,请务必注明出处

拍砖您随意,只要有理,我一定心怀感激的虚心接受