漫游计算机系统

    不可否认,计算机是20世纪最为重要的发明,从计算机诞生的那天起,他就无时无刻不在影响着我们每个人的生活,也就是说,下面这句话的回答肯定是否定的:没有计算机,你能活么?

    但是究其根本,我个人认为,计算机之所以能够完美的“侵入”到人类生活的各个方面,主要还是在于其高效永久的信息存储(当然了,这是理论上的,存储信息的介质坏了,我就无话可说了)

那我不禁要问,计算机中的信息是如何表示的呢,他是怎样“记住”我们需要的信息的呢?

1.     信息表示

    说白了,计算机中的信息全部是二进制位,也可以称之为信息位。

    在计算机的世界里,没有一二三四五六七,他就只有01(多么可笑的机器,愚蠢到只能够认识01),0表示一个状态的关闭,1表示一个状态的打开,在计算机的最原始的设计中,和她的对话,就是一系列开关的打开和关闭(而且开关的打开和关闭都需要人为的操纵,哎,又是多么累人的活儿啊,你说科学家咋就设计出这么笨的机器来了呢,最可恨的是,现在我们,至少我,是离不开他了),将一个开关打开,就是我们现在理解的二进制数字1,将一个开关关闭,就是我们现在的数字0,可想而知,最初,为满足大量(当时看来算是大量的了,现在就不值一提了)信息的表示,就将多个开关通过打开关闭的组合来表示不同的信息(今天看来,那得多少的开关啊,不过确实如此,只不过今天的计算机的开关全部被晶体管给替代了)

    但是这些打开和关闭的东西,在计算机看来就是一些机械的行为,要知道,他是死的,我们怎么知道这些信息就是我们所想要的呢,换一句说,假设计算机有10个开关,那么就会有= 1024种不同的开关组合,对于计算机来讲,每一种组合都会表达出一种信息,我们怎么将我们所需要的信息转换为这些开关的组合呢,这个就是接下来的计算机编码。

2.     信息编码

    就像上面说的,为了和计算机进行交流,就需要对计算机中不同的开关组合进行编码,每一种编码表示一种信息。

    那么,世界上的信息有很多种,汉字,数字,英文字符,阿拉伯符号,图片,不计其数,这些东西都要编码,OMG,我疯了,你快杀了我吧,这活儿谁干得了啊,确实,要对这么多东西进行编码,不太现实,也是不可行的方法之一,那难道就没有一种合理的解决方案来解决这个问题吗,嘿嘿,肯定是有的,不然科学家白玩儿是吧。

数学是一切自然科学的基础,这话确实不错,在计算机世界里依然如此,数学的基础是数字,那么计算机能否对数字进行适当的编码,然后在数字和大千世界的各种符号中找到一种平衡呢,答案是肯定的,事实证明,计算机科学家们也确实是如此去做的,于是就有接下来的一幕,首先拿数字开刀,先对数字进行编码,毕竟是做计算机的嘛,主要功能都用于计算,先把数字搞定了再说,然后在考虑其他的符号的编码,这也就是计算机为什么永远只能够表示数字的原因,也就是说,在计算机里,所有的信息全是以数字进行表示和存储的,数字组成了计算机世界的所有血液,那么我们不禁要问,数字有那么多,计算机是怎样去表示数字的呢?

3.     数字编码

    前面我们说过,计算机只有开和关两种状态,因此,如果我们人为的将某一个开关的开启状态编码为1,而将关闭状态编码为0,那么我们就可以认为,计算机能够识别数字0,1

    基于这一点,不难想到,人类所能够识别的数字的最基本单位只有10个,他们是:01,2,3,4,5,6,7,8,9,其余所有数字均是通过这10个数组的不同组合形式来表现的,那么在计算机所能够识别的数字和人类所能够识别的数字之间是否存在某种对等的关系,使得他们之间能够相互转换,答案是肯定的,这就是“进制”。

我们通常所说的数字为十进制数字,而计算机能够表示的数字是二进制数字,通过进制之间的数字对等关系,我们就可以在十进制和二进制数字之间进行对等的转换,正因为如此,“进制”就成为了计算机对数字编码的基本方式。

3.1二进制编码

计算机数字编码的基础在于二进制数字和十进制数字之间的转换。

例如有如下十进制数2345,如何将其转换为二进制数呢?

我们知道,这是十进制数字表示。同理,将十进制数字转换成二进制数字实际上就是十进制数字的二进制表示法。我们通过将2345循环除以2并保留余数得到如下结果:

2345/2 = 1172 … 1

1172/2 = 586 … 0

586/2 = 293 … 0

293/2 = 146 … 1

146/2 = 73 … 0

73/2 = 36 … 1

36/2 = 18 … 0

18/2 = 9 … 0

9/2 = 4 … 1

4/2 = 2 … 0

2/2 = 1 … 0

1/2 = 0 … 1

 

因此我们有:2345的二进制表示为:100100101001,将其写成标准形式如下:

                

也即:2345 = 2048 + 256 + 32 + 8 + 1

3.2十六进制编码

由上面的十进制数的二进制表示法可以看出,如果在显示的过程中,用二进制数据来表示十进制数据,会由于01较多,存在阅读困难,因此计算机科学家们提出了目前在显示上面使用最多的一种数字表示方法,那就是十六进制表示法。

联想前面十进制和二进制,既然为十六进制,那么他的基本数字编码单元肯定有十六个,计算机科学家将其表示为:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,为了便于区分,通常为十六进制数字加上前缀0X或者0x,这几种进制的基本单元的对应关系如下所示:


表格 41各个进制基本编码单元的对应关系

十进制数转换为其十六进制表示法和十进制数转换为其二进制表示法一样,使用循环进制相除即可,例如 转换为十六进制方法如下:

                                     

因此我们将余数从下至上排列得到 的十六进制表示法:0x929。将其改写成标准形式如下:

                                       

也即:2345 = 2304 + 32 + 9

3.2.1      八进制编码

