计算机软件


0.3 数据表示方式

回到顶部

下面我们就来谈谈数值与文字的编码系统啰!

二进制和十进制的转换

回到顶部

计算机内部硬件都是由二极管组成的大规模集成电路,通过二极管是否通电来计数,通电就是1,没有通电就是0。 计算机只能识别0与1,数据只能以0和1记录,所以计算机中的数据都是采用二进制计数(binary)。 人类常用的数值运算是十进制, 十进制逢十进一,个位数归零而十位数写成1。二进制,就是逢二进一。
十进制数3456可以用下面的等式表示:
3456 = 3x10^3 + 4x10^2 + 5x10^1 + 6x10^0
任何数值的零次方为1:n^0=1。 二进制数1101010就可以表示如下:
1101010=1x2^6 + 1x2^5 + 0x2^4 + 1x2^3 + 0x2^2 + 1x2^1 + 0x2^0 = 64 + 32 + 0x16 + 8 + 0x4 + 2 + 0x1 = 106
二进制是计算机基础中的基础!八进制、十六进制转成十进制也是同样的道理! 以十进制数106为例,十进制数转二进制数方法如下:
十进制转二进制的方法 图 十进制转二进制的方法
根据红色箭头的方向,由最后的余数向上写可得到106的二进制数为1101010 这些数字的转换系统是非常重要的,因为计算机的加减乘除都是使用这些机制来处理的!

文字编码系统

回到顶部

计算机中记录的所有数据都0和1,而人类容易识别的是文字信息, 计算机需要把二进制数字转换成更适合人类阅读的文字信息。 就需要对文字进行二进制编码,编码系统就是文件和编码的对照表。
当我们要写入文件的文字数据时,该文字数据会由编码对照表将该文字转成数字后,再存入文件当中。 同样的,将文件内容的数据读出时,也会经过编码对照表将该数字转成对应的文字后,再显示到屏幕上。 每一种文字在存入计算机之前都会对其编码,如果在读出的时候没有用对应的编码表进行解码,就会出现所谓的乱码现象。 这时候只要尝试修改一下文件编码就可以正常显示了。
常用的英文字符编码表为ASCII系统,每个符号(英文、数字或符号等)占用1bytes,总共会有2^8=256种变化。 至于中文字当中的编码系统早期最常用的就是big5这个编码表了。每个中文字占用2bytes,理论上最多可以有2^16=65536个中文字。 在实际应用过程中,包括中文在内的非英语系语言的编码常常出现各种问题!
为此国际组织ISO/IEC制订了统一的Unicode编码系统, 目前网络上常用的Unicode编码就是UTF8。

软件程序运作

回到顶部

计算机系统是硬件和软件的结合体,如果没有软件的配合,计算机就是一堆无用的废铁。 一般来说,计算机软件分为两大类,一类是系统软件,另一类是应用程序软件。

机器程序与编译程序

回到顶部

计算机的内核部件是cpu,cpu通过执行内部指令来完成一系列的运算和控制工作, 我们将cpu执行的指令编写在一起组成特定逻辑功能的指令序列, 这些实现特定功能的指令序列集合就是我们通常所说的计算机软件程序。
cpu执行的指令肯定都是二进制,如果直接用cpu指令来编写程序,对cpu来说非常容易识别和执行, 但是对于人类来说真是非常痛苦的事情。 就像文字有对应的编码系统一样,人们把一条条计算机二进制指令编码成方便人类阅读识别的文字, 例如移动指令是10001011,真的是太难记了,干脆就把10001011标记为move好了, 以后看到move就知道这是一条移动指令了。这就是最早的汇编语言。
每一条二进制指令都有一个对应的英文标记,人们在编写程序的时候就用汇编语言编写, 让计算机执行的时候,就先转换为对应的二进制指令就可以了。
汇编语言虽然大大解放了生产力,但是还是有很多不足之处。 例如汇编指令和cpu指令一一对应,不具备可移植性。每种cpu的指令集都是不一样的,在x86上面编写的汇编程序无法在arm处理器上运行。
为此计算机科学家设计出了和硬件无关的,可移植性更好,更方便人类编写的高级程序设计语言, 常见的高级程序设计语言有C, C++, Java, Fortran等。 上面提到的都是编译型语言,另外还有供计算机程序解释执行的脚本语言。 例如linux系统管理必须使用的shell脚本语言,就是由shell程序执行的语言,而shell则是由c语言编写的计算机程序。 所以可以将脚本语言称为高级语言的语言。
这样人们在编写计算机程序的时候,只需要用这些高级程序设计语言或者脚本语言编写就可以了。
在让计算机运行的时候,会先由编译器编译成对应计算机的汇编指令,再由汇编器转换成cpu可以执行的cpu指令序列。
而我们在linux下执行的大部分命令都是由这些高级程序设计语言编写。

