“hello world”引发的思考:
1.程序为什么编译后才能运行?
2.编译过程?
3.编译出来的可执行文件是什么?怎么存放,组织的
4.C语言库是什么?
硬件主要:CPU 内存 I/O控制芯片(慢速的I/O设备和快速CPU实现交互)
CPU主频 目前最高4GHZ 受限于制造工艺
计算机体系:计算机科学领域任何问题都可以通过增加一个间接的中间层解决
系统调用接口通常通过中断实现
操作系统:尽可能压榨计算机硬件潜力
1.CPU 多任务系统
2.设备驱动 硬件驱动可看成操作系统一部分,和内核一起运行在特权级,但之间又有一定独立性
3.内存不够 直接运行在物理内存(地址空间不隔离 内存使用率低 程序每次重新运行的地址不确定)
虚拟内存 : 例如32位 2^32 = 4G 所以每个进程都有4G空间
通过分段,把需要用到的虚拟内存等价映射到物理空间,解决了空间不隔离和每次运行地址不确定
分页 分4kb页大小 常用的放在内存 不常用的放到磁盘 通过MMU实现页映射
线程 线程ID + 当前指令指针(PC)+ 寄存器集合 + 堆栈
LINUX 线程就是进程 都属于任务范畴 每个任务类似单线程的进程
fork + exec 产生新任务 单fork属于写时复制
clone 产生新的线程
线程安全
原子操作: 单条指令不会被打断 操作方便 但只适用简单场合
同步与锁: 二元信号量、互斥量(同二元信号量)、临界区(限定部分线程) 、读写锁(更特定场合 可以多个读 )
多线程和内核线程
一对一 多对一 多对多 (基本用这个)