计算机有时候也是用八进制表示法来对数字进行编码,类似于十六进制表示法,八进制表示法的基本表示单元只有八个:0,1,2,3,4,5,6,7,可以通过循环进制相除的方法将十进制数转换为八进制数,由于实践中使用较多的是二进制和十六进制,因此对于八进制此处不做过多推导,有兴趣的童鞋可以根据上面的方法来推导一下的八进制表示方法,具体结果如下:

                 

3.3进制之间的转换

前面讲解了数字的十进制表示法,二进制表示法,八进制表示法,十六进制表示法,那么,如何将数字的一种进制表示法转换为另一种进制表示法呢?

具体转换方式大体上分为三种,具体如下:

3.3.1      十进制向其它进制转换

十进制向其它进制的转换通过循环进制相除的方法实现,具体可以参照前面所讲解的十进制数2345转换为二进制,十六进制和八进制的过程。

3.3.2      其它进制向十进制转换

我们用 的八进制表示法 为例说明其它进制向十进制转换,具体如下:

             

3.3.3      其它进制之间的转换

其它进制之间的转换可以先将原进制转换成二进制,然后再转换为目标进制。从各个进制基本编码单元的关系可以看出,八进制的各个基本编码单元最多用三个二进制位即可表示(因为八进制数字的最大编码单元 对应的二进制编码 只占用三个二进制位);同理,十六进制的基本编码单元 最多用四个二进制位即可表示(因为十六进制的最大编码单元对应的二进制编码 只占用四个二进制位)

我们以将 的十六进制转换和八进制之间的转换为例进行说明:

的八进制表示法为:

的十六进制表示法为:

3.3.3.1八进制向十六进制转换

首先,将八进制数字转换成二进制数字:

我们将八进制数字 从左边最高位到右边最低位依次用三个二进制位写出每个八进制编码单元对应的二进制表示:,然后将他们从左到右连接起来即得到该八进制数字的二进制表示:

其次,将二进制数字转换成八进制数字:

我们将得到的二进制数字从右边最低位至左边最高位按照四位一个单元的方式进行划分,最左端的位数如果不足四个,则在最左端的高位部分添加二进制数字0以补齐四个二进制位,于是我们得到如下划分单元: ,然后参照上述进制之间的基本编码单元对应关系表从左边最高位至右边最低位将对应的二进制单元转换为十六进制的编码单元,我们得到: ,于是得到对应数字的十六进制编码为:

3.3.3.2十六进制向八进制转换

十六进制向八进制转的基本思想和八进制至到十六进制转换的基本思想一致,首先转换为二进制表示,然后转换为八进制表示,具体过程如下:

               

4.     符号编码

    好了,这里,我们知道,由于计算的原因,计算机先拿数字开刀,解决了数字的编码问题(其实也没有完全解决,因为到目前为止我们的例子都是对正整数进行编码,那么还有浮点数和负数的编码是怎样的呢?嘿嘿,这个稍安勿躁哈,稍后会有讲解的,咱们一步一步的来哈),那么符号呢,要知道在我们丰富多彩的世界不只有数字啊,还有更好看的东嘛,比如符号,图片,文字等等,这么多东西,该怎么表示呢,这可给计算机科学家们出来难题了,肿么办啊,难道计算机就只能够表示数字不成?

不开玩笑了,计算机科学家要是连这个都解决不了,那他们还怎么混嘛,于是计算机科学家想出了如下办法来解决这个问题:用数字对符号进行编码。这样,每一个符号都有对应的数字,这样就巧妙的将对符号的编码转换成了对数字的编码。

4.1ASCII编码

    计算机问世之初,最为有名的莫过于美国信息交换标准码,简称ASCIIAmericanStandard Code for Information Interchange),它使用七个二进制位表示标准美国键盘上的字符或符号。通过将这些字符用的值标准化,ASCII允许计算机和计算机程序交换信息,因此标准的ASCII只能够表示字符。这128个字符,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)。

128个字符,没错,标准的ASCII就只能够表示这128个字符,这不太扯了吗,完全不够是吧,比如希腊字符,汉字,象形文字这些东128个字符完全不能够表示啊,为了解决这些问题,在ASCII的基础上又推出了ASCII扩展字符集,我们也称之为ASCII,因为它仅仅比标准的ASCII多用了个位来表示扩展出的字符,因此扩展的ASCII最多能够表示字符。

4.2UNICODE编码

    但是ASCII还远远不能够满足日常字符的表示,于是基于ASCII的编码思想,不同的国家为了表示自己国家内部特有的字符(比如中文),就会按照实际情况推出一套属于自身的编码系统(比如中文GB码,又称为国标码,我们常用的GB2312就属于国标码),但是这样就会出现一个问题,比如同一个数字,在不同的国家可能会被编码成不同的符号,这个问题促使了UNICODE码的诞生,它将世界上所有的符号都纳入其中,世界上只要目前能够出现的字符,均可在UNICODE编码集中找到对应的编码数字,所有的字符编码均以其为参照标准,这样我们在中文编码转换为其他编码集的时候,就需要先将中文编码转换为UNICODE编码,然后再将UNICODE编码转换为其他编码,否则就会导致乱码的出现。

4.3UTF-8等编码

可想而知,UNICODE编码是一个很庞大的编码系统,目前可以容纳过百万的字符集,这样必然会导致该编码系统的检索效率较低,为了解决效率低下的问题,后续在UNICODE的基础上又推出了UTF-XX=8,16,32)系列的编码方式,他们根据不同的符号,自动的选择编码的二进制位的长短,比如因为英文字母仅仅用一个字节(八个二进制位)即可进行编码。

