交换处理: 内存容量不足以容纳整个程序的代码和数据。所以需要定期进行交换处理。
sched(); //用来定期寻找交换处理对象的进程,也被称为swapper
sched() 从proc[]中寻找满足以下条件的进程作为交换处理的对象。
- 位于交换空间最长
- 位于可执行状态
如果换入时内存不足,需要找满足一下条件的进程换出
- 位于内存中
- 处于SWAIT or SSTOP状态
如果没有满足,则放宽条件 - 滞留内存时间最长
- 处于SRUN 或 SSLEEP状态
(但是要满足以下条件。) - 换入对象位于交换空间的时间大于或等于3秒
- 换入对象位于内存的时间大于或等于2秒
mess:
spl6() //将处理器优先级设置为6,防止发生中断。
代码段,用text结构体表示12345678struct text { int x_daddr; //交换磁盘的地址 int x_caddr; //读入内存时物理内存地址 int x_size; //代码段的长度 int *x_iptr; //指向inode[]中对应程序执行文件的元素 char x_count; //所有进程为对象的参照计数器 char x_ccount; //以内存中的进程为对象的参照计数器} text[NTEXT];
代码段在内存中只读,如果某个程序有多个进程,共享代码段。当内存中没有进程用代码段了,内存自动释放, 交换空间和内存没有进程使用代码段,代码段在交换空间中释放。