不知道你有没有产生过这些疑问:程序员
桌面上的图标究竟是啥?凭啥我在鼠标上一双击,就会出来一些不可描述的画面?都是从哪里跑出来的?
凭什么我在键盘上噼里啪啦地敲,某个位置就会显示我想要的那些字符?网络
电脑怎么知道我鼠标点击的是这个地方,又是怎么知道我要输入的是这个地方?架构
我在键盘上点“a”,是谁在显示器上画出“a”这个图像呢?并发
为何我一回车,这些字符就发到遥远的另一台机器上去了?函数
别小看“双击鼠标打开聊天软件”这样一个简单的操做,它几乎涵盖了操做系统的全部功能。咱们就从这个熟悉的操做,来认识陌生的操做系统。操作系统
操做系统其实就像一个软件外包,内核就至关于这家外包公司的老板。因此接下来请你将本身的角色切换成这家软件外包公司的老板,设身处地地去理解操做系统是如何协调各类资源,帮客户作成事情的。blog
从此所说的“用户”,都是指操做系统的用户,“客户”则是指外包公司的客户,这二者是对应的。接口
计算机的输入设备。进程
用户想要告诉计算机应该作什么,都是经过这两个设备。事件
若是是一家外包公司,怎么才能知道客户的需求呢?你须要配备销售、售前等角色,专门负责和客户对接,把客户需求拿回来,咱们把这些人统称为客户对接员。你能够跟客户说,有什么事儿都找对接员。
也就是显示器,是计算机的输出设备,将计算机处理用户请求后的结果反馈给客户。
显示器上面显示的东西是由显卡控制的。
不管是显示器仍是显卡,这里都有个“坐标”的概念,也就是说,什么图像在哪一个坐标,都是定义好了才画上去的。原本在某个坐标画了一个鼠标箭头,当接到鼠标移动的事件以后,你应该按相同的方向,按照必定的比例(鼠标灵敏度),在屏幕的某个坐标再画一个鼠标箭头。
做为外包公司,当客户给你提了需求,无论你作仍是不作,最终作成什么样,你都须要给客户反馈,因此你要配备交付人员,将作好的需求展现给他们看。
其实就是客户对接员。有时候新插上一个鼠标的时候,会弹出一个通知你安装驱动,这就是操做系统这家外包公司给你配备对接人员呢。当客户告诉对接员需求的时候,对于操做系统来说,输入设备会发送一个中断。这个概念很好理解。客户确定但愿外包公司把正在作的事情都停下来服务它。因此,这个时候客户发送的需求就被称为中断事件(Interrupt Event)。
显卡会有显卡驱动,在操做系统中称为输出设备驱动,也就是上面说的交付人员。
有了客户对接员和交付人员,外包公司就能够处理用户“在桌面上点击QQ图标”的事件了。
首先,鼠标双击会触发一个中断,这至关于客户告知客户对接员“有了新需求,须要处理一下”。你会事先把处理这种问题的方法教给客户对接员。在操做系统里面就是调用中断处理函数。操做系统发现双击的是一个图标,就明白了用户的原始诉求,准备运行QQ和别人聊天。
你会发现,运行QQ是一件大事,由于未来的一段时间,用户要一直和QQ进行交互。
这就至关于大家公司接了一个大单,而不是处理零星的客户需求,这个时候应该单独立项。一旦立了项,之后与这个项目有关的事情,都由这个项目组来处理。
立项可不能随便立,必定要有一个项目执行计划书,说明这个项目打算怎么作,一步一步如何执行,遇到什么状况应该怎么办等等。
换句话说,对QQ这个程序来讲,它能作哪些事情,每一个事情怎么作,先作啥后作啥,都已经做为程序逻辑写在程序里面,而且编译成为二进制了。这个程序就至关于项目执行计划书。
电脑上的程序有不少,它们都以二进制文件的形式保存在硬盘上。硬盘是个物理设备,要按照规定格式化成为文件系统,才能存放这些程序。文件系统须要一个系统进行统一管理,称为文件管理子系统(File Management Subsystem)。
对于大家公司,项目立得多了,项目执行计划书也会不少,一样须要有个统一保存文件的档案库,并且须要有序地管理起来。
当你从资料库里面拿到这个项目执行计划书,接下来就须要开始执行这个项目了。项目执行计划书是静态的,项目的执行是动态的。
同理,当操做系统拿到QQ的二进制执行文件的时候,就能够运行这个文件了。
你会发现,一个项目要想顺畅进行,须要用到公司的各类资源,好比说盖个公章、开个证实、申请个会议室、打印个材料等等。
这里有个两难的权衡
为了平衡这一点,一方面涉及核心权限的资源,仍是应该被公司严格把控,审批了才能用;
另一方面,为了提升效率,最好有个统一的办事大厅,明文列出提供哪些服务,谁须要能够来申请,而后就会有回应。
在操做系统中,也有一样的问题。
例如多个进程都要往打印机上打印文件,若是随便乱打印进程,就会出现一样一张纸,第一行是A进程输出的文字,第二行是B进程输出的文字,全乱套了。因此,打印机的直接操做是放在操做系统内核里面的,进程不能随便操做。可是操做系统也提供一个办事大厅,也就是系统调用(System Call)。
系统调用也能列出来提供哪些接口能够调用,进程有须要的时候就能够去调用。
这其中,立项是办事大厅提供的关键服务之一。一样,任何一个程序要想运行起来,就须要调用系统调用,建立进程。
一旦项目正式立项,就要开始执行,就要成立项目组,将开发人员分配到这个项目组,按照项目执行计划书一步一步执行。
为了管理这个项目,咱们还须要一个项目经理、一套项目管理流程、一个项目管理系统,例如程序员比较熟悉的Jira。若是项目多,可能一个开发人员须要同时执行多个项目,这就要考验项目经理的调度能力了。
在操做系统中,进程的执行也须要分配CPU进行执行,也就是按照程序里面的二进制代码一行一行地执行。
因而,为了管理进程,咱们还须要一个进程管理子系统(Process Management Subsystem)。若是运行的进程不少,则一个CPU会并发运行多个进程,也就须要CPU的调度能力了。
每一个项目都有本身的私密资料,这些资料不能被其余项目组看到。这些资料主要是项目在执行的过程当中,产生的不少中间成果,例如架构图、流程图。
执行过程当中,不免要在白板上或者本子上写写画画,若是不一样项目的办公空间不隔离,一方面,项目的私密性不能获得保证,A项目的细节,B项目也能看到;另外一方面,项目之间会相互干扰,A项目组的人刚在白板上画了一个架构图,出去上个厕所,结果B项目组的人就给擦了。
若是把不一样的项目组分配到不一样的会议室,就解决了这个问题。固然会议室是有限的,须要有人管理和分配,而且须要一个会议室管理系统。
在操做系统中,不一样的进程有不一样的内存空间,可是整个电脑内存就这么点儿,因此须要统一的管理和分配,这就须要内存管理子系统(Memory Management Subsystem)。
若是想直观地了解QQ如何使用CPU和内存,能够打开任务管理器,你就能看到QQ这个进程耗费的CPU和内存。
项目执行的时候,有了必定的成果,就要给客户演示。例如客户说要作个应用,咱们作出来了要给客户看看,若是客户说哪里须要改,能够根据客户的需求再改,这就须要交付人员了。
QQ启动以后,有一部分代码会在显示器上画一个对话框,而且将键盘的焦点放在了输入框里面。CPU根据这些指令,就会告知显卡驱动程序,将这个对话框画出来。
因而使用QQ的用户就会很开心地发现,他能和别人开始聊天了。
当用户经过键盘噼里啪啦打字的时候,键盘也是输入设备,也会触发中断,通知相应的输入设备驱动程序。
咱们假设用户输入了一个“a”。这就像客户提出了新的需求给客户对接员。客户对接员收到需求后,由于是对接这个项目的,于是就回来报告,客户提新需求了,项目组须要处理一下。项目执行计划书里面通常都会有当遇到何种需求应该怎么作的规定,项目组就按这个规定作了,而后让交付人员再去客户那里演示就好了。
对于QQ来说,因为键盘闪啊闪的焦点在QQ这个对话框上,于是操做系统知道,这个事件是给这个进程的。QQ的代码里面确定有遇到这种事件如何处理的代码,就会执行。通常是记录下客户的输入,而且告知显卡驱动程序,在那个地方画一个“a”。显卡画完了,客户看到了,就以为本身的输入成功了。
当用户输入完毕以后,回车一下,仍是会经过键盘驱动程序告诉操做系统,操做系统仍是会找到QQ,QQ会将用户的输入发送到网络上。QQ进程是不能直接发送网络包的,须要调用系统调用,内核使用网卡驱动程序进行发送。
这就像客户对接员接到一个需求,可是这个需求须要和其余公司沟通,这就须要依靠公司的对外合做部,对外合做部在办事大厅有专门的窗口,很是方便。
到这里,一个外包公司大部分的职能部门都凑齐了。你能够对应着下图的操做系统内核体系结构,回顾一下它们是如何组成一家公司的。
QQ的运行过程,只是一个简单的比喻。在后面的章节中,我会展开讲述每一个部分是怎么工做的,最后我会再将这个过程串起来,这样你就能了解操做系统的全貌了。
趣谈Linux操做系统