Linux并發與競爭的基本概念

一.? 簡介

Linux是一個多任務操作系統,肯定會存在多個任務共同操作同一段內存或者設備的情況, 多個任務甚至中斷都能訪問的資源叫做共享資源,在驅動開發中要注意對共享資源的保護,也就是要處理對共享資源的并發訪問。比如,共享單車,大家按照誰掃誰騎走的原則來共用這個單車,如果沒有這個并發訪問共享單車的原則存在,只怕到時候為了一輛單車要打起來了。
在 Linux 驅動編寫過程中,對于并發控制的管理非常重要。
本文簡單了解一下Linux中并發與競爭的概念。

二.? Linux并發與競爭的基本概念

1.? 并發與競爭簡介

并發就是多個 “用戶” 同時訪問同一個共享資源,比如,你們公司有一臺打印機,你們公司的所有人都可以使用。現在小李和小王要同時使用這一臺打印機,都要打印一份文件。小李要 打印的文件內容如下:
我叫小李
電話:123456
工號:16

小王要打印的內容如下:
我叫小王
電話:678910
工號:20
這兩份文檔肯定是各自打印出來的,不能相互影響。當兩個人同時打印的話如果打印機不做處理的話可能會出現小李的文檔打印了一行,然后開始打印小王的文檔,這樣打印出來的文檔就錯亂 了,可能會出現如下的錯誤文檔內容:
我叫小王
電話:123456
工號:20

可以看出,小王打印出來的文檔中電話號碼錯誤了,變成小李的了,這是絕對不允許的。如果有多人同時向打印機發送了多份文檔,打印機必須保證一次只能打印一份文檔,只有打印完成以后才能打印其他的文檔。

2.? 并發產生的原因

Linux 系統是個多任務操作系統,會存在多個任務同時訪問同一片內存區域,這些任務可 能會相互覆蓋這段內存中的數據,造成內存數據混亂。針對這個問題必須要做處理,嚴重的話 可能會導致系統崩潰。現在的 Linux 系統并發產生的原因很復雜,總結一下有下面幾個主要原 因:
①? 多線程并發訪問, Linux 是多任務 ( 線程 ) 的系統,所以多線程訪問是最基本的原因。
②? 搶占式并發訪問,從 2.6 版本內核開始, Linux 內核支持搶占,也就是說調度程序可以 在任意時刻搶占正在運行的線程,從而運行其他的線程。
③? 中斷程序并發訪問,這個無需多說,學過 STM32 的同學應該知道,硬件中斷的權利可 是很大的。
SMP( 多核 ) 核間并發訪問,現在 ARM 架構的多核 SOC 很常見,多核 CPU 存在核間并 發訪問。

并發訪問帶來的問題就是競爭,學過 FreeRTOS UCOS 的同學應該知道臨界區這個概念,所謂的臨界區就是共享數據段,對于臨界區必須保證一次只有一個線程訪問,也就是要保證臨 界區是原子訪問的,這里的原子訪問就表示這一個訪問是一個步驟,不能再進行拆分。 果多個線程同時操作臨界區就表示存在競爭。
我們在編寫驅動的時候,一定要注意避免并發和防止競爭訪問。 很多 Linux 驅動初學者往往不注意這一點,在驅動程序中埋下了隱患,這類問題往往又很不容易查找,導致驅動調試難度加大、費時費力。所以,在實現驅動之前就需要考慮到并發與競爭,而不是驅動都編寫完了然后再處理并發與競爭。

3. 保護什么

前面一直說要防止并發訪問共享資源,換句話說就是要保護共享資源,防止進行并發訪問。
在程序中什么是共享資源?也就是保護的內容是什么?
我們保護的不是代碼, 而是數據!某個線程的局部變量不需要保護,我們要保護的是多個線程都會訪問的共享數據。 一個整形的全局變量 a 是數據,一份要打印的文檔也是數據。
雖然我們知道了要對共享數據進行保護,怎么判斷哪些共享數據要保護呢?
找到要保護的數據才是重點,而這個也是難點, 因為驅動程序各不相同,那么數據也千變萬化,一般像全局變量,設備結構體這些肯定是要保 護的,至于其他的數據就要根據實際的驅動程序而定了。
當我們發現驅動程序中存在并發和競爭的時候一定要處理掉。

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

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

相關文章

【服務器數據恢復】FreeNAS+ESXi虛擬機數據恢復案例

服務器數據恢復環境: 一臺服務器通過FreeNAS(本案例使用的是UFS2文件系統)實現iSCSI存儲,整個UFS2文件系統作為一個文件掛載到ESXi虛擬化系統(安裝在另外2臺服務器上)上。該虛擬化系統一共有5臺虛擬機&…

2024水科技大會暨技術裝備成果展覽會——高品質供水和飲用水水源安全保障論壇

供水與飲水安全直接關系到人民群眾的生活與健康,切實做好城市供水與飲水安全保障工作,是把以人為本真正落到實處的一項緊迫任務。近年來,中央和地方加大了城鄉供水與飲水安全保障工作的力度,對標最優質供水城市建設要求&#xff0…

[Angular 基礎] - service 服務

[Angular 基礎] - service 服務 之前的筆記就列舉三個好了……沒想到 Angular 東西這么多(ー ー;)……全加感覺越來越湊字數了 [Angular 基礎] - 視圖封裝 & 局部引用 & 父子組件中內容傳遞 [Angular 基礎] - 生命周期函數 [Angular 基礎] - 自…

