• 操作系统【OS】Ch2 大题 PV题型分类


    • 生产者-消费者问题:生产资源-消费资源
    • 理发师问题:服务-被服务
    • 读者-写者问题:同类进程不互斥、异类进程互斥
    • 哲学家进餐问题:只有一类进程,每个进程需要同时拥有多种资源才能运行
    • 单纯的同步问题:前驱后继图

    生产者-消费者问题

    • 有几类进程?
      • 每类进程对应一个函数
    • 在每个函数内部,用中文描述进程动作
      • 只做一次:不加whlie
      • 不断重复:加while(1)
    • 分析每一动作之前是否需要p什么?
      • ⚠️隐含的互斥(eg 缓冲区的访问,需要加:P(mutex))
    • 只要有P必定有V,每写一个P,就要安排V
    • 所有PV写完之后,再去定义信号量(semaphore)
    • 定义完之后思考每个信号量的初值是多少
    • 检查多个P连续出现的地方是否可能产生死锁
      • ⚠️可以尝试调整P顺序
      • 若某个信号量PV操作总连续出现,中间没有夹其他P,则不可能因信号量产生死锁
    • 读题检查,是否满足题目要求

    哲学家进餐问题

    无脑让进程一口气取得所有的资源,再开始运行

    - 定义大锁:`Semophore Lock = 1; //互斥信号量`

    - 定义资源数:

    ```

    //eg:有a、b、c三类资源,分别有9个、8个、5个,则:

    int a = 9; // 表示a的剩余数量

    int b = 8; // 表示b的剩余数量

    int c = 5; // 表示c的剩余数量

    ```

     

    - 代码模版:

    ```

    Process(){

        while(1){

            P(Lock);

            if(所有资源都够){

                所有资源的int值减少; //题目回告知每类资源需要多少个。

                取xxx资源; //一口气拿走所有的资源。

                V(Lock); //拿完资源解锁

                break; //跳出while循环

            }

            V(Lock); //资源不够,解锁,再循环尝试一次

        }

        做进程该做的事情(例如:哲学家干饭)// 用中文说明即可。

        P(Lock);

        归还所有资源,所有资源的int值增加。

        V(Lock);

    }

    ```

    读者-写者问题

    题目没有要求避免饥饿的话,用最简单的方法(读优先)可以得满分

    - 读者优先:

    ```

    semaphore lock = 1; // 用于实现对共享文件的互斥访问

    int count = 0; //记录当前有几个读进程在访问文件

    semaphore mutex = 1; //用于保证对count变量的互斥访问

     

    writer(){

        while(1){

            P(lock); // 写之前上锁

            write;

            V(lock); // 写完了解锁

        }

    }

     

    reader(){

        while(1){

            P(mutex); //各个进程互斥访问count

            if(count == 0) P(lock); //第一个读者,读之前帮他的兄弟们上锁

            count ++; //访问文件的读进程数+1

            V(mutex);

           

            read;

           

            P(mutex); //各个进程互斥访问count

            count—-; //访问文件的读进程数-1

            if(count == 0) V(lock); //最后一个读进程负责解锁

            V(mutex);

        }

    }

    ```

  • 相关阅读:
    迭代加深算法题目
    如何在搜索引擎中应用AI大语言模型,提高企业生产力?
    眼见不为“实”,人们更信任人工智能合成的假脸
    外国电影字幕翻译,怎么把英文字幕翻译成中文字幕?
    VS 调试Hololens 2工程报错 有未经处理的异常: Microsoft C++ 异常:
    236. 二叉树的最近公共祖先
    C++ Qt开发:字符串QString容器
    Java使用pdfbox将pdf转图片
    BootStrap日历插件
    怎样设计产品的兼容性测试更好?
  • 原文地址:https://blog.csdn.net/weixin_42932602/article/details/134000789