linux基础篇之vmware workstation计算机体系结构(下)

    程序要想运行,就意味着它利用这个芯片的某根线的功能来进行执行,那所以想象一下,英特尔公司生产的CPU和摩托罗拉生产的CPU放到一块,它的运行机制可能会不一样,那如果有一个程序员开发的程序在英特尔的CPU上能运行,放到摩托罗拉上能不能一定会运行?那怎么办?我怎么能够写一个程序,让它两个都能运行呢?所谓的程序的移植听说过吗?什么叫移植啊?为什么需要程序?为什么需要移植?就是因为我们底层芯片的工作机制不同,而程序是必须要依赖于芯片才能工作的,对吗?因为机器能理解的只能是二进制,对吗?后来为了能够加速程序员的开发速度怎么办?这个芯片的生产者给芯片本身附带了一个语言,叫微码,
每一个芯片都会支持微码编程的,就是所谓的汇编语言。
    汇编语言是什么?就是用人类的自然语言所能够表示的单词,比如说我移动就用move,加法就plus什么之类的,
用的这种单词来进行表示,那程序员就能理解了,程序员能理解但机器理解不了怎么办?进行转换,OK,我们必须要将汇编语言开发的程序编译成、也就是所谓的转换成机器能理解的语言,那所以它需要个工具?这个工具我们称为叫编译器,编译器是什么?它也是个软件,这个软件能够负责将我们程序员写的微码程序,人容易理解的程序,给它转换成机器语言,所以才能在机器上运行,对吗?但是我们刚刚有说过,微码是芯片自带的,那因此英特尔芯片的微码和摩托罗拉芯片的微码是一样的吗?肯定是不一样的,对吗?那所以你在英特尔上开发的微码放到摩托罗拉上基本上是无法运行,所以汇编语言尽管说人类容易识别,但是它跟硬件芯片的结合程度仍然是非常紧密的,而所以这种语言我们也把它称为低级语言,后来就产生了高级语言,那高级语言是什么呢?为什么把它称为叫高级语言?这种语言,它有这样一种特性,但是无论是哪种语言,最终它要能够在CPU上运行,必须要转换成二进制,所以它也需要编译器,但是高级语言是这样一种语言,它本身需要先转换,而后再转换成对应芯片上的语言,当然,刚才说汇编跟芯片本身就是结合在一起的,对不对?所以一般而言,先翻译成汇编,然后再翻译成机器语言,当然,这个过程,我们不用了解,没那么复杂,但是各位要知道,高级语言要想能够真正工作起来,有一种特性,就是它要结合一些额外的机制来弥合多种芯片,比如说,这个是我们的英特尔的CPU,那个是摩托罗拉的CPU,它俩本来是不一样的,他们所执行的程序格式是不同的,那怎么办呢?

    我们在这个程序之上给它放一层设备,我们在使用其他的高级语言编程的时候,这高级语言学所写出来的程序,它只需要能够跟这个中间设备结合就行了,如果说两个机器上的中间设备是相同的,那意味着,上面程序不用关心你的底层硬件是什么?只需要关心中间设备是不是相同就可以了,这个中间设备,我们可以把它理解成叫API,我们称为叫应用编程接口,所以API是什么呢?它就是在不同的CPU上使用汇编语言,大家知道,不同的CPU是不是都有汇编?而写出来的具有相同功能的程序,这个程序它本身不会自动运行,它只是告诉你不用关心我这里的CPU是什么了,接口是这样子的,给你虚拟成这种样子,所以库是一种虚拟设备,可以理解吗?库就是一种虚拟器或者叫虚拟机,它只不过向程序虚拟了相同类型的执行环境,可不可以理解?好,那我再解释一遍,任何一个硬件芯片,它所能够运行的二进制格式以及运算逻辑,各不相同的,所以为了,便于程序员开发程序,每一个芯片自带的都有微码编程环境,也有自己的编译器,好,尽管如此,由于两个芯片的运算逻辑不同,所以使用汇编语言所开发的程序就是无法移植的,彼此之间不能交叉运行,这也使得我们程序员所开发的程序为了运行在不同的CPU当中,你得开发多个不同的版本的程序,怎么办呢?将底层的不同微码再给它增加一个中间层,让两个不同的设备上的中间层是相同的,这个中间层一般来讲,可能是使用汇编开发完成以后,它将底层芯片的功能使用软件的方式给你抽象出来了,而两种不同硬件平台使用软件抽象出来的环境是相同的,而这个基本的环境,由谁来负责抽象这个环节?有些公司,也有一些社会上的组织,或者GPL的等等,或者叫GNU的啊,这些组织,所以使得我们使用高级语言开发完程序后,你会发现,你压根就不用考虑说,你的CPU到底是哪个厂商的,比如是AMD的还是因特尔的还是摩托摩拉的,都能运行,但事实上AMD和英特尔是兼容的,或者说是没有太大差异的,因为它们都属于x86架构。
    我们就说说常见的CPU有哪些系列呢?硬件平台架构叫硬件架构,我们以后再提到架构的时候,你就知道这指的是CPU芯片的不同,而不同系列彼此之间进行交互,可能是比较困难的,程序是需要移植的,那这些架构有哪些?各位应该知道,我们现在所使用的手持智能设备,大家玩的手机,基本上都是安卓的,或者IOS的,鸿蒙的对吗?在硬件架构上,他们都统统属于一种,叫移动硬件平台,绝大部分都是ARM架构,arm是英国的一家公司,这家公司只生产知识产权,不生产设备,他们只负责设计芯片,真正生产,都是由三星、高通这些公司生产,它们都是ARM系列,而各位应该知道安卓,安卓系统本身核心其实就是我们的linux,以后我会专门去讲,当然你自己没事儿也可以去封装,或者讲完了系统的整个linux构成之后。
    好,这是arm系列,这是一种CPU的架构类型,各位需要注意,另外我们常见的就是我们的x86,x86指的就是你的英特尔或者AMD的x86系列32位的平台,那32位指的是什么?64位又是什么?这个我相信,对各位来讲容易理解,32位就是我们大马路并行,32车道,64位就是大马路并行,64位车,64车道是不是?那你想象一下,64车道它能够实现的交通流量比32位是不是要大得多啊?x64就是所谓的AMD 64,因为64位是AMD最先做出来的,当时英特尔的64位是模拟的,好,英特尔还有另外一个CPU叫安藤,各位听说过吗?安腾是英特尔当年没有64位的CPU,而AMD已经出现的情况下,急需要一种64位的架构,从惠普公司买的,从惠普收购了安腾,原来属于惠普,当然,惠普现在也有叫阿尔法,惠普公司曾经收购了DEC公司,所以惠普有两条CPU生产线,一个是安腾的,一个是阿尔法(alpha)的,后来安腾卖给英特尔,

    当然,英特尔好像也着急了,因为现在主流的移动设备已经是ARM,所以下一个巨头肯定是ARM,ARM芯片的最重要特点就是省电,而且性能也不错,当然跟x86系列的cpu性能比起来,要差的多,比方说比较高性能的CPU,像sun公司设计的,或者斯坦福大学设计的,后来转让给sun的,由富士通公司代为生产的叫Ultrasparc,这是sun公司的,当然sun已经被oracle收购了,这种CPU性能非常强,很早之前就支持64位,事实上,比Ultrasparc更牛的是另外一个,叫power ,这是IBM的,power是世界上第一个双核心、八核心、核心64核心等CPU,性能超强,当然价格也超贵,而且也是第一个主频超过4g赫兹的CPU,大家知道现在的制作工艺已经遇到瓶颈了是吧?好像主频无法再提高了,4g就是一个天花板,因此CPU再强,怎么办呢?就向多核心发展,两核儿,四核儿,八核儿,就这样,让CPU性能更强,早先都是通过提升CPU主频的频率来实现,另外,摩托罗拉也生产CPU,早前呢,叫摩托罗拉M68000,摩托罗拉早期是生产CPU的,只不过后来的转而生产手机了,而且早期的很多设备上的CPU用的都是摩托罗拉,有时候把它称为叫M68K,因为1k就是1000嘛,后来苹果、IBM和摩托罗拉三家联合起来生产一个比power要差一点,但是性能仍然很不错的CPU叫power pc,各位应该知道,power pc早期的苹果的系统是无法装在我们PC机上的,现在可以了,苹果可以装在你的酷睿双核上面去了,那是因为苹果进行了移植,事实上,早期苹果公司所生产的台式机或者小型机都是power pc的CPU,
