• 领导讲话
  • 自我介绍
  • 党会党课
  • 文秘知识
  • 转正申请
  • 问题清单
  • 动员大会
  • 年终总结
  • 工作总结
  • 思想汇报
  • 实践报告
  • 工作汇报
  • 心得体会
  • 研讨交流
  • 述职报告
  • 工作方案
  • 政府报告
  • 调研报告
  • 自查报告
  • 实验报告
  • 计划规划
  • 申报材料
  • 当前位置: 勤学考试网 > 公文文档 > 工作汇报 > 正文

    操作系统实验报告经典生产者—消费者问题x

    时间:2020-10-13 12:44:35 来源:勤学考试网 本文已影响 勤学考试网手机站

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    实验二 经典的生产者一消费者问题

    一、 目的

    实现对经典的生产者一消费者问题的模拟,以便更好的理解经典进程同步问题。

    二、 实验内容及要求

    编制生产者一消费者算法,模拟一个生产者、一个消费者,共享一个缓冲池的情形。

    1、 实现对经典的生产者一消费者问题的模拟,以便更好的理解此经典进程同步问题。生产者一消 费者问题是典型的 PV操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满 就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。缓冲 池被占用时,任何进程都不能访问。

    2、 每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。在这 种情况下,生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。他们 之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进行。

    三、 生产者和消费者原理分析

    在同一个进程地址空间内执行两个线程。 生产者线程生产物品, 然后将物品放置在一个空缓冲区中

    供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如 果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。当消费者线程消费物品 时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来。

    四、 生产者与消费者功能描述:

    生产者功能描述:在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放 置在一个空缓冲区中供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产 者线程必须等待消费者线程释放出一个空缓冲区。

    v1.0可编辑可修改

    v1.0可编辑可修改

    消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时, 如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

    五、 实验环境

    操作系统环境: Win dows系统。

    编程语言:C#o

    六、 生产者与消费者的思路和设计

    1、程序流程图

    (1)生产者

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    (2)消费者

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    2、主要程序代码

    //初始化变量

    private void Form1_Load(object sen der. Even tArgs e)

    {

    mutex =

    :1; //

    互斥信号量

    full = 0;

    //

    缓冲池中满缓冲区的数量

    empty =

    :5;//

    缓冲池中空缓冲区的数量

    countl

    =0;//

    生产的产品数目

    i = 0;

    "0";

    "5"

    }

    //消费者从缓冲区中消费一个产品 private void con sumer_Click(object sen der, Even tArgs e)

    {

    if (full > 0){ //

    if (full > 0)

    { //

    if (mutex == 1) //

    {

    mutex = 0; //

    消费者已进入互斥临界区

    申请进入临界区

    消费者已进入互斥临界区

    =true;// 启动消费者消费缓冲区产品

    else

    ("缓冲区被占用,请等待。。。信息提

    ("

    缓冲区被占用,请等待。。。

    信息提”;

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    }

    }

    else

    {

    (” 缓冲区为空,不能消费!","信息提示",;

    }

    }

    //生产者向缓冲区中存入一个产品

    private void producer_Click(object sen der, Even tArgs e)

    {

    coun t1 = coun t1 + 1;

    // 生产一个产品

    if (empty > 0)

    {

    //

    有缓冲区可放产品

    if (mutex == 1)

    {

    //

    申请进入临界区

    mutex = 0;

    //

    生丿者已进入临界区

    ="0";

    ();

    //

    启动生产者将产品放入缓冲区

    }

    else

    { // 不能进入临界区

    count1 = count1 - 1;

    (" 缓冲区被占用,请等待。。。 ","信息提示",;

    }

    }

    else

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    (” 缓冲区已满!","信息提示",;// 无缓冲区可放产品

    countl = countl - 1;

    }

    }

    //生产者

    private void timer1_Tick_1(object sen der. Even tArgs e)

    {

    if (bool1)

    {

    switch (co un t1)

    {

    case 1:

    =true; break;

    case 2:

    =true; break;

    case 3:

    =true; break;

    case 4:

    =true; break;

    case 5:

    =true; break;

    }

    —n

    生产者进程占用缓冲区,请等待。。。。 ";

    bool1 = false;

    }

    else

    {

    switch (co un t1)

    {

    case 1:

    =false; break;

    case 2:

    =false; break;

    case 3:

    =false; break;

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    case 4: = false; break;

    case 5: = false; break;

    }

    =" 生产者进程占用缓冲区,请等待。。。。

    booll = true;

    }

    i = i + 1;

    if (i == 5)

    { // 循环缓冲区,首尾相接

    i = 0;

    =false;

    mutex = 1;

    —ll/f II.

    switch (co un ⑴

    {

    case 1:

    =true; break;

    case 2:

    =true; break;

    case 3:

    =true; break;

    case 4:

    =true; break;

    case 5:

    =true; break;

    }

    full = full + 1;

    =();

    empty = empty - 1;

    =();

    =" 生产结束!";

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    }

    //消费者

    private void timer_c on sumer_Tick(object sen der. Even tArgs e)

    {

    if(bool1){

    switch(cou nt1){

    case 1:

    =true; break;

    case 2:

    =true; break;

    case 3:

    =true; break;

    case 4:

    =true; break;

    case 5:

    =true; break;

    }

    =" 消费者进程占用缓冲区,请等待。。。。

    bool1 =false;

    }

    else{

    switch(co un t1){

    case 1:

    =false; break;

    case 2:

    =false; break;

    case 3:

    =false; break;

    case 4:

    =false; break;

    case 5:

    =false; break;

    }

    =" 消费者进程占用缓冲区,请等待。。。。

    bool仁 true;

    }

    i = i + 1;

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    if(i==5){

    i = 0;

    =false;

    mutex = 1;

    ="i";

    switch(co un t1){

    case 1:

    =false; break;

    case 2:

    =false; break;

    case 3:

    =false; break;

    case 4:

    =false; break;

    case 5:

    =false; break;

    }

    count1 = count1 - 1; full = full - 1;

    =();

    empty = empty+1;

    =();

    ="消费结束!

    }

    3、运行界面和运行结果

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    一般情况下,点一次生产者按纽, mutex由1变为0,缓冲区呈现闪烁状态(表示正在存储),此时

    不可以再进行缓冲区操作,否则将显示“生产者进程正在占用缓冲区,请等待” 。闪烁约秒后,mutex

    由0变为1,闪烁停止,表示存储过程结束;点一次消费者按纽, mutex由1变为0,缓冲区呈现闪烁状

    态(表示正在消费),此时不可以再进行缓冲区操作,否则将显示“消费者进程正在占用缓冲区,请等

    待”。闪烁约秒后,mutex由0变为1,闪烁停止,表示消费过程结束。

    缓冲池满后,若再点生产者按纽,会给出信息提示: “缓冲区已满!”。

    缓冲池空后,若再点消费者按纽,也会给出信息提示: “缓冲区为空,不能消费! ”。

    在存储状态或消费状态(闪烁状态) ,无论是点生产者按纽还是消费者按纽都会给出“缓冲区被占 用,请等待。。”信息提示。

    七、心得体会

    本次实验是关于生产者与消费者之间互斥和同步的问题。问题的是指是 P、V操作,实验设一个共

    享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线 程释放缓冲区为止。

    v1.0可编辑可修改

    v1.0可编辑可修改

    PAGE

    PAGE #

    生产者与消费者是一个与现实有关的经验问题,通过此原理举一反三可以解决其他类似的问题。

    通过本实验设计,我们对操作系统的 P、V进一步的认识,深入的了解 P、V操作的实质和其重要

    性。课本的理论知识进一步阐述了现实中的实际问题。

    实验中,我们小组分工合作,共同学习,虽然在实验中遇到了一些问题,但在老师和同学的细心 指导和热心帮助下解决了。 同时,了解到团队精神的重要性, 也为以后的学习和工作打下了坚实的基础,

    同时积累了宝贵的经验。

    • 考试时间
    • 范文大全
    • 作文大全
    • 课程
    • 试题
    • 招聘
    • 文档大全

    推荐访问