linux多線(進)程編程——(8)多進程的沖突問題

前言

隨著時間的推移,共享內存已經在修真界已經淪為禁術。因為使用這種方式溝通的兩人往往會陷入到走火入魔的狀態,思維扭曲。進程君父子見到這種情況,連忙開始專研起來,終于它們發現了共享內存存在的問題:

進程間沖突

我們現在假設這樣一種情況,有三個進程,它們使用共享內存完成通信。進程1向共享內存中寫入一些數據,想讓進程2讀取這些數據。很不巧,由于缺乏管理,現在進程3也同時在向共享內存中寫入數據。進程1與進程3的數據發生了相互沖突與相互覆蓋,對于進程2來說,讀取到了一些無意義的數據。如下圖所示,這種相互沖突的問題是也是共享內存最大的局限性。如何解決不是我們這一節的重點,我們下一節再討論,請大家繼續向后看。
在這里插入圖片描述
上面這種情況屬于比較容易理解的范疇,下面這個就比較抽象了。
現在假設一種情況,我們在共享內存中定義了一個變量x,初始值為0,現在有兩個進程,同時對這個變量進行加一操作,最后這個變量的值應該是多少?
既然我都這么問了,當然答案不可能是2,實際上,我們無法判斷這個變量最終的值,它可能是1,也可能是2,可能每次運行結果都不同。這種反直覺的現象是什么原因造成的呢?接下來我帶大家分析一下。
在c或者c++中,我們對一個變量x進行加一操作,無非一下兩種手段,這里假設x已經被定義并且初始化為0

// 方案1
x = x + 1;// 方案2
x++;

大家在上面看到的是兩條語句,因此可能想當然的認為這兩條語句每條都是一次直接執行完畢。但是實際上,對于這兩條語句中的任意一條語句,他的執行大概分為三步。我們先編寫一段C語言代碼。在這里為了模擬共享內存,我們在全局區定義x并初始化為0,模擬x在共享內存中的情況。

#include <stdio.h>int x = 0;int main() {x = x + 1;return 0;
}

我們將這段代碼進行匯編,觀察它的匯編代碼,如下所示,根據#注釋的內容我們可以看到,main.c文件的第六行的x=x+1;對應著三條匯編語句,它們分別是:(1)把變量x從內存中轉移到CPU寄存器eax中,(2)在寄存器eax中對變量x加一,(3)把處理后的變量x從寄存器中放回到內存中。

main:
.LFB0:# 進入main函數后需要壓棧
# main.c:6:     x = x + 1;movl	x(%rip), %eax	# x, x.0_1addl	$1, %eax	#, _2
# main.c:6:     x = x + 1;movl	%eax, x(%rip)	# _2, x
# main.c:7:     return 0;movl	$0, %eax	#, _5
# main.c:8: }# 即將離開main函數,需要出棧ret	.cfi_endproc

每一條匯編指令都是原子的,也就是不會被進程切換打斷的。但是對于單核CPU在每兩條匯編指令之間,都有可能會發生進程的切換。對于多核CPU,也可能會出現同時處理的情況,這會造成什么影響呢?我們用下面的圖來表示:

小結

今天我們詳細分析了共享內存可能存在的問題。雖然它的傳輸速度快,節約資源,但是如果不加以約束,一定會出現問題。
那么如何在共享內存中加入約束,讓兩個進程間互不干擾呢?這就是我們下一節要研究的問題:信號量。

結束語

進程君父子找到了共享內存存在的局限性,它們打算提供一個補救方案,方案定制中。

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

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

相關文章

網絡層IP協議知識大梳理

全是通俗易懂的講解&#xff0c;如果你本節之前的知識都掌握清楚&#xff0c;那就速速來看我的IP協議筆記吧~ 自己寫自己的八股&#xff01;讓未來的自己看懂&#xff01; &#xff08;全文手敲&#xff0c;受益良多&#xff09; 網路基礎3 網路層 TCP并沒有把數據發到網路…

數據結構與算法學習導航

