Linux信號量和信號

1.溫故知新

? ? ? ? 上一篇博客,我們又知道了一種進程間通信的方案:共享內存。它是在物理內存中用系統調用給我們在物理內存開辟一個共享內存,可以由多個進程的頁表進行映射,共享內存不和管道一樣,它的生命周期是隨內核的,而且它的效率高,這是因為共享內存創建出來不需要系統調用,而我們的管道等都需要系統調用進行通信,系統調用由成本,所以共享內存效率比較高,不知道我們學C++的時候還知道內存池嗎?SLT它為了提高效率,防止小塊內存一直調系統調用,它會提前開辟出一大塊內存池讓我們的STL去使用,減少內存碎片的問題。new,malloc底層就是系統調用,我們用戶肯定無法開辟空間,得讓我們的系統幫助我們用戶去開辟空間,為什么,系統是管理硬件和軟件的軟件。共享內存不提供互斥和同步,所以我們用戶必須手動來保證訪問資源的同步和互斥。

這里簡單介紹一下,互斥是什么?顧名思義,就是互斥的,我一個資源在同一時間只能有一個線程來訪問,同步就是讓不同的線程按照一定的順序來訪問我們的資源,同步必須保證互斥,只不過是有順序了,所以同步=互斥+順序。

2.并發編程

? ? ? ? 介紹信號之前,先了解一個概念叫做并發編程。

? ? ? ? 多個執行流,能看到同一份資源,如果我們并發訪問一份共享資源,會導致數據不安全,我們需要協調我們多執行流,就是保護我們的共享資源,一般就是共享和互斥。

? ? ? ? 被保護起來的資源,一般是全局變量等全局的,叫做臨界資源。

? ? ? ? 保護的方式一般就是我們上面說的互斥和同步,讓多個進程在同一時間只能有一個進程來訪問這個資源,同步就是協調進程,讓它們按照一定的順序來訪問,避免饑餓問題。

? ? ? ? 多個執行流,在訪問臨界資源的時候,具有一定的順序性,叫做同步。同步保證了互斥,在保證一個執行流訪問共享資源的時候同時保證了一定的順序性。

? ? ? ? 系統中某些資源同一時間只允許一個執行流訪問,這樣的資源叫做臨界資源。

? ? ? ? 在執行流中涉及訪問互斥資源的程序叫做臨界區,你寫的代碼=訪問臨界資源的代碼(臨界區)+不訪問臨界資源的代碼(非臨界區)。

? ? ? ? 所謂的對共享資源的保護,其實就是對臨界區代碼的保護。歸根到底我們是寫代碼來保護資源的,對代碼的保護就間接實現了對共享資源的保護。

????????

????????

????????

3.信號量

? ? ? ? ? ? ? ?信號量就是一個計數器。我們知道我們有的時候會去看電影,假如我們電影是一個資源,我們一個電影院一般要容納很多人進去看電影,所以我們這個時候很多人進去看電影就是抽象為資源分給很多執行流使用,而如果我們一個VIP影院只允許一個人去看,抽象出來就是我們就是把電影院資源作為一個整體去使用了。

? ? ? ? 我們電影院的經營者要進行賣票,我只要買了票,那個位置就是我的,就是對資源的預定。我們電影院是不能將一個位置的票重復出售的。

? ? ? ? 未來當我們的所有執行流想要訪問一個 公共資源,要先對資源進行申請,也就是買票,相當于對資源的預定機制。

? ? ? ? 但是所有進程想要看到信號量,信號量本身就是一個共享資源,那么誰來保證信號量的安全嗯?答案是把信號量設計為原子的,不可被中斷的。

? ? ? ? 所以我們的信號量實際就是對一個資源的預定機制,允許多個執行流去訪問一個共享資源,所以未來執行流想要訪問臨界資源就要先申請信號量,對資源進行預定。

? ? ? ? 我們的二元信號量就是互斥,多元信號量就是同步,說白了我們二元信號量就是只0和1只允許一個執行流申請,多元信號量允許多個執行流對資源進行申請。二元就是把電影院的資源當整體使用,只允許一個人進去看。多元就允許我們多個執行流對資源進行預定,然后進去訪問了。多元信號量允許多個線程對資源進行并發訪問,如果我們里面有共享資源還要搭配鎖來保證我們的線程安全。

