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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程进程通信

發(fā)布時間:2024/9/30 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程进程通信 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://www.cnblogs.com/memewry/archive/2012/08/22/2651696.html

一、進程/線程間同步機制。

臨界區(qū)、互斥區(qū)、事件、信號量四種方式
臨界區(qū)(Critical Section)、互斥量(Mutex)、信號量(Semaphore)、事件(Event)的區(qū)別
1、臨界區(qū):通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數(shù)據(jù)訪問。在任意時刻只允許一個線程對共享資源進行訪問,如果有多個線程試圖訪問公共資源,那么在有一個線程進入后,其他試圖訪問公共資源的線程將被掛起,并一直等到進入臨界區(qū)的線程離開,臨界區(qū)在被釋放后,其他線程才可以搶占。
2、互斥量:采用互斥對象機制。 只有擁有互斥對象的線程才有訪問公共資源的權限,因為互斥對象只有一個,所以能保證公共資源不會同時被多個線程訪問。互斥不僅能實現(xiàn)同一應用程序的公共資源安全共享,還能實現(xiàn)不同應用程序的公共資源安全共享 .互斥量比臨界區(qū)復雜。因為使用互斥不僅僅能夠在同一應用程序不同線程中實現(xiàn)資源的安全共享,而且可以在不同應用程序的線程之間實現(xiàn)對資源的安全共享。
3、信號量:它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數(shù)目 .信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時使用共享資源,這與操作系統(tǒng)中的PV操作相同。它指出了同時訪問共享資源的線程最大數(shù)目。它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數(shù)目。

PV操作及信號量的概念都是由荷蘭科學家E.W.Dijkstra提出的。信號量S是一個整數(shù),S大于等于零時代表可供并發(fā)進程使用的資源實體數(shù),但S小于零時則表示正在等待使用共享資源的進程數(shù)。
   P操作申請資源:
  (1)S減1;
  (2)若S減1后仍大于等于零,則進程繼續(xù)執(zhí)行;
  (3)若S減1后小于零,則該進程被阻塞后進入與該信號相對應的隊列中,然后轉(zhuǎn)入進程調(diào)度。
  
  V操作 釋放資源:
  (1)S加1;
  (2)若相加結(jié)果大于零,則進程繼續(xù)執(zhí)行;
  (3)若相加結(jié)果小于等于零,則從該信號的等待隊列中喚醒一個等待進程,然后再返回原進程繼續(xù)執(zhí)行或轉(zhuǎn)入進程調(diào)度。
4、事 件: 通過通知操作的方式來保持線程的同步,還可以方便實現(xiàn)對多個線程的優(yōu)先級比較的操作 .

?

總結(jié):
  1. 互斥量與臨界區(qū)的作用非常相似,但互斥量是可以命名的,也就是說它可以跨越進程使用。所以創(chuàng)建互斥量需要的資源更多,所以如果只為了在進程內(nèi)部是用的話使用臨界區(qū)會帶來速度上的優(yōu)勢并能夠減少資源占用量。因為互斥量是跨進程的互斥量一旦被創(chuàng)建,就可以通過名字打開它。
  2. 互斥量(Mutex),信號燈(Semaphore),事件(Event)都可以被跨越進程使用來進行同步數(shù)據(jù)操作,而其他的對象與數(shù)據(jù)同步操作無關,但對于進程和線程來講,如果進程和線程在運行狀態(tài)則為無信號狀態(tài),在退出后為有信號狀態(tài)。所以可以使用WaitForSingleObject來等待進程和線程退出。
  3. 通過互斥量可以指定資源被獨占的方式使用,但如果有下面一種情況通過互斥量就無法處理,比如現(xiàn)在一位用戶購買了一份三個并發(fā)訪問許可的數(shù)據(jù)庫系統(tǒng),可以根據(jù)用戶購買的訪問許可數(shù)量來決定有多少個線程/進程能同時進行數(shù)據(jù)庫操作,這時候如果利用互斥量就沒有辦法完成這個要求,信號燈對象可以說是一種資源計數(shù)器。

?

二、進程間通信方式

由于比較容易混淆,我們把進程間通信方法也列在這里做比較。

