适合人群:
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;
代码2;
v(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()
{
while(1)
{
wait(SA);
制烟;
signal(SD);
吸烟;
}
void smokerB()
{
while(1)
{
wait(SA);
制烟;
signal(SD);
吸烟;
}
void smokerc()
{
while(1)
{
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();
}