日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

我們一起聊聊從操作系統層面理解多線程沖突

來源: 責編: 時間:2024-04-19 09:28:05 155觀看
導讀前言今天來從操作系統層面理解一下多線程沖突的問題,話不多說,開始~~什么是多線程的沖突同一進程內的線程是共享同一內存空間的,所以在多個線程的進程里,線程是可以同時操作這個進程空間的數據的,線程之間可以共享進程的資

前言

今天來從操作系統層面理解一下多線程沖突的問題,話不多說,開始~~XkD28資訊網——每日最新資訊28at.com

XkD28資訊網——每日最新資訊28at.com

什么是多線程的沖突

同一進程內的線程是共享同一內存空間的,所以在多個線程的進程里,線程是可以同時操作這個進程空間的數據的,線程之間可以共享進程的資源:比如代碼段、堆空間、數據段、打開的文件等資源,但每個線程也有自己獨立的棧空間。如果多個線程如果競爭共享資源,如果不采取有效的措施,則會造成共享數據的混亂。XkD28資訊網——每日最新資訊28at.com

舉個小栗子:一個房子里(代表一個進程),只有一個廁所(代表共享資源)。屋子里面有兩個人A和B(代表兩個線程),共用這個廁所。一天A去上廁所了,不過廁所門的鎖壞了,就沒法鎖門。這是B也想去上廁所,直接就開門進去了,然后發現A在里面。XkD28資訊網——每日最新資訊28at.com

上面這個故事說明,對于共享資源,如果沒有上鎖,在多線程的環境里,那么就可能會發生翻車現場。XkD28資訊網——每日最新資訊28at.com

競爭與協作

做個小實驗,創建五個線程,它們分別對共享變量 i 自增 1 執行 1000 次XkD28資訊網——每日最新資訊28at.com