5.     类型的出现

    通过上面可以知道,计算机通过数字对符号进行编码,不同的符号对应于不同的数字,也就是说,同一种符号,采用不同的编码集,它所对应的数字以及占用的二进制位的数目是不相同的,这样仍然会导致一个问题:对于同一个二进制编码,什么情况下,计算机将该编码识别为字符,什么情况下将该编码识别成数学意义上的数字?

    这就导致类型的出现,比如charintshortfloatdouble等等,对于同一段二进制位,相同的编码方式,可能由于类型的不同,它所表示的信息也就会不同,当然除了类型以外,还有其他的一些信息,我们把这些能够确定某个特定的二进制编码所表示的内容的信息称为上下文信息,计算机就是根据这些上下文信息来识别不同长度的编码所代表的内容。

    讲到这里,我们不难发现,其实计算机中的所有信息概括起来就两个词:上下文,只要这两样信息确定了,计算机就能够对我们现实生活中的所有信息进行正确的表示,也正因如此,位和上下文就成了搭建了人与计算机之间相互沟通的桥梁的重要基石。

    那么我们不仅要问,我们是如何向计算机输入我们的信息,而计算机又是如何向我们展示他的输出结果的呢?

6.     IO和存储设备

6.1开关和信号灯

    最早的计算机的输入输出设备十分落后,没有鼠标,键盘,更没有显示器,人们只能够手动的拨动计算机庞大的面板上的无数个控制开关向计算机输入信息,计算机把这些信息经过内部的硬件处理后,通过计算机面板上面无数个信号灯的组合向人们展示其计算结果。

    可想而知,当时的计算机只能够处理一下简单的数字计算任务,计算机操纵员需要花费很大的精力去熟悉这些输入开关和输出信号灯,想想也真是够累的(反正这事儿我是干不了的),但是就当时的情况而言,这种计算机能够避免繁重的手工计算,在一定程度上确实提高了计算的效率。

6.2内部存储器

随着时间的发展,这种最为原始的计算机暴露出了他严重的局限性:只能够进行简单的计算,对于复杂的计算,要么耗费大量的时间和精力,要么就无能为力。

当时的计算机科学家们是这样设计的:无论多么复杂的计算,都可以将其划分成最为原始最为简单的计算,因此我们可以先处理简单的计算,然后将计算的结果作为下一简单计算的输入,这样通过循环往复的迭代,我们就能够对任何一个复杂的计算求解。

这个在理论上确实可行,而且数学上的一切复杂表达式的运算都是这么做的,但是在实际的操作过程中,计算机操作员们发现,由于计算机无法存储每次简单运算的中间结果,因此,每当一个中间结果被运算出来后,操作员需要将这些中间结果进行重新编码,然后再拨动控制器上的控制开关,向计算机输入中间结果和下一个操作数,然后计算机再进行下一次的计算,这样一来,这种最为原始的计算机,虽然将人们从繁重的手工计算中解脱出来,但是又将人们推入了另一个更为琐碎的手工操作的深渊当中,这就违背了计算机避免繁重手动运算的设计初衷,有点得不偿失了。因此,对于当时的计算机操作员来说,这种操作方式无论在精神上还是在肉体上都是对他们的一种变态的折磨(如果叫你来干,你受得了么?)。

那么,我们不禁要问了,难道就没有一种合理的解决方案来解决这个问题么,既能够提高计算机运算的复杂度,又能减少计算机操作人员琐碎而又繁重的操作任务呢?答案当然是肯定的,这就是计算机科学家们所提出的内部存储器的概念。

这里我们先打个比方说,在课堂上,如果老师让你心算一道非常简单的题目,你可以不用反应就会马上得出正确的答案,但是如果老师让你心算一个复杂的题目,如果你心算能力好的话,给你一点儿时间,你同样会得出正确的答案,但是如果题目非常复杂,或许你就没有那么容易得出正确的答案了,但是这个时候,如果给你一张草稿纸,让你将每次算出的结果记录下来,给你一些时间,你也能够算出来结果来,也即是说,只要你的反应能力够快,草稿纸的数量充足,那么对于任何一个复杂的表达式,你都可以在一个时间范围内得出正确的结果来。

也就是说,上面的草稿纸就相当于中间结果的存储器,基于这种假设,如果在一个没有内部存储器的计算机上进行一个复杂的计算,由于它的存储能力有限,无法“记住”这些中间结果,可能他根本没有办法计算出结果,纵然是计算出了结果,也会耗费掉大量的时间,

因此计算机科学家们在计算机中设置了可以将一些中间结果进行临时存储的内部存储器,等到需要的时候再将它们取出来,进行下一步的运算,如此往复,计算机就可以处理很多复杂的运算,同时也大大减轻了计算机操作员的手工操作次数。

讲到这里,我们不难发现,虽然计算机能够适应复杂计算,在一定程度上也能够减少操作员的操作次数,但是对于操作员而言,他们必须熟悉计算机面板上的每一个开关以及面板上的不同信号灯的组合所代表的不同信息,这也是一项繁琐的工作。那么,我们能否将这些工作通过其他的方式去实现,以提升计算机的操纵效率?

6.3纸带机和打印机

随着计算机应用的发展,人们越来越感到计算机最原始的输入输出方式存在着严重的局限性,远远不能够满足人们的需要,这就促使了纸带机和打印机的问世。

在输入方面,为了不再每次拨动计算机面板上成百上千的开关,人们发明了纸带机,在纸带机的纸带上的每一行都标明了26个英文字符,10个阿拉伯数字和若干个运算符,如果在某行的某个字符上面打上了一个孔,那么就说明这个字符是需要向计算机输入的字符,这样,在一个长长的纸带上就可以存储很多的信息,因此可以想到,纸带机的作用就是在人们将这些纸带放入纸带机的时候,将这些信息翻译给计算机,因为计算机是看不懂这些纸带上面信息的。因此,纸带和纸带机共同构成了这个阶段计算机的输入设备。

虽然纸带打孔和纸带机翻译比较麻烦,但是这个在当时确实很大程度上促进了计算机的发展。与此同时,对应于纸带机,人们发明了打印机替代计算机面板上的信号灯作为计算机的输出设备,打印机负责将计算机的输出信息翻译成人们能够理解的语言(不一定是自然语言,有可能是某种特殊的语言,但是人们能够读懂它即可),并打印到纸带上,这就避免了通过看那成百上千的信号灯去获取计算机的输出信息,而是直接从纸带上就可以很方便的读懂计算机所返回的结果。因此纸带和打印机就构成了这个阶段计算机的输出设备。