操作系统

回到顶部

我们用高级程序设计语言编写好的程序经过编译汇编链接等处理后,就变成计算机可以执行的软件程序了。 那么如何运行这些程序呢?包括编写编译汇编链接的这些环节都是在哪里操作完成的呢?
一个cpu在某个时刻只能同时执行一个计算机程序,如果我们手头有好多程序,希望同时提交到内存给cpu执行, cpu忙不过来怎么办?内存不足装不下怎么办?
另外在编写程序的时候,希望操作某个硬件,但是别人已经针对该硬件编写过驱动程序了,还需要重新编写吗?
如果每个人都针对同一个硬件编写同样的驱动程序,岂不是浪费时间, 最明智的做法就是直接调用别人编写好的硬件驱动程序就可以了,完全没有必要重复造轮子。
那么怎么调用别人写好的驱动程序呢?写好的驱动程序怎么提供给有需要的人呢?
这些都是需要操作系统(Operating System, OS)的辅助。 我们在linux上执行的命令就是在运行别人或者自己写好的计算机程序, 这些程序也都是在操作系统提供的环境下编写而成,例如操作系统会为程序提供操作底层硬件的api接口,提供硬件驱动程序等。

操作系统内核(Kernel)

回到顶部

操作系统(Operating System, OS)内核(Kernel)也是一组程序软件, 这组程序的重点在于管理计算机的所有活动以及驱动系统中的所有硬件。 计算机没有软件就是一堆废铁,内核的功能就是让CPU可以开始判断逻辑与运算数值、 让主存储器可以开始加载/读出数据与程序代码、让硬盘可以开始被存取、让网络卡可以开始传输数据、让所有周边可以开始运转等。 总之,硬件的所有动作都必须要通过操作系统内核来完成! 如果内核不支持某项功能,硬件再强大也是无法发挥作用的。例如如果内核不支持TCP/IP网络协议, 那么再强大牛逼的网卡也无用武之地! 内核主要在管控硬件与提供相关的能力(例如存取硬盘、网络功能、CPU 资源取得等), 这些管理的动作是非常的重要的,如果用户能够直接使用到内核的话,万一用户不小心将内核程序停止或破坏, 将会导致整个系统的崩溃! 内核程序在开机启动后就一直常驻内存,为了防止用户不小心破坏内核程序而导致整个系统崩溃,内核所在的内存区域需要严格保护。

系统调用(System Call)

回到顶部