信號量可以限制我們執行流訪問共享內存的個數,當它為1時,它只允許一個執行流去訪問我們的共享內存,會保護我們的共享內存的安全。

??4.信號

1.什么是信號

? ? ? ? 講完了信號量,我們來講一講信號,有人問,信號量和信號一字之差有啥聯系嗎?答案是沒有聯系,就和老婆餅和老婆沒有半毛錢關系一樣。

? ? ? ? 信號有信號產生,信號保存,信號處理三個階段。現實生活中我們看到紅燈信號就知道不能走,信號在發出之前我們就知道對應的應對方法了。相似的,我們計算機中,我們進程內部都已經內置了對信號的處理方法和處理機制了。我們能識別這些信號是因為被教育過,進程能識別過這些信號是已經被寫好了。

? ? ? ? 還有信號到來時,我們可能正在做更重要的事,不會立即去處理信號,比如快遞到達了, 我還正在打游戲,那得等我打完游戲再去取快遞吧。

? ? ? ? 進程對于信號的處理有默認動作,顧名思義,就是默認處理,還有就是忽略,忽略它不管它,還有就是我們自定義捕捉,OS會提供對應的函數幫助我們捕捉信號并對它的處理進行修改。

? ? ? ? 我們知道前面講過我們在shell中啟動一個命令,如果我們想讓它停下來,可以按crtl+c,就可以終止掉這個進程,當我們按下這個鍵的同時,我們就會想這個進程發送2號信號,讓它終止下來,我們看到的就是這個進程被我們終止了。

? ? ? ? 結論1:我們通過crtl+c這個案例可以明白我們的鍵盤可以想進程發送信號。

? ? ? ? 結論2:kill命令可以殺死一個進程。

? ? ? ? 我們先來說一下crtl+c的詳細,就是我們只有前臺進程可以通過鍵盤獲取信號,任何時刻,一個登錄系統只允許一個進程在前臺運行,其他進程都在后臺。

? ? ? ? 我們fork之后,父進程先退出,讓子進程變孤兒進程,它就會自動變為后臺進程了。

? ? ? ? 我們有一個signal可以對捕捉的信號做自定義處理可以驗證我的說法,有興趣可以去Linux上試一下。

#include <stdio.h>
#include <signal.h>
#include <unistd.h>// 自定義信號處理函數
void signal_handler(int signum) {printf("自定義信號處理:捕獲信號 %d\n", signum);
}int main() {// 注冊信號處理函數signal(SIGINT, signal_handler);printf("程序運行中,按下 Ctrl+C 觸發信號...\n");printf("進程ID: %d\n", getpid());// 無限循環以保持程序運行while(1) {sleep(1);}return 0;
}

2.信號的本質

我們說是信號信號的,其實就是一個宏,我們發現我們的信號是沒有0號信號的。我們前面說過信號分為大致下面:信號產生,信號保存,信號處理,我們信號產生不會去立即處理,而是在合適的時候處理,那我就得把我的信號保存下來啊,保存下來我才知道他來過啊!那么記錄在哪里呢?怎么記錄呢?

下面依次回答:記錄在結構體力,結構體里各種變量,怎么記錄呢?通過位圖,我們一個有這么多信號,我們一個整型剛好32個比特位,一個比特位表示一個信號,可以保存所有產生的信號。

????????

下面我有2個問題是:如何理解給進程發信號?有了上面的認識,給進程發信號不就把一個比特位由0變1嗎?我們查一下比特位我們就知道這個信號來過了,它就被保存下來了。

? ? ? ? 如何識別信號呢?這也是我們看它在位圖的哪個比特位,看它對應比特位是0還是1我們就可以知道在這個信號在哪里,是否產生過。

但是總而言之,我們發信號是通過操作系統發送的,無論發送的信號方式有多少種,我們用戶是無法發送信號的,本質還是我們操作系統去發送信號的。

不知道還記得我們以前介紹過的task struct結構體嗎?每個進程創建出來這個結構體里面就描述它的屬性,我們的信號存儲就是存儲在我們的task_struct里了。task_struct本質是內核的數據結構,誰有權利去內核改數據,只有操作系統,所以我們得出上面的結論,既然我們的信號是通過位圖在我們的task_struct(描述進程屬性的結構體)里存儲的,我們修改里面的一個變量可以保存我們的信號,那么就只有操作系統本身可以去內核修改數據,就只有操作系統才可以給我們的進程發送信號!!!

