第四讲——操作系统内部结构 本文共有6328个字,关键词: 要讲操作系统内部结构,先讲一讲什么是程序。 程序就是个程序,鼠标双击就可以运行了嘛,有啥好讲的?是不是? 所谓的程序就是按照人们的意愿,将计算机硬件的功能调用来完成一些特定工作的代码,当然光是代码还是不行的,因为计算机不认识啊!计算机比幼儿园的小朋友都笨,只认识0,1两个数字,其他的怎么也学不会,0,1组成的字符串叫做二进制。 所以写完代码还得将其转换成相应硬件平台能够读懂的二进制代码,为什么说是相应硬件平台呢?因为计算机硬件也是发展的,既然在发展那么就会有新旧之分,这里面起到十分重要作用的叫做CPU,人们常说的硬件架构大多数指的是CPU芯片的不同系列,比如大家耳熟能详的inter的酷睿I系列,什么I3,I5。I7,还有老一辈的奔腾系列等等,这些CPU采用的架构不一样就导致了其内部的指令集存在差异,指令集就是CPU厂商为了提高开发人员的效率所开发出来的指令,使用这些指令就能够调用CPU的功能,这玩意儿也叫汇编语言。 我们常见的CPU来自两大厂商inter和AMD,有X86或者X86_64的平台架构,有一个大家经常使用却很少关注的手机CPU,它来自移动平台的霸主ARM,这家公司比较诡异,它只生产知识产权,并不生产任何设备,好像是英国的一家公司。 程序员通过编译器将代码编译之后就能够在机器上运行,能运行的这玩意儿叫做程序。 一个程序具有局部性原理,什么叫局部性原理呢? 1. 从时间上来说,程序具有时间上的局部性:已经访问过的数据还需要用到,这让才使缓存具有意义。 2. 从空间上来说,程序具有空间上的局部性:访问一个数据时,会将它挨着的数据同时提取,这样就避免了从内存中重复读取。 另外,程序需要移植也是因为不同的机器底层硬件不尽相同。 早期的操作系统叫批处理系统,就是那种需要在纸带上打孔然后输入的那种系统,这种操作系统一次只能执行一个完整的计算过程,效率低下,后来将更长的织带打上多个程序,这样虽然快了一些但是依然一次只能执行一个程序,也叫做一个作业。因为机器的内存只有这么一段,而这段内存是完全被运行的程序霸占的,也叫做全权访问,这就造成了CPU计算能力的大量闲置,在当时计算代价是相当昂贵的,这迫使那些科学家、学者们不得不像一种办法解决这个问题。 后来就有了多用户多任务的系统的实现,在这里面引入了进程的概念。 首先,计算机的运算需要CPU和内存,实现多任务就需要将资源进行划分,CPU的运算是随着时间的流逝而完成的,是由时间而驱动,因此将CPU按时间片进行划分(slice CPU),内存引入了分段机制,对被划分的每一段来说都有自身的起始作业位置(相对位置)。 怎么对这些计算机资源进行划分,是由操作系统实现的,操作系统也是一个软件,但是操作系统只是提供一些功能,并不完成具体的工作,所以是一种通用软件。 操作系统(确切说应该是操作系统内核)提供的功能可以大致分为 1. 进程管理 2. 内存管理 3. 提供文件系统 4. 提供网络功能 5. 提供硬件驱动 6. 提供安全机制 7. 内核还负责完成一个程序的启动,停止,回收,切换等等 所以说,操作系统是运行在硬件上,负责管理硬件资源,而且将硬件资源所提供的计算能力切割分配给各个进程,并完成协调。 这里讲到了将硬件资源分配给各个进程,为什么不是程序? 我们要知道,一个程序是放在硬盘上的,不去动动手脚这个程序是不会自己动的,程序要运行起来就得先加载到内存中去,加载到内存的这个玩意儿我们称为进程,进程是有生命周期的,也就是说它不能黏在内存中不走,干完工作就得离开,不然就是占着茅坑不拉屎,浪费硬件资源。 操作系统是将计算机硬件的计算能力用软件二次模拟出来,所以其他程序看到的不是硬件,而是操作系统所提供的接口,称为system call,system call都非常低层,他们负责底层硬件的各个功能的提供,这就降低了程序员的开发难度。有了操作系统后,任何程序都不能再和硬件直接交互,要想使用硬件的功能,都必须要通过操作系统进行协调。 但是这种叫做system call(系统调用)的接口用起来还是非常麻烦,于是就有一些人,通常是系统开发人员,将系统调用进行再次封装成较为容易使用的接口,间接提供给开发人员,这个封装了系统调用的接口被称为库,为了实现多个功能,所以就有各种各样的库。 我们上面说的程序的运行,实际上任何一个程序都有一个程序入口,就像C语言里的main{}一样,比较诡异的是库是一堆程序,却没有入口,但是他可以被其他程序调用执行,库虽然不能独立执行,但是它被调用后会提供一个统一的调用机制。 库(library)只是提供接口,调用称为call。 系统调用(system call)是非常接近硬件的,所以对于开发者也是不怎么友好的,系统调用由内核(kernel)提供,操作系统除了提供内核外,还需要将内核所提供的系统调用输出出来,而这种输出是通过较为高层一点的调用接口来实现,称为库调用(library call)。 库调用简写为LIB,又称为API(应用编程接口)。 程序员就是负责调用计算机所提供的某些功能,然后开发程序的过程。 但是我们要明白,一个程序可能运行在库调用上,也可能运行在系统调用上,运行在系统调用上的程序执行的效率可能会更高,但相对也会更难,获得的权限也就越大,此处限于水平就不拓展开了。 我们需要知道,当计算机运行起来之后,内核和程序都是放在同一个物理内存里的,那么怎么保证内核的稳定性呢?要是一个恶意程序捣蛋一下那不坏菜了? 为了保护内核的安全,CPU厂商从硬件上做了限定,因为内存控制器都在CPU里面嘛,所以inter平台提供了一种四个同心圆级别,最内圈为零级别,又称为特权模式,零级别会映射到内存中某一段处于保护的空间当中,只有内核才能工作在特权模式下,而且其他的程序只能运行在最外层,中间两层没有使用。 所以在任何情况下,所有应用程序是不能访问内存中处于零级别的区域的。 现在就可以知道,当计算机运行起来之后,内存会被分为三段,第一段是开机时BIOS的映射程序,第二段就是处于零级别模式的内核,第三段则被其他应用程序所共享。 内存中的数据如果不是连续存储的,则会产生内存碎片,这个事情内核会解决的。 好了我现在已经知道了系统内核、系统调用、库调用,有了这些操作系统就可以运行了吗?其实原则上来说只要有内核计算机就能跑起来了,但是问题在于你怎么去和计算机交互?难道是吼两嗓子?显然这是行不通的。 所以我们需要计算机提一个供能够和我们交互的窗口,这个窗口就是shell。 Shell就是把计算机的功能通过人类容易理解的操作方式输出的一个接口,也称为人机交互接口。有了shell以后我们才能够去执行程序完成一些工作,才能够操作计算机看看小电影什么的。 广义上的shell有两种。 1. 图形化的shell,我们现在使用的windows系统提供的就是图形化的shell。 2. 命令行的shell,可以借鉴windows下的cmd,就是那个黑黢黢的命令行。而我们的linux大多数情况下都是在这样的窗口下运行的,有时候甚至连显示器都没有,当有需要的时候再接上显示器。当然,这一步还非常之遥远。 在linux上的图形化shell常用的有三种,称为GUI(GGraphical user interface) 1. GNOME 使用C语言开发的 2. KDE 使用c++语言开发的 3. Xface 主要应用于嵌入式轻量级桌面系统 GUI接口大多通过鼠标操作,就像玩游戏那样在屏幕上点来点去。话说鼠标是施乐公司的雷锋实验室PARK发明的。 但是linux主要工作在命令行模式下,种类很多,称为CLI(command line interface) 1. bash 最常用的,功能强大而且开源 2. csh 3. zsh 4. ksh 5. tcsh………… 我们正常登陆命令行界面通常称为虚拟终端(多个模拟的显示器),tty1-tty6,通过Ctrl+Alt+(F1-F6功能键)实现虚拟终端切换。 这里涉及到一个问题,用户的身份验证。总不能谁都可以动动你的电脑吧? 所以就有了认证的概念,认证机制可以使指纹、虹膜、密码等等等 我们的密级没有那么高,用密码就差不多了,主要是更高的防护手段代价也很高。 我们首先会创建一个标识身份的用户名,但是这个用户名可能很多人都知道,所以就有了密码作为防护手段,并且使用用户名和密码来限定使用者的权限。 认证的过程就是鉴别某个用户是否就是声称的那个人的过程,认证并不代表就是全部,之后还要完成资源访问的授权,并且系统还会做相应审计,审计就是把你干的事情都统统记录在案,以后查起来就会有依据。审计通常会以日志的形式保存在计算机中。 那么至此,我们已经能够进入一个操作系统了,可以实现看他几天几夜伟大的小电影梦想了…… 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 给自己讲linux 2016-12-04 评论 1826 次浏览