信号量与PV操作 ●记录型信号量及其应用 二元信号量 ●同时型傖号量及其应用 型信号量及其应用
信号量与PV操作 ⚫ 记录型信号量及其应用 ⚫ 二元信号量 ⚫ 同时型信号量及其应用 ⚫ 一般型信号量及其应用
3.31同步和同步机制 著名的生产者--消费者( Producer Consumer Problem)问题是计算机操作 系统中并发进程内在关系的一种抽象, 是典型的进程同步问题。在操作系统中, 生产者进程可以是计算进程、发送进程; 而消费者进程可以是打印进程、接收进 程等等。解决好了生产者-消费者问题就 解决好了一类并发进程的同步问题
3.3.1 同步和同步机制 ⚫ 著 名 的 生 产 者 - - 消费者 ( ProducerConsumer Problem) 问题是计算机操作 系统中并发进程内在关系的一种抽象, 是典型的进程同步问题。在操作系统中, 生产者进程可以是计算进程、发送进程; 而消费者进程可以是打印进程、接收进 程等等。解决好了生产者--消费者问题就 解决好了一类并发进程的同步问题
生产者-消费者间题表述如下: ●有n个生产者和m个消费者,连接在 个有k个单位缓冲区的有界缓冲上, 故又叫有界缓冲问题。其中,p和cj 都是并发进程,只要缓冲区未满, 生产者pi生产的产品就可投入缓冲 区;类似地,只要缓冲区不空,消 费者进程c就可从缓冲区取走并消耗 品
生产者--消费者问题表述如下: ⚫有n个生产者和m个消费者,连接在 一个有k个单位缓冲区的有界缓冲上, 故又叫有界缓冲问题。其中,pi和cj 都是并发进程,只要缓冲区未满, 生产者pi生产的产品就可投入缓冲 区;类似地,只要缓冲区不空,消 费者进程cj就可从缓冲区取走并消耗 产品
可以把生产者-消费者问题的算法描述如下 ●vark: integer; type item: any; buffer: arrayl0.k-l]of item; inout: integer:=0 coumter integer:=0 process producer while (true) /无限循环 produce an item in nextp; /*生产一个产品 e if(counter==k) sleep(; /缓冲满时,生产者睡眠 bufferin = nextp /将一个产品放入缓冲区 in:=(in+1)mod k; /指针推进 counter:=counter+l; /*缓冲内产品数加1 if( counter=1) wakeup( consumer);缓冲为空了,加进一件产品并 唤醒消费者
可以把生产者-消费者问题的算法描述如下: ⚫ var k:integer; ⚫ type item:any; ⚫ buffer:array[0..k-1]of item; ⚫ in,out:integer:=0; ⚫ coumter:integer:=0; ⚫ process producer ⚫ while (TRUE) /* 无限循环 ⚫ produce an item in nextp; /* 生产一个产品 ⚫ if (counter==k) sleep( ); /* 缓冲满时,生产者睡眠 ⚫ buffer[in]:=nextp; /* 将一个产品放入缓冲区 ⚫ in:=(in+1) mod k; /* 指针推进 ⚫ counter:=counter+1; /* 缓冲内产品数加1 ⚫ if (counter==1) wakeup( consumer); /* 缓冲为空了,加进一件产品并 唤醒消费者
o process consumer ● while(TRUE) /无限循环 f( counter==0)slep();/缓冲区空,消 费者睡眠 nextc:-bufferlout: /取一个产品 到 nextc out: =(out+1)mod k; /指针推进 counter=counter-l /取走 个产品,计数减1 if (counter==k-1)wakeup( producer);/ 缓冲满了,取走一件产品并唤醒生产者 consume thr item in nextc;/消耗产品
⚫ process consumer ⚫ while (TRUE) /* 无限循环 ⚫ if (counter==0) sleep ( ); /* 缓冲区空,消 费者睡眠 ⚫ nextc:=buffer[out]; /* 取一个产品 到nextc ⚫ out:=(out+1) mod k; /* 指针推进 ⚫ counter:=counter-1; /* 取走一 个产品,计数减1 ⚫ if (counter==k-1) wakeup( producer); /* 缓冲满了,取走一件产品并唤醒生产者 ⚫ consume thr item in nextc; /* 消耗产品