那个时候的苹果。
    是没办法运行在我们的PC机上的,不是同一个架构,装不上去。现在可以了,以至于苹果的很多是很多笔记本儿也用的都是酷睿的CPU了,但它仍然需要很强的CPU才行,因为其实苹果是个unix ,mac OS 是个unix,包括它的iOS也是一个unix,是free BS的unix,后面我们讲了linux的发展史的时候,你会明白他们彼此之间的关系啊,万变不离其宗,对吧?好,这是powerpc的。当然,还有其他的,我们这里不再一一介绍了,
    事实上,linux遍布在任何一种角落里头,就是因为linux几乎支持这所有的CPU类型,甚至于连IBM的一些专用小型机它都能支持的很好,这就是linux这种开源技术的强大之处,好,那接下来我们再来说说到底操作系统是什么?linux就是一个操作系统,对不对?所了解的linux操作系统有哪些呢?当然WINDOWS不用提了,是吧?linux,还有unix对吧?其实unix已经是一个范畴了,底下有很多的,各厂商的unix,比如说像惠普的叫HP-UX,像sun公司的叫solaris,IBM的叫做aix,还有SCO公司叫SCO unix,这都是商业版的,所以unix已经是一种联盟,是一种范畴,它不再是某一个特定的操作系统了,那其他的我们听说过的,就像你的安卓它也是个操作系统,安卓只不过还是linux,iOS还是一个unix而已,万变不离其宗,对我们的单颗CPU的主机,那它有个CPU,有一段内存有,输入输出设备,是不是,那在某一时刻能够运行的程序有多少个呢?CPU只有一颗,我们假如它也是单核心的,那因此,在某一时刻,它只能进行一个运算,是不是?OK,但是好像我们打开程序以后,为什么这些程序看上去是并行执行的呢?其实,早期计算机刚生产出来的时候,那时候所有的很多操作都是人工的,输入设备穿空纸带输出设备发二极管,不是像今天这样有磁盘,生活是这么美好,虽然说近几十年的发展是突飞猛进来形容一点都不为过,但事实上,倒回50年,你会发现那时的计算机是理解不了的落后,