package com.atguigu.juc.atomics;public class Station{    int i = 0;    public void add() {        for(int m = 0; m < 1000; m++){            try {                //使用sleep()模擬業務時間,如果不加,大概率不會出現并發問題                Thread.sleep(1);                i += 1;            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    public static void main(String[] args) throws InterruptedException {        //實例化站臺對象,并為每一個站臺取名字        Station station = new Station();        new Thread(station::add,"線程1").start();        new Thread(station::add,"線程2").start();        new Thread(station::add,"線程3").start();        new Thread(station::add,"線程4").start();        new Thread(station::add,"線程5").start();        Thread.sleep(20000);        // 讓每一個站臺對象各自開始工作        System.out.println(station.i);        Thread.sleep(5000);        System.out.println(station.i);    }}

運行了幾次發現,每次運行得到不同的結果。在計算機里是不能容忍的,雖然是小概率出現的錯誤,但是小概率事件它一定是會發生的。XkD28資訊網——每日最新資訊28at.com

為什么會出現這樣的問題呢?XkD28資訊網——每日最新資訊28at.com

為了理解為什么會發生這種情況,我們必須了解編譯器為更新計數器 i 變量生成的代碼序列,也就是要了解匯編指令的執行順序。XkD28資訊網——每日最新資訊28at.com

在這個例子中,我們只是想給 i 加上數字 1,那么它對應的匯編指令執行過程是這樣的:XkD28資訊網——每日最新資訊28at.com

XkD28資訊網——每日最新資訊28at.com

可以發現,只是單純給 i 加上數字 1,在 CPU 運行的時候,實際上要執行 3 條指令。XkD28資訊網——每日最新資訊28at.com

設想我們的線程 1 進入這個代碼區域,它將 i 的值(假設此時是 50 )從內存加載到它的寄存器中,然后它向寄存器加 1,此時在寄存器中的 i 值是 51。XkD28資訊網——每日最新資訊28at.com

現在,一件不幸的事情發生了:當前線程被掛起了,線程 2 被調度運行,并進入同一段代碼。它也執行了第一條指令,從內存獲取 i 值并將其放入到寄存器中,此時內存中 i 的值仍為 50,因此線程 2 寄存器中的 i 值也是 50。假設線程 2 執行接下來的兩條指令,將寄存器中的 i 值 + 1,然后將寄存器中的 i 值保存到內存中,于是此時全局變量 i 值是 51。XkD28資訊網——每日最新資訊28at.com

最后,又發生一次上下文切換,線程 1 恢復執行。還記得它已經執行了兩條匯編指令,現在準備執行最后一條指令。回憶一下, 線程 1 寄存器中的 i 值是51,因此,執行最后一條指令后,將值保存到內存,全局變量 i 的值再次被設置為 51。XkD28資訊網——每日最新資訊28at.com

簡單來說,增加 i (值為 50 )的代碼被運行兩次,按理來說,最后的 i 值應該是 52,但是由于不可控的調度,導致最后 i 值卻是 51。XkD28資訊網——每日最新資訊28at.com

針對上面線程 1 和線程 2 的執行過程,我畫了一張流程圖,會更明確一些:XkD28資訊網——每日最新資訊28at.com

XkD28資訊網——每日最新資訊28at.com

互斥的概念

上面展示的情況稱為競爭條件(race condition),當多線程相互競爭操作共享變量時,由于運氣不好,即在執行過程中發生了上下文切換,我們得到了錯誤的結果,事實上,每次運行都可能得到不同的結果,因此輸出的結果存在不確定性(indeterminate)。XkD28資訊網——每日最新資訊28at.com

由于多線程執行操作共享變量的這段代碼可能會導致競爭狀態,因此我們將此段代碼稱為臨界區(critical section),它是訪問共享資源的代碼片段,一定不能給多線程同時執行。XkD28資訊網——每日最新資訊28at.com

我們希望這段代碼是互斥(mutualexclusion)的,也就說保證一個線程在臨界區執行時,其他線程應該被阻止進入臨界區,說白了,就是這段代碼執行過程中,最多只能出現一個線程。XkD28資訊網——每日最新資訊28at.com

XkD28資訊網——每日最新資訊28at.com

另外,說一下互斥也并不是只針對多線程。在多進程競爭共享資源的時候,也同樣是可以使用互斥的方式來避免資源競爭造成的資源混亂。XkD28資訊網——每日最新資訊28at.com

同步的概念

所謂同步,就是并發進程/線程在一些關鍵點上可能需要互相等待與互通消息,這種相互制約的等待與互通信息稱為進程/線程同步。XkD28資訊網——每日最新資訊28at.com

上面那個栗子:一A去上廁所了,發現廁所門的鎖壞了,告訴B一聲。這是B想去上廁所的話,就會先問一下A是不是還在里面,然后再開門進去了。這也是互通消息的方式,如果鎖沒有壞,A直接把門鎖上,這就是相互等待的方式。XkD28資訊網——每日最新資訊28at.com

怎么解決多線程沖突?

為了實現進程/線程間正確的協作,操作系統必須提供實現進程協作的措施和方法,主要的方法有兩種:XkD28資訊網——每日最新資訊28at.com

  • 鎖:加鎖、解鎖操作;
  • 信號量:P、V 操作;

這兩個都可以方便地實現進程/線程互斥,而信號量比鎖的功能更強一些,它還可以方便地實現進程/線程同步。XkD28資訊網——每日最新資訊28at.com

使用加鎖操作和解鎖操作可以解決并發線程/進程的互斥問題。XkD28資訊網——每日最新資訊28at.com

任何想進入臨界區的線程,必須先執行加鎖操作。若加鎖操作順利通過,則線程可進入臨界區;在完成對臨界資源的訪問后再執行解鎖操作,以釋放該臨界資源。XkD28資訊網——每日最新資訊28at.com

XkD28資訊網——每日最新資訊28at.com

信號量

信號量是操作系統提供的一種協調共享資源訪問的方法。通常信號量表示資源的數量,對應的變量是一個整型(sem)變量。XkD28資訊網——每日最新資訊28at.com

另外,還有兩個原子操作的系統調用函數來控制信號量的,分別是:XkD28資訊網——每日最新資訊28at.com

  • P 操作:將 sem 減 1,相減后,如果 sem < 0,則進程/線程進入阻塞等待,否則繼續,表明 P 操作可能會阻塞;
  • V 操作:將 sem 加 1,相加后,如果 sem <= 0,喚醒一個等待中的進程/線程,表明 V 操作不會阻塞;

舉個類比,2 個資源的信號量,相當于 2 條火車軌道,PV 操作如下圖過程:XkD28資訊網——每日最新資訊28at.com

XkD28資訊網——每日最新資訊28at.com


XkD28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-84017-0.html我們一起聊聊從操作系統層面理解多線程沖突

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C#中的正則表達式:強大的文本處理工具

下一篇: WPF界面魔法:探秘Template奇妙世界,個性化定制你的UI

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 紅魔電競平板評測:大屏幕硬實力

    前言:三年的疫情因為要上網課的原因激活了平板市場,如今網課的時代已經過去,大家的生活都恢復到了正軌,這也就意味著,真正考驗平板電腦生存的環境來了。也就是面對著這種殘酷的
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 零售大模型“干中學”,攀爬數字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標。攀登珠峰的商業路線有兩條,一是尼泊爾境內的南坡路線,一是中國境內的北坡路線。相
  • 簽約井川里予、何丹彤,單視頻點贊近千萬,MCN黑馬永恒文希快速崛起!

    來源:視聽觀察永恒文希傳媒作為一家MCN公司,說起它的名字來,可能大家會覺得有點兒陌生,但是說出來下面一串的名字之后,或許大家就會感到震驚,原來這么多網紅,都簽約這家公司了。根
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 首發天璣9200+ iQOO Neo8系列發布首銷售價2299元起

    2023年5月23日晚,iQOO Neo8系列正式發布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強悍登場,限時售價3099元起;價位段最強性能手機iQOO Neo8同期上市
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 上思县| 安图县| 三明市| 麻栗坡县| 浦江县| 崇州市| 金坛市| 固阳县| 松潘县| 商都县| 博罗县| 永康市| 潮州市| 昌图县| 汉阴县| 宝清县| 区。| 堆龙德庆县| 盐池县| 虹口区| 封丘县| 靖边县| 南和县| 淳化县| 炉霍县| 布拖县| 文昌市| 惠水县| 溆浦县| 常德市| 东阿县| 哈尔滨市| 基隆市| 沙田区| 镇巴县| 大丰市| 深圳市| 抚宁县| 马龙县| 墨江| 会理县|