一、计算机硬件的主要组成部分
CPU,内存,I/O设备。其中,CPU的核心组件由运算器、控制器和寄存器组成。I/O设备则主要由输入、输出设备,例如键盘、鼠标、硬盘等
1.1 CPU内部运行机制
以执行一个两个整形的加法运算为例
前提: 一个程序要能运行,必须首先加载到内存中,还必须要有程序的执行入口(例如main函数)。
另外,CPU要进行加法运算,必须有指令和数据两个基本“数据”。
运算器主要负责进行二进制运算,控制器负责去内存提取指令,数据,并告诉运算器把结果存到内存的地址。
过程:
Step1: 加法程序执行,通过sh人机交互接口,传到内核,内核检查程序的执行入口,和查看程序所使用的动态库(Linux中通常是SO (shared object)/DSO (Dynamic shared object))是否已经被加载到内存,如果没在内存,要加载到内存中。程序中的变量(加数与被加数)也被载入内存
Step2: 控制器从内存中获取指令(进行加法运算)传给运算器,并告诉运算器加数、被加数在内存中的地址(以去内存中读取),内存把存储的数据都转化成电信号再传给CPU。运算器每次只能取一个数据(加数或者被加数),取到后,存到寄存器中,继续读取下一个数字。
Step3: 运算器进行加法运算
Step4: 控制器告诉运算器,要把运算结果放到内存的那个地址。
1.2 CPU的主频
运算器是通过线路接入电流变化,读取数据的。那么这个电流变化是由“电开关”的开闭来实现的,那么这个开闭的频率就被称为CPU的主频。例如, 1Ghz的主频,实际意义就是CPU可以在1s的时间内,开闭电路10的9次方 次。寄存器可以与CPU以相同的频率工作。但是内存相对CPU就慢的多,因此根据“木桶原理”,CPU的速度再快,内存跟不上,性能也不会太好。
缓存: 为了解决上述问题,就出现了CPU缓存,现在一般都有三级缓存,级数越小离CPU越近,缓存越大,整体性能越强劲。
1.3 内核如何与硬件“打交道”?
从键盘输入的字符,如何能够快速作用于我们希望作用的APP中?CPU怎么知道从哪个外围设备输入的?又怎么输出到对的外围设备?
对于第一个问题,大致说来有两种机制,一种是CPU 轮询(POLL)但这种方法会造成大量的资源浪费。另一种就是“中断”(Interrupt),即在外围设备作用时(比如点击鼠标),产生一个电信号通知CPU有这样一个实时时间需要相应。
对于后面两个问题: 是通过与CPU针脚相连的控制芯片实现的,这个芯片又叫做可编程中断控制器,这个控制器上有很多线,每根线代表一个或者多个外围设备。如果一根线代表多个外围设备,需要“中断向量”来区分。
1.4 南桥北桥
北桥:离CPU较近的,高速线路。开始连接CPU和内存。现在为了获取更高的性能,内存之间与CPU相连,北桥就只连接南桥。为了快速读取硬盘,有些会将固态硬盘连接于北桥之上。
南桥:离CPU较远的,低速线路。主要连接各个外围设备。
二、计算机架构
2.1 操作系统的出现
在计算机出现伊始,计算机不仅是个庞然大物,运算能力低下,而且即便是CPU速度不快,相比于输入输出设备,依然显得鹤立鸡群。早期的输入设备主要是打孔纸,程序员首先编写程序,然后开始在打孔纸上打孔,如果有错误,就要完全重新来;而输出设备主要靠“灯”,小灯是否点亮由人记录,就是程序运行的输出结果。那么计算器在同一时刻,只能做一件事情,可是极大的资源浪费。
为了解决上述问题,有大牛发明了分时处理机制,可谓是计算机史上具有里程碑意义的大事件。分时处理系统可以使得CPU看上去在同一时间能够处理很多事情,那么这个系统的主要作用就是把CPU分成时间片,把内存也分成不同的块,并协调硬件资源遵循这一规则,这个东东,就是内核。操作系统的核心。
在有了操作系统之后,所以程序都不能直接跟硬件打交道,而必须通过内核。例如,有个进程想要读取硬盘中的数据,那么必须通过系统调用(System call)来请求,由内核负责读取硬件资源,
2.2 库文件
在有了操作系统之后,所以程序都不能直接跟硬件打交道,而必须通过内核。例如,有个进程想要读取硬盘中的数据,那么必须通过系统调用(System call)来请求,由内核负责读取硬件资源并返回给进程。 系统调用时非常非常底层的实现,因此又有人将这些system call封装起来,成为更高级的接口,这样程序员就可以用这些已有的库函数,专心实现更高级的应用。 而且,在这种架构下,即使底层逻辑不同,如果封装成相同的库函数(API),就大大增强了程序的可移植性,成为日后高级语言迅猛发展的沃土。
在Windows上,那些dll (Dynamic link libaray) 结尾的文件就是库文件. 在Linux系统,库文件是so(shared object) 或者dso(Dynamic shared object)结尾的。
2.3 人机交互接口
上层应用通过shell跟内核通信,分为两种:一是GUI,另一个是CLI
2.4 计算机架构