第四讲——操作系统内部结构 要讲操作系统内部结构,先讲一讲什么是程序。 程序就是个程序,鼠标双击就可以运行了嘛,有啥好讲的?是不是? 所谓的程序就是按照人们的意愿,将计算机硬件的功能调用来完成一些特定工作的代码,当然光是代码还是不行的,因为计算机不认识啊!计算机比幼儿园的小朋友都笨,只认识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功能键)实现虚拟终端切换。 这里涉及到一个问题,用户的身份验证。总不能谁都可以动动你的电脑吧? 所以就有了认证的概念,认证机制可以使指纹、虹膜、密码等等等 我们的密级没有那么高,用密码就差不多了,主要是更高的防护手段代价也很高。 我们首先会创建一个标识身份的用户名,但是这个用户名可能很多人都知道,所以就有了密码作为防护手段,并且使用用户名和密码来限定使用者的权限。 认证的过程就是鉴别某个用户是否就是声称的那个人的过程,认证并不代表就是全部,之后还要完成资源访问的授权,并且系统还会做相应审计,审计就是把你干的事情都统统记录在案,以后查起来就会有依据。审计通常会以日志的形式保存在计算机中。 那么至此,我们已经能够进入一个操作系统了,可以实现看他几天几夜伟大的小电影梦想了…… 给自己讲linux 2016-12-04 评论 1826 次浏览
第三讲——讲一讲系统 说起操作系统来,大家肯定不会陌生,毕竟大多都是那么多年的资深骨灰级玩家,我这种小流氓那是肯定入不了法眼的。 我们常见的操作系统是由大名鼎鼎的微软公司开发的操作系统——Windows,不管是XP,7,8,9,10还是什么,面向的都是桌面级用户,也就是说开机之后操作系统会给你提供一个图形化的操作界面,你可以用鼠标东点点西点点,可以偷偷摸摸看点小电影啥的,这个就是windows操作系统给我们提供的与计算机交互的界面。 操作系统有很多,说成百上千一点儿也不夸张,但是按照操作系统内核来划分大致可以分为以下几类。 1.Windows NT 这就是windows操作系统的核心 2.Unix 采用这一核心的操作系统就太多了,就连前些年割肾都要去买的苹果全家桶,其核心也是基于Unix,Unix大旗下大将颇多,比如 惠普公司的 HP-UX Sun公司的 Solaris 还有一些是AIX,sco Unix,Unix wave等等 3.linux linux核心演变到今天早已无处不在,市场占有率很高的安卓手机,其核心基于linux,只是上面跑着一个Java的虚拟机,所以安卓系统与linux操作系统区别还是很大的,其安全性的差别因手机厂商的能力各有不同。 Linux旗下发行版那叫一个多,Redhat,centOS,Debian,Ubuntu,mint等等等等。 大家可能注意到了我在描述linux的时候用了“发行版”三个字,为什么用这么个词来表述? 首先,发行版这个词并不是我创造的,我只是引用一下,这个就得从linux的出生说起了。 Unix 1969年在贝尔实验室诞生,期初的时候是跑在一台PDP-7型号的计算机上,用来实现一个飞机大战的游戏,后来这个游戏没有火,运行这个游戏的操作系统火了,当时的编程语言大多都是汇编语言,汇编语言对硬件依赖性很大,不能很方便的移植到其他计算机上,这对于众多开大者来说很不方便,于是Unix的作者肯•汤姆森和另一名高手丹尼斯•里奇一起合作改写Unix,可是当时并没有合适的高级语言来给他们使用,于是两人先将一门叫做B的语言改写成了适合他们使用的语言,这个语言大家不会陌生,就是大名鼎鼎的C语言。条件具备了以后肯•汤姆森和丹尼斯•里奇用C语言将Unix操作系统重写,这使得Unix和C语言得到了迅速的发展,后来因为贝尔实验室被其他巨头收购,就收回了Unix的版权,也就是说使用Unix是要付费的,在此之前是开源的,开源使得Unix在很多大学里生根发芽,这其中最著名的就是BSD,是由加州大学和伯克利大学合作的产物。由于版权收回,使得BSD面临了一场旷日持久长达十年的官司,这十年里很多人畏于版权放弃了Unix系统,转而使用其他的操作系统,这使得Unix在市场的占有率大大受挫,Windows就是在这个时间段里发展起来的,虽然性能不好而且经常死机,但是它便宜啊,与其他操作系统绑定硬件出售的方式不同,Windows操作系统(那时还叫DOS)卖授权,就是给人家机器上安装操作系统一台几美元的价格,这在当时一个操作系统动辄上万刀来说不值一提,就算是性能差,因为没钱,所以能忍就忍!这一巨大的价格优势使得微软迅速壮大,苹果在那个时候是软硬件一起卖的,虽然性能不错但是高昂的价格让人望而却步。后来Windows迅速推出了桌面版的Windows NT,98,2000,2003,xp等等,一路势如破竹,当Unix与BSD醒悟过来的时候十年已经过去了,操作系统的江山几乎被微软的操作体统霸占。但是微软操作系统的不稳定为以后再服务器上的道路埋下了深深的隐患,谁也不想正热火朝天的赚钱,然后机器说崩溃就崩溃了。 Unix的优势在这个时候展现了出来,但是其高昂的价格依旧让人难以接受,一位大学教授为了教学需要,自己写了一个操作系统内核,但是这老头儿很固执,他决不允许 别人往里面加代码,这让一位小伙伴尤为恼火,这个小伙伴叫李纳斯,李纳斯是个富二代,家里在他生日的时候送了他一台计算机,装的是Unix的操作系统,这小伙儿觉得用着不爽,恰好在网上看到了老教授售卖的系统附带源码,于是就弄了一份,老教授的固执己见让李纳斯爆发了小宇宙,只花了几周的时间写了一个操作系统,叫做Linus,并以GNU(开源协议)协定将其放到了网上,这不打紧,这对于刚好需要一个操作系统内核的GUN组织来说简直是雪中送炭,GNU是一个递归缩写GNU’s Not Unix,但是GNU的所有软件都是跑在Unix上的,这不得不说很打脸,好几年都没有改变,知道Linus这个内核的出现,后来这个内核在全球众多志愿者高手们的努力下壮大起来,至于后来怎么就变成linux了就需要交给各位去研究了。GUN是一个提倡软件代码开放的组织,他们认为代码是全人类的共同财产,这在当时有众多大神般的人物支持,这个组织的倡导者是个很有实力的教授,gcc编译器就出自他的手,还有一款功能很强大的文本编辑软件Emace,且都是开源的。 这样一来万事俱备,东风也有了,所以作为完全开源的linux迅速的发展流行起来,但是这是在高手之间的流行使用,对于普通人来说,一大堆的源代码没法使用。 于是就出现了一些如Redhat的组织或者商业机构,他们把源代码收集起来,把内核和各类软件凑到一起,拼凑成一个可以供人安装使用的操作系统,这个操作系统称为发行版,当然这些发行版也是遵循GNU协定的,一样会公布源代码,而且这些组织或者商业机构还开发了相关的软件管理软件,例如Redhat的rmp,Debian的apt等等 解释发行版三个字整了洋洋洒洒一大片,阿弥陀佛,罪过罪过,水平有限,凑合着看吧。 给自己讲linux 2016-12-03 评论 1781 次浏览
第二讲——开机流程 开机流程?难道不是按下开机键就行了嘛?我………… 上一节我们已经整好了一个能够插上电的一堆硬件,但是这并不意味着按下开机键就能那啥了…… 好了,说正经的。 当我们准备好一个硬件环境的时候,这才是我们具备了一个基础条件之一。因为我们不知道这些硬件能不能好好地相互配合,能不能按照我们的想法运行,所以,开机并非是那么简单的操作,只是这些操作不是我们去完成的而已。 1.上电自检 什么叫上电自检,为啥叫上电自检? 我们给新装的电脑插上电,按下开关,此时的主板会先工作,就是那个把许多设备穿在一起的大个头电路板,上面有一个闪闪发光的玩意儿——电池,它是用来给主板上的某些部件供电的。就是那个大个头,在上面由生产厂家封装了一块芯片,芯片里面写了一个程序叫BIOS,那个芯片叫ROM,只读存储器,什么叫只读,就像你在外面的商场见到的那种大显示屏一样(实际上是LED矩阵),你只能看看里面播放的是不是小电影。 这个小程序会被加载到RAM(内存)的第一段(此处分段会在后面解释),按照程序的设置检查设备是不是好的,如果有硬件坏了还会有声音发出来(本流氓表示没听见过几回),如果是第一次开机,检查结束的硬件信息会被保存在一个flash芯片里,由那个亮瞎眼的小电池供电以存储数据,它还有一个作用就是维持硬件时间,像电子表一样,维持里面的石英晶体振荡器的振荡来计算时间的流逝。 如果在此时用户与计算机硬件 产生交互,也就是说你按了键盘什么的,这时键盘就会产生一个电信号通知CPU,这时候CPU机会暂时停下手里的活来响应用户的指令,这个称谓中断。中断是一种硬件通知机制。 这就是为什么我们按下键盘就会有响应。 还有一种就是CPU不停的扫描用户有没有按下某个按键,这个称谓轮询,这种效率很低下,在单片机里会有。 这样的话问题就来了,为什么计算机知道你按的是键盘而不是你的鼻子耳朵鼠标? 主板上有一块芯片,称谓可编程控制器,它的针脚与CPU是相连的,我们可以简单的理解为这个芯片的一个针脚代表一个设备,如果你的键盘鼠标很多,硬盘也有很多怎么办?哎,土豪任性起来让人头痛啊! 这种情况也不是没有,服务器上挂个千儿八百个硬盘还是很常见的,这时候可以再可编程控制器的一个针脚上标识多个设备,用所谓的中断向量来表示……此处省略我也不知道多少字 所以计算机的CPU就是通过不停的中断来与外围设备交互的,当然中断越多对性能的影响也就越大。 比如一些大的网站每秒的请求就上千次,假如一个网页3M,图片乱七八糟加起来轻轻松松过3M,也就是说每秒硬盘的吞吐就的数GB,这要是机械硬盘估计能着火了,所以大多都采用固态硬盘,有些人为了提高硬盘的效率,将固态硬盘直接接到了北桥上,因为北桥是高速总线嘛,起点高啊,机械硬盘因为是有机械结构的,瓶颈很明显,就算是接到北桥意义也不大……看来硬件配置是我的硬伤…… CPU与内存的交互也不是直接互怼的,毕竟CPU那么厉害,内存也怼不过,大家可能听说过缓存,缓存干嘛的?缓存就是用作数据缓冲,你CPU不是吃的快吗,那我提前给你扔点吃的在换缓存里,反正我(RAM)货备的足,CPU有一级缓存、二级缓存,其中和内存交互的是二级缓存,CPU里的都是高速缓存,高速缓存的造价昂贵,举个例子,同样是I7四核心,但是一个二级缓存2M一个二级缓存6M这个价格可能翻一番都还不止,二级缓存容量的提高会提高CPU的性能。一级缓存分为指令缓存和数据缓存,为什么分开?凑一起不好吗?分开会避免冲突并且提高效率,在一级缓存之上还有个和CPU以一样的频率运行的缓存,叫寄存器,就是临时存放数据的,比如要计算2+3,将二传输进去后放哪里?寄存器就是这么个作用,这玩意儿造价啧啧…… 这时候计算机自检结束后会在硬盘里的找MBR(主引导分区)以及引导驱动器的分区表,当然这个时候那个小电池的威力就出来了,它会将所有的硬件信息保存在一个叫CMOS的玩意儿里,你可以在BIOS中定义你的启动顺序,从光驱还是第一块硬盘,或者网络,当然你要是有装小电影的硬盘可能也是可以的。然后BIOS就会从硬盘第一个扇区加载MBR到内存,找到MBR里的启动程序和磁盘分区表,然后把工作给启动程序,这个启动程序称为BootLoader,它常常是grub/lilo,这也就意味着系统的控制权从BIOS过渡到了grub/lilo,然后再由grub/lilo找到相应的操作系统,确切的说应该是内核,这样就把权限过渡到了操作系统的内核,此时才会有那个Windows系统熟悉的几个方块的出现,在操作系统中查询硬件信息时都是由BIOS提供的,CMOS里面记录着一张庞大的拓扑网络结构,就是各个硬件之间的关系以及线路是干什么用的,比如网卡是连在第几条PCI总线上的。 至此,这堆花里胡哨的玩意儿终于能像个正常电脑的模样运行了。 给自己讲linux 2016-12-02 评论 1882 次浏览
第一讲——硬件讲解 学习这件事不仅要像吃饭那样一直总结坚持下去,还不能吃了这顿忘了上顿,更不能不知道下一顿该吃啥。开始总结笔记,主要是这是我第四遍从头到尾撸知识,前三遍用完了一沓A4纸,当然不完全是计算机方面消耗的,瞎搞搞打印打印文件什么的,说了一堆,都是废话,开始我的成神之路。 第一节——计算机硬件组成: 我们常说的计算机,也就是PC机,家里手头都有的,什么台式机、笔记本,它们大多采用了冯诺依曼结构。也就是计算机的五大构成,这不同于我们现在常说的几大件。 1.运算器 运算器简单地说就是用来执行加法和逻辑运算的部件。 运算器和控制器是组成CPU的重要组件 2.控制器 控制器,顾名思义,用于控制其他各个部件工作的部件。 3.存储器 此处的存储器并非硬盘,而是RAM(易失性存储器),意思就是断电数据就消失,俗称运行内存。 4.输入设备 这个大家都熟悉,键盘、手写板、鼠标等等都是输入设备。 5.输出设备 常见的输出设备有显示器、打印机等等。 硬盘属于I/O设备,Input/Output 既是输入设备又是输出设备,是辅助存储设备。 输入输出设备又叫交互设备。 那么问题来了,这些设备之间是怎么工作的?用线穿起来就可以了? 当然不是,把这些设备整合到一起的设备我们称为主板。就是主机箱里的那块个头最大的电路板,上面插了很多设备。 以前的老主板上面会有较为明显的区分一个概念,叫做南桥、北桥,肯定不是北乔峰南慕容。 北桥靠近CPU,因为北桥负责连接CPU于内存(RAM),CPU的频率(运算速度)很快,而内存的频率往往因为制造成本达不到CPU的频率,所以北桥就担负起调节频率,使CPU和RAM之间数据传输的频率在RAM承受的范围内,这也就解释了为什么DDR4频率提高后性能会有提高。 南桥干啥的?肯定不是凑热闹的,是吧?不然买回来的电脑上有个没用的玩意儿心里挺憋屈。 我们刚才说了,CPU和内存连接了,那其他的设备怎么办?总不能看着CPU和内存眉目传情吧?我就来说一说有哪些设备看着的,输入设备,常见的就是键盘,输出设备,常见的就是屏幕,还有个玩意儿,没它根本玩不转——硬盘。 这些设备的速度相比内存来说都慢了太多太多,对CPU来说那就更慢了,你要是一秒钟能敲击键盘几十亿次当我没说过。这些设备因为慢所以就有一个要求不高的设备来连接它们,就是南桥。 南桥负责将接收的数据转给北桥,由北桥再转发给CPU。 但是现在主板上的北桥功能主要不是连接CPU与内存,CPU厂商将内存控制器直接集合在了CPU内部,这样就大大提高了与内存数据交换的能力。 所以北桥负责高速总线,南桥负责低速总线,说起总线,大致有三种 1.数据总线 负责数据的传输 2.地址总线 简单说就是用来访问内存中的实体地址,内存是一种平面编码存储器,就像有很多房间且有门牌号。 3.控制总线 用来传输控制信号 这么多线要是放计算机里那就太让人恼火了,所以就有了线路复用的概念,就是一条线能实现三种功能 硬件差不多就这么攒起来了,把设备什么的插一插,然后再插上电源,然后……开机? 现在开机这种事还是不能达成我们进入一个操作系统并玩玩游戏的愿望的。 Why? Because……你(wo)没(bu)有(hui)操(shuo)作(ying)系(yu)统…… 给自己讲linux 2016-12-01 评论 1859 次浏览