6.4键盘和显示器

不过不难发现,通过纸带机和打印机进行输入和输出的方式也存在其局限性,针对每次输入,操作员都需要对纸带进行打孔,有没有一种接近于最自然的输入输出方式呢。在这种信念的驱使下,人们发明了键盘和显示器来作为计算机的输入输出设备,使得人们可以直接向计算机输入信息,而计算机也可以及时的将处理的结果显示在显示器的屏幕上。键盘和显示器的出现是计算机发展史上的一个里程碑,它奠定了现代高性能计算机的基本雏形。

随着后续的发展,越来越多的输入输出设备被用于和计算机的交互上(比如:扫描仪,摄像机,光笔等),而随着晶体管和半导体的出现,计算机的体积也大大的缩小了,计算机的使用范围也逐步扩大,人类世界20世纪的一场基于计算机的革命也即将爆发。

6.5外部存储器

    早期的计算机可以说是真正意义上的裸机,当时的计算机没有操作系统,没有软件,是和其它普通的机器没有任何区别的机械设备,随着计算机的进一步普及,人们又发现了计算机的不足之处。

随着计算机的进一步发展,计算机能够处理的信息量越来越大,运算功能也越来越复杂,因此往往需要输入很长一段时间后,计算机才开始进行计算任务,而在输入过程中,如果停电了,那前面输入的内容就白费了,等来电后,还要全部重新输入。就算不停电,如果人们一次仅仅输入部分内容,计算机在处理这部分内容的时候也不会输出结果,等到第二次输入剩下的内容时,之前所输入的内容仍然需要重新输入,然后计算机方可开启正确的计算逻辑,为了解决这种重复劳动的厌倦,计算机科学家们提出了“外部存储器”的思想。

外部存储器的“外部”是相对于上面提到的临时存储计算中间结果的内部存储器来说的,在计算机处理信息的时候(这个阶段中央处理器已经诞生了,主要信息的计算和处理都是交给中央处理器进行处理,由于本节主要讲IO和存储器,因此省去了中央处理器的讲解),并不直接和外部存储器打交道,处理过程中的信息被临时存放到内部存储器中,等到信息处理完成,可以根据需要将结果存储于外部存储器中。但是对于内部存储器而言,它是临时存储设备,因此,如果在信息处理的过程中断电,结果还是会丢失,因为内部存储器所存储的信息需要依靠电力来维持,一旦电力消失,内部存储器中的存储的数据会全部消失。也就是这个原因,计算机科学家们就向计算机中增加了外部存储器。可以想到,外部存储器所存储的信息是不需要依靠电力来维持的,因此即使断电了,外部存储器所存储的信息依然不会丢失。因此,人们不但可以将计算机处理的结果信息存放于外部存储器中,还可以将很多需要输入到计算机中的数据存放到外部存储器中,这样就可以反复的使用这些数据,既避免了信息的丢失,又避免了重复劳动,一举两得。

由于需要永久存储,外部存储器一般由磁性介质制成,最常见的就是磁盘和磁带了,因此目前使用最多的外部存储器就是磁盘。

7.     文件与文件夹

    在使用磁盘作为外部存储设备后,人们又发现了另外一个问题,随着人们向磁盘上存储的信息越来也越多,如何有效的管理和组织这些信息也就成为了计算机科学家们不得不考虑的又一个问题。

    考虑到日常生活中对信息的管理和组织,计算机科学家们提出了文件“的概念:计算机中的文件是一个虚拟的概念,但是它和具体生活中的文件有些类似,人们首先将信息进行分类,整理成计算机所能够识别的文件,然后再存储到外部存储器上,同时不同的文件具有不同的名称,因此计算机中就有了文件1、文件2

    自从文件的概念诞生后,对信息的存储也就变成了对文件的存储,对信息的访问也就成了对文件的访问,文件成了计算机外部存储器的存储单元。

    但是随着文件数量的增大,众多文件的管理又成为了一个难题(文件名的管理就是其中之一),于是计算机科学家们在文件的基础上又提出了文件夹“的概念:人们可以根据文件的不同属性,将文件存放于不同的文件夹下,文件夹中不仅可以存放文件,也可存放文件夹,可以说文件夹是一种本身可以存储和管理文件的文件,因此,文件夹是一种特殊的文件。

    虽然可以通过文件和文件夹去方便的组织和管理外部存储器中存储的信息,但是这些都需要手动的去进行,随着信息数量的快速增加,手动管理这些信息的效率会极其低下,因此,如何提高对外部存储器上的文件和文件夹的管理效率,就成为了计算机科学家们茶余饭后所讨论的又一个话题。

