×
操作系统教程操作系统的定义和功能操作系统的类型

进程管理

与进程有关的时间操作系统CPU调度操作系统调度算法操作系统FCFS调度操作系统FCFS护航效果操作系统FCFS与开销操作系统最短作业优先(SJF)调度预测SJF进程的CPU突发时间最短剩余时间优先(SRTF)调度算法循环调度算法循环调度算法示例最高响应比下(HRRN)调度最高响应比下(HRRN)调度示例优先级调度非抢占式优先级调度抢先式优先级调度

同步

进程同步简介临界区问题锁定变量机制测试集锁定机制优先级反转开启可变或严格的交替方式感兴趣变量机制帕特森(Peterson)解决方案同步机制无需等待睡眠和唤醒信号量介绍计算信号量的问题计算信号量的问题二进制信号量或互斥量

死锁

死锁简介处理死锁的策略死锁预防避免死锁避免死锁使用RAG进行死锁检测死锁检测和恢复

内存管理

内存管理简介固定分区动态分区压缩(碎片整理)用于动态分区的位图链表动态分区分区算法分页技术分页技术实例二进制地址基础知识物理和逻辑地址空间页表从页表映射到主内存页表项查找最佳页面大小虚拟内存后备缓冲器按需分页转换页表页面替换算法Belady异常分段分页与分段比较分段的分页

文件管理

文件的属性文件上的操作文件访问方法目录结构一级目录两级目录树型结构目录非循环图结构化目录文件系统文件系统结构主引导记录(MBR)磁盘中的数据结构内存中的数据结构目录实现目录实现连续分配链表分配文件分配表索引分配链接索引分配索引节点空闲空间管理磁盘调度

睡眠和唤醒


下面我们来看看睡眠和醒来的基本模型。假设有两个系统调用作为睡眠和唤醒。呼叫睡眠的过程将被阻止,而调用的过程将被唤醒。

有一个叫做生产者消费者问题的流行例子,它是模拟睡眠和唤醒机制的最流行的问题。

睡眠和觉醒的概念非常简单。如果关键部分不是空的,那么该过程将进入休眠状态。它将被临界区内正在执行的其他进程唤醒,以便进程可以进入临界区。

在生产者消费者问题中,让我们说有两个过程,一个过程写某事,而另一个过程读取。正在写东西的过程称为生产者,而正在阅读的过程称为消费者。

为了读取和写入,它们都使用缓冲区。下面显示了为生产者消费者问题提供解决方案的模拟睡眠和唤醒机制的代码。

#define N 100 //maximum slots in buffer   
#define count=0 //items in the buffer   
void producer (void)   
{   
    int item;   
    while(True)  
    {  
        item = produce_item(); //producer produces an item   
        if(count == N) //if the buffer is full then the producer will sleep  
            Sleep();   
        insert_item (item); //the item is inserted into buffer  
        countcount=count+1;   
        if(count==1) //The producer will wake up the   
        //consumer if there is at least 1 item in the buffer   
        wake-up(consumer);  
    }  
}  

void consumer (void)  
{  
    int item;   
    while(True)  
    {  
        {     
            if(count == 0) //The consumer will sleep if the buffer is empty.   
            sleep();   
            item = remove_item();   
            countcount = count - 1;   
            if(count == N-1) //if there is at least one slot available in the buffer   
            //then the consumer will wake up producer  
            wake-up(producer);   
            consume_item(item); //the item is read by consumer.   
        }  
    }  
}

生产者生产该项目并将其插入缓冲区。每次插入时全局变量计数的值都会增加。如果缓冲区被完全填满并且没有插槽可用,那么生产者将会休眠,否则它将继续插入。

在消费者方面,每次消费时,计数值都降低了1。如果缓冲区在任何时间点都是空的,那么消费者就会进入休眠状态,它会持续消耗这些物品并将计数值减1。

如果缓冲区中至少有1个物品可用,消费者将被生产者唤醒。如果缓冲区中至少有一个可用槽位,生产者将被消费者唤醒,以便生产者可以写入。

那么,这个问题就出现在消费者即将休眠之前被抢占的情况下。现在消费者既不休眠也不消费。由于生产者没有意识到消费者实际上并不在休眠的事实,因此它不断地唤醒消费者,而消费者因为没有休眠就会响应。

这导致了系统调用的浪费。当消费者重新安排时间时,它会因为即将被抢占而休眠。

生产者不停地写入缓冲区,并在一段时间后得到填充。 生产者也会在那个时候休眠,记住当缓冲区中有一个插槽时,消费者会唤醒他。

消费者也在休眠,并且不知道生产者会把他叫醒。

这是一种僵局,无论生产者还是消费者都活跃起来,彼此等待唤醒他们。 这是一个需要解决的严重问题。

使用标志位来消除问题

标志位可以用来消除这个问题。 生产者可以在第一次唤醒时设置该位。 当消费者安排时,它会检查这个标志位。

消费者现在会知道生产者试图唤醒他,因此它不会休眠并进入准备好的状态,以消费生产者产生的任何东西。

这种解决方案仅适用于一对生产者和消费者,如果有n个生产者和n个消费者,该怎么办? 在那种情况下,需要保持一个整数,该整数可以记录多少次唤醒呼叫以及有多少消费者不需要睡眠。 这个整数变量被称为信号量。 稍后我们将详细讨论关于信号量的更多信息。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)