請簡述你對SpringMVC的理解

SpringMVC是一種基于Java語言開發,實現了WebMVC設計模式,請求驅動類型 的輕量級Web框架。 采用了MVC架構模式的思想,通過把Model,View,Controller分離,將Web層進 行職責解耦,從而把復雜的Web應…

idea打開項目白屏

解決方法: 右鍵“最大化” idea打開項目白板解決方案_idea打開白屏-CSDN博客 IDEA 2022 CPU占用100%的問題及解決方法_java_腳本之家

STM32控制數碼管從0顯示到99

首先 先畫電路圖吧!打開proteus,導入相關器件,繪制電路圖。如下:(記得要保存啊!發現模擬一遍程序就自動退出了,有bug,我是解決不了,所以就是要及時保存,自己重…

計算機組成原理(10)----微程序控制器

目錄 1.微程序控制器的設計思想 2.微指令的基本格式 3.微程序控制器的基本結構 (1)控制存儲器CM (2)CMAR (3)地址譯碼 (4)CMDR (5)微地址形成部件 &…

31.云原生Istio可觀測性之官網Bookinfo應用實戰演示

云原生專欄大綱 文章目錄 可觀測性kiali介紹Overview(概觀)Application(應用維度)workloads(負載維度)Services(服務維度)Istio Config(配置維度) Kiali部署…

音頻聲波的主觀感受

一、響度 聲壓是“客觀”的,響度是“主觀”的。 響度又稱音量。人耳感受到的聲音強弱,它是人對聲音大小的一個主觀感覺量。響度的大小決定于聲音接收處的波幅,就同一聲源來說,波幅傳播的愈遠,響度愈小…

React18原理: React核心對象之Update、UpdateQueue、Hook、Task對象

Update 與 UpdateQueue 對象 1 ) 概述 在fiber對象中有一個屬性 fiber.updateQueue是一個鏈式隊列(即使用鏈表實現的隊列存儲結構)是和頁面更新有關的 2 )Update對象相關的數據結構 // https://github.com/facebook/react/blob/v18.2.0/pa…

【Nginx】Nginx配置反向代理 和 https

nginx.conf配置 進入linux /etc/nginx/ 打開nginx.conf 進行以下配置 http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {#監聽443端口listen 443 ssl;#你的域名server_name huiblog.top;#ssl證書的pe…

VSCode The preLaunchTask ‘C/C++: clang++ 生成活動文件‘ terminated with exit code -1

更改tasks.json文件里面的type為shell 選擇g 選擇g,然后點回到text.c,按下F5. 得到結果。 文中內容參考: 從零開始手把手教你配置屬于你的VS Code_嗶哩嗶哩_bilibili https://blog.csdn.net/qq_63872647/article/details/128006861

【EasyV】QGIS轉換至EasyV

QGIS轉換至EasyV 第一步:導入QGIS第二步 坐標系轉換第三步 集合修正第四步 重命名字段第五步 導出WGS geojson坐標第六步 導入EasyV 第一步:導入QGIS 第二步 坐標系轉換 第三步 集合修正 第四步 重命名字段 第五步 導出WGS geojson坐標 第六步 導入EasyV…

【es6】模版字面量/模版字符串,標簽函數/String.raw()靜態方法

模版字符串經常用,但是這個標簽函數的功能你肯定不知道,請看官網文檔 看完你需要知道 可以自定義標簽函數String.raw 的用法 唯一一個內置的模版字符串標簽函數第一個參數具有 raw 屬性的對象,值時一個類數組字符串對象模版字面量的緩存機制…

【vue vue-seamless-scroll】解決vue-seamless-scroll鼠標懸浮才滾動或者只滾動一次就失效的問題

解決問題:使用vue-seamless-scroll發現只有鼠標懸浮上去才滾動,而且滾動一次停止了 目標效果: 解決方案: 最后發現是因為數據需要在頁面掛載好就賦值,否則頁面在加載完成后,數據無法自動滾動。但因為數據…

c++:藍橋杯的基礎算法2(構造,模擬)+練習鞏固

目錄 構造 構造的基礎概念: 模擬 練習1:掃雷 練習2:灌溉 練習3:回文日期 構造 構造的基礎概念: 構造算法是一種用于解決特定問題的算法設計方法。在C語言中,構造算法通常涉及到創建一個函數或類來實…

ARM服務器上部署zookeeper集群

由于ARM服務器上部署zookeeper集群,會存在加載不到主類問題,現在把遇到的問題進行總結下,問題如下: [rootnode206 apache-zookeeper-3.5.10]# bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /data1/software/apache-zookeeper-3.5.10/bin/../conf/…

四、Burpsuite工具之proxy模塊詳解-intercept功能

前言: 過了一個年,感覺好久都沒有更新了,今天就從burpsuite的更新開始吧。 前面已經說過了burpsuite的安裝和proxy代理的配置,今天說一下proxy模塊中非常有用的intercept功能。 intercept功能介紹: intercept是攔截…

Spring之AOP源碼解析(中)

前言 在上一篇文章中,我們講解了Spring中那些注解可能會產生AOP動態代理,我們通過源碼發現,完成AOP相關操作都和ProxyFactory這個類有密切關系,這一篇我們將圍繞這個類繼續解析 演示 作用 ProxyFactory采用策略模式生成動態代理對象,具體生成cglib動態代理還是jdk動態代理,…