计算机软件基础

数字系统

计算机使用电信号的开和关来代表二进制的 1 和 0,这种逢 2 进 1 位的表示法称为二进制。除了二进制,常用的进制还有八进制和十六进制。然而,现实生活中使用的数字系统是十进制。

在编程语言中,表示二进制数的前缀是"0b",表示八进制数的前缀是"0o",表示十六进制数的前缀是"0x"。

二进制转十进制

例如,要将二进制数 1101101 转换为十进制数,手动计算方法如下:

1101101=126+125+024+123+122+021+1=64+32+0+8+4+0+1=1091101101=1*2^6+1*2^5+0*2^4+1*2^3+1*2^2+0*2^1+1=64+32+0+8+4+0+1=109

在 Bash 中,可以使用echo $(())来直接将二进制数转换为十进制数:

[root@server2 ~]$ echo $((2#1101101))
109

十进制转二进制

例如,将十进制数 109 转换为二进制数:

109/2=54...1
054/2=27...0
027/2=13...1
013/2=06...1
007/2=03...0
003/2=01...1
001/2=00...1

将商除到 0 为止,把所有的余数从下往上读,得到的就是二进制结果 1101101。

在 Bash 中,可以通过调用bc来进行计算:

[root@server2 ~]$ echo "obase=2;ibase=10;109"|bc -l
1101101

二进制转十六进制

例如,将二进制数 1101101 转换为十六进制数。

因为四位二进制恰好等于一位十六进制,所以先将二进制数从低位到高位分为四位一组,高位不足四位在前面补 0:

0110 1101

然后将每一组转为对应的十六进制数:

6 D

得到转换结果 0x6D。

十六进制转二进制

例如,将十六进制数 0x6D 转换为二进制数。

原理同二进制转十六进制,将每位十六进制单独拿出来:

6 D

将每位转为对应的二进制:

0110 1101

得到转换结果 1101101。

计量单位

计算机中常用的计量单位有下面一些:

  • 存储容量单位
    • 比特(bit):二进制单位,只记录 0 或 1。
    • 字节(Byte):储存记录用的单位,1Byte = 8bit。1KB = 1024Byte,再往上有 GB、TB、PB、EB、ZB 等单位。
  • 速度单位
    • 运算速度:Hz 代表秒分之一,CPU 运算速度常使用 MHz 或 GHz。1MHz = 1000*1000Hz。
    • 网络传输:bps 意思是 bit per second 每秒多少比特,常见的网卡速度 100Mbps 意即每秒传输 100Mb,转为实际文件传输速度等于 12.5MB/s。

编码系统

计算机只能识别数字,因此需要使用编码系统将文字转换为数字进行储存。

编码过程

编码的过程是根据一个编码对照表将文字转换为对应编码表中的编号,并将编号存入文件中。

在读取文件时,再根据编码对照表将编号还原成文字进行显示。

如果选择的编码表与实际不符,则会出现所谓的“乱码”。

常用的编码表包括 ASCII、GB2312 和 Unicode 等。

ASCII 编码

美国信息交换标准码(ASCII,American Standard Code for Information Interchange)为每个字符指定 7 位(最左边的位被忽略掉),占用 1Byte 的记录,因此总共可以表示 128 个字符,即从二进制 0000000 到 1111111。

ASII 码中包含 33 个控制字符、52 个字母(65 ~ 90,97 ~ 122)、10 个数字(48 ~ 57)、32 个标点符号以及空白符。

GB2312 编码

简体中文最常用的是 GB2312 编码,每个中文字会占用 2Bytes。

理论上有 216=65536 个记录位置,实际只收录了一万三千多个中文字。

Unicode 编码

Unicode 编码也叫 UTF-8 或统一码。基本上包含了所有语言的文字。

逻辑门

计算机中的逻辑电路基本单元有以下几种:

非门(NOT Gate)

也称为反相器、倒相器、逻辑否定电路,它的输出是输入的反相。当输入端为高电平(1)时,输出端为低电平(0),当输入端为低电平(0)时,输出端为高电平(1)。

非门的真值表:

输入 A 输出 Y
0 1
1 0

逻辑符号表示如下:

非门

与门(AND Gate)

与门又称与电路、逻辑积、逻辑与电路。当所有的输入同时为高电平(1)时,输出才为高电平(1),否则输出为低电平(0)。

与门的真值表:

输入 A 输入 B 输出 Y
0 0 0
0 1 0
1 0 0
1 1 1

逻辑符号表示如下:

与门

或门(OR Gate)

又称或电路、逻辑和电路。只要输入中有一个为高电平(1)时,输出就为高电平(1);只有当所有的输入全为低电平(0)时,输出才为低电平(0)。

或门的真值表:

输入 A 输入 B 输出 Y
0 0 0
0 1 1
1 0 1
1 1 1

逻辑符号表示如下:

或门

与非门(NAND Gate)

与非门是与门和非门的叠加。当输入均为高电平(1)时,输出为低电平(0);当输入中至少有一个为低电平(0)时,输出为高电平(1)。与非门可以看作是与门和非门的叠加。

与非门真值表:

A B Y
0 0 1
0 1 1
1 0 1
1 1 0

逻辑符号表示如下:

与非门

或非门(NOR Gate)

或非门实现逻辑或非功能。它有多个输入端,1 个输出端。多输入或非门可由 2 输入或非门和反相器构成。只有当两个输入 A 和 B 为低电平(0)时,输出为高电平(1)。也可以理解为任意输入为高电平(1),输出为低电平(0)。

或非门真值表:

输入 A 输入 B 输出 Y
0 0 1
0 1 0
1 0 0
1 1 0

逻辑符号表示如下:

或非门

异或门(XOR Gate)

异或门是数字逻辑中实现逻辑异或的逻辑门。多输入异或门可由两输入异或门构成。若两个输入的电平相异,则输出为高电平(1);若两个输入的电平相同,则输出为低电平(0)。即如果两个输入不同,则异或门输出高电平(1)。

异或门真值表:

输入 A 输入 B 输出 Y
0 0 0
0 1 1
1 0 1
1 1 0

逻辑符号表示如下:

异或门

同或门(XNOR Gate)

同或门也称为异或非门,在异或门的输出端再加上一个非门就构成了异或非门。当 2 个输入端中有且只有一个是低电平(0)时,输出为低电平(0)。即当输入电平相同时,输出为高电平(1)。

同或门真值表:

输入 A 输入 B 输出 Y
0 0 1
0 1 0
1 0 0
1 1 1

逻辑符号表示如下:

同或门

二进制加法器

可以使用两种基本逻辑门来计算两个二进制数相加的结果:

  • 位相加

    位相加的计算结果由 XOR 异或门实现。

    位和 0 1
    0 0 1
    1 1 0
  • 进位位

    进位位的计算结果由 AND 与门实现。

    进位 0 1
    0 0 0
    1 0 1

将它们连起来就成为半加器(Half Adder):

半加器

为了将可能产生的进位位纳入下一次运算,需要对三个二进制数进行加法运算,最终将两个半加器和一个或门连接起来成为一个全加器(Full Adder):

全加器

首先这一次计算两个二进制数 A 和 B 的和得到进位和位和输出。然后将位和输出与上一次计算结果的进位输出相加得到另外一个进位和位和输出,最后将两次的进位输出做或运算,与上一步得出的位和输出在一起传递给下一环节。

软件程序

通常软件程序可以分为两类:操作系统和应用程序。

操作系统

操作系统(OS,Operating System)是一组程序,用于管理计算机的所有活动以及驱动系统中的所有硬件。

操作系统内核直接参考硬件规格编写,用于管理硬件,因此同一个操作系统内核不能在不同的硬件构架下运行。

操作系统的功能主要包括:

  • 系统调用接口(System call interface)

    方便程序员通过接口与内核通信,利用硬件资源。

  • 程序管理(Process Control)

    一部计算机可以同时运行很多软件,一般管运行中的程序叫进程。进程可以在前台也可以在后台运行,内核控制着系统管理运行在系统上的所有进程。

  • 内存管理(Memory Management)

    因为程序代码和数据都必须载入到内存中运行,所以内存控制非常重要。

    交换空间(虚拟内存)用于物理内存不足时提供内存交换(swap)功能,调用虚拟内存的过程称为页面调度(Paging)。

    内存储存单元按组划分成很多块,这些块称为页面(Page)。内核将每个内存页面放在物理内存或交换空间中,然后维护一个内存页面表,自动把一段时间未访问的内存页面复制到交换空间(Swapping Out)。当程序要访问一个已被换出的内存页面时,内核必须从物理内存换出另外一个内存页面给它让出空间,然后从交换空间换入请求的内存页面。

  • 文件系统管理(Filesystem Management)

    负责对多种文件系统的支持,管理数据输入输出工作,文件格式支持等。

  • 设备驱动(Device Driver)

    管理硬件的驱动。驱动程序相当于应用程序和硬件设备的中间人,允许内核与设备之间交换数据。

应用程序

应用程序是利用操作系统提供的开发接口开发出来的软件,这些软件通常针对特定功能而开发。

源代码

源代码是创建软件的原始数据。可以使用诸如 C++ 之类的编程语言编写源代码,在使用这些代码之前需要进行编译。使用 Perl 或 Python 这样的脚本语言编写源代码,则无需编译即可运行。

开源许可

以源代码形式提供的软件称为开源软件,通常可以自由地查看、共享、使用和修改它。

开源软件许可证声明对源代码拥有版权,并确定代码的使用和发布以及派生代码的使用和发布的自由范围和限制。常见的开源许可证有 BSD 和 GPL。

  • BSD 许可证

    持有 BSD 许可证的源代码可以自由地进行修改,而且不需要重新发布这些修改。常用于私有或商业软件中。

  • GPL 许可证

    GNU 通用公共许可证(GPL)规定任何已发布的软件所做的任何修改都必须以相同的许可证发布。