8.     操作系统

    在计算机操作员手动管理外部存储器上的文件以及文件夹的时候,他们发现,其实大多数时候,他们针对文件的操作基本上相同,比如:创建文件,删除文件,创建文件夹,移动文件至文件夹,重命名文件等,在文件数目较大的情况下,重复的进行这些操作是一件非常痛苦的事情。

    另一方面,计算机发展到现在,“•诺依曼结构”体系结构已经基本成型,早期和计算机进行交互的纸片也就被一种称为“程序”的无形事物所取代,人们通过编写程序来向计算机传达指令,那么是否可以编写程序让计算机自动的去管理文件和文件夹,以此避免手工的对文件进行管理和操作呢?

    基于这种需求的驱动,一些高校(比如斯坦福,MIT,卡内基.梅隆等)和一些实验室(这其中最有名的莫过于AT&T了)的计算机科学家们通过对自己的项目的研究和总结(最有名的莫过于MULTICS了),提出了操作系统的概念,并编写出了最原始的操作系统(其中就有大名鼎鼎的由Ken ThompsonDennis Ritchie等计算机泰斗于1969年在AT&T开发的UNIX操作系统),所谓操作系统,就是在计算机硬件和计算机操纵者之间搭建一个无形的平台,计算机操纵人员通过操作系统向计算机发送指令,而计算机硬件也通过操作系统向用户返回请求,操作系统所做的事情就是自动的管理和调度计算机的所有硬件资源,这样,计算机操作人员就可以在完全不理解计算机具体硬件工作模式的情况下,也能够通过操作系统和计算机进行交互,也就避免了在硬件级别上对计算机硬件资源(磁盘的文件以及文件夹等)进行手动的管理。

    操作系统的出现,也极大的普及了计算机的使用规模,人们再也不用像专业人员一样,需要去理解计算机硬件的工作原理和流程,甚至需要去观察计算机集成电路的工作状态,人们并不直接和计算机硬件打交道,不用直接去对这些硬件资源发号施令,人们所需要做的事情很简单,他们只需根据自身的需求,一条一条的通过操作系统向计算机硬件发送指令,然后等待计算机硬件通过操作系统返回结果,这比之前手动的操纵一切硬件资源可省事儿多了。

    同时,在操作系统出现之前,人们通过键盘给计算机下达命令必须是计算机硬件能够“听懂”的专业术语,而有了操作系统之后,人们和计算机之间的交流就可以使用一些不那么专业的语言(比如最初的汇编语言,BCPL语言以及今天使用得较多的其他高级语言),就不必去背诵那些该死的专业术语了。

    不得不说操作系统是计算机发展史上的又一个里程碑,他不但能够在人和计算机之间传递信息,而且还负责管理和调度计算机的所有硬件资源:一方面,他替人们管理日益增多的文件,使人们能够很方便的查找和使用这些文件;另一方面,他替人们管理计算机的内部存储设备和外部存储设备资源,随时报告他们的使用情况,让计算机能够高效而安全的运行;最后,他还负责管理各种计算机外部设备(比如打印机、扫描仪、写字板、光笔等),使得这些外部设备能够更为有效的为计算机用户服务。

    也正因为操作系统在计算机世界有着举足轻重的地位,因此,计算机科学家们也在不断的改进他,使他的功能更为强大,使用起来也更加方便(这其中最为著名的莫过于微软从最初的MS-DOS到目前使用最为广泛的Windows桌面系统了)。

    但是,这仍然有一个问题值得思考,操作系统是计算机硬件和用户之间的一个平台,也就是说,就目前的计算机系统而言,和计算机硬件打交道的就是操作系统了,但是计算机硬件有很多种啊,比如CPU我们知道目前PC上最常用的有AMDIntel,磁盘的种类就更多了(西部数据、日立等),显卡我们比较熟悉的有ATINVIDIA,也就是说组成一台计算机的硬件资源可以有很多种选择,而不同的硬件对相同的信息的处理和存储方式也会不同(比如画一条直线,ATI的显卡和NVIDIA的显卡所使用的算法和指令就可能不同),这就要求我们的操作系统在不同的硬件平台上都能够很好的工作,那么我们不禁又要问了,操作系统是如何识别这些硬件资源的呢,同一个操作系统是如何访问不同的硬件资源的呢?

9.     硬件驱动程序

    随着操作系统的普及,计算机使用者们更加倾向于通过操作系统去操纵计算机,而不是通过直接向计算机硬件发送指令。

    另一个原因就是,不同的计算机硬件,其工作指令集可能是不同的,如果需要直接向硬件发号施令,那么就要求计算机操纵员记住不同硬件的这些指令集,这显然是计算机操纵员们不愿意做的事情,于是他们提出将这件事情交给操作系统,让操作系统去“记住”不同硬件的操作指令集。

    但是操作系统的开发者们可不这么认为,他们说,计算机硬件种类繁多,如果交由操作系统去“记住”这些不同的计算机硬件指令集的话,不仅仅增加了操作系统的开发难度,而且会导致操作系统的“体积”非常臃肿,所以这件事情操作系统是肯定不愿意做的。

    那么怎么办呢,我们肯定不愿意为每一种计算机硬件组合开发特定的操作系统了,于是计算机科学家们提出了一个折中的办法:硬件是由计算机硬件厂商生产的(比如:AMDCPU就是由AMD公司生产的,IntelCPU就是由Intel公司生产的),那么厂商肯定知道如何操纵这些计算机硬件的指令(比如:AMD公司肯定知道他的ATI显卡是如何执行画直线的算法和指令的,NVIDIA公司肯定知道他的NVIDIA显卡是如何执行画直线的算法和指令的),操作系统是由计算机科学家们写出来的,那么计算机科学家们肯定知道操作系统具体操作计算机硬件时所用到的接口,于是他们将这些接口标准化(接口名称,接口参数,接口的功能,接口的返回值等信息),并为他们提供默认的实现,如果硬件厂商不支持这种实现方式,那么硬件厂商就需要根据自身的计算机硬件特性去实现这些接口,覆盖掉操作系统所提供的默认实现,等到操作系统去操作这些硬件的时候,操作系统就会调用这些标准的接口去向硬件发送指令。我们举个例子说明:

    比如用户用鼠标在绘画板上画了一条直线,需要将这条直线显示出来,那么操作系统获取到用户画直线的请求后,假设就调用了操作系统操纵显卡的接口draw_line(args),此接口我们假设默认使用中点算法(计算机图形学中画直线的一种算法)实现,如果此时的计算机所使用的显卡是ATI系列的显卡,但是该系列的显卡所使用的画直线的算法并不是中点算法,而是DDA算法(计算机图形学中画直线的又一种算法),那么AMD公司就必须根据这种ATI型号显卡的特性去实现操作系统的接口draw_line(args),用以覆盖操作系统对该接口的默认实现,于是操作系统通过调用由AMD公司实现的draw_line(args)接口去向AMD公司生产的ATI显卡发送画直线的命令了。

    这仅仅只是一个画直线的例子,操作系统所提供的操纵计算机硬件的标准接口有很多,那么,计算机厂商要么遵从操作系统的默认实现去生产他们的硬件,并规定这些计算机硬件的指令集,要么就需要按照计算机硬件特性去重写这些标准接口以覆盖操作系统的默认实现。

    但是不同的操作系统所提供的标准接口有可能是不一样的(比如UNIX操作系统提供的显卡画直线的标准接口可能是draw_line(args),但是Windows操作系统的标准接口可能是line(args)),那么硬件厂商还需要针对不同的操作系统平台去实现这些接口,也就是说,针对一种类型的ATI显卡,AMD公司不仅要实现UNIX所提供的操纵显卡的接口,还要实现Windows所提供的操纵显卡的接口,否则这个显卡要么不能够在UNIX或者Windows上面正常工作,要么即使是工作了,也不能够充分发挥其显卡的某些特有的硬件特性(比如显卡的高清加速)。

    为了方便用户使用,硬件厂商将这些根据自己硬件特性和操作系统的类型所实现的操作系统所提供的标准接口封装成为一个软件包,用户在安装好操作系统后,再安装上操作系统对应的软件包,就可使该硬件正常的为用户提供优质的服务了。我们就将这个软件包称之为该硬件在该操作系统上的硬件驱动程序

    至此,我们就知道了,操作系统为计算机操纵员和计算机硬件提供一个平台,计算机操纵员通过操纵系统去间接的向计算机硬件发号施令,而计算机硬件也通过操作系统向计算机操纵员返回请求;与此同时,在操作系统和计算机硬件之间还有一个被称之为“硬件驱动程序”的软件包为操作系统和计算机硬件提供服务,使得不同的硬件在不同的操作系统上都能够高效稳定的为用户提供优质的服务。

    讲到这里,我们大致了解了计算机的信息编码方式,计算机的IO和存储设备,计算机文件系统和操作系统,知道如何向计算机输入信息以及计算机如何输出信息,但是计算机将我们输入的信息交给谁去处理的呢,它又是怎么处理的呢,计算机的最原始的体系结构是什么呢,计算机除了这些管理存储的硬件资源,还有没有更为重要的其他硬件资源呢?

