指令集
存储在CPU内部,对CPU运算进行指导和优化的指令集合。拥有这些指令集,CPU就可以更高效地运行。例如:x86指令集。
计算机就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。一台计算机中的所有指令的集合,称作指令集。程序员用各种语言编写的程序要翻译(编译或解释)成以指令形式表示的机器语言之后,才能在计算机上运行。计算机硬件完成各条指令所规定的操作,并保证按程序所规定的顺序执行指令,所以指令系统反映了计算机的基本功能,是硬件设计人员和程序员都能见到的机器的主要属性。
计算机硬件结构
image.png高速的北桥:速度非常高,主要负责CPU和内存、显卡这些部件的数据传送。现在有些主板已经没有北桥了,因为芯片厂商已经把北桥所负责的功能直接集成到CPU中了。
低速的南桥:主要负责I/O设备、外部存储设备以及BIOS之间的通信。
FSB总线:即前端总线(Front Side Bus),CPU和北桥之间的桥梁,CPU和北桥传递的所有数据必须经过FSB总线,可以这么说FSB总线的频率直接影响到CPU访问内存的速度。
PCI总线:PCI总线是一种高性能局部总线,其不受CPU限制,构成了CPU和外设之间的高速通道。比如现在的显卡一般都是用的PCI插槽,PCI总线传输速度快,能够很好地让显卡和CPU进行数据交换。
SMP与多核
原因:在制造CPU的工艺方面已经达到了物理极限,除非再有本质的突破,否则CPU的频率会一直被目前4GHz的“天花板”限制。(主频和实际的运算速度存在一定的关系,但并不是一个简单的线性关系,但提高主频对于提高CPU运算速度至关重要。)
SMP(Symmetrical Multi-Processing):对称多处理器,简单地讲就是每个CPU在系统所处的地位和所发挥的功能都是一样的,是相互对称的。理论上讲,速度的提高与CPU的数量成正比,但实际并非如此,因为我们的程序并不是都能分解成若干个完全不相干的子问题。当然在同时处理大量请求的时候,像大型数据库和网络服务器上是很有用的。
多处理器:SMP的简化版,共享比较昂贵的缓存部分,只保留多个核心。
CPU、存储器和I/O设备
不要让CPU打盹
多道程序(Multiprogramming):当某个程序暂时无需使用CPU时,监控程序就把另外正在等待CPU资源的程序启动,使得CPU能够充分地利用起来。
缺点:调度策略太粗糙,程序之间不分轻重缓急。
分时系统(Time-Sharing System):每个程序运行一段时间后都主动让出CPU。
缺点:任何一个程序死循环会导致系统死机。(这里存疑,可能是跑不到系统调用了)
多任务(Multi-tasking):操作系统接管所有硬件资源,并且本身处在一个受硬件保护的级别。所有的应用程序都以进程的方式运行在比操作系统权限低的级别,每个进程有自己独立的地址空间,相互隔离。CPU由操作系统一分配,如果运行超过了一定时间,操作系统会停止该进程,将CPU资源分配给其他进程。如果分配的时间很短,就能快速地切换。目前几乎所有的操作系统都采用这种方式。
I/O设备
这里提一下文件系统,文件系统管理着硬盘中文件的存储方式。一个硬盘往往有多个盘面,盘面分两面,每面安装同心圆划分为若干磁道。每个磁道划分为多个扇区,每个扇区一般为512字节。但是我们可以想象,同心圆的周长不一样,如果每个磁道都拥有相同数量的扇区,那么越外面就越稀,这样浪费空间;如果数量不一样,计算起来又十分麻烦。现在的硬盘使用一种叫LBA的方式解决以上问题,即整个硬盘中所有的扇区从0开始编号,一直到最后一个扇区,这个扇区编号叫逻辑扇区号。
内存不够怎么办
早期的程序直接运行在物理内存上,除了物理内存的大小限制以外,还有以下三个问题:
- 地址空间不隔离:程序直接访问物理地址,所使用的内存空间不是相互隔离的,可以修改到其他程序的数据。
- 内存使用效率低:多个程序一起运行,内存不足的时候要不停的换入换出大量数据。
- 程序运行的地址不确定:程序每次装入运行时,都需要分配一块足够大的空闲区域,区域位置不确定,给程序编写造成了麻烦,这涉及到程序的重定位问题。
解决的思路是增加中间层。计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,这就是虚拟地址的由来与用处,通过虚拟地址映射到物理地址的过程,达到了空间隔离的效果。
线程
线程是程序执行流的最小单元,多线程可以避免程序的卡顿。
线程可以访问进程内存里的所有数据,甚至包括别的线程的堆栈(知道堆栈地址),它也有自己的私有存储空间:
- 栈(尽管可以被其他线程访问,一般还是认为是私有的)
- 线程局部存储(Thread Local Storage,TLS),容量很小。
- 寄存器,寄存器是执行流的基本数据,因此为线程私有。
锁
信号量:初始值为N的信号量允许N个线程并发访问,线程获取信号量后,N减一,释放N+1,如果信号量小于0,获取的线程线程进入等待状态,待其他线程释放后再唤醒。
互斥量:和二元信号量类似(N=1),不同的是,信号量可以被任意线程获取和释放,互斥量要求谁获取,谁释放。
临界区:与以上两种的区别在于,临界区的作用范围仅限于本进程,其他进程无法获取该锁。
读写锁:以上三种对于读取频繁,偶尔写入的情况比较低效,读写锁可以避免这个问题。读写锁有两种获取方式,共享和独占。自由锁可以被任意进程任意方式获取,并置为对应状态;共享锁能被任意进程以共享方式获取,但以独占方式的话,需要等待其他所有线程释放;独占锁组织任何线程获取。
过度优化
- 编译器为了提高速度,将变量缓存到寄存器而不写回。
- 编译器的动态调度,可能交换相邻指令的执行顺序。
- CPU的动态调度, 可能交换相邻指令的执行顺序。
1和2可以通过volatile关键字阻止过度优化,3不存在平台无关的指令,不同的CPU提供的指令名称不同。
网友评论