王道408---OS---试卷问题
一、系统的页表项一般包括
⻚号(隐含,实际不会占⽤存储空间)
⻚框号(⽤于描述逻辑⻚⾯在物理内存中的位置)
脏位(⽤于描述该⻚⾯的数据是否被修改过)
有效位
外存地址(⽤于描述该⻚⾯在外存中的存放地址)
置换算法相关的信息(不同的置换算法,需要记录的信息不同。如FIFO算法需要记录⻚⾯调⼊内存的时间,LRU算法需要记录⻚⾯最近⼀次被访问的时间
二、当前目录的概念
课本P255
linux用户设置某目录(如:"tlsn//A//B")为"当前目录",则B目录会被读取并常驻内存
三、页面置换时的脏位
页面置换时也要注意到脏位需写回磁盘,与cache相似
若页面在使用过程中没有被修改,就不用写回磁盘 ,反之,需要写回磁盘
四、读者写者问题
分三种情况
读优先
semaphore write=1; //互斥信号量,⽤于给写者“上锁”
semaphore rmutex=1; //互斥信号量,实现对readCount的互斥访问
int readCount=0;//读者的数量
void reader(){
while(1){
p(rmutex)
if(readCount == 0){
p(write)
}
readCount++;
v(rmutex)
read ...
p(rmutex)
readCount--
if(readCount == 0){
v(write)
}
v(rmutex)
}
}
void writer(){
while(1){
p(write)
writing ...
v(write)
}
}
读写公平
semaphore write=1; //互斥信号量,⽤于给写者“上锁”
semaphore rmutex=1; //互斥信号量,实现对readCount的互斥访问
semaphore piror=1; // 全局优先锁
int readCount=0;//读者的数量
void reader(){
while(1){
p(piror) //读进程拿到全局优先锁
p(rmutex)
if(readCount == 0){
p(write)
}
readCount++;
v(rmutex)
v(piror) // 释放
read ...
p(rmutex)
readCount--
if(readCount == 0){
v(write)
}
v(rmutex)
}
}
void writer(){
while(1){
p(piror)
p(write)
writing ...
v(write)
v(piror)
}
}
写优先
semaphore limit_reads=1; //互斥信号量,⽤于给读者“上锁”
semaphore writes=1; //互斥信号量,⽤于给写者“上锁”
semaphore rmutex=1; //互斥信号量,实现对readCount的互斥访问
semaphore wmutex=1; //互斥信号量,实现对writeCount的互斥访问
int readCount=0, writeCount=0; //读者、写者的数量
void reader(){
while(1){
p(limit_reads)
p(rmutex)
if(readCount == 0){
p(writes)
}
readCount++
v(rmutex)
v(limit_reads)
reading ...
p(rmutex)
readCount--
if(readCount == 0){
v(writes)
}
v(rmutex)
}
}
void writer(){
while(1){
p(wmutex)
if(writeCount == 0){
p(limit_reads)
}
writerCount++
v(wmutex)
p(writes)
writing ...
v(writes)
p(wmutex)
writeCount--
if(writeCount == 0){
v(limit_reads)
}
v(wmutex)
}
}
// 读进程拿到写进程的令牌后,会限制写进程等待所有读进程运行完后再运行
// 写进程拿到读进程令牌后,会限制读进程的进入,并且一直维持到写进程队列的进程都运行完毕后才释放令牌