成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux命令之write調用的原子性

運維 系統運維
linuxman手冊頁中關于write調用的說明很不詳細,并未說明寫操作是否是原子的,所以我們有必要查找SingleUNIXSpecification(SUS)對write調用的說明,在SUS中對此調用的說明還是比較詳細的。在繼續討論之前我們需要清楚內核在寫文件之前會對該文件加鎖,不管是否成功完成寫操作,在返回之前都會解鎖。

linux命令是對Linux系統進行管理的命令。本文介紹的關于linux命令中write調用的原子性的詳細描述,具體內容如下所述。

UNIX環境高級編程中關于原子操作的介紹,其中有一種情形是在文件尾端添加數據。

文中說,如果多個進程都需要將數據添加到某一文件,那么為了保證定位和寫數據這兩步是一個原子操作,需要在打開文件時設置O_APPEND標志,看到這里我們就會想,雖然保證了定位和寫數據是一個原子操作,但是是否能夠保證多個進程或線程寫入的數據不會交錯呢,比如A進程調用write(filedes1,"AAA",3),B進程調用write(filedes2,"BBBB",4)(其中filedes1和filedes2指向同一個文件),但是***文件中的數據是否有可能是AABBBAB,如果這個文件是一個管道或socket呢。

linuxman手冊頁中關于write調用的說明很不詳細,并未說明寫操作是否是原子的,所以我們有必要查找SingleUNIXSpecification(SUS)對write調用的說明,在SUS中對此調用的說明還是比較詳細的。在繼續討論之前我們需要清楚內核在寫文件之前會對該文件加鎖,不管是否成功完成寫操作,在返回之前都會解鎖。

下面我們就以三種常見的文件根據SUS標準來討論上面提出的這個問題:

1.普通文件

SUS中也沒有說明在寫普通文件時是否會保證是原子操作,但是它說明了write調用可能并不能完全把我們需要寫入的數據寫到文件中去,那么什么情況下可能少寫數據呢?

SUS說明了兩種情況:磁盤已滿或則要寫入的文件的大小超過了當前進程的文件大小限制。其實至少還有一種情況,那就是內核中的高速緩存不夠用的時候,比如linux內核在發現高速緩存不夠用的時候就只寫入實際能夠容下的數據然后返回。正是由于存在上述***一種情況,所以說按照APUE那種方法在linux下面寫文件并不能保證我們的數據不會交錯(不過我們可以根據write的返回值得知是否有發生交錯的可能)。

其它的unix內核可能會在實現上不同于linux內核,他們可能在寫之前就判斷一下緩沖區是否足夠容納所有數據,如果是這種情況,寫操作應該就是原子的;也可能寫了一部分數據后才發現緩沖區不夠用并讓當前進程進入睡眠狀態,此時內核如果解鎖,那么在當前進程睡眠期間其它進程可能寫了數據,如果不解鎖,那么就是原子操作,其他進程不可能在這個時候寫入數據。由上面的分析可知,正是由于SUS標準不太完整的標準,我們不能確定一定可以按APUE的方法來同時向同一個普通文件寫數據。

如果我們非要在同一個文件中記錄多個進程產生的數據,我們***采用unix日志系統采用的方法,用一個專用進程處理文件IO,其它進程把需要寫的數據發送給這個專用進程,這樣應該比多個進程同時寫一個文件可靠和高效。

2.管道

SUS對管道的寫操作說得更多也更明確,我們只需遵照其標準就可以了。對于write(pipefd,buf,nbyte),其要點如下:

如果nbyte<=PIPE_BUF,不管O_NONBLOCK是否設置,其寫操作都是原子的,就是說多個進程都在此條件下同時寫同一個管道不會引起數據交錯。

如果nbyte>PIPE_BUF,是不能保證寫操作是原子的,寫入的數據可能與其他進程寫入的數據交錯。

3.socket

SUS中對于寫socket并沒有說很多,我們無法從標準中得知write是否保證寫操作的原子性。我看了一下linux2.6.14內核關于tcp數據的寫操作,發現它不是原子的,也從網上查到了這部分代碼的作者(們)對這個問題的看法,他(們)認為對一個可能***阻塞的操作保證原子性是錯誤的。我們也只能姑且這么認為了。

補充:

對于用UNIX日志系統服務器的方法,連接端必須每個線程connect一次logsvr,這樣才能保證發過來的日志數據不互相錯亂,保證原子性;此時logsvr只要用reactor方法來處理每個線程的連接就好,把這些fd放到隊列里輪流處理,寫文件,也保證了寫文件的原子性。

實際上日志服務器一般都是用UDP來完成的。

總結:

希望本文介紹的Linux命令中write調用的原子性的內容能夠對讀者有所幫助,更多有關linux系統的知識還有待于讀者去探索和學習。

【編輯推薦】

  1. Linux內核級虛擬環境簡介
  2. Linux二十年歷程:昨天與今天
  3. Linux命令行configure參數介紹
  4. Linux系統中如何進行網絡校時?
  5. linux服務器中的三個內核文件簡介
責任編輯:韓亞珊 來源: 建站學
相關推薦

2023-01-05 12:30:32

Redis

2021-07-03 17:44:34

并發高并發原子性

2021-06-03 14:00:35

PolarDB

2021-06-02 16:30:33

PolarDB原子性數據庫

2012-05-23 12:49:58

Java自增操作原子性

2010-03-18 17:00:57

Linux命令

2021-11-24 09:55:56

Linuxnohup命令

2021-09-07 12:27:34

Linuxchmod命令

2012-05-10 08:46:05

Linuxsort命令

2012-05-10 08:37:54

Linuxxargs

2012-05-11 10:07:55

Linuxfind

2021-05-16 17:14:30

線程安全性

2021-01-12 07:39:48

線程線程安全

2021-09-22 12:56:19

編程技能Golang

2019-02-27 09:28:15

Redis服務器事務

2024-03-18 11:24:54

2009-07-31 16:14:27

linux cd命令Linux基本命令

2010-03-18 16:38:39

Linux命令

2009-10-22 10:59:29

linux磁盤命令

2009-10-22 11:36:31

linux磁盤管理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品欧美一区二区三区久久久 | 视频一区二区在线观看 | 欧美性jizz18性欧美 | www.色53色.com| 免费视频一区二区 | 日韩av大片免费看 | 欧美美乳 | 一区二区三区成人 | 国产偷久久一级精品60部 | 日韩在线看片 | av一区二区三区在线观看 | 91精品在线播放 | 成人一区二区在线 | 免费久久精品 | 成人一区二区三区视频 | 欧美日韩视频在线播放 | 蜜桃日韩 | 在线播放中文字幕 | 欧美日韩亚洲一区 | 亚洲va欧美va天堂v国产综合 | 免费毛片网站在线观看 | 伊人电影院av | 国色天香成人网 | 在线观看黄色大片 | 国产成人一区二区三区 | 一区二区三区久久 | 精国产品一区二区三区 | 五月天天丁香婷婷在线中 | 99精品国产一区二区青青牛奶 | 日韩在线视频免费观看 | 99久久国产精 | 国产精品久久久久久久久久久新郎 | 99精品免费久久久久久久久日本 | 亚洲一区二区三区在线 | 亚洲一区二区精品视频 | 国产精品久久欧美久久一区 | 中文字幕高清免费日韩视频在线 | 日韩精品激情 | 91视视频在线观看入口直接观看 | 女同久久另类99精品国产 | 在线免费黄色小视频 |