《鸟哥的linux私房菜》读书笔记(一)计算机概论

第一章 计算机概论

第一节 五大单元

  计算机由以下几个单元组成:输入单元、输出单元、CPU内部的控制单元和算数逻辑单元、主存储器。

  计算机的重点是中央处理器(Central Processing Unit, CPU),CPU是一个具有特定功能的芯片,里面含有微指令集,主要工作是管理和运算,所以CPU又分为两个单元:算数逻辑单元与控制单元。算数逻辑单元主要负责程序运算与逻辑判断,控制单元主要协调周边组件和各单元间的工作

  所以数据从输入单元传输到主存储器,经过CPU处理后写回主存储器,最后再传输到输出单元。(因为所有数据都要经过主存储器传输,如果内存容量不足,会对性能造成很大影响,所以提升内存被认为是提高机器性能的简单做法)


第二节 指令集

  CPU的微指令集主要有两种设计理念:精简指令集(RISC)与复杂指令集(CISC)系统。

精简指令集

  如字面意思,此微指令集较为精简,每个指令的运行时间都很短,完成的动作也很单纯,指令执行效能较佳。但对于复杂的任务,就需要多个指令来完成。

  常见的RISC微指令集CPU主要为:Oracle公司的SPARC系列、IBM公司的PowerPC系列、ARM公司的ARM CPU系列等。SPARC CPU主要用于学术领域的大型工作站,或者金融体系的主服务器。Power PC则有索尼的PS3等。ARM则是绝大部分主流手机、导航设备、网络设备等所采用的CPU。

复杂指令集

  CISC每个小指令都可以执行一些较低阶的硬件操作,指令数目多而且复杂,每条指令的长度并不相同,消耗的时间较长,但可以处理较丰富的任务。

  常见的CISC微指令集CPU主要有AMD、Intel、VIA等x86架构CPU。大量的PC都是采用x86架构CPU。


第三节 其他单元

  设备主要通过主板在硬件上连接起来,主板上有个连接沟通所有设备的芯片组,使CPU可以对各个设备下达命令。

  • 系统单元:CPU、内存和主板等相关组件。主板上有很多连接界面和适配卡。
  • 记忆单元:包括主存储器(RAM)与辅助内存。辅助内存就是硬盘、光盘等存储设备。
  • 输入、输出单元:触摸屏、键盘、鼠标、打印机、HDMI、投影机、蓝牙等等。

第四节 常见单位

容量单位

  最基础的单位就是bit,代表二进制0或1。

  字节 Byte 是很多简单数据都是8比特大小而定义的单位,所以 1 Byte = 8 bit。

  在字节之上就通过一系列简化单位来表示所代表的位数(K,M,G,T,P,E,Z等),二进制换算是每隔一代代表1024倍,十进制换算是每隔一代代表1000倍。

速度单位

  CPU的指令周期常用MHz或GHz等单位,Hz表示秒分之一。对于网络传输,因为网络使用bit作为单位,所以为Mbps(Mbits per second)也就是每秒多少Mbit。比如常见的100M宽带,如果转换为字节时,理论最大传输值为:每秒12.5Mbyte。


第五节 CPU

  早期主板上的芯片组使用两个网桥来控制各个组件的沟通:(1)北桥:负责链接速度较快的CPU、主存储器与显式适配器界面等组件。(2)南桥:负责链接速度较慢的装置接口,如硬盘、USB、网卡等。因为北桥最主要的用处是桥接CPU和主存储器,所以后来的架构将北桥内存控制器封装到CPU中了,这样CPU和主存储器不再需要一层北桥,而是直接联系,可以释放浪费的带宽,提高速度。

  多核CPU可以理解为CPU中有多个CPU处理单元,不同的微指令集也会影响到CPU的性能。CPU的频率就是CPU每秒钟可以进行的工作次数,如3.6GHz表示CPU可以一秒钟进行3.6*10^9次工作,只用频率来判定CPU性能是比较片面的,除了不同微指令集外,架构也不同,可用的第二层快取及其计算器制也可能不同,每次频率能进行的工作指令数也不同。

  早期因为需要通过北桥来进行连接,所有设备工作频率需要相同,所以就有了前端总线(Front Side Bus, FSB)。因为CPU指令周期最快,所以有了外频和倍频的定义,外频就是CPU和外部组件进行传输的速度,倍频则是CPU内部用来加速工作效能的一个倍数,二者的积才是CPU的频率速度。比如一个CPU内频为3.0GHz,外频是333MHz,所以倍频就是9倍(3G = 3000M = 333M * 9)。

  超频就是将CPU的倍频或外频通过主板设定为较高的频率,倍频通常不允许修改,一般修改的是外频。如333MHz提到400MHz,但超频之后CPU被提速,主板的各个组件都要相应的提速,变为原来的1.333倍(4/3),虽然CPU可能会达到3.6GHz,但可能会导致当机等问题。

  北桥要慢于CPU,就会变成性能的瓶颈,所以后来就将内存控制器整合到了CPU内部。这时就不需要考虑同步的外频,只要考虑整体频率即可。

  CPU每次能够处理的数据量称为字组大小,根据CPU设计有32位和64位,32位CPU因为能解析数据量有限,最多只能支持最大4GBytes的内存。

  CPU的超线程(Hyper-Threading),CPU指令周期太快了,所以运算核心经常得以闲置,如今的系统基本都是多任务系统,同时会有很多任务让CPU执行,所以就可以让CPU“同时”执行多个程序,来充分利用其性能。多线程的原理在其他博文中已有整理,简单的说就是CPU将缓存器分为两块,多个程序同时竞争CPU的运算单元,这样4核的CPU可以有8核的效果。


