赞
踩
#include <stdio.h>
int main()
{
printf ( "Hello, world\n") ;
return 0;
}
linux> gcc -o hello hello.c
可以把操作系统看成是应用程序和硬件之间插入的一层软件。
操作系统的两个基本功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的的机制来控制复杂而又通常大不相同的低级硬件设备。主要通过进程、虚拟内存、文件来实现这两个功能。
文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。
1.7.1 进程
1.7.2 线程
1.7.3 虚拟内存
1.7.4 文件
1.9.1 Amdahl 定律
Amdahl 定律(也叫阿姆达尔定律)的主要思想是:当我们对系统的某个部分加速时,
其对系统整体性能的影响取决于该部分的重要性和加速程度。
1.9.2 并发和并行
使用线程可以在一个进程中执行多个控制流。
当构建一个由单操作系统内核控制的多处理器组成的系统时,我们就得到了一个多处理器系统
多核处理器将多个CPU(核)集成到一个电路芯片上。
超线程也称为同时多线程,是一项允许一个CPU执行多个控制流的技术。
1.9.3 计算机系统中抽象的重要性
斜体的数字表示移位填充的值
例如:
原理:无符号数编码的唯一性
函数B2Uw是一个双射。即,反过来,我们称其为U2Bw(无符号数到二进制)。
V = (-1)s x M x 2e
这个表达式,涉及三个变量:符号s、阶码E和尾数M。
采用移码表示阶码E ,将浮点数的指数真值e变成阶码E时,
应将指数e加上一个固定的偏移值127(01111111),即
E=e+127。
一个规格化的32位浮点数x的真值表示为
x=(-1)S×(1.M)×2E-127
e=E-127
规格化的64位浮点数x的真值为:
x=(-1)s×(1.M)×2E-1023
e=E-1023
IEEE754标准(规定了浮点数的表示格式,运算规则等)
规则规定了单精度(32)和双精度(64)的基本格式。
规则中,尾数用原码,指数用移码(便于对阶和比较)
例题:
格式化的值
当表示规格化的值时,其中阶码字段的取值范围如图所示。
非规格化的值
当阶码字段的二进制位全为0时,所表示的是非规格化的值,关于非规格化的数有两个用途:
一是提供了表示数值0的方法,当符号位s等于0,阶码字段全为0,小数字段也全为0时,此时表示正零。当符号位s等于1,阶码字段全为0,小数字段也全为0时,此时表示负零。根据IEEE的浮点规则,正零和负零在某些方面被认为不同,而其他方面是相同的。
特殊值
最后一类数值是当指阶码全为1的时候出现的。当小数域全为0时,得到的值表达无穷,当s=0时是+∞,当s=1时是-∞。
linux> gcc -Og -o p p1.c p2.c
linux> gcc -Og -S mstore.c
linux> gcc -Og -c mstore.c
linux> objdump -d mstore.o
linux> gcc -Og -S mstore.c
linux> gdb prog
4.5.1 SEQ+:重新安排计算阶段
4.5.2 插入流水线寄存器
4.5.3 对信号进行重新排列和标号
4.5.4 预测下一个PC
4.5.5 流水线冒险
4.5.6 异常处理
4.5.7 PIPE各阶段的实现
4.5.8 流水线控制逻辑
4.5.9 性能分析
4.5.10 未完成的工作
我们可以看到,除了整数加法的情况,这些测量值与处理器的延迟界限是一样的。这不是巧合——它表明这些函数的性能是由所执行的求和或者乘积计算主宰的。计算n个元素的乘积或者和需要大约L·n+K个时钟周期,这里L是合并运算的延迟,而K表示调用函数和初始化以及终止循环的开销。因此CPE就等于延迟界限L。
1.从机器级代码到数据流图
2.其他性能因素
一个良好的计算机程序常常具有良好的局部性(locality)。
程序访问的局部性原理指的是:内存中某个地址被访问后,短时间内还有可能继续访问这块地址。内存中的某个地址被访问后,它相邻的内存单元被访问的概率也很大。
程序访问的局部性包含两种:
+ 时间局部性:某个内存单元在较短时间内很可能被再次访问
+ 空间局部性:某个内存单元被访问后相邻的内存单元较短时间内很可能被访问
由于CPU和主存之间逐渐增大的差距,系统设计者被迫在CPU寄存器文件和主存之间插入了一个小的SRAM高速缓存存储器,称为L1高速缓存(一级缓存),如图6-24所示。L1高速缓存的访问速度几乎和寄存器一样快,典型地是大约4个时钟周期。
随着CPU和主存之间的性能差距不断增大,系统设计者在L1高速缓存和主存之间又插人了一个更大的高速缓存,称为L2高速缓存,可以在大约10个时钟周期内访问到它。有些现代系统还包括有一个更大的高速缓存,称为L3高速缓存,在存储器层次结构中,它位于L2高速缓存和主存之间,可以在大约50个周期内访问到它。
1)让最常见的情况运行得快。程序通常把大部分时间都花在少量的核心函数上,而这些函数通常把大部分时间都花在了少量循环上。所以要把注意力集中在核心函数里的循环上,而忽略其他部分。
2)尽量减小每个循环内部的缓存不命中数量。在其他条件(例如加载和存储的总次数)相同的情况下,不命中率较低的循环运行得更快。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。