“吴大哥,什么是操作系统?” 陈小速急切地想知道答案。
吴进并没有直接回答这个问题,而是问道:“小速,你有没有想过,如果没有操作系统,程序会怎么运行?”
“没有操作系统?那程序能运行得起来吗?” 陈小速觉得有些不可思议。
“怎么不行呢?” 吴进说着笑了起来,“还记得我们讨论CPU的结构与指令吗,程序不就是一条条指令的集合吗?”
“啊,对,想起来了。” 陈小速拍了拍脑袋,接着说,“但那样的话,计算机就很难操作和使用了啊。比方说我要做最简单的加法运算,就需要把四条指令装载到内存里,然后让CPU去计算。但一次只能执行一个程序,要执行另一个程序,那还得断电把数据擦除,再加载新程序。太麻烦了吧。”
“对嘛,你这不是道出了操作系统的一个本质特征吗?它就是机器与应用之间的界面,也可以叫做接口。当然,还可以看成是机器与人之间的窗口,微软的Windows可谓取了个很贴切的名字。”
“嘿,吴大哥,我明白你的意思了,” 陈小速兴奋起来,“就是说操作系统向用户屏蔽了对硬件操作的细节,这让普通用户可以专注于做自己的工作。那这么说,操作系统对于计算机的普及来说太重要了啊,没有它的话,计算机的能力发挥不出来啊。”
“非常正确,接下来我们说一说操作系统的两大核心功能吧。”
“还是先从咱们上面讨论的内容里,提一个问题吧。就是小速你刚才说的,如果没有操作系统,那么程序只能单独运行,而且切换也很麻烦。那么有了操作系统,程序可以怎么运行呢?” 吴进提出了问题。
这一次,陈小速没有马上开口,而是埋头思考起来,吴进也没有打扰他。过了十分钟,陈小速才抬起头来,有些犹疑地说:“我胡乱说两句啊。就是操作系统可以先把磁盘上的程序文件加载到内存里,然后交给CPU去一个接一个地执行,像排队一样,是吗?”
“原理上是没错,但小速你用电脑的时候,会不会一边浏览网页,一边听音乐呢?”
“肯定的啊。对啦,问题就在这儿了,CPU一次只能让一个程序执行,多个程序同时在运行,这是怎么做到的?” 陈小速马上意识到了这个问题。
“这就是操作系统的一个基本功能了,就是进程管理。” 吴进开始详细说明。
程序本身是一组指令的集合,一般是以文件的形式存在磁盘上。当程序被选中执行时,会进入作业状态。作业过程是指程序被操作系统纳入进程管理中,可能是在执行或者待执行状态,直到程序完全退出,作业过程也就终止了。
作业如果被操作系统选中加载到内存中,那么此时就可以称之为进程了。进程顾名思义,就是正在运行中的程序,它要么是占据CPU在执行,要么就是等待CPU被释放。
进程有三个状态,分别是就绪态、运行态和等待态。就绪态指的是资源都已经得到满足,就等着占用CPU进行运算了。而在CPU上运行的,则就是运行态。当产生中断或者有I/O请求时,进程会转到等待态,一直等到资源满足了,才再次进入就绪态。
需要注意的是,运行态有可能转到就绪态或等待态,但等待态只能转为就绪态。也就是说,进程必须在就绪态之后,才能进入运行。
有了进程管理,多个程序在宏观上就可以有同时运行的效果。这还是得益于CPU超快的计算能力,操作系统在一秒内就可以将进程进行亿次的切换。那么对于人类用户来说,使用计算机的体验就是并行工作,哪件事都不会耽误。
吴进说着就画下了进程调度的流程图。
看着上面那张图,陈小速如获至宝,一直琢磨个不停。吴进说:“好了,小速你回去以后可以有针对性地找资料,去研究进程调度的细节了,我们接下来再讨论操作系统的另一个核心功能吧,就是内存管理。”
“啊,对,内存管理又是干什么的?” 陈小速回过神来,提出了这个问题。
“在回答这个问题之前,我先说明一下内存的物理特性。你攒机的时候最关注的内存指标就是容量是吧,例如16G、32G。它的单位是字节,一个G是1024M字节,一M是1024K字节,一K是1024字节,一个字节是8位,你大概可以知道这能容纳多少数据。
1G = 1024M1M = 1024K1K = 1024Byte1Byte = 8bit
“内存条本身就像按顺序排列的一列水桶,每个桶子都有一个地址,而且可以存放数据。CPU可以通过地址访问任何水桶,也就是任意一个内存的地址,进行数据的读取操作。”
陈小速点着头,这个比方很形象,很好理解。
吴进接着说:“那么,我就要先提出一个问题了。为了简化讨论,我们假设现在有一台机器,它的内存空间是1G。而我们这台机器上会同时运行两个程序,每个程序都要使用1G的内存空间,应该怎么办?”
“怎么办?这个没办法运行吧……” 陈小速脱口而出了这句话,不过看着吴进温和的笑容,他知道这个回答肯定不对,挠了挠头,又自己想了会。
陈小速有些信心不足地开口说:“吴大哥,我猜可能也是类似进程管理吧。例如CPU只有一个,而为了让多个程序同时运行,就不停地来回切换,像这样的管理方式?”
“从原理上来看,其实差不多。” 吴进先表示了肯定,“这在操作系统里,叫做虚拟内存技术。它的原理就是让每个程序都认为自己可访问的空间是1G,而且内存地址都是一致的。只有在实际运行的时候,才会将程序所需的指令代码和数据加载至物理内存中。
“当程序要使用内存时,它访问的是虚拟内存地址,而操作系统会将虚拟内存映射至实际的物理内存。通过这种方式,程序就不必考虑实际运行时,还有多少可用物理内存了,只要专注于自身的逻辑实现就好。”
“啊,这个原理我弄明白了。” 陈小速一边点头一边说,但他也想到了一个问题,“那操作系统是怎么把物理内存分配给程序的呢?是一次给一大块,还是一点一点给?”
“这个问题很好,” 吴进笑着说,“现代操作系统对于内存分配通常都是基于分段与分页式调度管理。它们也是实现虚拟内存技术的基础。操作系统会将内存按照固定大小分成块,这样的块被称为帧。比方说一帧的大小是4KB。”
陈小速在脑海里浮现出拉开相机胶卷的画面。
“那么好了,程序运行需要占用内存,那操作系统就将程序也分片放在4KB的空间中,这称为页。借助虚拟内存技术,程序运行时的页空间是连续的,但映射到帧上是可以不连续的,小速你看下这张图。” 吴进说着,又画了一张图。
陈小速一看就明白了这个意思,吴进接着说:“那分段管理呢,就是将若干页合并起来,成为一个段,段的大小也是固定的。逻辑上可以按照子程序划分,分配段内存给它。然后在子程序内部,又按照分页方式进行管理。”
陈小速不住地点头,又问道:“那段大小是固定的,会不会在分配的时候会造成浪费呢?”
“你说得很对,” 吴进发现陈小速果然注意到了这一点,“所以原理说起来简单,但操作系统在实现的时候就有许多细节要处理好。那就要通过算法来做到,将浪费减小到最少,同时还要保证稳定性和健壮性。”
“小速,今天我们学习了操作系统两个最核心的功能,进程管理与内存管理。其他还有存储管理的文件系统、IO系统,用户界面等方面。希望今天给你开这个头,你回去以后再继续学习,逐渐理解操作系统的主要功能和设计哲学。”
“好的,吴大哥。这学习理论和编程实现之间,是不是就像是知道牛顿三大运动定律,和造出能飞上天的火箭之间的区别一样啊?” 陈小速搔着脑袋问。
吴进不由得哈哈大笑,“真的可以这么说,但任何一个火箭工程师,也必须从学习三大定律开始,对吧?”
“没错,那我这就回去好好把基础理论学好!” 陈小速下定决心要啃下操作系统的知识来。