第六节 内存

  主存储器的主要组件为动态随机存取内存(Dynamic Random Access Memory, DRAM),断电后数据即丢失。

  DDR是所谓的双倍数据传送速度(Double Data Rate),可以在一次工作周期进行两次数据传送。

  内存除了频率/带宽和型号外,其容量是非常重要的,所有数据都要加载到内存后才能被CPU读取,内存不够大会使大容量数据无法完整加载,内存需要释放未被使用的数据,现实使用中这些释放会和影响内存性能。

  CPU内有第二层高速缓存(L2 cache),用来存放常用的程序或数据,避免再从主存储器中读取。L2内存的速度和CPU频率相同,但DRAM无法达到这个频率,所以需要静态随机存取内存(Static Random Access Memory, SRAM)。SRAM成本较高,很难做成大容量,所以利用其速度快的优势来作缓存是很好的方案。

  CMOS主要用来记录主板上重要的参数,包括系统时间、CPU电压和评率、各项设备的I/O地址与IRQ等,记录这些需要通电,所以主板上也会有电池。

  BIOS(Basic Input Output System)是写死在主板上内存芯片中的一套程序,这个芯片是只读存储器(ROM)即使没有通电也可以记录数据。BIOS随着计算机发展,需要不断地进行更新,所以只能放弃ROM,转为写入如闪存(flash)或EEPRO中。BIOS开机时执行,加载CMOS中的参数,并尝试呼叫存储设备中的开机程序从而进入操作系统。

  显式适配器又叫VGA(Vifeo Graphics Array),图像的显式颜色需要占用内存,一些3D需要一定的运算,而CPU并非针对3D而设计的,所以就在VGA中嵌入了3D加速的芯片,也就是GPU。PCI是VGA的规格,经过了AGP后又发展为PCI-Express。

  VGA和显示器连接的接口有:D-Sub(VGA端子),DVI,HDMI,Display port(DP)。


第七节 机器语言到高级语言

  机器语言就是一种指令集,也叫机器码,可以让CPU直接解读的语言,通过二进制代码来表示一些机器可以直接执行的指令集合。

  因为机器只能识别0和1这种二进制语言,为了让机器执行特定的程序,需要参考机器自身的功能,程序最重要的运算和逻辑判断是通过CPU进行处理,所以为了让CPU执行程序需要参考CPU特有的微指令集,所以不同CPU微指令集不同时,移植就是一件麻烦事,程序需要和硬件结合才能开发时,程序就无法有效的复用,每次都要重新和硬件打交道。

  为了解决这些麻烦,经过不断地发展,从机器语言到汇编语言,最后发展到一些现在的高级语言。

  汇编语言通过助记符来代替机器指令的操作码,从而不用面对大量的二进制串,但汇编语言基本是和机器语言指令集一一对应的,所以不能解决不同平台不能移植的问题,不同指令集也就意味着不同的汇编语言,也没有降低编程的复杂度,但其性能和机器语言相当,要高于其他语言,所以到现在也会在一些场景继续发挥作用。

  高级语言是高度封装后的编程语言,相比面向机器的汇编和机器语言,高级语言是面向用户的。高级语言不能直接被机器理解,所以需要一个翻译的过程,变为可以执行的机器语言。翻译方式有:编译和解释,编译就是先翻译程序后再执行,解释则是一边翻译一边执行。翻译的过程由编译程序来执行,开发人员只要专注于创造性的内容即可。

  高级语言接近算法语言,简单易理解,更有结构化,使其开发的程序更具有可读性、可维护性、可靠性等,因为脱离了和硬件的对应,所以也实现了好的可移植性,提高了复用率。


第八节 操作系统

  如果程序想要把数据写入内存,必然需要分配一块内存区域用来放置数据,也就意味着要了解内存地址是如何定位的,而操作系统可以完成这种和硬件打交道重复撰写句柄的任务。

  操作系统也是一组程序,其工作重点是管理计算机所由活动以及驱动系统中所有硬件。操作系统可以实现的这些功能就是其核心(Kernel),核心主要管控硬件与提供相关的能力,这些功能十分重要,所以核心程序会被放置到内存当中的区块中进行保护,开机后就会驻留在内存当中。

  程序通过系统呼叫(System Call)来和核心交互,只要遵守操作系统提供的开发接口,核心的系统呼叫接口会主动的把程序语言的相关语法转为可以识别的任务函数,而开发人员不需要去了解核心或硬件了。

操作系统的角色

  核心程序提供的这一整组开发接口叫系统呼叫层,操作系统的核心层参考硬件信息来实现,没有其他程序的帮助操作系统只是在管理整个硬件资源,只是让计算机处于准备状态,应用程序开发时参考操作系统的开发接口,也只能运行在这个操作系统上。

核心至少要具有以下功能:

  • 系统呼叫接口
  • 程序管理
  • 内存管理
  • 文件系统管理
  • 装置的驱动

  驱动一般由硬件厂商提供,操作系统会提供给硬件厂商一组开发接口,让他们按照接口设计驱动程序,从而使操作系统可以识别任意版本的驱动。


参考博客和文章书籍等:

《鸟哥的Linux私房菜》

因博客主等未标明不可引用,若部分内容涉及侵权请及时告知,我会尽快修改和删除相关内容