????????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918626.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918626.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918626.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

騰訊測試崗位面試真題分析

以下是對騰訊測試工程師面試問題的分類整理、領域占比分析及高頻問題精選&#xff08;基于??92道問題&#xff0c;總出現次數118次??&#xff09;。問題按??7大技術領域??劃分&#xff0c;高頻問題標注優先級&#xff08;1-5&#x1f31f;&#xff09;&#xff1a; 不…

全面解析遠程桌面:功能實現、性能優化與安全防護全攻略

遠程桌面技術已成為工作與生活中不可或缺的協作工具&#xff0c;但在實際應用中&#xff0c;用戶常遇到連接失敗、卡頓延遲、安全隱患等問題。本文從遠程桌面功能原理、網絡與性能優化、安全防護策略、跨平臺兼容性等角度&#xff0c;詳細解析常見問題的解決方案&#xff0c;并…

【問題】Mybatis-plus框架使用@Select注解編寫查詢SQL,json字段查詢轉換失敗

問題描述在使用mybaits-plus的時候定義的Mapper接口實現了BaseMapper&#xff0c;沒有編寫Mapper對應的xml&#xff0c;大部分查詢使用框架的接口進行查詢基本屬性返回都是正常&#xff0c;復雜對象在sql中會進行查詢&#xff0c;但是返回對象中卻未包含相關屬性。問題原因 沒有…

Python多線程實現大文件下載

Python多線程實現大文件下載 在互聯網時代&#xff0c;文件下載是日常操作之一&#xff0c;尤其是大文件&#xff0c;如軟件安裝包、高清視頻等。然而&#xff0c;網絡條件不穩定或帶寬有限時&#xff0c;下載速度會變得很慢&#xff0c;令人抓狂。幸運的是&#xff0c;通過多線…

【R語言】RStudio 中的 Source on Save、Run、Source 辨析

RStudio 中的 Source on Save、Run、Source 辨析 在使用 RStudio 進行 R 語言開發時&#xff0c;我們會在主界面左上角看見三個按鈕&#xff1a;Source on Save、Run、Source 。 本文將帶你從概念、使用方法、快捷鍵、使用場景以及注意事項等方面詳細解析這三個功能。 文章目錄…

藍橋杯算法之搜索章 - 4

目錄 文章目錄 前言 一、記憶化搜索 二、題目概略 三、斐波拉契數 四、Function 五、天下第一 六、滑雪 總結 親愛的讀者朋友們&#xff0c;大家好啊&#xff01;不同的時間&#xff0c;相同的地點&#xff0c;今天又帶來了關于搜索部分的講解。接下來我將接著我前面文章的內容…

抗量子加密技術前瞻:后量子時代的密碼學革命

目錄抗量子加密技術前瞻&#xff1a;后量子時代的密碼學革命1. 量子計算威脅現狀1.1 量子霸權里程碑1.2 受威脅算法1.3 時間緊迫性2. 抗量子密碼學體系2.1 技術路線對比2.2 數學基礎革新3. 標準化進程3.1 NIST PQC標準化時間線3.2 當前推薦算法4. 技術實現方案4.1 Kyber密鑰交換…

基于STM32設計的礦山環境監測系統(NBIOT)_262

文章目錄 一、前言 1.1 項目介紹 【1】開發背景 【2】研究的意義 【3】最終實現需求 【4】項目硬件模塊組成 1.2 設計思路 【1】整體設計思路 【2】上位機開發思路 1.3 項目開發背景 【1】選題的意義 【2】摘要 【3】國內外相關研究現狀 【5】參考文獻 1.4 開發工具的選擇 【1】…

電腦如何安裝win10專業版_電腦用u盤安裝win10專業版教程

電腦如何安裝win10專業版&#xff1f;電腦還是建議安裝win10專業版。Win分為多個版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和專業版&#xff08;Pro&#xff09;是用戶選擇最多的兩個版本。win10專業版在功能以及安全性方面有著明顯的優勢&#xff0c;所以電腦還…

多語言文本 AI 情感分析 API 數據接口

多語言文本 AI 情感分析 API 數據接口 AI / 文本處理 AI 模型快速分析文本情感傾向 多語言文本 / 情感分析。 1. 產品功能 支持多語言文本情感分析&#xff1b;基于特定 AI 模型&#xff0c;快速識別文本情感傾向&#xff1b;適用于評論分析、輿情監控等場景&#xff1b;全接…