早期的计算机,它运行的运行的程序也只是程序,有程序员使用机器语言编一个程序或者使用汇编语言,编好这个程序之后,将程序转换成二进制,然后用一个纸袋机,做成穿孔纸带,一就不打孔,零就打一孔,有那种输入设备,就是装读进我们计算机的内存当中,由计算机开始运算,运算结果由发光二极管把它显示出来,
亮起来就是一,不亮就是零,然后有很多记录员,他负责记录这一位。人们发现,计算机很快,输入输出很慢,是不是?那怎么办?如果是你的话,该怎么办?那时候计算机也很昂贵,体积也非常庞大,一个计算机亮起来,几乎需要一栋楼上所有电气设备加起来的电还要多?所以运行一秒钟的代价是非常昂贵的,那因此人们就尽可能希望计算机的运算而不干别的事,所以这个时候为了能够编程序,干脆这样子,买好几台计算机,弄一个性能非常差的、一个性能非常好的,那个差的负责由程序员编程,编完程以后用快的进行运算,再后来,计算机发展就出现磁带了,当然这个磁带跟我们的磁带盒式录音机上的录音带是类似的,磁带上面可以存储磁性信息,进行读入的时候,速度就已经快的多了,对不对?好,那因此程序员编的程序就放在磁带上,然后由那个计算机从磁带上读取,当然,磁带有个坏处,大家知道,磁带它只能按次序访问,好,但不管怎么讲,这时候人们就用两台计算机,一个计算机负责让成员编程,之后把它存储到磁带上,
而另外一台计算机只负责从磁带上读取程序,这个时候我们把计算机称为叫批处理系统,能理解吗?把它称为叫批处理系统,为什么叫批处理啊?什么叫批处理来,我给大家做一下解释,在计算机上运行一次完整的计算过程,我把它称为叫一个作业,叫一个job,多个作业,我把它称为叫jobs,好,那早期的作业在磁带上,每一个磁带上面可能放一个作业,这作业完成了,把磁带拆下来,再换下一个磁带,这能理解吧?OK,那后来,我们为了能够让它更快速,怎么办呢?我可以在一个字上放多个作业,而且多个作业之间是用一些分隔符隔开,比如说,第一个作业,放完之后,我把程序放进去之后,用一大堆的$符,比如说,一大堆$符,然后放第二个作业,那因此,我们计算机读到这个位置的时候,发现这个$符就知道直接作为结束,那么,执行完成会自动的去加载第二个作业,能明白了吗?这种叫批处理,它可以一次读一个,执行一个,再读一个,再执行一个,但这个时候大家明白,它在某一时刻是不是仍然只能执行一个程序啊?或者只能执行一个作业,
为什么只能执行一个,其实也容易理解,因为我的内存只有一段,这个内存是被这个程序所全权访问的,你两个程序交叉运行,第二个程序就可以把第一个程序的内存损毁了,这样子仍然会有问题,因为大家发现作业的执行过程当中,执行一个指令过程中,我的计算机的CPU由于速度过快,大多数时间为了跟IO交互都是空闲的,为了完成IO交互,它也是空闲的,比如说,我这个作业读进来完成了,为了加载第二个作业,第二个作业在磁带上,我把磁带转着、机械运动着,把它完全读进内存,这中间CPU干啥去了?是不是计算能力是非常昂贵的呀?因此,人们就期望能够尽可能让CPU的工作繁忙起来,那就意味着,我们尽可能期望有更多个程序同时运行,这就叫多任务系统,对吗?那怎么能实现多任务呢?内存只有一段,一个程序访问,另一个程序就没法用,CPU也只有一颗,运行一次的运算,就无法进行第二次运算,怎么办?OK,那就是意味着将一个资源我们给它分成多个资源,是不是?给它切割开来,那我们计算机运行,刚刚说过,就需要两个核心部件,一个是CPU,一个是内存,对吗?那我怎么进行切割呢?怎么对它们进行切割?你的CPU怎么切割?就人大脑一样,你怎么同时想两件事儿?假如说我想第一件事儿需要十秒,想第二件事儿需要十秒,我怎么能够让第二件事和第一件事同时进行?想第一件事,一秒钟,停下来想第二件事,一秒钟,再倒过来,想第一件事,一秒钟,再想第二件事1秒钟,交叉着进行,但问题是,当你想到第一件事,你已经进行了一秒钟了,这一秒钟是不是已经想出来一些结果了?这些结果怎么办?然后你直接就想第二件事了,第一件事那基本上结果是就没了,是不是这意思?那中间所生的这些数据,我们必须要把它保存下来,我在重新回来,想第一件事的时候,能够从那个结束的地方重新开始,从结束地方继续,是不是这意思?而这个过程,我们把它称为叫保存现场的过程,能理解吗?叫保存一个程序的现场,回头我们再重新倒回来的时候,还能从现场重新在停止的一刻想,那怎么完成这些工作呢?进而我们经常就引入了所谓的进程的概念,进程是怎么工作的?首先我们把CPU要进行切分,
刚才我说过怎么切分呢?CPU的运算是随着时间的流逝而完成的,是不是这样?所以它是持续时间驱动的,那因此,把CPU就划分成了计算时间,叫CPU计算的时间片,叫slice,time slice,比如说,一个时间片是五毫秒,假设啊,五毫秒,那因此它运行第一个程序五毫秒,运行第二个程序五毫秒,这能理解了吧,然后在它们之间不停的进行交替,那内存怎么划分?我们物理内存插上去以后,可能只有一条,是吧?你不管是多少条,但计算机看到的是一样的,那内存怎么切?内存也更好切,中间一刀,两开是不是就可以了?第一个程序访问前半段,第二个程序访问后半段,但是现在又出现一个问题,它第二个程序怎么知道自己访问应该是后半段,而不是前半段呢?每个程序都假设自己从零开始,那所以,它俩之间是不是仍然会相互交叉的?那这时候该怎么办?所以内存当中,我们可以引入分段机制,我把CPU分段,怎么分段呢?第一个程序执行的时候,比方说我把CPU内部分成两段,但是对每一段来讲,它是不是都有自己的零、一、二、三、四,从哪一段开始编制啊?我们要全校统一编号,那个是零零一、零零二、零零三,如果我们分一班的零零一,那二班是不是也可以有零零一啊?那所以,他们都可以有自己的地址的起始位了,那所以把它分成两段以后,第一个程序用第一段的,从零零一开始,而第二程序从第二段的零零一开始,那就意味着,这个地址是相对的了,相对于它的这一段的位置开始的,所以我们的程序员仍然使用零零一,但是在计算机内部由CPU来完成,或者由硬件本身来完成,好,将内存分段来完成,但是还有一个问题,什么问题呢?比如说张三的主机,它配了两g内存,李四的配了512M,而一个程序员怎么知道我这个主机由多少内存?我编程的时候,难道说我还要为512M内存的环境开发一个程序,2g内存的开发一个程序么?这显然不现实,对不对?该怎么办?虚拟地址空间,注意虚拟地址空间不叫虚拟内存,什么叫虚拟地址空间呢?每一个程序员开发程序的时候,我也甭管你到底有多少内存,我就假设,如果你是32位系统,4g内存,如果是64位系统,那现在好像还没法输出来有多大,反正就是可以无限大的,而32位系统的CPU ,一共的地址总线只有32位,32位最多只能引用多少个不同的地址?多少个?4g个,所以32位系统最多只能使用4g的物理内存就是这个原因,因为这是由它的总线宽度决定的,那64位系统就是二的六十四次方了,对不对?那就是4g×4g的内存,好,这叫虚拟地址空间,那因此,每一个程序在它运行的时候,它都有自己的虚拟的内存地址空间,只要是32位系统,我们以32位系统为例,都是4g,不管你物理内存有多大,它认为自己有4g,但事实上,大家知道,一个程序运行起来,它可能根本就用不了,它只是说自己可以有这么多,对不对?甚至可能只是用两兆而已,那因此,每个进程就这样运行起来,或者多个程序怎么同时运行啊?CPU分成两片儿或者分成多个片儿,给第一个程序运行一次,给第二个程序运行一次,而且我的内存里边儿,我的第一个程序占据了一半儿,第二个程序占据了另一半儿,那如果说,第一个程序本来就分给它五毫秒运行,但它粘到CPU上不松了,再也不走了,赖着不走了,怎么办?不允许的,是不是?那因此,我们就需要一种软件,这个软件负责去监视这些程序的运行,给你五毫秒,你就只能运行五毫秒,该你下你就下了,该让其他人上其他人就上,
能理解吗?那该谁下该谁上呢?谁先谁后呢?是不是得有一个人去协调?有个机制去协调,而这个机制叫什么?来完成这种机制的就叫操作系统,
所以操作系统是个什么东西啊?它也是个软件,运行在硬件上的,负责管理硬件资源的,而且将硬件资源所提供的计算能力,给它切割成多个片儿,把CPU给他分成多个片,分配给多个程序,然后内存分成多个段分配给不同的程序,并且,在它们之间完成协调,操作系统还负责完成一个程序的启动和终止,还要负责完成程序的切换等工作。
    而这个时候,我们不把它称作程序,因为它是一个运行的实例,我把它称作进程。一个正在运行的程序,进程的单词叫process,说白了就是个处理过程,那处理结束了就没了,是不是这意思?所以进程是有生命周期的,从启动到结束,而程序放到硬盘上,只要你不删,是不是都存在?所以程序和进程是两码事。这就我们的操作系统。所以,言而总之,操作系统其实说白了就是一种通用软件,这种软件不负责完成具体的工作,因此,这样的软件也可以有多个,这就是为什么有linux、windows、unix,但是眼下就有一个问题了,我这里要提出一个问题,就是我们的操作系统,或者我们的一个程序,如果这个程序能够在WINDOWS上运行,它是不是就能够在linux运行?不一定,为什么?比如说,刚才我们说过一个程序,它跟我们硬件平台是息息相关的,对不对?而我们的程序员,假如说,主机装的是个Windows系统,他在WINDOWS上使用C语言开发了一个程序,编译一下能运行,而后他把这个WINDOWS格式化了,把这个WINDOWS删了,又重新装了个linux,还是同一台主机,那此前在WINDOWS上开发的程序,能不能在同一台主机上运行,装的硬件是一样的,那么,
