當前位置:首頁 » 操作系統 » linuxclosewait

linuxclosewait

發布時間: 2024-12-07 03:22:30

1. linux信號量

信號量是包含一個非負整數型的變數,並且帶有兩個原子操作wait和signal。Wait還可以被稱為down、P或lock,signal還可以被稱為up、V、unlock或post。在UNIX的API中(POSIX標准)用的是wait和post。

對於wait操作,如果信號量的非負整形變數S大於0,wait就將其減1,如果S等於0,wait就將調用線程阻塞;對於post操作,如果有線程在信號量上阻塞(此時S等於0),post就會解除對某個等待線程的阻塞,使其從wait中返回,如果沒有線程阻塞在信號量上,post就將S加1.

由此可見,S可以被理解為一種資源的數量,信號量即是通過控制這種資源的分配來實現互斥和同步的。如果把S設為1,那麼信號量即可使多線程並發運行。另外,信號量不僅允許使用者申請和釋放資源,而且還允許使用者創造資源,這就賦予了信號量實現同步的功能。可見信號量的功能要比互斥量豐富許多。

POSIX信號量是一個sem_t類型的變數,但POSIX有兩種信號量的實現機制: 無名信號量 命名信號量 。無名信號量只可以在共享內存的情況下,比如實現進程中各個線程之間的互斥和同步,因此無名信號量也被稱作基於內存的信號量;命名信號量通常用於不共享內存的情況下,比如進程間通信。

同時,在創建信號量時,根據信號量取值的不同,POSIX信號量還可以分為:

下面是POSIX信號量函數介面:

信號量的函數都以sem_開頭,線程中使用的基本信號函數有4個,他們都聲明在頭文件semaphore.h中,該頭文件定義了用於信號量操作的sem_t類型:

【sem_init函數】:

該函數用於創建信號量,原型如下:

該函數初始化由sem指向的信號對象,設置它的共享選項,並給它一個初始的整數值。pshared控制信號量的類型,如果其值為0,就表示信號量是當前進程的局部信號量,否則信號量就可以在多個進程間共享,value為sem的初始值。

該函數調用成功返回0,失敗返回-1。

【sem_destroy函數】:

該函數用於對用完的信號量進行清理,其原型如下:

成功返回0,失敗返回-1。

【sem_wait函數】:

該函數用於以原子操作的方式將信號量的值減1。原子操作就是,如果兩個線程企圖同時給一個信號量加1或減1,它們之間不會互相干擾。其原型如下:

sem指向的對象是sem_init調用初始化的信號量。調用成功返回0,失敗返回-1。

sem_trywait()則是sem_wait()的非阻塞版本,當條件不滿足時(信號量為0時),該函數直接返回EAGAIN錯誤而不會阻塞等待。

sem_timedwait()功能與sem_wait()類似,只是在指定的abs_timeout時間內等待,超過時間則直接返回ETIMEDOUT錯誤。

【sem_post函數】:

該函數用於以原子操作的方式將信號量的值加1,其原型如下:

與sem_wait一樣,sem指向的對象是由sem_init調用初始化的信號量。調用成功時返回0,失敗返回-1。

【sem_getvalue函數】:

該函數返回當前信號量的值,通過restrict輸出參數返回。如果當前信號量已經上鎖(即同步對象不可用),那麼返回值為0,或為負數,其絕對值就是等待該信號量解鎖的線程數。

【實例1】:

【實例2】:

之所以稱為命名信號量,是因為它有一個名字、一個用戶ID、一個組ID和許可權。這些是提供給不共享內存的那些進程使用命名信號量的介面。命名信號量的名字是一個遵守路徑名構造規則的字元串。

【sem_open函數】:

該函數用於創建或打開一個命名信號量,其原型如下:

參數name是一個標識信號量的字元串。參數oflag用來確定是創建信號量還是連接已有的信號量。

oflag的參數可以為0,O_CREAT或O_EXCL:如果為0,表示打開一個已存在的信號量;如果為O_CREAT,表示如果信號量不存在就創建一個信號量,如果存在則打開被返回,此時mode和value都需要指定;如果為O_CREAT|O_EXCL,表示如果信號量存在則返回錯誤。

mode參數用於創建信號量時指定信號量的許可權位,和open函數一樣,包括:S_IRUSR、S_IWUSR、S_IRGRP、S_IWGRP、S_IROTH、S_IWOTH。

value表示創建信號量時,信號量的初始值。

【sem_close函數】:

該函數用於關閉命名信號量:

單個程序可以用sem_close函數關閉命名信號量,但是這樣做並不能將信號量從系統中刪除,因為命名信號量在單個程序執行之外是具有持久性的。當進程調用_exit、exit、exec或從main返回時,進程打開的命名信號量同樣會被關閉。

【sem_unlink函數】:

sem_unlink函數用於在所有進程關閉了命名信號量之後,將信號量從系統中刪除:

【信號量操作函數】:

與無名信號量一樣,操作信號量的函數如下:

命名信號量是隨內核持續的。當命名信號量創建後,即使當前沒有進程打開某個信號量,它的值依然保持,直到內核重新自舉或調用sem_unlink()刪除該信號量。

無名信號量的持續性要根據信號量在內存中的位置確定:

很多時候信號量、互斥量和條件變數都可以在某種應用中使用,那這三者的差異有哪些呢?下面列出了這三者之間的差異:

2. linux timewait比較多會有什麼問題

如果是做 server, 有可能會 socket耗盡

如果不是 server 那沒影響.

timewait 狀態表示對端已經發送 close, 而自己還沒有給對方響應, 在 4 分鍾後會釋放.

3. linux 下查看網路負載命令

用 netstat 查看 Linux 網路狀況。
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
前面的 netstat -n是netstat的命令,Windows和Linux都可以用,結果顯示內容差不多
後面的 awk'/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 是Linux下的命令,主要作用是對netstat輸出的結果進行過濾和處理:
運行這一句之後,顯示的結果類似如下:
TIME_WAIT 27
FIN_WAIT1 435
FIN_WAIT2 89
ESTABLISHED 82
SYN_RECV 64
CLOSING 4
LAST_ACK 90
內容解釋如下:
TIME-WAIT:等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認
FIN-WAIT-1:等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認
FIN-WAIT-2:從遠程TCP等待連接中斷請求
ESTABLISHED:代表一個打開的連接
SYN-RECV:再收到和發送一個連接請求後等待對方對連接請求的確認
SYN-SENT:再發送連接請求後等待匹配的連接請求
CLOSING:等待遠程TCP對連接中斷的確認
CLOSED:沒有任何連接狀態
CLOSE-WAIT:等待從本地用戶發來的連接中斷請求
LAST-ACK:等待原來的發向遠程TCP的連接中斷請求的確認
LISTEN:偵聽來自遠方的TCP埠的連接請求

4. linux python socket怎麼去除

原因是server端關掉了tcp連接,給client發送FIN信號,client的tcp層回了ACK,然後它的socket狀態就處於close_wait狀態。

實驗:

Python中,socket在send之前處於close_wait狀態,那麼該send不會報錯,並且執行完之後socket就closed了。再繼續調用send就會報錯。


推理:

說明python的socket.send在發送數據之前會檢查socket的狀態,如果處於close_wait,就執行close(socket)(應用層感覺不到哦),然後正常退出。所以再次send時,會拋出異常。


為什麼會一直處close_wait狀態?

當socket處於close_wait時,必須由應用層調用close(socket),發送FIN給server端才能變為LAST_ACK,接收到server端回應的ACK後,才變為CLOSED。如果應用層不調用close(),那麼socket會一直處於close_wait。[1]


如果我在python中不斷循環去調用socket.sendall(),那麼在socket變為close_wait後,通過socket.sendall()也會關閉socket,為什麼它還是一直處在close_wait狀態呢?

原因在於當sendall(data)的data比較大,在data被發送一半時,連接被server端斷掉了。那麼sendall(data)會一直卡在那,也就不會執行到sendall的開始處,去判斷socket狀態,確定是否關閉socket了。

簡單而言,就是socket在變為close_wait之後,根本沒有調用sendall()去關閉socket。


5. LINUX中此程序運行後,為何刷新不出命令提示符

很遺憾,在我的centos6測試系統中,輸入你的程序編譯運行後,會直接顯示命令行提示符,不需要回車一下。

我認為這種情況是由於shell處理子進程的方式不同而引起的,研究這種原因大部分時間不如研究茴香豆的茴字有幾種寫法有意義。

如過你想找到原因,我認為可以在你的環境裡面,逐步的刪除你程序中一些不影響結果的行,然後調整運行方式(比如說,不要用close,不要wait等)再試試看吧

熱點內容
搭建郵件伺服器的方法 發布:2024-12-23 12:27:27 瀏覽:430
資料庫說明文檔 發布:2024-12-23 12:22:12 瀏覽:620
安卓手機玩mc卡怎麼辦 發布:2024-12-23 12:15:46 瀏覽:5
mt編譯時出現錯誤信息 發布:2024-12-23 12:15:45 瀏覽:107
雙存儲冗餘 發布:2024-12-23 12:09:16 瀏覽:664
解壓縮太慢 發布:2024-12-23 12:08:36 瀏覽:535
linux恢復誤刪文件 發布:2024-12-23 11:59:36 瀏覽:493
平板電腦賬號登錄伺服器錯誤 發布:2024-12-23 11:41:07 瀏覽:99
金蝶kis專業版資料庫表 發布:2024-12-23 11:35:41 瀏覽:602
相冊已經加密如何改密碼 發布:2024-12-23 11:32:20 瀏覽:277