程間通信就是在不同進程之間傳播或交換信息,那么不同進程之間存在著什么雙方都可以訪問的介質(zhì)呢?進程的用戶空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享內(nèi)存區(qū)。但是,系統(tǒng)空間卻是“公共場所”,所以內(nèi)核顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩個進程當然也可以通過磁盤上的普通文件交換信息,或者通過“注冊表”或其它數(shù)據(jù)庫中的某些表項和記錄交換信息。廣義上這也是進程間通信的手段,但是一般都不把這算作“進程間通信”。因為那些通信手段的效率太低了,而人們對進程間通信的要求是要有一定的實時性。

  進程間通信主要包括管道, 系統(tǒng)IPC(包括消息隊列,信號量,共享存儲), SOCKET.

????管道分為有名管道和無名管道,無名管道只能用于親屬進程之間的通信,而有名管道則可用于無親屬關系的進程之間。

????消息隊列用于運行于同一臺機器上的進程間通信,與管道相似;

共享內(nèi)存通常由一個進程創(chuàng)建,其余進程對這塊內(nèi)存區(qū)進行讀寫。得到共享內(nèi)存有兩種方式:映射/dev/mem設備和內(nèi)存映像文件。前一種方式不給系統(tǒng)帶來額外的開銷,但在現(xiàn)實中并不常用,因為它控制存取的是實際的物理內(nèi)存;

?????本質(zhì)上,信號量是一個計數(shù)器,它用來記錄對某個資源(如共享內(nèi)存)的存取狀況。一般說來,為了獲得共享資源,進程需要執(zhí)行下列操作:

  (1)測試控制該資源的信號量;

  (2)若此信號量的值為正,則允許進行使用該資源,進程將進號量減1;

  (3)若此信號量為0,則該資源目前不可用,進程進入睡眠狀態(tài),直至信號量值大于0,進程被喚醒,轉(zhuǎn)入步驟(1);

  (4)當進程不再使用一個信號量控制的資源時,信號量值加1,如果此時有進程正在睡眠等待此信號量,則喚醒此進程。
????套接字通信并不為Linux所專有,在所有提供了TCP/IP協(xié)議棧的操作系統(tǒng)中幾乎都提供了socket,而所有這樣操作系統(tǒng),對套接字的編程方法幾乎是完全一樣的

?

三、進程/線程同步機制與進程間通信機制比較

很明顯2者有類似,但是差別很大

線程同步主要是臨界區(qū)、互斥、信號量、事件

進程間通信是管道、內(nèi)存共享、消息隊列、信號量、socket

共通之處是,信號量和消息(事件)

?

其他資料:

進程間通訊(IPC)方法主要有以下幾種:???
??? 管道/FIFO/共享內(nèi)存/消息隊列/信號???

1.管道中還有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子進程通訊,命名管道可用于非父子進程,命名管道就是FIFO,管道是先進先出的通訊方式 ? ?

2.消息隊列是用于兩個進程之間的通訊,首先在一個進程中創(chuàng)建一個消息隊列,然后再往消息隊列中寫數(shù)據(jù),而另一個進程則從那個消息隊列中取數(shù)據(jù)。需要注意的是,消息隊列是用創(chuàng)建文件的方式建立的,如果一個進程向某個消息隊列中寫入了數(shù)據(jù)之后,另一個進程并沒有取出數(shù)據(jù),即使向消息隊列中寫數(shù)據(jù)的進程已經(jīng)結(jié)束,保存在消息隊列中的數(shù)據(jù)并沒有消失,也就是說下次再從這個消息隊列讀數(shù)據(jù)的時候,就是上次的數(shù)據(jù)!!!! ? ?

3.信號量,它與WINDOWS下的信號量是一樣的,所以就不用多說了 ? ?

4.共享內(nèi)存,類似于WINDOWS下的DLL中的共享變量,但LINUX下的共享內(nèi)存區(qū)不需要像DLL這樣的東西,只要首先創(chuàng)建一個共享內(nèi)存區(qū),其它進程按照一定的步驟就能訪問到這個共享內(nèi)存區(qū)中的數(shù)據(jù),當然可讀可寫 ? ? ?

以上幾種方式的比較: ? ?

1.管道:速度慢,容量有限,只有父子進程能通訊 ? ?

2.FIFO:任何進程間都能通訊,但速度慢 ? ?

3.消息隊列:容量受到系統(tǒng)限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數(shù)據(jù)的問題?? ?

4.信號量:不能傳遞復雜消息,只能用來同步 ? ?

5.共享內(nèi)存區(qū):能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當于線程中的線程安全,當然,共享內(nèi)存區(qū)同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經(jīng)共享了同一進程內(nèi)的一塊內(nèi)存

總結(jié)

以上是生活随笔為你收集整理的线程进程通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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