目錄 指導思想資料總結代碼隨想錄hello-algoOI-WIKI 一名麻瓜的刷leetcode的簡單概述。 在這里對過去的自己說: 如果你相信算法有用你就刷刷leetcode&#xff0c;如果不相信面試會讓你相信。 當然&#xff0c;現在我確實認為算法和數據結構有用&#xff0c;leetcode也有用。 …

【網絡安全】誰入侵了我的調制解調器?(二)

文章目錄 針對 TR-069 協議 REST API 的攻擊思路攻擊百萬臺調制解調器意外發現 Cox 后端 API 的授權繞過漏洞確認我們能夠進入任何人的設備訪問和更新任何Cox商業客戶賬戶通過泄露的加密密鑰覆蓋任何人的設備設置執行對任何調制解調器的命令影響最后想說閱讀本文前,請先行瀏覽…

大模型在急性單純性闌尾炎預測及治療方案制定中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的 1.3 研究方法與創新點 二、急性單純性闌尾炎概述 2.1 定義與發病機制 2.2 臨床表現 2.3 傳統診斷方法 三、大模型在急性單純性闌尾炎預測中的應用 3.1 大模型簡介 3.2 數據收集與處理 3.3 模型訓練與優化 3.4 預測…

Linux 上安裝和配置 VNC 遠程桌面

在 Linux 上安裝和配置 VNC&#xff08;Virtual Network Computing&#xff09;可以讓你遠程訪問圖形化桌面環境。以下是詳細的安裝和配置步驟&#xff0c;適用于主流 Linux 發行版&#xff08;如 Ubuntu、CentOS、Debian 等&#xff09;。 1. 安裝 VNC 服務器 Ubuntu/Debian …

《AI大模型應知應會100篇》第22篇:系統提示詞(System Prompt)設計與優化

第22篇&#xff1a;系統提示詞(System Prompt)設計與優化 摘要 在大語言模型&#xff08;LLM&#xff09;應用中&#xff0c;系統提示詞&#xff08;System Prompt&#xff09;是控制模型行為的核心工具之一。它不僅定義了模型的身份、角色和行為規范&#xff0c;還直接影響輸…

其他網頁正常進入,但是CSDN進入之后排版混亂

顯示不正常&#xff0c;排版混亂 解決方法&#xff1a; ①打開網絡設置 ②更改適配器 ③所連接的網絡 --右鍵 屬性 然后就可以正常訪問了。

Qwen2.5-VL視覺大語言模型復現過程,沒碰到什么坑

視頻講解&#xff1a;Qwen2.5-VL視覺大語言模型復現過程&#xff0c;沒碰到什么坑_嗶哩嗶哩_bilibili Qwen2.5-VL視覺大語言模型復現過程&#xff0c;沒碰到什么坑 今天復現下Qwen2.5-VL玩玩 https://github.com/QwenLM/Qwen2.5-VL 創建conda環境&#xff0c;實測22.04&#x…

宮庭海:跨界融合與家國情懷的影視開拓者

從音樂經紀人到影視多面手的創業之路 近日&#xff0c;國內娛樂產業領軍人物、著名音樂經紀人、制片人、影視投資人宮庭海先生再次受到廣泛關注。憑借其卓越的成就和貢獻&#xff0c;宮庭海先生在業界樹立了良好的口碑和廣泛的影響力。 宮庭海&#xff0c; 遼寧省大連市人&…

LeetCode算法題(Go語言實現)_51

題目 給你兩個下標從 0 開始的整數數組 nums1 和 nums2 &#xff0c;兩者長度都是 n &#xff0c;再給你一個正整數 k 。你必須從 nums1 中選一個長度為 k 的 子序列 對應的下標。 對于選擇的下標 i0 &#xff0c;i1 &#xff0c;…&#xff0c; ik - 1 &#xff0c;你的 分數 …

并查集(力扣2316)