10.控制器和运算器

    前面我们讲到,操作系统本身是没有处理信息的能力的,他仅仅起到一个信息交互和管理计算机硬件资源的能力,而对于输入的信息最终是在“控制器”的控制之下交由“运算器”进行计算,然后进行输出的,因此我们就不得不简要的谈谈“控制器”和“运算器”了。

    这里注明,由于本人对“控制器”和“运算器”不是很了解,因此这部分内容大多来自百度百科,还望读者见谅。

    自从有了存储器的概念后,为了提升计算机处理的性能,计算机科学家们提出了“控制器”和“运算器”的概念(后面我们可以知道,这两个部件构成了计算机中央处理器的核心)。

10.1        控制器

    控制器(Controller)是指挥计算机的各个部件按照指令的功能要求协调工作的部件,是计算机的神经中枢和指挥中心,由指令寄存器IRInstruction Register)、程序计数器PCProgram Counter)和操作控制器OCOperation Controller)三个部件组成,对协调整个电脑有序工作极为重要,它是发布命令的决策机构,即完成协调和指挥整个计算机系统的操作。

10.1.1指令寄存器

指令寄存器是用以保存当前执行或即将执行的指令的一种寄存器。指令内包含有确定操作类型的操作码和指出操作数来源或去向的地址。指令长度随不同计算机而异,指令寄存器的长度也随之而异。计算机的所有操作都是通过分析存放在指令寄存器中的指令后再执行的。指令寄存器的输人端接收来自存储器的指令,指令寄存器的输出端分为两部分:

操作码部分送到译码电路进行分析,指出本指令该执行何种类型的操作;

地址部分送到地址加法器生成有效地址后再送到存储器,作为取数或存数的地址。

存储器可以指主存、高速缓存或寄存器等用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器DRData Register)中,然后再传送至IR。指令划分为操作码和地址码字段,由二进制数字组成。为了执行任何给定的指令,必须对操作码进行测试,以便识别所要求的操作。指令译码器就是做这项工作的。指令寄存器中操作码字段的输出就是指令译码器的输入。操作码一经译码后,即可向操作控制器发出具体操作的特定信号。

10.1.2程序计数器

程序计数器是指明程序中下次要执行的指令地址的一种计数器,又称指令计数器。它兼有指令地址寄存器和计数器的功能。当一条指令执行完毕的时候,程序计数器作为指令地址寄存器,其内容必须已经改变成下一条指令的地址,从而使程序得以持续运行。

为此可采取以下两种办法:

第一种办法是在指令中包含了下一条指令的地址。在指令执行过程中将这个地址送人指令地址寄存器即可达到程序持续运行的目的。这个方法适用于早期以磁鼓、延迟线等串行装置作为主存储器的计算机。根据本条指令的执行时间恰当地决定下一条指令的地址就可以缩短读取下一条指令的等待时间,从而收到提高程序运行速度的效果。

第二种办法是顺序执行指令。一个程序由若干个程序段组成,每个程序段的指令可以设计成顺序地存放在存储器之中,所以只要指令地址寄存器兼有计数功能,在执行指令的过程中进行计数,自动加一个增量,就可以形成下一条指令的地址,从而达到顺序执行指令的目的。这个办法适用于以随机存储器作为主存储器的计算机。当程序的运行需要从一个程序段转向另一个程序段时,可以利用转移指令来实现。转移指令中包含了即将转去的程序段入口指令的地址。执行转移指令时将这个地址送人程序计数器(此时只作为指令地址寄存器,不计数)作为下一条指令的地址,从而达到转移程序段的目的。子程序的调用、中断和陷阱的处理等都用类似的方法。在随机存取存储器普及以后,第二种办法的整体运行效果大大地优于第一种办法,因而顺序执行指令已经成为主流计算机普遍采用的办法,程序计数器就成为中央处理器不可或缺的一个控制部件。

10.1.3操作控制器