之前提到过,谁来负责弥合底层硬件不同的?我们把它称为叫库,库是什么,库是一堆的程序,回头我们讲到编程的时候,我们再深入的学习,库说白了就是一堆的程序,这个程序比较独特,我们还会讲到程序的执行格式,任何一个程序,它必须有自己的执行入口,从哪个地方开始来执行这个一个程序,它里边有很多数据,对不对?我从哪个地方开始啊?我把它称为开始之处,称为叫执行入口。如果写过C语言,知道应该有一个main函数对吧?如果学过JAVA的话,应该知道有一个静态类,公共静态类public static什么之类的,还有一个main方法,对不对?这个就叫程序的执行入口,而库它也是程序,这种程序比较独特,它没有执行入口,那怎么运行呢?可以被其他程序调用执行,所以他自己不能独立执行,只能被调用执行。但是它在执行的时候,可以提供一个统一的调用机制,它的调用接口是一样的。都是安卓手机,华为、小米生产的手机,只要充电接口一样,只要能连接充电器,至于它里边到底使用什么电池的都无所谓了,就是相同接口,无论是哪个厂商生产的,
里边儿到底用的麒麟芯片儿还是晓龙芯片儿,都是一样道理,好,这就是所谓的调用机制。而库只提供接口,它无法直接使用,只提供调用接口被程序调用,我们把它称为叫call,当然,我们先不说库,还回来说我们的操作系统,操作系统本身刚才说过,它是一种通用软件,这个软件装上去以后,就将我们的整个硬件本身所提供的计算能力用软件的方式模拟出来了。做了二次模拟,所以任何程序看到的就不再是硬件本身,而是操作系统所提供的接口,这能理解吗?操作系统的这种功能的接口为了尽可能简化,或者说尽可能少一点,把它做的都非常底层,而操作系统的接口,我把它称为叫system call,有了操作系统以后,任何程序都不能直接跟硬件打交道,要想使用硬件功能,必须要通过操作系统,必须要通过操作系统来进行协调,所以,假如说这是我们的硬件,上面运行着操作系统,在操作系统之上,我们运行了这样几个程序,运行起来以后,叫进程,对不对?任何一个进程,它要访问一个数据,数据是不是在硬盘上啊?那就意味着跟硬盘打交道,但刚才我们说过,
程序是不能直接跟硬件打交道的,怎么办?要通过内核来完成,对不对?内核中有一个功能就是通过调用的方式输出出来,我们称为叫系统调用,
    那因此,程序只需要向内核请求调用一下这个系统调用,而由内核负责将数据取出来再返回给这个进程,所以任何时候进程跟硬件打交道都通过这样一个中间层,这个代理人来完成了,这个代理人,我们把它称为叫操作系统。但是刚才说过,操作系统的功能是通过system call来向外提供的,system call,过于底层,非常非常底层,什么叫底层?底层意味着什么?比如说,要买一个馒头,然后给你了一堆麦子,你自己拿回去把麦子磨成面粉,再发酵做成馒头,当然这也是馒头啊,是这概念。你到我这来买馒头,我给你面粉,那你省的磨了,我如果直接给你馒头,你也省的做了,是不是这个道理?那你说哪个更底层呢?给你麦子更底层,还是给你面粉更底层?肯定是麦子,那给麦子有什么好处?为什么我给你的不是馒头,而是给麦子,我们的操作系统为什么作用底层?我给你麦子,你既可以做成馒头,你也可以做包子,你也可以做面条,是不是这个道理?那如果我给你馒头的话,你不能把馒头再揉回,还原成面粉去做面条,这是不可能的,能理解这个概念了吗?
