本發(fā)明涉及數據訪問技術領域,特別涉及一種生產者消費者模式優(yōu)化方法及系統(tǒng)。
背景技術:
當前,在生產者消費者模式中,生產者用于將消息放入緩沖區(qū),而消費者則用于從緩沖區(qū)中取出消息。也即,在生產者消費者模式中,生產者和消費者的數據訪問對象均是同一個緩沖區(qū)。生產者進程和消費者進程在對緩沖區(qū)進行數據寫入操作或數據取出操作時,相應的操作結果依賴于上述兩種進程在執(zhí)行過程中的相對時間,也即依賴于上述兩個進程的指令執(zhí)行順序,在這個過程中,很容易出現由于生產者進程和消費者進程對緩沖區(qū)中資源進行爭奪而引發(fā)的數據訪問異?,F象。
綜上,如何避免生產者消費者模式中由于資源爭奪所導致的數據訪問異常現象是目前有待解決的問題。
技術實現要素:
有鑒于此,本發(fā)明的目的在于提供一種生產者消費者模式優(yōu)化方法及系統(tǒng),能夠避免生產者消費者模式中由于資源爭奪所導致的數據訪問異?,F象。其具體方案如下:
一種生產者消費者模式優(yōu)化方法,包括:
將當前緩沖區(qū)中已寫滿數據的區(qū)域長度以及空閑的區(qū)域長度分別賦值給預設的信號量full和信號量empty;
若生產者進程嘗試向所述緩沖區(qū)中寫入新數據,則對信號量empty和預設的信號量mutex進行判斷,并根據判斷結果決定是否允許生產者進程向所述緩沖區(qū)寫入新數據;
若消費者進程嘗試從所述緩沖區(qū)中取出數據,則對信號量full和信號量mutex進行判斷,并根據判斷結果決定是否允許消費者進程從所述緩沖區(qū)中取出數據;
其中,若信號量mutex為1,則表示當前所述緩沖區(qū)未被任何進程占用,若信號量mutex為0,則表示當前所述緩沖區(qū)已被生產者進程或消費者進程占用。
可選的,所述對信號量empty和預設的信號量mutex進行判斷,并根據判斷結果決定是否允許生產者進程向所述緩沖區(qū)寫入新數據的過程,包括:
判斷當前信號量empty是否大于0,并且判斷信號量mutex是否為1;
如果當前信號量empty大于0,并且信號量mutex為1,則將信號量mutex設為0,并通過生產者進程將新數據寫入所述緩沖區(qū),在本次數據寫入操作結束之后將信號量mutex重新設為1;
如果當前信號量empty為0和/或信號量mutex為0,則禁止生產者進程向所述緩沖區(qū)中寫入新數據。
可選的,在生產者進程每向所述緩沖區(qū)寫入一個新數據的過程之前,均包括:
將當前信號量empty的具體數值減1;
在生產者進程每向所述緩沖區(qū)寫入一個新數據的過程之后,均包括:
將當前信號量full的具體數值加1。
可選的,所述對信號量full和信號量mutex進行判斷,并根據判斷結果決定是否允許消費者進程從所述緩沖區(qū)中取出數據的過程,包括:
判斷當前信號量full是否大于0,并且判斷信號量mutex是否為1;
如果當前信號量full大于0,并且信號量mutex為1,則將信號量設為0,并通過消費者進程從所述緩沖區(qū)中取出數據,在本次數據取出操作之后將信號量mutex重新設為1;
如果當前信號量full為0和/或信號量mutex為0,則禁止消費者進程從所述緩沖區(qū)中取出數據。
可選的,在消費者進程每從所述緩沖區(qū)取出一個數據的過程之前,均包括:
將當前信號量full的具體數值減1;
在消費者進程每從所述緩沖區(qū)取出一個數據的過程之后,均包括:
將當前信號量empty的具體數據值加1。
本發(fā)明還公開了一種生產者消費者模式優(yōu)化系統(tǒng),包括:
信號量賦值模塊,用于將當前緩沖區(qū)中已寫滿數據的區(qū)域長度以及空閑的區(qū)域長度分別賦值給預設的信號量full和信號量empty;
生產者管理模塊,用于當生產者進程嘗試向所述緩沖區(qū)中寫入新數據,則對信號量empty和預設的信號量mutex進行判斷,并根據判斷結果決定是否允許生產者進程向所述緩沖區(qū)寫入新數據;
消費者管理模塊,用于當消費者進程嘗試從所述緩沖區(qū)中取出數據,則對信號量full和信號量mutex進行判斷,并根據判斷結果決定是否允許消費者進程從所述緩沖區(qū)中取出數據;
其中,若信號量mutex為1,則表示當前所述緩沖區(qū)未被任何進程占用,若信號量mutex為0,則表示當前所述緩沖區(qū)已被生產者進程或消費者進程占用。
可選的,所述生產者管理模塊,包括:
第一判斷單元,用于當生產者進程嘗試向所述緩沖區(qū)中寫入新數據,則判斷當前信號量empty是否大于0,并且判斷信號量mutex是否為1;
第一生產者管理單元,用于當所述第一判斷單元判斷出當前信號量empty大于0,并且信號量mutex為1,則將信號量mutex設為0,并通過生產者進程將新數據寫入所述緩沖區(qū),在本次數據寫入操作結束之后將信號量mutex重新設為1;
第二生產者管理單元,用于當所述第一判斷單元判斷出當前信號量empty為0和/或信號量mutex為0,則禁止生產者進程向所述緩沖區(qū)中寫入新數據。
可選的,所述第一生產者管理單元在生產者進程每向所述緩沖區(qū)寫入一個新數據的過程之前,均將當前信號量empty的具體數值減1,以及在生產者進程每向所述緩沖區(qū)寫入一個新數據的過程之后,均將當前信號量full的具體數值加1。
可選的,所述消費者管理模塊,包括:
第二判斷單元,用于當消費者進程嘗試從所述緩沖區(qū)中取出數據,則判斷當前信號量full是否大于0,并且判斷信號量mutex是否為1;
第一消費者管理單元,用于當所述第二判斷單元判斷出當前信號量full大于0,并且信號量mutex為1,則將信號量設為0,并通過消費者進程從所述緩沖區(qū)中取出數據,在本次數據取出操作之后將信號量mutex重新設為1;
第二消費者管理單元,用于當所述第二判斷單元判斷出當前信號量full為0和/或信號量mutex為0,則禁止消費者進程從所述緩沖區(qū)中取出數據。
可選的,所述第一消費者管理單元在消費者進程每從所述緩沖區(qū)取出一個數據的過程之前,均將當前信號量full的具體數值減1,以及在消費者進程每從所述緩沖區(qū)取出一個數據的過程之后,均將當前信號量empty的具體數據值加1。
本發(fā)明中,生產者消費者模式優(yōu)化方法,包括:將當前緩沖區(qū)中已寫滿數據的區(qū)域長度以及空閑的區(qū)域長度分別賦值給預設的信號量full和信號量empty;若生產者進程嘗試向緩沖區(qū)中寫入新數據,則對信號量empty和預設的信號量mutex進行判斷,并根據判斷結果決定是否允許生產者進程向緩沖區(qū)寫入新數據;若消費者進程嘗試從緩沖區(qū)中取出數據,則對信號量full和信號量mutex進行判斷,并根據判斷結果決定是否允許消費者進程從緩沖區(qū)中取出數據;其中,若信號量mutex為1,則表示當前緩沖區(qū)未被任何進程占用,若信號量mutex為0,則表示當前緩沖區(qū)已被生產者進程或消費者進程占用。
可見,本發(fā)明預先設置了用于記錄當前緩沖區(qū)中已寫滿數據的區(qū)域長度的信號量full、用于記錄當前緩沖區(qū)中空閑的區(qū)域長度的信號量empty,以及信號量mutex,其中,當信號量mutex為1,則表示當前緩沖區(qū)未被任何進程占用,當信號量mutex為0,則表示當前緩沖區(qū)已被生產者進程或消費者進程占用,本發(fā)明利用上述信號量empty和信號量mutex決定是否允許生產者進程向緩沖區(qū)寫入新數據,以及利用上述信號量full和信號量mutex決定是否允許消費者進程從緩沖區(qū)中取出數據,這樣,能夠有效避免生產者消費者模式中由于資源爭奪所導致的數據訪問異?,F象。
附圖說明
為了更清楚地說明本發(fā)明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據提供的附圖獲得其他的附圖。
圖1為本發(fā)明實施例公開的一種生產者消費者模式優(yōu)化方法流程圖;
圖2為本發(fā)明實施例公開的一種生產者消費者模式優(yōu)化系統(tǒng)結構示意圖。
具體實施方式
下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
本發(fā)明實施例公開了一種生產者消費者模式優(yōu)化方法,參見圖1所示,該方法包括:
步驟S11:將當前緩沖區(qū)中已寫滿數據的區(qū)域長度以及空閑的區(qū)域長度分別賦值給預設的信號量full和信號量empty;
步驟S12:若生產者進程嘗試向緩沖區(qū)中寫入新數據,則對信號量empty和預設的信號量mutex進行判斷,并根據判斷結果決定是否允許生產者進程向緩沖區(qū)寫入新數據;
步驟S13:若消費者進程嘗試從緩沖區(qū)中取出數據,則對信號量full和信號量mutex進行判斷,并根據判斷結果決定是否允許消費者進程從緩沖區(qū)中取出數據;
其中,若信號量mutex為1,則表示當前緩沖區(qū)未被任何進程占用,若信號量mutex為0,則表示當前緩沖區(qū)已被生產者進程或消費者進程占用。
可見,本發(fā)明實施例預先設置了用于記錄當前緩沖區(qū)中已寫滿數據的區(qū)域長度的信號量full、用于記錄當前緩沖區(qū)中空閑的區(qū)域長度的信號量empty,以及信號量mutex,其中,當信號量mutex為1,則表示當前緩沖區(qū)未被任何進程占用,當信號量mutex為0,則表示當前緩沖區(qū)已被生產者進程或消費者進程占用,本發(fā)明實施例利用上述信號量empty和信號量mutex決定是否允許生產者進程向緩沖區(qū)寫入新數據,以及利用上述信號量full和信號量mutex決定是否允許消費者進程從緩沖區(qū)中取出數據,這樣,能夠有效避免生產者消費者模式中由于資源爭奪所導致的數據訪問異?,F象。
本發(fā)明實施例公開了一種具體的生產者消費者模式優(yōu)化方法,相對于上一實施例,本實施例對技術方案作了進一步的說明和優(yōu)化。具體的:
上一實施例步驟S12中,對信號量empty和預設的信號量mutex進行判斷,并根據判斷結果決定是否允許生產者進程向緩沖區(qū)寫入新數據的過程,具體可以包括下面步驟S121至S123:
步驟S121:判斷當前信號量empty是否大于0,并且判斷信號量mutex是否為1;
步驟S122:如果當前信號量empty大于0,并且信號量mutex為1,則將信號量mutex設為0,并通過生產者進程將新數據寫入緩沖區(qū),在本次數據寫入操作結束之后將信號量mutex重新設為1;
步驟S123:如果當前信號量empty為0和/或信號量mutex為0,則禁止生產者進程向緩沖區(qū)中寫入新數據。
可以理解的是,上述步驟S122中,在生產者進程每向緩沖區(qū)寫入一個新數據的過程之前,均包括將當前信號量empty的具體數值減1;另外,在生產者進程每向緩沖區(qū)寫入一個新數據的過程之后,均包括將當前信號量full的具體數值加1。
另外,上一實施例步驟S13中,對信號量full和信號量mutex進行判斷,并根據判斷結果決定是否允許消費者進程從緩沖區(qū)中取出數據的過程,具體可以包括下面步驟S131至S133:
步驟S131:判斷當前信號量full是否大于0,并且判斷信號量mutex是否為1;
步驟S132:如果當前信號量full大于0,并且信號量mutex為1,則將信號量設為0,并通過消費者進程從緩沖區(qū)中取出數據,在本次數據取出操作之后將信號量mutex重新設為1;
步驟S133:如果當前信號量full為0和/或信號量mutex為0,則禁止消費者進程從緩沖區(qū)中取出數據。
可以理解的是,上述步驟S132中,在消費者進程每從緩沖區(qū)取出一個數據的過程之前,均包括將當前信號量full的具體數值減1;另外,在消費者進程每從緩沖區(qū)取出一個數據的過程之后,均包括將當前信號量empty的具體數據值加1。
由上可見,本發(fā)明實施例中,信號量full和信號量empty的作用在于實現同步,而信號量mutex的作用在于實現進程互斥。
相應的,本發(fā)明實施例還公開了一種生產者消費者模式優(yōu)化系統(tǒng),參見圖2所示,該系統(tǒng)包括:
信號量賦值模塊11,用于將當前緩沖區(qū)中已寫滿數據的區(qū)域長度以及空閑的區(qū)域長度分別賦值給預設的信號量full和信號量empty;
生產者管理模塊12,用于當生產者進程嘗試向緩沖區(qū)中寫入新數據,則對信號量empty和預設的信號量mutex進行判斷,并根據判斷結果決定是否允許生產者進程向緩沖區(qū)寫入新數據;
消費者管理模塊13,用于當消費者進程嘗試從緩沖區(qū)中取出數據,則對信號量full和信號量mutex進行判斷,并根據判斷結果決定是否允許消費者進程從緩沖區(qū)中取出數據;
其中,若信號量mutex為1,則表示當前緩沖區(qū)未被任何進程占用,若信號量mutex為0,則表示當前緩沖區(qū)已被生產者進程或消費者進程占用。
具體的,上述生產者管理模塊,可以包括第一判斷單元、第一生產者管理單元和第二生產者管理單元;其中,
第一判斷單元,用于當生產者進程嘗試向緩沖區(qū)中寫入新數據,則判斷當前信號量empty是否大于0,并且判斷信號量mutex是否為1;
第一生產者管理單元,用于當第一判斷單元判斷出當前信號量empty大于0,并且信號量mutex為1,則將信號量mutex設為0,并通過生產者進程將新數據寫入緩沖區(qū),在本次數據寫入操作結束之后將信號量mutex重新設為1;
第二生產者管理單元,用于當第一判斷單元判斷出當前信號量empty為0和/或信號量mutex為0,則禁止生產者進程向緩沖區(qū)中寫入新數據。
可以理解的是,本實施例中,上述第一生產者管理單元在生產者進程每向緩沖區(qū)寫入一個新數據的過程之前,均將當前信號量empty的具體數值減1,以及在生產者進程每向緩沖區(qū)寫入一個新數據的過程之后,均將當前信號量full的具體數值加1。
另外,上述消費者管理模塊,可以包括第二判斷單元、第一消費者管理單元和第二消費者管理單元;其中,
第二判斷單元,用于當消費者進程嘗試從緩沖區(qū)中取出數據,則判斷當前信號量full是否大于0,并且判斷信號量mutex是否為1;
第一消費者管理單元,用于當第二判斷單元判斷出當前信號量full大于0,并且信號量mutex為1,則將信號量設為0,并通過消費者進程從緩沖區(qū)中取出數據,在本次數據取出操作之后將信號量mutex重新設為1;
第二消費者管理單元,用于當第二判斷單元判斷出當前信號量full為0和/或信號量mutex為0,則禁止消費者進程從緩沖區(qū)中取出數據。
可以理解的是,本實施例中,上述第一消費者管理單元在消費者進程每從緩沖區(qū)取出一個數據的過程之前,均將當前信號量full的具體數值減1,以及在消費者進程每從緩沖區(qū)取出一個數據的過程之后,均將當前信號量empty的具體數據值加1。
可見,本發(fā)明實施例預先設置了用于記錄當前緩沖區(qū)中已寫滿數據的區(qū)域長度的信號量full、用于記錄當前緩沖區(qū)中空閑的區(qū)域長度的信號量empty,以及信號量mutex,其中,當信號量mutex為1,則表示當前緩沖區(qū)未被任何進程占用,當信號量mutex為0,則表示當前緩沖區(qū)已被生產者進程或消費者進程占用,本發(fā)明實施例利用上述信號量empty和信號量mutex決定是否允許生產者進程向緩沖區(qū)寫入新數據,以及利用上述信號量full和信號量mutex決定是否允許消費者進程從緩沖區(qū)中取出數據,這樣,能夠有效避免生產者消費者模式中由于資源爭奪所導致的數據訪問異?,F象。
最后,還需要說明的是,在本文中,諸如第一和第二等之類的關系術語僅僅用來將一個實體或者操作與另一個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關系或者順序。而且,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設備中還存在另外的相同要素。
以上對本發(fā)明所提供的一種生產者消費者模式優(yōu)化方法及系統(tǒng)進行了詳細介紹,本文中應用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領域的一般技術人員,依據本發(fā)明的思想,在具體實施方式及應用范圍上均會有改變之處,綜上所述,本說明書內容不應理解為對本發(fā)明的限制。