操作系统 一篇搞懂【进程与通信】大题 全文8000字------期末复习

本文详细介绍了进程的概念、进程调度、进程互斥与同步,重点讲解了信号量机制,包括整型信号量和记录型信号量的实现。通过实例展示了如何使用信号量解决生产者-消费者问题,并探讨了进程同步的重要性。此外,还提供了并发执行的代码示例,如抽烟者问题和数据读写同步问题。
摘要由CSDN通过智能技术生成

适合人群:
1.基本上理解主要概念:进程定义,进程调度定义。、
2.理解 进程互斥同步
3.有一些编程经验。
2.期末复习人群。
简单来说就是 没搞懂, 属于一瓶子不满的人。

信号机制

目的:

含义※

其实是一个变量,用一个信号量表示某种资源的数量

  比如:
  1.系统中有一个的打印机,可以设置 初值为 1 的信号量。
  2.系统中有二个 写入的进程,可以设置 初值为 2的信号量。

原语

含义:是一中特殊的程序段,其执行只能一气呵成,不可被中断。

wait(s):可以理解为一个函数,函数名为wait, 信号量s为传递的参数。(等待某个资源)**也称为p(s);**
signal(s): 可以理解为一个函数,函数名为signal, 信号量s为传递的参数。(释放某个资源)**也称为v(s)**

整型信号量

进程0:
 wait(s); //进入区,申请资源
 使用资源。
 signal(s)//退出区,释放资源

函数

int s=1;
void wait(int s){  //进入区,申请资源
 while(s<=0){ //如果资源不够,一直循环
  s=s-1; //如果资源够了,占用一个资源。
}

void signal(int s) //退出区,释放资源
{
   s=s+1;//使用完资源,在退出区释放资源

}

}

记录型信号量

/*记录型的信号量*/
typedef struct{
 int value; //剩余资源
 struct process*l //等待队列

}semphore
//调用资源
 void wait(semphore s)
 {
   s.value--;//资源-1
   if(s.value<0{
      block(s.l); //进入堵塞
    }

}
//使用完资源后
void signal(semphore s)
{
   s.value++; //资源加1
   if(s.value<=0{
        wakeup(s.l);//唤醒下个进程
    }
 
}

信号量实现进程互斥

void p1(){//进程p1
semophre mutex =1; //设置信号量
.....
p(mutex); //申请资源,加锁
临界区代码..... 
v(mutex);//使用以后 需要解锁
......
}

void p2() //进程p2
{
.......
  p(mutex); //申请资源,加锁
   临界区代码 
   v(mutex);//使用以后 需要解锁
.......
}

进程同步

进程同步问题:
比如有 俩 进程

void p1()
{
 代码1;
 代码2;
 代码3}


void p2()
{
 代码4;
 代码5;
 代码6}

如果两个进程实现并发执行。 执行代码 的次序是交替进行的。

我们想让cpu执行完 代码2 就执行代码4;

思想:

1.先设置一个mutex=0信号量,
2.如果执行v(mutex) 因为mutex=0.其执行block;
void p1()
{
 代码1;
 代码2v(mutex)//释放进程 ,并mutex+1
 代码3}


void p2()
{
p(mutex) //申请资源
 代码4;
 代码5;
 代码6}

生产者——消费者问题

题目:请添加图片描述
问题:
请添加图片描述
解析:
请添加图片描述
1.生产者-消费者问题 是互斥的:
生产者的缓冲区 是有限个的 并且同一个位置只能存放一个资源所以必须是互斥的如下图👇
请添加图片描述
2.**生产者-消费者问题是同步的:
只有缓冲区有 资源(数据)之后 才能进行消费操作。 说白了就是 一个产品 只有先生产 才能消费。(先后顺序)

请添加图片描述

semphore mutex =1;//互斥信号量,实现对缓冲区的互斥访问
 semphore empty =n;//同步信号量,表示空闲缓冲区的数量,
 semphore full =0;//同步信号量,表示产品的数量。

请添加图片描述
请添加图片描述

实战题目

请添加图片描述

semaphore SA=SB=SC=0;
 SD=1;
 i:interger;

//抽烟函数
 void smokerA()
 {
    while1{
      wait(SA);
      制烟;
      signal(SD);
      吸烟;

    }


     void smokerB()
 {
    while1{
      wait(SA);
      制烟;
      signal(SD);
      吸烟;

    }

void smokerc()
 {
    while1{
      wait(SA);
      制烟;
      signal(SD);
      吸烟;

    }
//
      void produce()
      {
             while(1)
             i=random(2);;//0代表纸和火柴的组合,1代表烟草和火柴的组合,2代表烟草和纸的组合
              wait(SD);
              switch(i);
              {
                  case  0: signal(SA);
                  case  1: signal (SB);
                  case  2: signal (SC);

               }           

      }

//
            Main()
                 {
                  cobegi
                     {
                  somkerA();
                  somkerB();
                  somkerC();
                  provider();
                    }
                 } 
 

    
  }

请添加图片描述

semaphore S=1,SO=SE=0;
buffer B;
void R1()
{int x;
while(1)
{从输入设备上读一个数;
x=接收的数;
wait(S);
B=x;
if  B=奇数 then signal(SO);
else signal(SE); 
 }
   }
void W1()
{int y;
while(1)
{ wait(SO);
y=B;
signal(S);
{打印y中数};
}
 }
void W2()
{int z;
while(1)
{ wait(SE);
z=B;
signal(S);
打印z中数 ;
    }
 }
main()
{
       cobegin{
       R();
       W1();
       W2();
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值