freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

進程同步與通信(2)-資料下載頁

2025-05-12 18:00本頁面
  

【正文】 Modula Java等,并且還作為程序庫提供服務。 ? 利用管程可以鎖定任何對象,尤其是鏈表型數據結構,可以鎖定整個鏈表,或鏈表中的某個元素。 管程的結構 ? 管程是由過程、變量及數據結構等組成的集合。典型的管程包括三個部分: (1)對局部于管程的共享數據結構的說明; (2)對該數據結構進行操作的一組過程; (3)對該數據結構初始化的語句。 ? 管程有自己的名字,管程中的各個過程可以帶有自己的形式參數,與過程調用一樣進行參數替換執(zhí)行。 管程的使用 ? 管程本身被作為一種臨界區(qū),因此,實現管程時,需要考慮互斥、同步和控制變量等問題。 ? 進程可在任何需要的地方調用管程中的過程,但不能在管程外直接訪問管程內的數據結構。 Type name=monitor /*管程命名 */ Var i:integer。 /*變最說明 */ c:condition。 Procedure P1(x)。 Begin … End。 Procedure P2(x)。 Begin … End。 … Procedure Pn(x)。 Begin … End。 Begin /*初始化語句 */ End。 用管程實現互斥 ? 當幾個進程調用某個管程時,僅允許一個進程進入管程,其他進程必須等待,即任何時刻,管程中只能有一個活躍進程。 ? 典型地,當一個進程調用管程中的過程時,若先檢查管程中是否有其他的活躍進程,如果有,則阻塞調用進程、直到管程內的進程離開管程。 ? 管程的互斥操作通常由編譯程序支持,編譯時自動為每個管程建立一個初值為 1的互斥信號量。 用管程實現同步 ? 用管程實現進程同步,是指在管程中要設置一對同步操作原語,例如, wait(或 block)和 signal(或wakeup)。 ? 注意,這里的 wait和 signal與作用于信號量的wait和 signal不同,后者作用于信號量。信號量具有累加功能,當信號量為負數時,其絕對值表示等待在該信號量上的阻塞進程數。這里的 wait和 signal作用于條件變量,條件變量不具有累加功能,如果管程中的進程發(fā)出了一個信號量,卻沒有在對應的條件變量上阻塞等待,則該信號量沒有作用,會被丟失。 ? 由于進程阻塞等待的原因有多種,為了區(qū)別阻塞等待進程和不同的阻塞隊列,管程中設置了不同的條件變量,將因為不同事件阻塞的進程組織在不同的隊列中。 ? 當一個進程利用管程申請資源而未能滿足時,將調用 wait原語阻塞自己,并進入相應阻塞隊列。當某進程釋放出一個臨界資源以后,將用 signal原語喚醒等待在該臨界資源上的一個阻塞過進程。 消息傳遞 進程通信的方式 ? 進程之間的通信內容包含兩種類型: 控制信息 與 大批量數據 。 ? 低級通信 :進程之間交換控制信息的過程。 ? 高級通信 :進程之間交換批量數據的過程。 ? 進程之間同步與互斥是一種低級通信,用來控制進程執(zhí)行速度。 發(fā)送進程 接收進程 郵件 郵件 郵件 接收進程 發(fā)送進程 終端用戶 發(fā)送進程 接收進程 終端用戶 發(fā)送進程 接收進程 郵件服務器 郵件服務器 電子郵件的發(fā)送與接收過程 常用的進程通信機制 ? 基于共享存儲區(qū)方式 ? 消息傳遞方式 ? 郵箱機制 基于共享存儲區(qū)方式 ? 生產者 /消費者問題:生產者與消費者通過共享緩沖區(qū),實現數據傳遞,屬于基于共享存儲區(qū)通信。 ? 這里的共享數據區(qū)屬于每個互相通信進程的組成部分,這種通信方式不要求數據移動,一般用于本地通信。 ? 對于遠程通信來說,每臺計算機擁有各自的私有內存區(qū),不易實現共享存儲區(qū)的訪問。 ?如何通過共享存儲區(qū)通信 ? 通過程序設計來實現 。程序員設計程序時,利用程序指令設置共享存儲區(qū),并處理通信進程之間的同步等問題,操作系統(tǒng)只需提供共享存儲區(qū)。 ? 由操作系統(tǒng)在內存中劃分出一塊區(qū)域作為共享存儲區(qū) 。進程在通信前向系統(tǒng)申請共享存儲區(qū)中的一個分區(qū)。然后,申請進程把獲得的共享存儲分區(qū)連接到本進程上,此后便可象讀 /寫普通存儲器一樣地讀 /寫共享存儲分區(qū),該方式下,通信進程之間的同步與互斥訪問共享存儲區(qū)可以由操作系統(tǒng)實現。 消息傳遞的機制 消息的一般格式 消息傳遞的同步 ? 進程之間的通信的兩條原語: ? Send(destination,message) ? Receive (source, message) 消息傳遞的同步 ? 只有當一個發(fā)送進程發(fā)送出消息以后,接收進程才能接收消息。 ? 即,當發(fā)送進程調用 Send原語發(fā)送消息時,若沒有空閑的消息緩沖區(qū),則發(fā)送進程阻塞;當接收進程調用 Receive原語接收消息時,如果沒有消息可接收,由接收進程阻塞,直到一條消息到達。 三種同步方式 ? 阻塞發(fā)送,阻塞接收;進程間的緊密同步。 ? 不阻塞發(fā)送,阻塞接收;常用于服務進程為其它進程提供服務。 ? 不阻塞發(fā)送,不阻塞接收。 “不阻塞發(fā)送” ? 例如,當進程執(zhí)行過程中需要打印輸出,通常讓打印任務排隊等待,而請求打印的進程無須阻塞等待打印完成,即,每當進程需要打印時,都可以以消息形式發(fā)出請求,然后繼續(xù)執(zhí)行。 ? “不阻塞發(fā)送”方式容易導致消息的無限發(fā)送,無限發(fā)送消息會消耗處理機時間,且由于消息需要占用內存的緩沖區(qū),無限發(fā)送消息也會消耗其它系統(tǒng)資源。 ? 設計并發(fā)程序時,若采用“不阻塞發(fā)送”方式,就必須在程序中考慮讓接收進程發(fā)回應答消息,證實其是否收到消息,這將增加程序設計的難度。 阻塞接收 ? 并發(fā)程序設計中常采用該方式; ? 當接收消息的進程未收到期望的消息時,常需要阻塞等待,直到消息到來,但是,如果消息丟失,或發(fā)送進程發(fā)送消息之前失敗,則接收進程將永久阻塞。 ? 如果采用“不阻塞接收”方式,則可能因為接收方的緣故,丟失消息。 消息傳遞中的尋址 ? 尋址方式:直接尋址和間接尋址。 ? 若采用直接尋址, send原語中必須指定目標進程的具體標識號。 ? Receive原語中的 source地址有兩種處理方法: ?接收進程顯式地指定發(fā)送方進程標識號,這就要求接收進程必須事先清楚將接收哪個進程發(fā)來的消息。 ?接收進程可以不必指定接收哪個進程的消息。 間接尋址 ? 采用間接尋址傳遞消息時,消息不再從發(fā)送方直接發(fā)送到接收方,而是通過發(fā)送進程與接收進程共享的一個數據結構進程中轉,該數據結構通常稱為郵箱。 ? 發(fā)送進程將消息發(fā)送到指定的郵箱中,接收進程從郵箱中接收消息。 郵箱 ? 郵箱不限制進程數,允許多個發(fā)送進程向郵箱發(fā)送消息,同時,也允許多個接收進程從郵箱接收消息。 利用消息傳遞實現互斥 ? 采用“不阻塞發(fā)送,阻塞接收”方式。 ? 多個并發(fā)執(zhí)行的發(fā)送進程和接收進程共享一個郵箱 mutex,它被初始化為一個無內容的“空”消息。 ? 如果一個進程希望進入臨界區(qū),首先必須申請從mutex郵箱中接收一條消息.若郵箱為“空”,則該進程阻塞(接收);若進程收到郵箱中的一條消息,則進入臨界區(qū),執(zhí)行完畢以后,退出臨界區(qū),并將該消息發(fā)送回郵箱 mutex中。 Const n=…。 /* 進程數 */ Procedure P(I:integer)。 Var msg:message。 Begin repeat receive(mutex,msg)。 /*從郵箱接收一條消息 */ 臨界區(qū) 。 send(mutex,msg)。 /*將消息發(fā)回到郵箱 */ 其余部分 forever End. Begin /*主程序 */ Create_mailbox(mutex)。 /*創(chuàng)建郵箱 */ Send(mutex_null)。 /*初始化,向郵箱發(fā)送一條空消息 */ Parbegin P(1): P(2)。 … P(n) parend 注意 ? “空”消息:代表一條消息體為“空”,但具有消息頭的“真正”的一條消息,不是沒有消息。 ? 當第一個希望進入臨界區(qū)的進程執(zhí)行receive(mutex,msg)語句時,從郵箱mutex中接收了這條“空”消息,進入臨界區(qū)執(zhí)行。這時,郵箱 mutex變?yōu)椤翱铡保礇]有消息.其后執(zhí)行receive(mutex,msg)語句希望進入臨界區(qū)的進程被阻塞。 注意 ? 當進入臨界區(qū)的進程執(zhí)行完臨界區(qū)的代碼,退出臨界區(qū)時,執(zhí)行 send(mutex,msg)語句,將這條“空”消息歸還給郵箱 mutex,并喚醒一個阻塞進程,使其取走這條消息,進入臨界區(qū)執(zhí)行。 ? 可見,控制進程互斥進入臨界區(qū)的這條消息本身可以不含任何有用的內容,它僅被當作進程能否進入臨界區(qū)的一種憑證,或令牌。 ? 只要保證郵箱中最多只有一條消息,就能保證只允許一個進程進入臨界區(qū),從而實現進程互斥使用臨界資源。 利用消息傳遞解決生產者-消費者問題 ? 共使用了 capacity條消息,類似于共享內存緩沖區(qū)中的 capacity個存儲單元。 ? 消費者首先將 capacity條“空”消息發(fā)送給生產者,當生產者向消費者傳遞一個數據項時,它取走一條“空”消息,并發(fā)送回一條填充了內容的消息。 ? 通過這種方式進行數據傳遞,系統(tǒng)中的總消息數保持不變,所以,消息可以存入在預知數量的內存中。 生產者 /消費者同步 ? 如果生產者生產數據的速度比消費者消費數據的速度快,則所有的“空”消息最終都將被填滿,于是生產者將因為接收不到“空”消息而被阻塞,等待消費者取走帶有數據的消息,然后返回一條“空”消息。 ? 如果消費者消費數據的速度更快,則消費者將因為接收不到“數據”消息而阻塞,直到生產者生產并發(fā)送來一條“數據”消息。 死鎖 ? 進程的并發(fā)控制不僅要控制若干進程的同步與互斥 ,確保進程之間正常通信 ,還需要解決進程死鎖問題。 ? 一旦出現進程死鎖,相應的進程將無法向前推進。如果系統(tǒng)內的絕大多數進程或全部進程死鎖,那么,整個系統(tǒng)將處于癱瘓狀態(tài),造成系統(tǒng)“死機”。 交通中的死鎖現象 進程競爭資源可能引起死鎖 Process P … Get A , Get B , Release A , Release B , Process Q … Get B … Get A … Release B … Release A … 進程競爭資源且推進順序不當可能產生死鎖 修改進程 P,Q代碼 Process P … Get A , Release A , Get B , Release B , Process Q … Get B … Release B … Get A … Release A … 死鎖的定義 ? 死鎖 (deadlock)概念可以描述為,多個進程因為競爭資源,或執(zhí)行時推進的順序不當,或相互通信而永久阻塞現象,如果沒有外力作用,這種現象將永遠保持下去。 ? 若系統(tǒng)出現死鎖,必須有相應的措施進行解除。當然,如果能提前預防和避免死鎖的出現,將能提高系統(tǒng)的運行效率。 引起死鎖的原因 ? 引起進程死鎖的一個主要因素是由于進程競爭系統(tǒng)中的資源 ,而進程對資源的總需求量超過系統(tǒng)能提供的最大資源量。 ? 系統(tǒng)中的資源大體可以分為兩類:可重用資源和可消耗資源。 可重用資源 ? 可重用資源,指某一時刻僅允許一個進程使用的、不能被進程消耗的,釋放以后還可被其他進程使用的資源。 ? 如處理機、 I/O通道和設備、內 /外存儲器、諸如文件、數據庫和信號量之類的數據結構等。 競爭可重用資源可能會死鎖 ? 例如:兩個進程 P P2互斥修改兩張數據庫表T T若進程 P1打開并鎖定表格 T完成修改操作以后,未解鎖,又申請修改表格 T2。 ? 假設這時,表格 T2被進程 P2占用且鎖定,則進程P1阻塞等待。 ? 如果進程 P2在修改表格 T2的過程中,也需要對表格 T1進行操作,而表格 T1被進程 P1(阻塞 )占用,不會釋放出來。 ? 這樣進程 P P2都會因為等待對方占用的資源而阻塞,出現死鎖。 可消耗資源 ? 可消耗資源,指可以創(chuàng)造(生產)和撤消(消耗)的資源,其數量不限。 ? 如中斷、信號( signals)
點擊復制文檔內容
規(guī)章制度相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1