王道408---OS---试卷问题

发布时间 2023-09-13 17:03:57作者: TLSN

一、系统的页表项一般包括

⻚号(隐含,实际不会占⽤存储空间)
⻚框号(⽤于描述逻辑⻚⾯在物理内存中的位置)
脏位(⽤于描述该⻚⾯的数据是否被修改过)
有效位
外存地址(⽤于描述该⻚⾯在外存中的存放地址)
置换算法相关的信息(不同的置换算法,需要记录的信息不同。如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)
    }
}

// 读进程拿到写进程的令牌后,会限制写进程等待所有读进程运行完后再运行
// 写进程拿到读进程令牌后,会限制读进程的进入,并且一直维持到写进程队列的进程都运行完毕后才释放令牌