嵌入式Linux中的進程同步無競爭態讀寫

來源:互聯網
上載者:User

Linux作為一個開源、穩健的作業系統,支援多種平台,擁有豐富的開發工具和應用軟體,尤其是其核心可裁減的特性,非常適合嵌入式系統。在資料即時性、準確度要求很高的情況下,系統在對資料的採集和處理過程中,由於其進程協調性問題,往往會造成資料的丟失。利用經典進程同步模型,可解決嵌入式Linux系統中資料同步讀寫衝突的問題。

       引言

        在對即時採集更新的資料進行處理時,往往會遇到資料更新速度與資料處理的速度不匹配的問題。這種情況下,會出現資料丟失而導致資料處理結果不準確,甚至會帶來不可預測的後果,因此需要一種機制來協調資料更新與資料處理,從而保證資料的完整性和處理結果的準確性。作為一個多任務、多使用者作業系統,Linux支援多個進程在系統中並發運行,由於進程本身的動態特性,用來描述即時資料處理非常合適,因此,解決好Linux進程間的同步與通訊問題就能解決即時資料處理的問題。

        在Linux環境下,進程通常存在運行(running)、阻塞(blocked)、就緒(ready)、終止(terminated)四種狀態。當多個進程並發執行時,往往會出現進程間的競態。我們希望進程能協調彼此間的行為,使得一個進程只有在其他的進程執行到一個特定的點時才會執行一個動作,即控制同步;同時,當並發進程訪問共用資料時不應當出現競爭條件。這一點通過在訪問共用資料時執行互斥來確保,即資料訪問同步。

        實現同步的基本技術是阻塞一個進程,直到一個特定條件滿足為止;實現資料訪問同步是通過阻塞一個進程直到另外的進程完成訪問共用資料。

        1 有限長度緩衝區的生產者一消費者問題模型

       當僅存在單個生產者和消費者時,生產進程和消費進程所對應的是同樣的資料結構,它們共用同一個資料空間。生產進程和消費進程如何進行相互協調,使得消費進程每次使用的資料都是生產進程新生產寫人的,又使生產進程新寫入的資料不會覆蓋還未被消費進程讀出使用的資料,是該問題模型實現的關鍵問題。

       在生產者一消費者問題模型中,生產者進程不斷生產產品並把它們放入緩衝區,消費者進程不斷從緩衝區中取走產品進行消費。當緩衝區中產品已經放滿時,表示生產速度高於消費速度,出現了供過於求,此時生產者必須等待產品被消費;當緩衝區為空白時,表示消費速度高於生產速度,出現了供不應求,此時消費者進程必須等待產品的生產。生產和消費的進程必須達到同步運行,才能實現供需平衡。

        處理讀寫同步的兩種常見的策略被稱為“強讀者同步(strongreadersynchronization)”和“強寫者同步(strongwritersynchronization)”。在強讀者同步中,總是給讀者以優先權,只要寫者當前沒有進行寫操作,讀者就可以獲得訪問權;在強寫者同步中,寫者總是獲得優先權,只要強讀者當前沒有進行讀操作,寫者就可以獲得訪問權。而生產者消費者同步與單純的讀寫同步又有不同,消費者可以通過訪問資源對資源進行刪除或銷毀。

        一個有限長度緩衝區的生產者消費者問題模型,是由若干生產者和消費者進程以及一個有限的緩衝池構成的。每個緩衝區能夠儲存一個資訊記錄,一個生產者一次生產一個資訊記錄。產生一個記錄之後,等待單獨進入一個空的緩衝區後將記錄寫入緩衝區。一個消費者進程一次消費一個資訊記錄。當它需要消費時,它等待單獨進入一個滿的緩衝區後將記錄讀出。

        通過上面的描述可以得出,解決生產者一消費者問題模型的方案需要滿足以下幾個條件:

    ·生產者不應覆蓋一個滿的緩衝區;

    ·消費者不應使用一個空的緩衝區;

    ·生產者和消費者應按互斥方式訪問資料緩衝區;

    ·資料必須按照先進先出(FIFO)方式;

    ·不能出現忙等待。

        必須避免資料寫進程不斷、反覆地檢查緩衝區直到找到一個空緩衝區為止,而讀進程也必須避免不斷檢查直到找到一個滿緩衝區為止。這相當於系統內部產生忙等待,是在僅使用臨界段(CS)演算法實現進程同步時難以避免的問題。

        針對問題模型解決方案的限制條件,採用訊號量方式解決即時更新資料處理的進程同步問題,即上述的生產者一消費者問題模型。

       訊號量是一個非負值的共用整數值,只能用於初始化和不可分操作。不可分操作是指在對一個資料D進行操作時不能與任何其他對D的操作重疊的操作。定義操作P和V為不可分操作。P和V的不可分性意味著這些操作不能並發執行,避免了對訊號量的競爭條件。定義P和V的操作語義為: 

   

       由上述定義的語義看,對一個訊號量S的操作,P和V為改變S的值,或者掛起或喚醒一個對S進行P操作的進程。被掛起的進程為阻塞狀態,因而避免了忙等待問題。一個二進位的訊號量只取0和1,用來實現互斥。

        在P和V操作中,對進程的阻塞和喚醒需要作業系統的進程管理組件的參與,因此訊號量會被作業系統實現而不是應用程式實現。

       生產者一消費者問題模型描述:    

         2 結構設計

        對於有限緩衝區的生產者消費者問題模型的執行包括以下組件:共用資料一緩衝區組、操作一緩衝區的訪問、進程一生產者消費者。

       在生產者一消費者同步中,由生產者建立資源,與單純的讀程式不同,消費者可以通過訪問資源,將資源刪除或銷毀。由於生產者進程和消費者進程共用一個緩衝區,因此在插入和刪除條目時必須同步。實現中必須避免表l所列的同步異常問題。 

    

        生產者一消費者問題的傳統的訊號量解決方案使用了2個訊號量,分別用來表示緩衝區中的條目數和空閑槽的數目。當進程需要特定類型的資源時,它可以通過函數調用對相應的訊號量進行減量操作;同樣,當進程釋放資源時,它可以通過函數調用來對相應的訊號量進行增量操作。由於訊號量永遠不會降到零以下,所以進程不能使用不存在的資源。因此,始終將計數訊號量初始化為開始時可用的資源數。

        定義迴圈隊列緩衝區存放待處理資料,控制台資料處理進程從該迴圈隊列緩衝區中消費資料,並將該資料存放區位標記為“廢棄”。資料擷取寫進程僅能將資料存放於標記為“廢棄”的迴圈隊列緩衝區中,1所示。

     

        在沒有多個生產者或消費者的情況下,如果仔細實現,迴圈緩衝區就不需要鎖。生產者是唯一允許修改寫入索引以及該索引指向的數組位置的進程。只要寫入者在更新寫入索引之前將新的值儲存到緩衝區,則讀取者將始終看到一致的資料結構;同時,讀取者是唯一可以訪問讀取索引以及該索引指向位置的資料的進程。只要確保兩個指標不要互相重疊,生產者和消費者可以在無竟態的情況下訪問該緩衝區,2所示。

     

        對於只有單個生產者和消費者,通過使用修正的使用訊號量方式的生產者一消費者問題模型解決方案來實現。   

  

        以上用訊號量方式解決了優先緩衝區問題,訊號量“empty”和“full”的值分別指示空和滿的緩衝區的數量,3所示。緩衝區指標i和j用來確保緩衝區按先進先出的順序提供並使用。只要系統中存在一些滿的和空的緩衝區,資料更新進程和資料處理進程就能無競態並發執行。筆者在ARM嵌入式平台HHARM2410-R5上按照上述方案成功實現了用例測試。   

  

        3 討論

       以上的結構設計,將生產者與消費者分別簡化為一個。當存在多個生產者和消費者的情況時,可以上述修正的解決方案為基礎,設計多個計數器來統計並行讀者(reader)、並行寫者(writer)、讀者或待讀者(pre_reader)、寫者或待寫者(pre_writer)的數量。計數器的值在進程中的相應位置進行增減。讀者和寫者在被允許閱讀和寫入之前必須被阻塞,這可以通過P操作來完成。當讀者或寫者在進程被阻塞時控制開始閱讀或書寫的條件並未滿足。這些條件隨著任意一個計數器值的變化而改變,所以,進程在完成閱讀或書寫後必須執行相應的V操作。

        在實行多讀、多寫進程同步解決方案時,必須要避免不同計數器的競爭條件

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.