中央处理器内的每个功能部件都完成一定的特定功能。信息在各部件之间传送及数据的流动控制部件的实现。通常把许多数字部件之间传送信息的通路称为“数据通路”。信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传到哪个寄存器,都要加以控制。在各寄存器之间建立数据通路的任务,是由称为“操作控制器”的部件来完成的。

操作控制器的功能就是根据指令操作码和时序信号,产生各种操作控制信号,以便正确地建立数据通路,从而完成取指令和执行指令的控制。

有两种由于设计方法不同因而结构也不同的控制器。微操作是指不可再分解的操作,进行微操作总是需要相应的控制信号(称为微操作控制信号或微操作命令)。一台数字计算机基本上可以划分为两大部分---控制部件和执行部件。控制器就是控制部件,而运算器、存储器、外围设备相对控制器来说就是执行部件。控制部件与执行部件的一种联系就是通过控制线。控制部件通过控制线向执行部件发出各种控制命令,通常这种控制命令叫做微命令,而执行部件接受微命令后所执行的操作就叫做微操作。控制部件与执行部件之间的另一种联系就是反馈信息。执行部件通过反馈线向控制部件反映操作情况,以便使得控制部件根据执行部件的状态来下达新的微命令,这也叫做“状态测试”。微操作在执行部件中是组基本的操作。由于数据通路的结构关系,微操作可分为相容性和相斥性两种。在机器的一个CPU周期中,一组实现一定操作功能的微命令的组合,构成一条微指令。一般的微指令格式由操作控制和顺序控制两部分构成。操作控制部分用来发出管理和指挥全机工作的控制信号。其顺序控制部分用来决定产生下一个微指令的地址。事实上一条机器指令的功能是由许多条微指令组成的序列来实现的。这个微指令序列通常叫做微程序。既然微程序是有微指令组成的,那么当执行当前的一条微指令的时候,必须指出后继微指令的地址,以便当前一条微指令执行完毕以后,取下一条微指令执行。

10.2        运算器

运算器:arithmetic unit,计算机中执行各种算术和逻辑运算操作的部件。运算器由算术逻辑单元(ALU)、累加器、状态寄存器、通用寄存器组等组成。算术逻辑运算单元(ALU)的基本功能为加、减、乘、除四则运算,与、或、非、异或等逻辑操作,以及移位、求补等操作。计算机运行时,运算器的操作和操作种类由控制器决定。运算器处理的数据来自存储器;处理后的结果数据通常送回存储器,或暂时寄存在运算器中。与Control Unit共同组成了CPU的核心部分。

10.2.1数据

运算器的主要功能是进行算术运算和逻辑运算,它处理对象是数据,所以数据长度和计算机数据表示方法,对运算器的性能影响极大。70年代微处理器常以1个、4个、8个、16个二进制位作为处理数据的基本单位。大多数通用计算机则以163264位作为运算器处理数据的长度。能对一个数据的所有位同时进行处理的运算器称为并行运算器。如果一次只处理一位,则称为串行运算器。有的运算器一次可处理几位(通常为68位),一个完整的数据分成若干段进行计算,称为/并行运算器。运算器往往只处理一种长度的数据。有的也能处理几种不同长度的数据,如半字长运算、双倍字长运算、四倍字长运算等。有的数据长度可以在运算过程中指定,称为变字长运算。

按照数据的不同表示方法,可以有二进制运算器、十进制运算器、十六进制运算器、定点整数运算器、定点小数运算器、浮点数运算器等。

按照数据的性质,有地址运算器和字符运算器等。

10.2.2操作

运算器能执行多少种操作和操作速度,标志着运算器能力的强弱,甚至标志着计算机本身的能力。运算器最基本的操作是加法。个数与零相加,等于简单地传送这个数。将一个数的代码求补,与另一个数相加,相当于从后一个数中减去前一个数。将两个数相减可以比较它们的大小。

左右移位是运算器的基本操作。在有符号的数中,符号不动而只移数据位,称为算术移位若数据连同符号的所有位一齐移动,称为逻辑移位。若将数据的最高位与最低位链接进行逻辑移位,称为循环移位

运算器的逻辑操作可将两个数据按位进行与、或、异或,以及将一个数据的各位求非。有的运算器还能进行二值代码的16种逻辑操作。

乘、除法操作较为复杂。很多计算机的运算器能直接完成这些操作。乘法操作是以加法操作为基础的,由乘数的一位或几位译码控制逐次产生部分积,部分积相加得乘积。除法则又常以乘法为基础,即选定若干因子乘以除数,使它近似为1,这些因子乘被除数则得商。没有执行乘法、除法硬件的计算机可用程序实现乘、除,但速度慢得多。有的运算器还能执行在一批数中寻求最大数,对一批数据连续执行同一种操作,求平方根等复杂操作。

10.2.3运算方法

        实现运算器的操作,特别是四则运算,必须选择合理的运算方法。它直接影响运算器的性能,也关系到运算器的结构和成本。另外,在进行数值计算时,结果的有效数位可能较长,必须截取一定的有效数位,由此而产生最低有效数位的舍入问题。选用的舍入规则也影响到计算结果的精确度。在选择计算机的数的表示方式时,应当全面考虑以下几个因素: 

        要表示的数的类型(小数、整数、实数和复数):决定表示方式;

        可能遇到的数值范围:确定存储、处理能力;

        数值精确度:处理能力相关;

        数据存储和处理所需要的硬件代价:造价高低。

        两种常用格式:

        定点格式:定点格式容许的数值范围有限,但要求的处理硬件比较简单;

        浮点格式:容许的数值范围很大,但要求的处理硬件比较复杂。

11.中央处理器

        随着现代科技的发展,不少硬件厂商为了提升计算机处理信息的速度,将计算机中的“控制器”、“运算器”、“寄存器”等构件在一块很小的被称为“中央处理器”的芯片上,以完成计算机所有的核心运算任务。

中央处理器也被称为中央处理单元(Central Processing Unit),其运作原理可分为四个阶段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。 CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码,并执行指令。所谓的计算机的可编程性主要是指对CPU的编程。