所以,一个麦子就可以应付馒头,面条等各种情况了,是这道理吧,那操作系统为了尽可能简化它的调用机制、调用接口,所以它做的都非常底层,当程序员要想要一个馒头,他不得不自己买麦子给自己磨成面粉,再进行发酵,还得和面,这就太麻烦了,那怎么办?就有人专门负责将系统调用给它再一次封装起来,让功能更强大一点,有人负责把它做成馒头,包子,面条什么都有,你想要什么买什么,再也不用自己去磨面粉,而这些将底层系统调用一个或者多个的功能封装起来,做成更高级的接口,这个高级接口就是所谓的api。
     好,这是我们系统调用和我们所谓的库的概念,那因此很多程序员在开发程序的时候,比如我使用c来写一个程序,我是直接通过系统调用来写呢?还是通过什么接口来写呢?因为有些功能就已经好了,比如说,程序员负责需要将五个馒头打包,自己非得去买麦子,然后磨成面,然后做成馒头,再打个包。如果说,别人直接有做好馒头的这个功能,我们直接拿五个馒头,做个打包是不是就可以了,所以,程序员就是负责调用别人所提供的功能,然后去开发程序的这样一个过程,那如果有这样的库,你就没必要自己去再重新造一个,在程序界有个著名的论断叫造轮子的概念,也就是说,如果一个轮子已经有了,我们拿来用,就是了,没必要再重新造一个轮子。而这种机制就是将那些公共的功能给它做成库,这个公共的库也称为叫共享库,谁都可以拿来用,张三要吃馒头,李四也要吃馒头,我们如果每个人都自产自足的话,这称为原始社会了,对不对?
    所以现代社会的文明标志就是大家可以通过交换来提高生产率的,来提高这种优化配置的,程序员是根据库来编程的,那就意味着我们在WINDOWS上调,用WINDOWS提供的c库来编程,而在linux上使用linux提供的c库来编程,WINDOWS上开发的程序,linux是不是运行不了?那如果想要运行的了,该怎么办呢?只要两边的库一样是不是就可以啊?但也未必完全可以,为什么?以后我们再说?那因此,简单总结一下,我们操作系统就是这样的组成,最底层的是硬件,硬件上一层是操作系统,操作系统就是通过系统调用,将我们的功能输出来的,对不对?更向上一层是库,库的上一层是什么呢?才是我们各个独立的具体的应用。各位又想一个问题,那我们的库也好了,操作系统也好了,硬件也好了,你现在想运行一下word,如何让你的word运行起来?你开机以后,它运行的是操作系统,毕竟不是word是吧?双击word是吧?双击word为什么你能双击呢?双击为什么就是能打开呢?想过这个问题吗?有人说,那是因为有桌面,那桌面是什么?想过这问题吗?那如果没桌面的话,你能不能把word运行起来?这些东西彼此之间都是什么关系?其实我们还需要一个特殊的软件,特殊的应用软件,这个软件我们把它称为叫做shell,shell是什么,地壳、外壳是不是,那shell是什么?shell说白了,就是把我们计算机的功能通过人类容易操作的方式来输出一个接口,通过这个接口,
你才能真正去操作我们的计算机,所以叫人机交互接口。广义的shell有两种,有图形化的,还有命令行的,
那具体他们到底该如何工作?彼此之间又如何进行结合的?接下来的课程中我们会详细的去学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值