• 实验四 用信号量解决进程互斥与同步问题 生产者与消费者问题模拟


    实验四 用信号量解决进程互斥与同步问题
    生产者与消费者问题模拟
    姓名 黄淋生 专业 网络工程 学号 201306114112

    一、实验目的
    1. 掌握临界区的概念及临界区的设计原则;
    2. 掌握信号量的概念、PV操作的含义以及应用PV操作实现进程的同步与互斥;
    3. 分析进程争用资源的现象,学习解决进程互斥的方法。
    二、实验内容
    分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟。
    三、实验步骤
    1. 生产者--消费者问题表述:
    有一环形缓冲池,包含n个缓冲区(0~n-1)。
    有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品。
    所有进程必须对缓冲区进行互斥的访问。
    生产者不能向满缓冲区写数据,消费者不能从空缓冲区取数据,即生产者与消费者必须同步。
    计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。
    2. 定义生产者消费者问题中的各数据结构,并初始化。
    信号量,初值。
    3. 编写PV操作。
    4. 编写生产者与消费者程序,利用信号量及其PV操作,实现生产者与消费者之间的同步与互斥。
    5. 模拟显示生产者与消费者同步与互斥的效果。
    6. 选做:模拟显示读者写者问题的效果。
    四. 代码
    #include<stdio.h>
    #define N 100


    typedef struct process
    {
    int num;
    int time;
    int start;
    int end;
    int level;
    int freetime;
    char buff;
    }P;

    P a[N],b;
    void rank(int n)
    {
    int i=0,j,t=n,x;
    for(i=0;i<n;i++)
    {
    if(i==0&&a[i].freetime!=0)
    a[i].buff='R';
    else if(a[i].freetime==0)
    a[i].buff='F';
    else
    a[i].buff='r';
    }//给状态
    for(i=0;i<n;i++)
    {
    for(j=i+1;j<t;j++)
    {

    if(a[i].freetime==0)
    {

    a[i].level=-100;

    }


    if(a[i].level<a[j].level)
    {
    b=a[i];
    a[i]=a[j];
    a[j]=b;
    }

    }
    }

    }

    int decide()
    {
    if(a[0].freetime==0)
    return 1;
    else
    return 0;
    }


    void main()
    {
    int n,i,t,sum=0;
    printf("请输入进程个数n>0 ");
    scanf("%d",&n);
    for(i=0;i<n;i++){
    printf("请输入第%d个进程时间n>0 ",i+1);
    scanf("%d",&a[i].time);
    a[i].freetime=a[i].time;//剩余时间赋值
    a[i].num=i+1;
    a[i].start=a[i].end=0;
    printf("请输入第%d个进程优先级 >0 ",i+1);
    scanf("%d",&a[i].level);
    }//输入数据

    for(i=0;i<n;i++)
    {
    for(t=i+1;t<n;t++)
    {
    if(a[t].level>a[i].level)
    {
    b=a[i];
    a[i]=a[t];
    a[t]=b;
    }
    }
    }//排序

    for(i=0;i<n;i++)
    {
    if(i==0)
    a[i].buff='R';
    else
    a[i].buff='r';
    }//给状态
    getchar();//间断控制
    printf("初始进程状态为 ");
    for(i=0;i<n;i++)
    {
    if(i==0){
    printf("进程号,进程总时间,进程剩余时间,进程执行时间,优先级,进程状态 ");
    }
    printf("%3d,%8d,%10d,%10d,%13d,%8c ",a[i].num,a[i].time,a[i].freetime,a[i].start,a[i].level,a[i].buff);
    }
    //打印第一组数据
    printf("按回车键继续。。。 ");
    getchar();
    while(decide()==0)
    {
    a[0].freetime--;//时间计算以下都是
    a[0].start++;
    a[0].level--;
    rank(n);//调整进程优先级
    for(i=0;i<n;i++)
    {
    if(i==0){
    printf("进程号,进程总时间,进程剩余时间,进程执行时间,优先级,进程状态 ");
    }
    printf("%3d,%8d,%10d,%10d,%13d,%8c ",a[i].num,a[i].time,a[i].freetime,a[i].start,a[i].level,a[i].buff);
    }
    //打印第一组数据
    printf("按回车键继续。。。 ");
    getchar();//间断控制

    }

    }
    截图:
    五. 实验心得
    心得体会,实验过程的难点问题及其解决的方法。

      有时候上课走神,没听到,所以做起来有点困难。不是很会做  参考了下其他人的代码。

  • 相关阅读:
    Mac音频播放
    Mac开发
    CoreFoundation对象的内存管理
    蓝牙收发数据长度的问题
    Android音视频之AudioTrack播放音频(二)
    Android音视频之AudioRecord录音(一)
    wav格式文件、pcm数据
    自定义view 波浪效果
    git 常用命令
    markdown 基本语法
  • 原文地址:https://www.cnblogs.com/huanglinsheng/p/5587992.html
Copyright © 2020-2023  润新知