读书笔记
2018-03-27 本文已影响6人
李相赫的乐芙兰
进程有自己的地址空间,包括文本区域:存储代码
数据区域:存储变量和动态分配的内存
堆栈区域:存储调用的指令和本地变量
无论如何分配内存,也无论分配在堆上还是栈上,很明显,它都是属于进程的,当程序退出的时候,进程都不在了,进程的所有资源操作系统都会回收
cpu,内存,I/O的基本结构沿用至今,变化的是处理速度(频率),同时为了解决不同频率的设备之间数据通信问题,硬件结构也需要改变,比如从总线到北桥,再加入南桥
cpu的物理极限4Ghz
信号量,互斥量,临界区可以保证程序正确,但对于读取频繁而写入较少的情况,会很低效。读写锁有两种获取方式:共享的或独占的。当锁处于自由状态时,试图以任何一种方式获取都会成功,并将锁置于对应状态。当锁处于共享态,其他线程可以以共享方式获取,以独占方式需要等待变为自由态。当锁处于独占态,以任何方式获取都需要等待。
编译器过度优化:
将一个变量缓存到寄存器内,而不同线程的寄存器是独立的
可能会交换一些好不相干的指令,单无法确认不同线程见这些指令是否相干
cpu过度优化:在执行程序时为了提高效率而交换指令的顺序
c++里的new包含两个步骤
(1)分配内存
(2)调用构造函数
所以ptr = new T包含了三个步骤:
(1)分配内存
(2)在内存的位置上调用构造函数
(3)将内存地址复制给ptr
而cup可能调换(2)(3)的执行顺序
