《軟體技術基礎》之《作業系統習題解析》

2021-10-24 06:16:34 字數 2844 閱讀 3125

小專案4:抽菸者問題

臨界資源是一次僅允許乙個程序使用的共享資源。各程序採取互斥的方式,實現共享的資源稱作臨界資源。屬於臨界資源的硬體有,印表機,磁帶機等;軟體有訊息佇列,變數,陣列,緩衝區等。諸程序間採取互斥方式,實現對這種資源的共享。

每個程序中訪問臨界資源的那段**稱為臨界區,每次只允許乙個程序進入臨界區,進入後,不允許其他程序進入。不論是硬體臨界資源還是軟體臨界資源,多個程序必須互斥的對它進行訪問。多個程序涉及到同乙個臨界資源的的臨界區稱為相關臨界區。使用臨界區時,一般不允許其執行時間過長,只要執行在臨界區的執行緒還沒有離開,其他所有進入此臨界區的執行緒都會被掛起而進入等待狀態,並在一定程度上影響程式的執行效能。

臨界區使用原則

(1) 空閒讓進:無程序處於臨界區時,若有程序要求進入臨界區應立即允許進入。

(2) 忙則等待:當已有程序進入臨界區時,其他試圖進入各自臨界區的程序必須等待,以保證諸程序互斥地進入臨界區。

(3) 有限等待:有若干程序要求進入臨界區時,應在有限時間內使一程序進入臨界區,即它們不應相互等待而誰都不進入臨界區。

(4) 讓權等待:對於等待進入臨界區的程序必須釋放其占有地cpu。

含義:訊號量相當於乙個訊號燈,表示狀態,是在多執行緒環境下使用的一種設施,可以用來保證兩個或多個關鍵**段不被併發呼叫。

作用:用來解決程序同步於互斥問題的機制,包括乙個稱為訊號量的變數和對它進行的兩個原語操作。

司機程序:

while

(true)

售票員程序:

while

(true)

設訊號量s=n,mutex=1p

(s)p

(mutex)

登記,取得座位號

v(mutex)閱讀p

(mutex)登出v

(mutex)

v(s)

設整型變數 count=n;

訊號量:mutex=1;

p(mutex)

;if (count ==0)

count=count-1;

登記,取得座位號

v(mutex);閱讀

p(mutex)

;count=count+1;

v(mutex)

;return;

emptya, emptyb, fulla, fullb:semaphore;

emptya=emptyb=1;

fulla=fullb=0;

main()

pa()}

pb()}

pc()}

假設乙個系統中有三個抽菸者程序,每個抽菸者不斷地捲菸並抽菸。抽菸者捲起並抽掉一顆煙需要有三種材料:菸草、紙和膠水。乙個抽菸者有菸草,乙個有紙,另乙個有膠水。系統中還有兩個**者程序,它們無限地**所有三種材料,但每次僅輪流提供三種材料中的兩種。得到缺失的兩種材料的抽菸者在捲起並抽掉一顆菸後會發訊號通知**者,讓它繼續提供另外的兩種材料。這一過程重複進行。 請用訊號量機制程式設計,實現該問題要求的功能。

問題分析:該問題本質是「可生產多種產品的多生產者-多消費者問題」。三個抽菸者相當於三個不同的消費者,他們每次只會有乙個抽菸者可以抽到煙,其餘兩個則需要等待。而在這裡預設空間大小只有乙個單元,即**者每次放下兩種材料後都會停下來等待直到有消費者使用了這兩種材料,他才會繼續放另兩種材料。相當於說緩衝區的大小為1。

關係分析:**者與三個抽菸者分別是同步關係。由於**者無法同時滿足兩個或 以上的抽菸者,三個抽菸者對抽菸這個動作互斥。

程序分析:這裡有五個程序。兩個**者作為生產者向三個抽菸者提供材料。

訊號量設定:

訊號量offer1、offer2、offer3分別表示菸草和紙組合的資源、菸草和膠水組合的資源、紙和膠水組合的資源。因為開始時沒有資源,所以將喚醒消費者的三個訊號的訊號量初始值都設為0。

隨機數設定:生產者要能提供三種組合的原料:菸草,紙,菸草,膠水,或是紙和膠水,這就需要乙個隨機數,來決定提供哪種組合的原料。這裡用random儲存隨機數。

訊號量finish用於互斥進行抽菸動作。finish初始值為0,表示無人抽菸。

測試結果:

完整**:

#include

#include

#include

#include

#include

using namespace std;

int random=0;

handle offer1,offer2,offer3;

handle finish;

unsigned __stdcall threadprovider

(void*)

return1;

}unsigned __stdcall threadsmoker1

(void*)

return2;

}unsigned __stdcall threadsmoker2

(void*)

return3;

}unsigned __stdcall threadsmoker3

(void*)

return4;

}void

process_smoker()

intmain()

《軟體技術基礎》之《資料庫習題解析》

設計思路 系統中抽象出操作 角色 使用者三個概念,其中操作由專案中抽象出來,乙個操作可以是乙個uri,也可以是乙個方法,比如建立使用者的操作,刪除使用者的操作。角色是許可權管理的核心,乙個角色具有某些操作的許可權,比如使用者管理員,這個角色具有的許可權有新增使用者的許可權 修改使用者的許可權 刪除使...

作業系統之1 1習題解答

1.在1.7節中,perror的引數是用iso c的屬性const定義的,而strerror的整形引數沒有用此屬性定義,為什麼?char strerror int errnum void perror const char msg 2.若日曆存放在帶符號的32位整形數中,那麼哪一年它將溢位?可用什麼...

作業系統習題解答

每次筆試,我都在作業系統的計算題中大費腦筋,以前學作業系統的時候,確實沒有怎麼做題。其實,各大公司出的題目都是作業題目,這一點我很不佔優勢。1.頁式儲存管理位址轉換問題 若在一分頁儲存管理系 統中,某作業的頁表如下所示。已知頁面大小為1024位元組,試將邏輯位址1011,2148,4000,5012...