操作系统是一个软件。
在编写过裸机程序之后就知道一个程序跑起来是需要怎样的资源与怎样的环境的。这个时候组织这个环境与资源分配的便是操作系统。操作系统就是一个运行在裸机上的程序。
操作系统为上层应用提供接口。
一个操作系统可以为上层应用提供接口,这个时候程序员使用接口的时候就不是面对裸机了,而是面对抽象化之后的一个机器,这个机器就是操作系统。在操作系统抽象化之后,cpu芯片的工作调度与核心功能被封装,此时上层应用在使用cpu芯片计算功能的时候就是调用操作系统提供的接口了。如果要使用其他的硬件设备(外设),就需要使用在操作系统中集成(集成不知道这样说恰不恰当!)的驱动程序。
驱动程序在个人理解是对具体的硬件设备使用方法的软件抽象。此时配合操作系统接口,就能够使得用户在操作系统提供的接口中使用驱动程序封装的软件接口从而调度硬件设备,进而完成应用所要完成的功能。
booloader是上电后裸机运行的第一个程序,初始化机器以及重定位后面要运行的操作系统(重定位:使程序的链接地址与其所处位置一致,以免造成地址访问的错误),为操作系统运行提供环境。
操作系统是建立在处理器上的,驱动程序面向的是具体硬件,在集成了驱动程序以后的操作系统便可以统一组织起一台机器的各个部件,程序员就可以在此操作系统上进行编程,使用操作系统提供的软件接口访问到具体硬件,完成具体功能。
谈谈操作系统的内存管理
围绕内存管理三个核心词展开:翻译、保护、内存分配。
1.保护:程序是如何在内存中执行的? 运行时重定位(为执行程序而对其中出现的地址所做的修改)支持移动和保护。
2.内存分配:
连续内存分配:碎片问题、内存紧缩时间成本太高
分段: 段号+段内偏移 碎片问题
分页: 页号+偏移
段页结合: 段号+偏移 (逻辑地址)—> 页号+偏移(线性地址) —> 物理页号+偏移(物理地址)
3.翻译:地址翻译
另外就是虚拟内存技术:
优点:
实现:按需调页(请求调页)
页面置换策略:
1.FIFO:先入先出
2.OPT(MIN):选择未来最远将使用的页淘汰
3.LRU:最近最少是用
LRU实现:计数器法、页码栈法、近似实现的clock算法
其他问题: 需要给进程分配页框(帧) => 全局、局部 => 颠簸 =>Belady异常=>栈式算法
如果把人比作一个操作系统的话,我们需要先明白我们的底层硬件是什么。据估计,我们的底层硬件就是我们的身体,而所谓的神经系统也无非就是写总线神马的玩意儿。然后驱动呢?我觉得就是一些底层的性格,虽然我们无法直接操作,但是和我们的思维息息相关的一些东西。而在上面的所有东西,就是我们的思维,应该就是操作系统真正的内核,负责处理所有的事件和思考能力的调度。我们在成长过程中所学的所有知识和经验,就是我们的应用软件。有了这个架构就很明显了。例如有人拍了你一下。然后你的皮肤感应到这个动作。于是产生了一个中断请求。这个中断通过神经系统到达cpu也就是我们的大脑。大脑就会停下来,思考一下这个中断应该如何处理。根据我们多年的经验。拍这个动作应该是有人找你有事。所以我们的内核会直接调用发出一个动作,让我们的身体转过去。当然这时候我们的眼睛这个外设就会起作用。然后获取到眼前的信息,再次产生中断。
分析了这么多,其实最主要想要考虑的是,我们应该维持一种什么样的姿态。作为技术人员,我觉得我们更加像是linux操作系统。但是作为主流的windows操作系统,我觉得也很有必要分析一下。首先,有些关键性的东西,对于我们的上层思维是被屏蔽掉的。例如我们不能直接控制血液流动,我们不能直接控制神经系统屏蔽掉所有痛的信息。突然发现无法写清楚了。可能选择了一个错的思路。我想要说的是人控制情感的能力。类比到这就是应用软件控制内核的一个过程。我一直想要达到的一种境界就是我能够完全控制自己的情感。例如我不会因为懒惰而使本该完成的事情没完成。我不会因为仅仅有感觉而喜欢上一个人。这就需要我们的思维给与我们自己更高的权限。但是作为我们人类来说。和计算机最大的区别就是我们的很多东西都是可以进化的,并不是一成不变的。例如我们可以。。。。举不到一个合适的例子了。