前面已经说过,将程序存储在内存中分为三步:
- 在编译阶段将一个完整的程序分为好几段;
- 在内存中找到空闲的空间来存储这些程序段;
- 将每个程序段存储在找到的空闲内存中,并将基地址存储在进程控制块 PCB 的 LDT 表中。
这一章节就要详细描述第二步。
L20-内存使用与分段
- 内存的使用仍要从计算机如何工作开始讲起。根据冯 · 诺依曼的理论,在计算机中,程序和数据是以同等的地位存储在存储器中的,计算机工作就是不断地“从内存中取出指令 - CPU分析指令 - CPU执行指令”的过程,由此,内存就被使用了起来。
L19-死锁处理
- 仍以生产者-消费者为例来讲述死锁问题:如果把生产者进程的
P(empty)
和P(mutex)
对调、消费者进程的P(full)
和P(mutex)
对调,就会产生死锁问题。
L18-信号量的代码实现
- 由于 linux-0.11 使用的是单核 CPU,所以我们可以利用关中断法来对信号量临界区进行保护,信号量的代码实现如下
L17-信号量临界区保护
- 靠临界区保护信号量(保护信号量的修改处,如前面的 P(semaphore s)、V(semaphore s) ),靠信号量实现进程之间的同步。