交换处理

交换处理: 内存容量不足以容纳整个程序的代码和数据。所以需要定期进行交换处理。
sched(); //用来定期寻找交换处理对象的进程,也被称为swapper
sched() 从proc[]中寻找满足以下条件的进程作为交换处理的对象。

  • 位于交换空间最长
  • 位于可执行状态

如果换入时内存不足,需要找满足一下条件的进程换出

  • 位于内存中
  • 处于SWAIT or SSTOP状态
    如果没有满足,则放宽条件
  • 滞留内存时间最长
  • 处于SRUN 或 SSLEEP状态
    (但是要满足以下条件。)
  • 换入对象位于交换空间的时间大于或等于3秒
  • 换入对象位于内存的时间大于或等于2秒

mess:
spl6() //将处理器优先级设置为6,防止发生中断。

代码段,用text结构体表示

1
2
3
4
5
6
7
8
struct text {
int x_daddr; //交换磁盘的地址
int x_caddr; //读入内存时物理内存地址
int x_size; //代码段的长度
int *x_iptr; //指向inode[]中对应程序执行文件的元素
char x_count; //所有进程为对象的参照计数器
char x_ccount; //以内存中的进程为对象的参照计数器
} text[NTEXT];

代码段在内存中只读,如果某个程序有多个进程,共享代码段。当内存中没有进程用代码段了,内存自动释放, 交换空间和内存没有进程使用代码段,代码段在交换空间中释放。