用户是无法直接操作操作系统内核的,而是需要在内核之上运行应用程序软件, 这些应用程序软件会和内核进行沟通,应用程序和内核沟通的桥梁就是系统调用!
操作系统内核通常会提供一整组的开发接口给工程师来开发软件! 工程师只要遵守 该开发接口那就很容易开发软件了!linux内核会提供C语言函数的api接口,不需要再去考虑其他内核的相关功能。
应用程序和linux内核的关系如下图所示:
图 0.4.2、操作系统的角色
计算机系统主要由硬件构成,然后内核程序主要在管理硬件,提供合理的计算机系统资源分配(包括 CPU 资源、内存使用资源等等), 因此只要硬件不同(如 x86 架构与 RISC 架构的 CPU),内核就得要进行修改才行。
而由于内核只会进行计算机系统的资源分配,所以在上头还需要有应用程序的提供,用户才能够操作系统的。
为了保护内核,并且让程序设计师比较容易开发软件,因此操作系统除了内核程序之外,通常还会提 供一整组开发接口, 那就是系统调用层。软件开发工程师只要遵循公认的系统呼叫参数来开发软件, 该软件就能够在该内核上头运作。 软件与内核有比较大的关系,与硬件关系则不大!硬件也与内核有比较大的关系! 至于与用户有关的,那就是应用程序啦!
在定义上,只要能够让计算机硬件正确无误的运作,那就算是操作系统了。 所以说, 操作系统其实就是内核与其提供的接口工具,一般我们提到的操作系统通常是指包括内核与相关的应用软件在内的一整套系统!
操作系统的内核层直接参考硬件规格写成, 所以同一个操作系统程序不能够在不一样的硬件架构下运作。 个人计算机版的 Windows 8.1 不能直接在 ARM 架构 (手机与平板硬件) 的计算机下运作。
操作系统只是在管理整个硬件资源,包括 CPU、内存、输入输出设备及文件系统文件。 如果没有其他的应用程序辅助,操作系统只能让计算机主机准备妥当(Ready)而已!并无法运作其他功能。 所以你现在知道为何Windows上面要达成网页影像的运作还需要类似PhotoImpact或Photoshop之类的软件安装了吧?
应用程序的开发都是参考操作系统提供的开发接口, 所以该应用程序只能在该操作系统上面运作而已,不 可以在其他操作系统上面运作的。
内核功能
既然内核主要是在负责整个计算机系统相关的资源分配与管理,那我们知道其实整部计算机系统最重 要的就是CPU与主存储器, 因此,内核至少也要有这些功能的:
系统调用接口(System call interface)
刚刚谈过了,这是为了方便程序开发者可以轻易的通过与内核的沟通,将硬件的资源进一步的利用, 于是 需要有这个简易的接口来方便程序开发者。
进程管理(Process control)
总有听过所谓的多任务环境吧?一部计算机可能同时间有很多的工作跑到 CPU 等待运算处理, 内核 这个时候必须要能够控制这些工作,让 CPU 的资源作有效的分配才行!另外, 良好的 CPU 排程机制(就是 CPU 先运作那个工作的排列顺序)将会有效的加快整体系统效能呢!
内存管理(Memory management)
控制整个系统的内存管理,这个内存控制是非常重要的,因为系统所有的程序代码与数据都必须要先存放 在内存当中。 通常内核会提供虚拟内存的功能,当内存不足时可以提供内存置换(swap)的功能哩。
文件系统管理(Filesystem management)
文件系统的管理,例如数据的输入输出(I/O)等等的工作啦!还有不同文件格式的支持啦等等, 如果你的核 心不认识某个文件系统,那么您将无法使用该文件格式的文件啰!例如:Windows 98 就不认识 NTFS 文件 格式的硬盘;
设备驱动(Device drivers)
就如同上面提到的,硬件的管理是内核的主要工作之一,当然啰,设备的驱动程序就是内核需要做的事情 啦! 好在目前都有所谓的可加载模块功能,可以将驱动程序编辑成模块,就不需要重新的编译内核啦! 这个也会在后续的第十九章当中提到的!
事实上,驱动程序的提供应该是硬件厂商的事情!硬件厂商要推出硬件时,应该要自行参考操作系统的驱动程序开发接口, 开发完毕后将该驱动程序连同硬件一同贩卖给用户才对!举例来说,当你购买显示适配器时, 显示适配器包装盒都会附上一片光盘,让你可以在进入 Windows 之后进行驱动程序的安装啊!
操作系统与驱动程序
老实说,驱动程序可以说是操作系统里面相当重要的一环了!不过,硬件可是持续在进步当中的! 包 括主板、显示适配器、硬盘等等。那么比较晚推出的较新的硬件,例如显示适配器,我们的操作系统 当然就不认识啰! 那操作系统该如何驱动这块新的显示适配器?为了克服这个问题,操作系统通常 会提供一个开发接口给硬件开发商, 让他们可以根据这个接口设计可以驱动他们硬件的驱动程序, 如此一来,只要用户安装驱动程序后, 自然就可以在他们的操作系统上面驱动这块显示适配器了。
操作系统必须要能够驱动硬件,如此应用程序才能够使用该硬件功能;
一般来说,操作系统会提供开发接口,让开发商制作他们的驱动程序;
要使用新硬件功能,必须要安装厂商提供的驱动程序才行;
驱动程序是由厂商提供的,与操作系统开发者无关。所以,如果妳想要在某个操作系统上面安装一张新的显示适配器, 那么请要求该硬件厂商提供适当的 驱动程序吧! ^_^! 为什么要强调适当的驱动程序呢? 因为驱动程序仍然是依据操作系统而开 发的, 所以,给 Windows 用的驱动程序当然不能使用于 Linux 的环境下了。

应用程序软件

回到顶部

应用程序是参考操作系统提供的开发接口所开发出来软件,这些软件可以让用户操作,以达到某些计算机的功能利用。 举例来说,办公软件(Office)主要是用来让用户办公用的;图像处理软件主要 是让用户用来处理影音资料的; 浏览器软件主要是让用户用来上网浏览用的等。
需要注意的是,应用程序是与操作系统有关系的。因此,如果你下载新软件, 请务必下载和操作系统对应的版本! 例如在windows上可以安装的软件是不能运行在linux操作系统上的,需要有对应的linux版本 Office 2013 是一套应用程序,要安装前必须要了解他能在哪些操作系统上面运作。

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读