訊號是由、系統或者程序傳送給目標程序的資訊,以通知目標程序某個狀態的改變或系統異常。
linux訊號可以由如下條件產生:
1、對於前台程序,使用者可以通過輸入特殊的終端字元來給它傳送訊號。比如輸入ctrl+c通常或給程序傳送乙個中斷訊號
2、系統異常。比如浮點異常和非法記憶體段訪問。
3、系統狀態變化
4、執行kill命令或呼叫kill函式
1)改變訊號響應方式signal()
預設的訊號響應方式: sig_dfl
忽略:sig_ign
自定義:fun
2)傳送訊號kill
int kill(pid_t pid,int sig);
該函式把訊號sig傳送給目標程序:目標程序由pid引數指定。該函式成功時返回0,失敗則返回-1 並設定errno其可能的取值及含義如下:
linux定義的訊號值都大於0,如果sig取值為0,則kill函式不傳送任何訊號。但將sig設定為0可以用來檢測目標程序或者程序組是否存在,因為檢查工作總是在訊號傳送之前就執行。不過這種檢測方式是不可靠的。
kill pid 15號結束程序(ctrcl+c)
9號不允許改變響應方式
3)訊號的實現
訊號在核心的實現是通過兩個資料結構來實現的,乙個32位 的長整型變數,和乙個結構體陣列(可以認為是一張表)陣列有32個元素,每個元素記錄乙個訊號響應方式
linux使用資料結構sigset_t來表示一組訊號。sigset_t實際上是乙個長整型陣列,陣列的每個元素的每個位表示乙個訊號。這種定義方式和檔案描述符集fd_set類似。
設定程序訊號掩碼後,被遮蔽的訊號將不能被程序接收。如果給程序傳送乙個被遮蔽的訊號,則作業系統將該訊號設定為程序的乙個被掛起的訊號。如果我們取消對被掛起訊號的遮蔽,則它能立即被程序接收到。
當多個程序同時訪問系統上的某個資源的時候,比如同時寫乙個資料庫的某條記錄,或者同時修改某個檔案,就需要考慮程序的同步問題,以確保任意時刻只有乙個程序可以擁有對資源的獨佔式訪問。通常,程式對共享資源的訪問的**只是很短的一段,但就是這一段**引發了程序之間的競態條件。我們稱這段**為關鍵**段,或者臨界區。對程序同步,也就是要確保任一時刻只有乙個程序能進入關鍵**段。訊號量是併發程式設計領域邁出的重要一步。
訊號量是一種特殊的變數,它只能取自然數值並且只支援兩種操作:等待(wait)和訊號(signal)不過在linux/unix中,「等待」和「訊號」都已經具有特殊的含義,所以對訊號量的這兩種操作更常用的稱呼是p(原子-1 代表獲取資源)、v(原子+1 代表釋放資源)操作
臨界資源:同一時刻只允許乙個程序或者執行緒訪問的資源
臨界區:訪問臨界資源的**段。
原子操作實現:保證執行時不會被打斷利用
訊號量和鎖的區別:當使用二值訊號量並且訊號量的初始值為1時能和互斥鎖互換。
執行緒間同步:訊號量 互斥鎖 讀寫鎖 條件變數
核心中同步執行緒使用自旋鎖,在多處理器情況下才有效:忙等待(進行迴圈測試 資源切換的時間大於等待時間小於從cpu上切換下去並恢復的時間段,忙等待比較有優勢) 或者直接阻塞(狀態切換阻塞 等待時間大於一次切換下去並恢復的時間 非忙等待比較有優勢)
同步和非同步:
在多程序或多執行緒中同步和非同步指的是訪問臨界資源有沒有被控制
在通訊方式中:同步和非同步關注的是訊息通訊機制,所謂同步,就是在發出乙個呼叫時,在沒有得到結果之前,該呼叫就不返回。但是一旦呼叫返回,就得到返回值了。也就是說呼叫者主動等待這個呼叫結果。非同步則是相反,在呼叫發出後,這個呼叫就直接返回了,所以沒有返回結果。也就是說當乙個非同步過程呼叫發出後,呼叫者不會立即得到結果。而是被呼叫者準備好資料後反過來通知呼叫者。
阻塞和非阻塞:
阻塞和非阻塞關注的是程式在等待呼叫結果時的狀態。阻塞是指方法(函式)執行後,在結果返回之前,當前執行緒(程序)會被掛起。呼叫執行緒只有愛得到結果之後才會返回。非阻塞方法(函式)指在不能立即得到結果之前,該方法(函式)不會阻塞當前執行緒,可以立即返回,只是返回結果是失敗,沒有資料,,一般需要cpu週期性輪詢,以檢查資料是否就緒。
訊號量 二值訊號量
訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...
python訊號量 Python訊號量
python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...
Linux C 訊號 訊號量
july 10,2020 12 49 am signal sighup,sig ign signal訊號函式,第乙個引數表示需要處理的訊號值 sighup 第二個引數為處理函式或者是乙個表示,這裡,sig ign表示忽略sighup那個註冊的訊號。sighup和控制台操作有關,當控制台被關閉時系統會...