【R語言】R語言的工作空間映像(workspace image,通常是.RData)詳解

R語言的工作空間映像&#xff08;.RData&#xff09;詳解 在使用 R 語言時&#xff0c;你可能會注意到&#xff0c;每次退出 R 會彈出一個提示&#xff1a; Save workspace image? [y/n/c] 如果你使用的是 Rstudio 這個 IDE 來進行R語言的開發&#xff0c;那么可能彈出的提示…

在線 A2C實踐

在線 A2C&#xff08;Actor-Critic&#xff09;算法在推薦系統中的實踐&#xff0c;核心是將推薦過程建模為實時交互的強化學習問題&#xff0c;通過 Actor 生成推薦策略、Critic 評估策略價值&#xff0c;實現 “決策 - 反饋 - 更新” 的閉環。從樣本設計到最終上線&#xff0…

Eclipse RCP產品動態模塊設計

文章目錄 遇到問題具體實踐效果演示應用下載 遇到問題 如果你是一個To C產品的設計者&#xff0c;勢必會遇到用戶需求高度分化的場景&#xff0c;隨之而來的是繁雜的功能列表&#xff0c;如何讓用戶只接觸與其任務直接相關的功能&#xff0c;隱藏無關元素&#xff1f; 具體實…

NLP自然語言處理: FastText工具與遷移學習基礎詳解

FastText工具與遷移學習基礎詳解 一、知識框架總覽 FastText工具核心功能與應用場景FastText模型架構與工作原理層次Softmax加速機制哈夫曼樹概念與構建方法 二、FastText工具核心解析 2.1 功能定位 雙重核心功能 文本分類&#xff1a;可直接用于文本分類任務&#xff0c;快速生…

uni-app 生命周期詳解

概述 uni-app 基于 Vue.js 框架開發&#xff0c;其生命周期包含了三個層面&#xff1a; 應用生命周期&#xff1a;App.vue 的生命周期頁面生命周期&#xff1a;各個頁面的生命周期Vue 組件生命周期&#xff1a;Vue.js 原生的組件生命周期 這三種生命周期在不同場景下會按特定順…

MCU外設初始化:為什么參數配置必須優先于使能

在微控制器領域&#xff0c;初始化參數配置階段至關重要。此時&#xff0c;雖無電源驅動&#xff0c;但微控制器在使能信號到來前&#xff0c;借初始化參數配置這一精細步驟&#xff0c;開啟關鍵準備進程。初始化參數配置如同物理坐標錨定、邏輯指令部署、內在秩序預設&#xf…

AI一周事件(2025年8月6日-8月12日)

&#xff08;以下借助 DeepSeek-R1 & ChatGPT-5 輔助整理&#xff09; 一、AI 模型與算法進展 1. OpenAI 正式發布 GPT-5&#xff08;8月7日&#xff09; 事件&#xff1a;OpenAI 于 2025 年 8 月 7 日推出 GPT-5——其自稱擁有“PhD 級別”的智能&#xff0c;通過內置…

快速了解自然語言處理

在這個智能時代&#xff0c;我們每天都在和機器 “對話”—— 用語音助手查詢天氣、讓翻譯軟件跨越語言障礙、靠智能客服解決問題…… 這些便捷體驗的背后&#xff0c;都離不開自然語言處理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09; 技術。作為人工…

洛谷 P2607 [ZJOI2008] 騎士-提高+/省選-

題目描述 Z 國的騎士團是一個很有勢力的組織&#xff0c;幫會中匯聚了來自各地的精英。他們劫富濟貧&#xff0c;懲惡揚善&#xff0c;受到社會各界的贊揚。 最近發生了一件可怕的事情&#xff0c;邪惡的 Y 國發動了一場針對 Z 國的侵略戰爭。戰火綿延五百里&#xff0c;在和平…

不止于GET:掌握POST報錯注入的精髓

文章目錄引言POST請求簡述報錯注入核心思想關鍵前提實戰演練POST報錯注入與GET報錯注入的區別防御之道&#xff1a;如何避免POST報錯注入&#xff1f;引言 SQL注入是Web安全領域危害性最大、最常見、最持久的高危漏洞之一。它直接威脅到應用程序核心數據庫的安全&#xff0c;可…