PS:操做系统原理是大学计算机专业最为重要的一门专业基础课程之一,对于操做系统核心原理的理解对于一个合格的程序员来讲十分重要,因而我继续个人“三大原理,两个协议,一种结构”复习,三大原理中操做系统原理首当其冲,这里主要依靠阅读《操做系统之哲学原理》来进行复习,将其中重要的部分记录下来,与各位分享。固然,更推荐你们去读读这本书,相信都会有必定收获。程序员
(1)程序设计语言数据库
首先,咱们得使用一门程序设计语言进行编程,通常咱们使用的都是高级程序设计语言(如C、C++、Java、C#等)。编程
(2)编译系统缓存
咱们写好了代码,可是因为计算机不认识高级语言编写的程序,须要编译成计算机可以识别的机器语言,这就须要编译器和汇编器的帮助。安全
(3)操做系统数据结构
机器语言程序须要加载到内存,才能造成一个运动中的程序(即进程),这就须要操做系统的帮助。架构
About:进程须要在计算机芯片即CPU上执行才算是真正在执行,而将进程调度到CPU上运行也是由操做系统完成的,这里也就不难理解为何进程管理会在咱们的教科书中排在最重要的位置了。并发
(4)指令集结构(计算机硬件系统)学习
在CPU上执行的机器语言指令须要变成可以在一个个时钟脉冲里执行的基本操做,这就须要指令集结构和计算机硬件的支持。spa
基于上面提到的四大要素,咱们能够得出下面一幅图,该图从一个线性角度展现了程序的演变过程,可以帮助咱们理解整个程序是如何在计算机上执行的。
事实上,程序能够执行在机器语言或汇编语言上编写,用这种被称为“低级”(我更愿意称其为底层)的语言编写出来的机器语言程序无需通过编译器的翻译就能够在计算机指令集上执行。若是是在汇编语言上编写的汇编程序,则只须要通过汇编器的翻译便可加载执行。
(1)操做系统究竟是什么鬼?
操做系统是介于计算机和应用软件之间的一个软件系统,操做系统的上层和下层都有其余的对象存在:
从上图能够看出,OS上边是应用软件,下边是硬件平台。
(2)操做系统到底操控什么事?
最原始的计算机并无OS,直接由人来掌管事情。随着计算机复杂性的增加,人已经不能胜任直接掌控计算机了。因而,OS这个软件被编写出来帮咱们掌控计算机,令人类从日益复杂的掌控任务中解脱出来。既然OS是专门掌控计算机的,那么计算机上发生的全部事情都须要OS的知晓和承认,未经OS赞成的任何事情均被视为非法的(想一想病毒和入侵攻击者试图作的事情)。
(1)魔术家
魔术家的目标是把差的东西变好,把少的东西变多,把复杂变简单。一样,OS将计算机以一个更加容易、更加方便、更增强大的方式呈现给用户。
Example:OS经过进程抽象让每个用户感受有一台本身独享的CPU,经过虚拟内存抽象,让用户感受物理内存空间具备无限扩张性,这就是把少变多的一个实例。
(2)管理者
操做系统管理计算机上的软硬件资源,如CPU、内存、磁盘等,使得不一样用户之间或者同一用户的不一样程序之间能够安全有序地共享这些硬件资源。
那么,问题来了,如何让用户很好地利用这些硬件资源呢?这就是分块(Parcel Out),把硬件分块给应用程序使用。这就涉及到有效和公平的原则,这也是一个管理者的必备素质,更是设计操做系统时的不懈追求!
操做系统的两个角色之间既有区别又有联系,为了完成不一样的任务,OS有时须要扮演魔术师,有时有须要扮演管理者,还有时须要同时扮演两个角色。
即如何分配CPU给不一样应用和用户,对于进程管理坚持三个目标:一是公平(每一个程序都有机会使用CPU),二是非阻塞(任何程序不能无休止地阻挠其余程序的正常推动),三是优先级(优先级高的程序开始运行则优先级低的就须要让出资源—>让一部分人先富起来)。
即如何分配内存给不一样应用和用户,主要管理缓存、主存、磁盘、磁带等存储介质所造成的内存架构。其目的主要有二:一是将少变多(好比虚拟内存的使用可以使得运行程序的大小大大地增长),二是让多个程序共享同一个物理内存(这就须要对物理内存进行分割和保护,不让一个程序访问另外一个程序所占的内存空间,专业术语称为运行时不能越界访问)。
即如何分配外存(磁盘)给不一样应用和用户,外存管理也称存储管理,也就是咱们所说的文件系统,其目的是将磁盘变为一个很容易使用的存储介质以提供给用户使用。
即如何分配输入输出设备给应用和用户,也称为设备管理,也就是管理输入输出设备。其目的主要有两个:一是屏蔽不一样设备的差别性(用户用一样的方式访问不一样的设备,从而减低编程的难度),二是提供并发访问(即将那些看上去并不具有共享特征的设备如打印机变得能够共享)。
操做系统的四个核心功能以下图所示:
操做系统的技巧也应用于不少领域,如抽象、缓存、并发等。操做系统简单说来就是实现抽象:进程抽象、文件抽象、虚拟存储抽象等。而不少领域都会使用抽象,例如数据结构和程序设计(抽象数据类型?抽象类?);不少地方也会用到缓存,例如开发Web应用程序时使用缓存下降数据库访问压力,加快页面响应速度等等。更为重要的是,对于一个程序员来讲,要想知道计算机在软件层面是怎么运转的,就得学习操做系统。
邹恒明,《操做系统之哲学原理》,机械工业出版社