管道的原子性

2021-09-21 05:55:36 字數 1072 閱讀 4545

從本質上說,管道也是一種檔案,但他又和一般的檔案有所不同,管道可以克服使用檔案進行通訊的兩個問題

限制管道的大小。實際上,管道是乙個固定大小的緩衝區。在linux中該換沖區的大小為一頁,4k

使得他的大小不像檔案那樣不加檢驗的增長。使用固定緩衝區也會帶來問題,比如再寫管道時可能變滿

當這種情況發生時,隨後對管道的write()呼叫被阻塞,等待某些資料被讀取,以便騰出足夠的空間供

write()呼叫。

讀取工作也可能比寫的程序快。當所有程序的資料被讀取完時,乙個隨後的read()呼叫將預設的被阻塞、

管道變空。這種情況發生時,乙個隨後的read()呼叫將被預設的阻塞,等待某些資料被寫入,這樣就解決了read()

呼叫將被預設的阻塞,等待某些資料將被寫入,這解決了read()呼叫返回檔案結束的問題。

乙個管道的容量是有限的。posix規定,少於 pipe_buf 的寫操作必須原子完成:要寫的資料應被連續的寫到管道;大於 pipe_buf 的寫操作可能是非原子的: 核心可能會把此資料與其它程序的對此管道的寫操作交替起來。posix規定pipe_buf至少為512b(linux中為4096b),具體的語義如下: 其中n為要寫的位元組數

n <= pipe_buf, o_nonblock無效:原子的寫入n個位元組。如果管道當前的剩餘空間不足以立即寫入n個位元組,就阻塞直到有足夠的空間。

n <= pipe_buf, o_nonblock有效:寫入具有原子性,如果有足夠的空間寫入n個位元組,write立即成功返回。否則乙個都不寫入,返回錯誤,並設定errno為eagain。

n > pipe_buf, o_nonblock無效:非原子寫。可能會和其它的寫程序交替寫。write阻塞直到將n個位元組寫入管道。

n > pipe_buf, o_nonblock有效:如果管道滿,則write失敗,返回錯誤,並將errno設定為 eagin。如果不滿,則返回寫入的位元組數為1~n,即部分寫入,寫入時可能有其他程序穿插寫入。

結論:1、當要寫入的資料量不大於pipe_buf時,linux將保證寫入的原子性。

2、當要寫入的資料量大於pipe_buf時,linux將不再保證寫入的原子性。

原子性,原子操作

舉個例子 a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 從a的帳戶中減去1000塊錢。如果a的帳戶原來有3000塊錢,現在就變成2000塊錢了。在b的帳戶裡加1000塊錢。如果b的帳戶如果原來有2000塊錢,現在...

mysql原子性 MySQL事務的原子性

一 事務的acid特性 1 原子性 2 一致性 3 隔離性 4 永續性 二 對於事務的原子性 a 我們知道事務中的操作要麼都做要麼都不做。對於這一點許多人有錯誤的理解,我們來看乙個例子 1 mysql select from t4 id name 1 a 2 b 3 c 3 rows in set ...

原子性atomic與非原子性natomic

原子操作是不可分割的操作,在原子操作執行完畢之前,其不會被任何其它任務或事件中斷。在單處理器系統 uniprocessor 中,能夠在單條指令中完成的操作都可以認為是 原子操作 因為中斷只能發生於指令之間。某些cpu指令系統中引入了test and set test and clear等指令產生臨界...