日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

操作系统:生产者与消费者问题

發(fā)布時(shí)間:2025/3/21 windows 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统:生产者与消费者问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用信號(hào)量實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者問(wèn)題?

問(wèn)題描述:使用一個(gè)緩沖區(qū)來(lái)保存物品,只有緩沖區(qū)沒(méi)有滿,生產(chǎn)者才可以放入物品;只有緩沖區(qū)不為空,消費(fèi)者才可以拿走物品。

因?yàn)榫彌_區(qū)屬于臨界資源,因此需要使用一個(gè)互斥量 mutex 來(lái)控制對(duì)緩沖區(qū)的互斥訪問(wèn)。

為了同步生產(chǎn)者和消費(fèi)者的行為,需要記錄緩沖區(qū)中物品的數(shù)量。數(shù)量可以使用信號(hào)量來(lái)進(jìn)行統(tǒng)計(jì),這里需要使用兩個(gè)信號(hào)量:empty 記錄空緩沖區(qū)的數(shù)量,full 記錄滿緩沖區(qū)的數(shù)量。其中,empty 信號(hào)量是在生產(chǎn)者進(jìn)程中使用,當(dāng) empty 不為 0 時(shí),生產(chǎn)者才可以放入物品;full 信號(hào)量是在消費(fèi)者進(jìn)程中使用,當(dāng) full 信號(hào)量不為 0 時(shí),消費(fèi)者才可以取走物品。

注意,不能先對(duì)緩沖區(qū)進(jìn)行加鎖,再測(cè)試信號(hào)量。也就是說(shuō),不能先執(zhí)行 down(mutex) 再執(zhí)行 down(empty)。如果這么做了,那么可能會(huì)出現(xiàn)這種情況:生產(chǎn)者對(duì)緩沖區(qū)加鎖后,執(zhí)行 down(empty) 操作,發(fā)現(xiàn) empty = 0,此時(shí)生產(chǎn)者睡眠。消費(fèi)者不能進(jìn)入臨界區(qū),因?yàn)樯a(chǎn)者對(duì)緩沖區(qū)加鎖了,消費(fèi)者就無(wú)法執(zhí)行 up(empty) 操作,empty 永遠(yuǎn)都為 0,導(dǎo)致生產(chǎn)者永遠(yuǎn)等待下,不會(huì)釋放鎖,消費(fèi)者因此也會(huì)永遠(yuǎn)等待下去。

#define N 100 typedef int semaphore; semaphore mutex = 1; semaphore empty = N; semaphore full = 0;void producer() {while(TRUE) {int item = produce_item();down(&empty);down(&mutex);insert_item(item);up(&mutex);up(&full);} }void consumer() {while(TRUE) {down(&full);down(&mutex);int item = remove_item();consume_item(item);up(&mutex);up(&empty);} }

使用管程實(shí)現(xiàn)

4. 管程

使用信號(hào)量機(jī)制實(shí)現(xiàn)的生產(chǎn)者消費(fèi)者問(wèn)題需要客戶端代碼做很多控制,而管程把控制的代碼獨(dú)立出來(lái),不僅不容易出錯(cuò),也使得客戶端代碼調(diào)用更容易。

c 語(yǔ)言不支持管程,下面的示例代碼使用了類 Pascal 語(yǔ)言來(lái)描述管程。示例代碼的管程提供了 insert() 和 remove() 方法,客戶端代碼通過(guò)調(diào)用這兩個(gè)方法來(lái)解決生產(chǎn)者-消費(fèi)者問(wèn)題。

monitor ProducerConsumerinteger i;condition c;procedure insert();begin// ...end;procedure remove();begin// ...end; end monitor;

管程有一個(gè)重要特性:在一個(gè)時(shí)刻只能有一個(gè)進(jìn)程使用管程。進(jìn)程在無(wú)法繼續(xù)執(zhí)行的時(shí)候不能一直占用管程,否者其它進(jìn)程永遠(yuǎn)不能使用管程。

管程引入了?條件變量?以及相關(guān)的操作:wait()?和?signal()?來(lái)實(shí)現(xiàn)同步操作。對(duì)條件變量執(zhí)行 wait() 操作會(huì)導(dǎo)致調(diào)用進(jìn)程阻塞,把管程讓出來(lái)給另一個(gè)進(jìn)程持有。signal() 操作用于喚醒被阻塞的進(jìn)程。

使用管程實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者問(wèn)題?

// 管程 monitor ProducerConsumercondition full, empty;integer count := 0;condition c;procedure insert(item: integer);beginif count = N then wait(full);insert_item(item);count := count + 1;if count = 1 then signal(empty);end;function remove: integer;beginif count = 0 then wait(empty);remove = remove_item;count := count - 1;if count = N -1 then signal(full);end; end monitor;// 生產(chǎn)者客戶端 procedure producer beginwhile true dobeginitem = produce_item;ProducerConsumer.insert(item);end end;// 消費(fèi)者客戶端 procedure consumer beginwhile true dobeginitem = ProducerConsumer.remove;consume_item(item);end end;

?

總結(jié)

以上是生活随笔為你收集整理的操作系统:生产者与消费者问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。