事实上电脑只认识0与1,记录的数据也是只能记录0与1,所以电脑常用的数据是二进制的。但是我们人类常用的数值运算是十进制,文字方面则有非常多的语言,常用的语言就有中文(又分正体与简体中文)、英文等。那么电脑如何记录与显示这些数值/文字呢?就得要通过一系列的转换才可以!下面我们就来谈谈数值与文字的编码系统!
早期的电脑使用的是利用通电与否的特性的真空管,如果通电就是1,没有通电就是0,后来沿用至今,我们称这种只有0/1的环境为二进制,英文称为binary。所谓的十进制指的是逢十进一位,因此在个位数归为零而十位数写成1。所以所谓的二进制,就是逢二就前进一位的意思。
那二进制怎么用呢?我们先以十进制来解释好了。如果以十进制来说,3456的意义为:
3456=3x103+4x102+5x101+6x100
特别注意:“任何数值的零次方为1”所以100的结果就是1。同样的,将这个原理带入二进制的环境中,我们来解释一下1101010的数值转为十进制的话,结果如下:
1101010=1x26+1x25+0x24+1x23+0x22+1x21+0x20=64+32+0x16+8+0x4+2+0x1=106
二进制是电脑基础中的基础!了解了二进制后,八进位、十六进制就依此类推!那么知道二进制转成十进制后,那如果有十进制数值转为二进制的环境时,该如何计算?刚刚是乘法,现在则是除法!我们同样的使用十进制的106转成二进制来测试一下:
最后的写法就如同上面的箭头,由最后的数字向上写,因此可得到1101010的数字!这些数字的转换系统是非常重要的,因为电脑的加减乘除都是使用这些机制来处理的!
事实上文字文件也是被记录为0与1,而这个文件的内容要被取出来查阅时,必须要经过一个编码系统的处理才行。所谓的“编码系统”可以想成是一个“字码对照表”,他的概念有点像下面的图示:
当我们要写入文件的文字数据时,该文字数据会由编码对照表将该文字转成数字后,再存入文件当中。同样的,当我们要将文件内容的数据读出时,也会经过编码对照表将该数字转成对应的文字后,再显示到屏幕上。
英文编码表为ASCII系统,这个编码系统中, 每个符号(英文、数字或符号等)都会占用1Bytes的记录,因此总共会有28=256种变化。
中文字当中的编码系统早期最常用的就是big5这个编码表。每个中文字会占用2Bytes,理论上最多可以有216=65536,亦即最多可达6万多个中文字。但是因为big5编码系统并非将所有的位都拿来运用成为对照,所以并非可达这么多的中文字码的。目前big5仅定义了一万三千多个中文字,很多中文利用big5是无法成功显示的。
big5码的中文字编码对于某些数据库系统来说是很有问题的,某些字码例如“许、盖、功”等字,由于这几个字的内部编码会被误判为单/双引号,在写入还不成问题,在读出数据的对照表时,常常就会变成乱码。不只中文字,其他非英语系国家也常常会有这样的问题出现啊!
为了解决这个问题,由国际组织ISO/IEC跳出来制订了所谓的Unicode编码系统,我们常常称呼的UTF8或万国码的编码。因为这个编码系统打破了所有国家的不同编码,因此目前网际网络社会大多朝向这个编码系统在走。
目前的电脑系统将软件分为两大类,一个是系统软件,一个是应用程序。但我们还是得要了解一下什么是程序,尤其是机器程序,了解了之后再来探讨一下为什么现今的电脑系统需要“操作系统”这玩意儿呢!
电脑只认识0与1,而且电脑最重要的运算与逻辑判断是在CPU内部,而CPU其实是具有微指令集的。因此,需要CPU帮忙工作时,就得要参考微指令集的内容,然后撰写让CPU读的懂的指令码给CPU执行,这样就能够让CPU运行了。
不过这样的流程有几个很麻烦的地方,包括:
机器只认识0与1,因此必须要学习直接写给机器看的语言!需要了解所有硬件的相关功能函数,因为程序必须要写给机器看,当然要参考机器本身的功能,然后针对该功能去撰写程序码。
例如,你要让DVD影片能够放映,那就得要参考DVD光驱的硬件信息才行。万一你的系统有比较冷门的硬件,光是参考技术手册可能会昏倒。
每个CPU都有独特的微指令集,同样的,每个硬件都有其功能函数。因此,为A电脑写的程序,理论上是没有办法在B电脑上面运行的!而且程序码的修改非常困难!因为是机器码,并不是人类看的懂得程序语言!
因为这样的程序必须要针对硬件功能函数来撰写,如果已经开发了一支浏览器程序,想要再开发文件管理程序时,还是得从头再参考硬件的功能函数来继续撰写。
那怎么解决啊?为了解决这个问题,电脑科学家设计出一种让人类看的懂得程序语言然后创造一种“编译器”来将这些人类能够写的程序语言转译成为机器能看懂得机器码,如此一来我们修改与撰写程序就变的容易多了!目前常见的编译器有C、C++、Java、Fortra等等。机器语言与高阶程序语言的差别如下所示:
从上面的图示可以看到高阶程序语言的程序码是很容易阅读的!在这样的环境下还是要考虑整体的硬件系统来设计程序!
举例来说,当你需要将运行的数据写入内存中,你就得要自行分配一个内存区块出来让自己的数据能够填上去,所以你还得要了解到内存的位址是如何定位的。为了要克服硬件方面老是需要重复撰写控制码的问题,所以就有操作系统(Operating System,OS)的出现了!
如同前面提到的,在早期想要让电脑执行程序就得要参考一堆硬件功能函数,并且学习机器语言才能够撰写程序。同时每次写程序时都必须要重新改写,因为硬件与软件功能不见得都一致之故。那如果我能够将所有的硬件都驱动,并且提供一个发展软件的参考接口来给工程师开发软件的话,那发展软件不就变的非常的简单了?那就是操作系统啦!
操作系统(Operating System,OS)其实也是一组程序,这组程序的重点在于管理电脑的所有活动以及驱动系统中的所有硬件。那么操作系统的功能就是让CPU可以开始判断逻辑与运算数值、让内存可以开始载入/读出数据与程序码、让硬盘可以开始被存取、让网卡可以开始传输数据、让所有周边可以开始运行等等。总之,硬件的所有动作都必须要通过这个操作系统来达成。核心程序所放置到内存当中的区块是受保护的!并且开机后就一直常驻在内存当中。
既然硬件都是由核心管理,那么如果要开发软件的话,自然就得要去参考这个核心的相关功能!如此一来不是从原本的参考硬件函数变成参考核心功能,还是很麻烦啊!为了解决这个问题,操作系统通常会提供一整组的开发接口给工程师来开发软件!工程师只要遵守该开发接口那就很容易开发软件了!
举例来说,我们学习C程序语言只要参考C程序语言的函数即可,不需要再去考虑其他核心的相关功能,因为核心的系统调用接口会主动的将C程序语言的相关语法转成核心可以了解的任务函数,那核心自然就能够顺利运行该程序了!
如果我们将整个电脑系统的相关软/硬件绘制成图的话,他的关系有点像这样:
电脑系统主要由硬件构成,核心程序主要在管理硬件,提供合理的电脑系统资源分配(包括CPU资源、内存使用资源等等),因此只要硬件不同(如x86架构与RISC架构的CPU),核心就得要进行修改才行。而由于核心只会进行电脑系统的资源分配,所以在上头还需要有应用程序的提供,使用者才能够操作系统的。
为了保护核心,并且让程序设计师比较容易开发软件,因此操作系统除了核心程序之外,通常还会提供一整组开发接口,那就是系统调用层。软件开发工程师只要遵循公认的系统调用参数来开发软件,该软件就能够在该核心上运行。软件与核心有比较大的关系,与硬件关系则不大!硬件也与核心有比较大的关系!至于与使用者有关的,那就是应用程序!
只要能够让计算机硬件正确无误的运行,那就算是操作系统了。所以说,操作系统其实就是核心与其提供的接口工具。
简单的说,上面的图示可以带给我们下面的概念:
操作系统的核心层直接参考硬件规格写成,所以同一个操作系统程序不能够在不一样的硬件架构下运行。举例来说,个人电脑版的Windows8.1不能直接在ARM架构(手机与平板硬件)的电脑下运行。
操作系统只是在管理整个硬件资源,包括CPU、内存、输入输出设备及文件系统文件。如果没有其他的应用程序辅助,操作系统只能让电脑主机准备妥当(Ready)!并无法运行其他功能。
应用程序的开发都是参考操作系统提供的开发接口,所以该应用程序只能在该操作系统上面运行,不可以在其他操作系统上面运行。
既然核心主要是在负责整个电脑系统相关的资源分配与管理,那我们知道其实整部电脑系统最重要的就是CPU与内存,因此,核心至少也要有这些功能的:
①系统调用接口(System call interface)
这是为了方便程序开发者可以轻易的通过与核心的沟通,将硬件的资源进一步的利用,于是需要有这个简易的接口来方便程序开发者。
②程序管理(Process control)
一部电脑可能同时间有很多的工作跑到CPU等待运算处理,核心这个时候必须要能够控制这些工作,让CPU的资源作有效的分配才行!另外,良好的CPU调度机制(就是CPU先运行那个工作的排列顺序)将会有效的加快整体系统性能!
③内存管理(Memory management)
控制整个系统的内存管理,这个内存控制是非常重要的,因为系统所有的程序码与数据都必须要先存放在内存当中。通常核心会提供虚拟内存的功能,当内存不足时可以提供内存交换(swap)的功能。
④文件系统管理(Filesystem management)
文件系统的管理,例如数据的输入输出(I/O)等等的工作啦!还有不同文件格式的支持啦等等,如果核心不认识某个文件系统,那么将无法使用该文件格式的文件!
例如:Windows 98就不认识NTFS文件格式的硬盘。
⑤设备的驱动(Device drivers)
就如同上面提到的,硬件的管理是核心的主要工作之一,当然啰,设备的驱动程序就是核心需要做的事情!好在目前都有所谓的“可载入模块”功能,可以将驱动程序编辑成模块,就不需要重新的编译核心!
驱动程序可以说是操作系统里面相当重要的一环!硬件可是持续在进步中!包括主板、显卡、硬盘等等。
操作系统通常会提供一个开发接口给硬件开发商,让他们可以根据这个接口设计可以驱动他们硬件的“驱动程序”,如此一来,只要使用者安装驱动程序后,自然就可以在他们的操作系统上面驱动新的硬件了
由上图我们可以得到几个小重点:
操作系统必须要能够驱动硬件,如此应用程序才能够使用该硬件功能;一般来说,操作系统会提供开发接口,让开发商制作他们的驱动程序;
要使用新硬件功能,必须要安装厂商提供的驱动程序才行;驱动程序是由厂商提供的,与操作系统开发者无关。
所以,如果你想要在某个操作系统上面安装一张新的显卡,那么请要求该硬件厂商提供适当的驱动程序吧!
因为驱动程序仍然是依据操作系统而开发的,所以,给Windows用的驱动程序当然不能使用于Linux的环境下了。
应用程序是参考操作系统提供的开发接口所开发出来软件,这些软件可以让使用者操作,以达到某些电脑的功能利用。
举例来说,办公室软件(Office)主要是用来让使用者办公用的;影像处理软件主要是让使用者用来处理影音数据的;浏览器软件主要是让使用者用来上网浏览用的等等。
需要注意的是,应用程序是与操作系统有关系的,如同上面的图示当中的说明。因此,如果你想要购买新软件,请务必参考软件上面的说明,看看该软件是否能够支持你的操作系统!
举例来说,如果你想要购买线上游戏光盘,务必参考一下该光盘是否支持你的操作系统,例如是否支持Windows XP/Windows Vista/MAC/Linux等等。
我们拿常见的微软公司的产品来说明。Windows 8.1,Office 2013之间的关系。
Windows 8.1是一套操作系统,他必须先安装到个人电脑上面,否则电脑无法开机运行;Windows7与Windows8.1是两套不同的操作系统,所以能在Win7上安装的软件不见得可在Win8.1上安装;Windows8.1安装好后,就只能拥有很少的功能,并没有办公室软件;Office2013是一套应用程序,要安装前必须要了解他能在哪些操作系统上面运行。
上一篇:计算机基础(二)