11.1        指令控制

        这是指控制程序中指令的执行顺序。程序中的各指令之间是有严格顺序的,必须严格按程序规定的顺序执行,才能保证计算机系统工作的正确性。

11.2        操作控制

        一条指令的功能往往是由计算机中的部件执行序列的操作来实现的。CPU要根据指令的功能,产生相应的操作控制信号,发给相应的部件,从而控制这些部件按指令的要求进行动作。

11.3        时间控制

        时间控制就是对各种操作实施时间上的定时。在一条指令的执行过程中,在什么时间做什么操作均应受到严格的控制。只有这样,计算机才能有条不紊地工作。

11.4        数据加工

        即对数据进行算术运算和逻辑运算,或进行其他的信息处理。

        CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码。它把指令分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行。

        指令是计算机规定执行操作的类型和操作数的基本命令。指令是由一个字节或者多个字节组成,其中包括操作码字段、一个或多个有关操作数地址的字段以及一些表征机器状态的状态字以及特征码。有的指令中也直接包含操作数本身。

11.5        程序和地址

        计算机根据人们预定的安排,自动地进行数据的快速计算和加工处理。人们预定的安排是通过一连串指令(操作者的命令)来表达的,这个指令序列就称为程序。一个指令规定计算机执行一个基本操作。一个程序规定计算机完成一个完整的任务。一种计算机所能识别的一组不同指令的集合,称为该种计算机的指令集合或指令系统。在微机的指令系统中,主要使用了单地址和二地址指令,其中,第1个字节是操作码,规定计算机要执行的基本操作,第2个字节是操作数。计算机指令包括以下类型:数据处理指令(加、减、乘、除等)、数据传送指令、程序控制指令、状态管理指令,整个内存被分成若干个存储单元,每个存储单元一般可存放8位二进制数(字节编址)。每个在位单元可以存放数据或程序代码,为了能有效地存取该单元内存储的内容,每个单元都给出了一个唯一的编号来标识,即地址。

11.6        提取

        第一阶段,提取,从存储器或高速缓冲存储器中检索指令(为数值或一系列数值)。由程序计数器(Program Counter)指定存储器的位置。(程序计数器保存供识别程序位置的数值。换言之,程序计数器记录了CPU在程序里的踪迹。)

11.7        解码

        CPU根据存储器提取到的指令来决定其执行行为。在解码阶段,指令被拆解为有意义的片断。根据CPU的指令集架构(ISA)定义将数值解译为指令。一部分的指令数值为运算码(Opcode),其指示要进行哪些运算。其它的数值通常供给指令必要的信息,诸如一个加法(Addition)运算的运算目标。

11.8        执行

        在提取和解码阶段之后,紧接着进入执行阶段。该阶段中,连接到各种能够进行所需运算的CPU部件。

        例如,要求一个加法运算,算术逻辑单元(ALUArithmeticLogic Unit)将会连接到一组输入和一组输出。输入提供了要相加的数值,而输出将含有总和的结果。ALU内含电路系统,易于输出端完成简单的普通运算和逻辑运算(比如加法和位元运算)。如果加法运算产生一个对该CPU处理而言过大的结果,在标志暂存器里可能会设置运算溢出(Arithmetic Overflow)标志。

11.9        写回

        最终阶段,写回,以一定格式将执行阶段的结果简单的写回。运算结果经常被写进CPU内部的暂存器,以供随后指令快速存取。在其它案例中,运算结果可能写进速度较慢,但容量较大且较便宜的主记忆体中。某些类型的指令会操作程序计数器,而不直接产生结果。这些一般称作“跳转”(Jumps),并在程式中带来循环行为、条件性执行(透过条件跳转)和函式。许多指令会改变标志暂存器的状态位元。这些标志可用来影响程式行为,缘由于它们时常显出各种运算结果。例如,以一个“比较”指令判断两个值大小,根据比较结果在标志暂存器上设置一个数值。这个标志可藉由随后跳转指令来决定程式动向。在执行指令并写回结果之后,程序计数器值会递增,反覆整个过程,下一个指令周期正常的提取下一个顺序指令。

12.•诺依曼结构

        讲到目前,我们知道,计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。

        程序与数据一样存储,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理。这一原理最初是由美籍匈牙利数学家.诺依曼于1945年提出来的,故称为.诺依曼原理。

12.1        系统架构

        计算机系统由硬件系统和软件系统两大部分组成。美藉匈牙利科学家冯·诺依曼(John von Neumann)奠定了现代计算机的基本结构,这一结构又称冯·诺依曼结构,其特点是:

l 使用单一的处理部件来完成计算、存储以及通信的工作。

l 存储单元是定长的线性组织。

l 存储空间的单元是直接寻址的。

l 使用低级机器语言,指令通过操作码来完成简单的操作。

l 对计算进行集中的顺序控制。

l 计算机硬件系统由运算器、存储器、控制器、输入设备、输出设备五大部件组成并规定了它们的基本功能。

l 采用二进制形式表示数据和指令。

l 在执行程序和处理数据时必须将程序和数据从外存储器装入主存储器中,然后才能使计算机在工作时能够自动调整地从存储器中取出指令并加以执行。

13.总线

        现代计算机有不同的硬件资源组成:CPUIO设备、存储设备,计算机想要正常的工作,就不得不协调好这些硬件资源的相互通信,这就是我们所需要讲的“总线”的概念。

总线是贯穿于整个计算机硬件系统的一组电子管道,他携带信息字节并负责在各个部件之间传递。通常总线被设计成传送定长的字节快,也就是字(word),字中的字节数(也即字长)是一个基本的系统参数,各个系统中也不尽相同。比如Intel Pentium系统的字长为4字节,也即32个二进制位,而服务器类,如Intel Itaniums和高端的Sun公司的SPARCS的字长为8字节,也即64个二进制位。其他如汽车工业和嵌入式设备的控制器等较小的系统的字长往往只有1或者2字节,也即8个二进制位或者16个二进制位。


图表 141现代计算机系统硬件组成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值