這種涉及不同連通分量的&#xff0c;看上去就可以用并查集。并查集的模板請參見上一篇內容。并查集&#xff08;力扣1971&#xff09;-CSDN博客 現在我們要求的是無法互相到達的點對。根據觀察易得&#xff0c;我們只需要求出每個并查集的元素數量&#xff0c;然后遍歷每個點&…

Python在生成藝術中的創新應用

Python在生成藝術中的創新應用 在數字藝術的浪潮中,Python以其強大的庫支持和簡潔的語法,成為了生成藝術領域的一顆璀璨明珠。今天,就讓我們一起踏上這段充滿創意與驚喜的旅程,探索Python如何在生成藝術中大放異彩。 一、引言 生成藝術,是一種通過算法自動生成藝術作品的…

ROS ROS2 機器人深度相機激光雷達多傳感器標定工具箱入門教程(一)

系列文章目錄 目錄 系列文章目錄 前言 一、安裝 1.1 ROS 2 官方軟件包 二、教程 2.1 標定配置器 2.1.1 機器人選項 2.1.2.1 外參相機-激光雷達標定 2.1.2.2 外參激光雷達-激光雷達標定 2.1.2.3 外參相機參照標定 2.1.2.4 外參激光雷達-參考標定 2.2 外參照相機-激…

Ubuntu利用docker搭建Java相關環境問題記錄

Docker拉取鏡像超時 報錯 Unable to find image dpanel/dpanel:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/ ": context deadline exceeded (Client.Timeout exceeded while awaiting headers)解決方式 在etc/do…

list的模擬實現和反向迭代器的底層

1&#xff1a;list的模擬實現 1&#xff1a;鏈表的節點 對于list的模擬實現&#xff0c;我們需要先定義一個節點的類可以使用&#xff08;class也可以使用struct&#xff09; // List的節點類 template<class T> struct ListNode {ListNode(const T& val T()){_p…

數據加載與保存

通用方式? SparkSQL提供了通用的數據加載方式&#xff0c;使用spark.read.loa方法&#xff0c;并可通過format指定數據類型&#xff08;如csv、jdbc、json、orc、parquet、textFile&#xff09;。 load方法后需傳入數據路徑&#xff08;針對csv、jdbc、json、orc、parquet、…

7 編譯型語言、解釋型語言與混合型語言的深度解析:以 C、Java、Python 為例

在編程領域&#xff0c;語言的執行方式是其設計哲學的核心體現&#xff0c;直接影響著性能、可移植性和開發效率。本文將深入剖析編譯型語言&#xff08;以 C 語言為例&#xff09;、解釋型語言&#xff08;以 Python 為例&#xff09;和混合型語言&#xff08;以 Java 為例&am…

Edge瀏覽器安卓版流暢度與廣告攔截功能評測【不卡還凈】

安卓設備上使用瀏覽器的體驗&#xff0c;很大程度取決于兩個方面。一個是滑動和頁面切換時的反應速度&#xff0c;另一個是廣告干擾的多少。Edge瀏覽器的安卓版本在這兩方面的表現比較穩定&#xff0c;適合日常使用和內容瀏覽。 先看流暢度。Edge在中端和高端機型上啟動速度快&…

智能云圖庫-12-DDD重構

本節重點? 之前我們已經完成了本項目的功能開發。由于本項目功能豐富、代碼量大&#xff0c;如果是在企業中維護開發的項目&#xff0c;傳統的 MVC 架構可能會讓后續的開發協作越來越困難。所以本節魚皮要從 0 帶大家學習一種新的架構設計模式 —— DDD 領域驅動設計。 大綱…

量子安全郵件系統 —— 郵件回溯密鑰銷毀機制

這里寫目錄標題 量子安全郵件系統 —— 郵件回溯密鑰銷毀機制一、項目背景與簡介二、理論基礎2.1 密鑰銷毀的重要性2.2 時間衰減與回溯銷毀2.3 安全日志與報警機制三、系統架構設計3.1 模塊劃分3.2 系統架構圖(Mermaid示意圖)四、關鍵算法與實現流程4.1 密鑰生成與存儲4.2 郵…