早期的计算机CPU和内存访问速度一致,而其他外设访问速度过慢,因此都需要一个相应的I/O控制器。后来CPU的频率提高了,CPU改使用倍频的方式与系统总线进行通信。后来随着图形芯片需要跟CPU和内存之间大量交换数据,设计了专门的北桥芯片。低速设备连接南桥芯片,再汇总连接到北桥。
硬件接口称为硬件规格。开发工具与应用程序是属于同一个层次的。
当我们要读一个文件时,应用程序发出读的命令,操作系统接收到之后传递给磁盘驱动程序,磁盘驱动程序再向磁盘发出硬件指令,读到数据。
将程序给出的地址看作是一种虚拟地址,通过MMU(硬件单元)完成映射得到物理地址,解决了地址空间不隔离的问题以及程序运行的地址不确定的问题。
物理内存有效利用的有多少取决于地址总线的个数。
同一个进程中的线程是可以访问其他线程的栈的,如果它知道其他线程的栈地址的话(但一般语言层面上不允许这样)
fork产生一个新的进程,使用的是写时复制,所以速度很快。clone可以在实际效果上产生一个新的线程(共享当前进程的内存空间和文件),是一个内核线程。
线程间的同步:原子操作,信号量,互斥量,临界区(区别在于他的作用范围仅限于本进程),读写锁,条件变量。
过度优化问题:即使成功正确上了锁,也有可能出现问题。因为编译器和CPU都会打乱指令的执行顺序,且为了提高变量的访问速度,有可能将变量放于寄存器中并未及时写回内存。
多对一线程模型:线程之间的切换由用户态的代码来进行,所以实际上只有一个内核线程。(个人理解,表面上的多线程实际是由代码库来负责切换线程)