计算机系统原理

第1章 计算机系统漫游
1.1 信息就是位+上下文
  • 源程序就是一个由0和1组成的位(又称为比特)序列,8个位被组织成一组,称为字节,每个字节表示程序中的某些文本字符
#include <stdio.h>
int main(){
    printf("Hello,World\n");
    return 0;
}
  • gcc main.c -> a.out -> ./a.out -> Hello,World
  • 充分利用高速缓存,高速缓存具有局部性原理
  • 存储器层次,左->右越来越快贵大;寄存器 -> L1高速缓存(SRAM) -> L2高速缓存(SRAM) -> L3 -> 主存(DRAM) -> 本地二级存储(本地磁盘) -> 远程二级存储(分布式文件系统,Web服务器)
  • 操作系统内核是应用程序和硬件之间的媒介,它提供了三个基本抽象:1,文件时对I/O设备的抽象,2,虚拟内存时对主存和磁盘的抽象,3,进程时处理器,主存和I/O的抽象
  • Amdahl定律:当我们对系统的某个部分加速时,其对系统整体性能的影响取决于改部分的重要性和加速程度 S=1/((1-a)+a/k))

第2章 信息的表示和处理

TODO
  • 某些机器选择在内存中按照从最低到最高有效字节的顺序存储对象,这种称之为“小端法”,反之为大端法。不同的操作系统底层的芯片时不一样的。 比如整数:0x01234567 ,小端: ‘.. 67 45 23 01 …’ 大端: ‘.. 01 23 45 67 ..’
  • 异或操作两个元素交换时, 注意First <= Last 是错误的,数据长度为偶数时正常,为奇数时,则First和Last都比较到中间值时异或的结果为0了,正确的是 First < Last 。
  • 注意位运算与逻辑运算的区别,逻辑运算是:ture或false 对应的操作是 && || 注意与位运算的区别,注意在做右移位操作时,逻辑移位是左边补0,而算数逻辑是补最高位相同的值,比如: 0xC3, 1100 0011  » 2 逻辑右移结果: 0011 0000 而算数右移结果: 1111 0000, 几乎所有的编译器对有符号数都是使用算术右移。在Java中,» 表示算术右移,而 »> 表示逻辑右移。
  • Java没有无符号数据类型,都是采用补码形式的数据。可以进行转化,比如 一个byte x x = x & 0x0FF 就转化为无符号数了。不过需要注意范围,可能出错, 比如 1000 0100 表示 -124 而转为无符号时,变成 132这就出错了。就是说1000 0100 即是无符号132的表示也是有符号 -124的表示。规律: 132+124-1=255
  • TODO p67乘法

程序的机器级表示