操作系统理解| 8月更文挑战

196 阅读4分钟

技术来自生产力的提升。

操作系统发展史

操作系统的发展经历了打孔->可编程(随着微型处理器出现)->多道程序系统->分时系统->实时系统。 纵观整个发展过程,最开始的萌芽期,人们追求的是更快捷的输入输出,程序容易写了,需要执行的程序多了起来,此时追求的程序执行的速度,到现在,也任然追求操作系统的执行速度。

联想到到自己维护的一些项目,第一个阶段,项目启动,追求快速开发,功能迭代。第二个阶段,在功能齐全时,用户量和用户的数据量逐步增加时,某些接口就出现了问题,耗时高,结果问题等等并发问题和性能问题。在往后呢,就是数据量继续增加了,第二阶段是g级别数据,那么下一阶段就是tb级别,在一阶段可能是pb级别。

在进一步追求根本原因,第二阶段不优化,会发生什么?从公司角度肯定是用户投诉,收益降低。从用户角度来说,响应慢会让用户点击一个按钮迟迟得不到效果,如果用户所在公司是来找枪械的,那么不优化是不是会导致生产力的降低?

(以上内容存属瞎扯)

进程

每当夜深人静之时,我不经在想,“09对战平台”这个程序是如何运行起来的。通过学校的单片机课程,一个程序编写完成后被编译为exe文件(window下),exe文件保存了程序的代码片段以及运行程序相关的文件,exe运行时,CPU需要读取程序的代码指令进行执行,但由于磁盘的IO速度与CPU的执行速度差了几个数量级,所以需要将程序的代码片段加载进内存,CPU与内存进行直接交互。

由此CPU可以一直运行这个进程,但如果此时我还需要启动一个“英雄联盟”,则复杂度就急剧上升。

虚拟化

一个程序运行,离不开磁盘(存储程序代码和数据)、内存(解决磁盘IO慢)、CPU(执行程序指令)。

所以如果要同时执行多个程序,我首先想到的是,每个硬件都买一个,但这与需求不符,目标是单个硬件实现多个程序同时执行。除此之外,有没有另外的方式?那就是虚拟化,写一个中间层的东西,在程序运行时,给程序虚拟化一个CPU、内存(磁盘在IO系统中讨论)。程序在运行时候就会以为自己单独占用了整个硬件资源。

那么虚拟化的方式有哪些?类比数字信号处理中的信号复用,目前只有两种方式:时分复用、空分复用。比如内存资源,时分复用是多个程序随着时间交替运行,比如第一秒,A程序使用以下,第二秒,A程序退出,B程序开始使用。空分复用是指将内存条按照空间进行切分,比如一个内存条的总共地址空间是0x000xFF,A,B两个进程执行时,将0x000x55分给进程A,后面的分给进程B。

至于硬件资源是按照时间切分还是空间切分,如何考虑?比如CPU,个人感觉目前没有比较好的方式能够实现空间切分。所以会按照时间切分。而对内存资源,实现来看,两个都能支持,但是如果按照时间切分,上下文切换的性能问题无法解决。举个例子,第一秒A程序执行,第二秒B程序执行,那么A程序执行时候在内存中存储的数据要放在哪里?我能想到的就只有磁盘了,但如果按照这个方式实现,性能又是一个大问题,因为通常有几十上百的程序同时执行,每次切换都要读写磁盘,肯定不现实。所以内存资源按照空间切分比较合理。

IO系统

只讨论文件系统的磁盘IO。

编译后的exe文件是如何存储到硬盘的?使用机械硬盘,是存储到那个柱面,哪个磁道,哪个扇区?又是如何进行存储的,exe文件可能存在某个目录,目录结构又是如何组织的?

总结

之前只负责一些Java项目,觉得操作系统无关紧要。天天在用,但我对其一无所知。读了操作系统的书之后,也是看了就忘,以文章方式加深自己的记忆,表达自己对操作系统的一些理解,以及对操作系统的一些思考。