色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于Linux kernel同步機(jī)制的這些知識點你不得不知道

嵌入式悅翔園 ? 來源:嵌入式悅翔園 ? 2023-04-21 14:42 ? 次閱讀

前言

同步就是進(jìn)程與進(jìn)程之間,進(jìn)程與系統(tǒng)資源之間的交互。由于 Linux內(nèi)核采用的是多任務(wù),所以在多個進(jìn)程之間,必須要有同步機(jī)制來保證彼此協(xié)調(diào)。

在 Linux內(nèi)核中,有很多種同步機(jī)制。今天我們主要講一下 kernel中的異步和同步機(jī)制,其中重點介紹一下 kernel中的異步機(jī)制,kernel中的異步機(jī)制分為兩種:一種是應(yīng)用層的同步機(jī)制,也就是應(yīng)用層線程之間的通信,另一種是內(nèi)核的同步機(jī)制。

當(dāng)一個線程進(jìn)入到內(nèi)核態(tài)后,就可以直接跟內(nèi)核溝通了, kernel中有兩個線程是這樣的:一個是線程A,它進(jìn)入內(nèi)核態(tài)后,會直接跟內(nèi)核溝通,告訴它我要去干啥了,等我干完了就會通知你。(這個操作我們叫它 semi)當(dāng)一個線程進(jìn)入到內(nèi)核態(tài)后,會先去跟內(nèi)核溝通一次,然后就可以直接去執(zhí)行了。

kernel中的同步機(jī)制,本質(zhì)上就是線程間的通信機(jī)制,它們之間的通信就是通過同步機(jī)制來實現(xiàn)的。

一、進(jìn)程間的通信

為了保證系統(tǒng)的正確性和一致性, Linux內(nèi)核會在進(jìn)程間通信的過程中使用阻塞隊列來處理進(jìn)程間的通信。阻塞隊列是指在消息隊列中的某個元素在消息發(fā)出時就被創(chuàng)建,但并不是所有的消息都會被發(fā)送出去,只有當(dāng)某一條消息的等待隊列滿了才會被發(fā)送出去。如果接收方等待隊列中沒有消息,則會接收到通知,如果接收方等待隊列中有消息,則不會收到通知。

在內(nèi)核中,對阻塞隊列進(jìn)行了抽象,即當(dāng)某個進(jìn)程發(fā)出了一個消息后,它就被阻塞了。因此,阻塞隊列實際上是一種同步機(jī)制。阻塞隊列通過一個特定的函數(shù)來創(chuàng)建一個新的對象,該對象包含一個等待隊列指針(Push/Pop)。當(dāng)?shù)却犃袧M了之后,系統(tǒng)將把該等待隊列指針指向的對象作為第一個發(fā)出通知的進(jìn)程的線程。也就是說,該進(jìn)程會收到通知后才能繼續(xù)執(zhí)行它的任務(wù)。

二、信號

信號量可以用來發(fā)送或接收消息。當(dāng)一個進(jìn)程擁有了一個信號量,就意味著他已經(jīng)擁有了一個屬于自己的信號量,這個信號量是他自己的一個私有變量。這個私有變量是不能被其它進(jìn)程拿到的。信號量用來表示一個進(jìn)程所擁有的信號量數(shù)量,當(dāng)這個進(jìn)程擁有了這個信號量之后,就可以向其它進(jìn)程發(fā)送消息。這個私有變量只允許這個進(jìn)程自己使用,不可以把它拿到其它進(jìn)程的進(jìn)程中去。

當(dāng)一個線程擁有了自己的信號量之后,就可以通過共享變量來與其它線程進(jìn)行通信了。共享變量也是在其它線程中進(jìn)行使用的,其它線程使用共享變量來和自己進(jìn)行通信。

三、互斥量

互斥量主要是針對系統(tǒng)資源來說的。Linux內(nèi)核中的互斥量又可以分為兩種:共享資源和全局互斥資源。

共享資源就是進(jìn)程之間共享的,比如一個進(jìn)程有多個線程,那么每個線程都可以訪問這個共享的內(nèi)存空間。全局互斥資源就是進(jìn)程和線程之間只能訪問到自己所在的全局內(nèi)存空間。在一個系統(tǒng)中,可以使用互斥量來實現(xiàn)多個進(jìn)程同時在內(nèi)存中執(zhí)行。但是如果要實現(xiàn)多個進(jìn)程同時執(zhí)行,就需要使用同步機(jī)制,這樣才能保證所有的進(jìn)程都能夠在同一個內(nèi)存中運(yùn)行。使用互斥量,一個進(jìn)程只能訪問到自己所在的全局內(nèi)存空間,而無法訪問其它內(nèi)存空間。但是互斥量有一個很大的好處,那就是不會出現(xiàn)進(jìn)程阻塞等情況。

四、消息隊列

消息隊列的出現(xiàn),對進(jìn)程間通信進(jìn)行了很大的擴(kuò)展。在 kernel中,除了同步機(jī)制外,還有另外一種異步機(jī)制,那就是消息隊列。我們都知道, Linux內(nèi)核是支持消息隊列的。雖然在內(nèi)核中也有關(guān)于消息隊列的詳細(xì)信息,但是由于內(nèi)核是不支持用戶態(tài)的消息隊列的,所以我們還是要從應(yīng)用層入手來了解一下消息隊列。

首先我們先了解一下消息隊列是什么?

消息隊列是一種特殊的隊列,它能夠滿足多個應(yīng)用線程之間的同步需要。消息隊列用于提供應(yīng)用程序與其他進(jìn)程或線程之間的異步通信。如果我們需要進(jìn)行異步通信,那么就可以通過使用消息隊列來進(jìn)行。比如當(dāng)我們調(diào)用 clear ()函數(shù)時,我們就可以直接使用一個已注冊的消息隊列。

那么如何創(chuàng)建一個消息隊列呢?當(dāng)我們使用ext2. json時,可以在 JAR. json. clear ()中使用 semaphore命令創(chuàng)建一個消息隊列。

五、共享內(nèi)存

在共享內(nèi)存中,我們使用的是共享鎖,但因為共享鎖是與某個進(jìn)程共享內(nèi)存,所以當(dāng)你想要獲取共享鎖的時候,你需要向其他進(jìn)程請求。

就像在上面的例子中,我們通過 volatile關(guān)鍵字來訪問共享內(nèi)存。此時你并沒有向其他進(jìn)程請求,所以當(dāng)你想要獲取這個共享鎖時,只需要向其他進(jìn)程請求。這樣就避免了兩個進(jìn)程之間的互相競爭,同時還能實現(xiàn)數(shù)據(jù)的同步。

由于共享鎖是與某個進(jìn)程共享內(nèi)存,所以你必須向該進(jìn)程請求訪問它的地址。對于這種情況來說,最簡單的解決方案就是使用線程池。

在線程池中有一個叫做“byte”的對象,它也是一個共享鎖。當(dāng)你想要獲取這個鎖時,只需要向 byte對象發(fā)送請求就可以了。這時候 byte對象會將你的請求發(fā)送到該線程的隊列中,當(dāng)該線程收到請求時,它就會給你返回一個響應(yīng)消息。

六、線程池

線程池是一個非常好的線程管理工具,它可以讓多個線程同時運(yùn)行,還可以減少線程之間的死鎖和沖突。它還有一個最重要的特點就是,可以有效地利用系統(tǒng)的內(nèi)存,達(dá)到提高效率的目的。

線程池的使用非常簡單,就是把要執(zhí)行的任務(wù)分配到相應(yīng)的線程池中。當(dāng)要執(zhí)行的任務(wù)分配到相應(yīng)線程池后,就可以執(zhí)行了。使用線程池會給我們帶來很多好處:

可以更快地完成任務(wù)。當(dāng)一個任務(wù)被分配到了線程池中,就會被循環(huán)執(zhí)行下去,直到執(zhí)行完成或者是線程重新創(chuàng)建完成。

提高了資源利用效率。當(dāng)一個任務(wù)需要很多資源時,例如 CPU、內(nèi)存等,我們就可以使用線程池來管理這些資源,使每個線程都有足夠的 CPU和內(nèi)存來執(zhí)行這個任務(wù)。

七、內(nèi)核態(tài)的同步機(jī)制

上面介紹了兩種同步機(jī)制,那么我們來看看內(nèi)核態(tài)的同步機(jī)制,在內(nèi)核態(tài)有四種同步方式:

信號量:它是用來操作鎖的,當(dāng)一個線程占用了一個鎖時,它會向系統(tǒng)發(fā)送一個信號量。

信號量傳遞:這個機(jī)制是由操作系統(tǒng)提供的,在調(diào)用sys_thread函數(shù)后,會進(jìn)入中斷狀態(tài),此時調(diào)用sys_thread函數(shù)時,就會將信號量傳遞給系統(tǒng)。

互斥鎖:這種方式主要是通過優(yōu)先級的高低來控制對資源的訪問。

互斥鎖和信號量都是用來解決進(jìn)程之間的同步問題的。

還有一種同步方式是通過線程池來實現(xiàn)的。在這個過程中,線程池會創(chuàng)建一個線程,通過這個線程來跟其他線程進(jìn)行交互,從而達(dá)到同步效果。

八、總結(jié)

通過上面的分析我們了解到,同步是一個復(fù)雜的問題,在內(nèi)核態(tài)是如何完成同步的呢?

首先,在內(nèi)核態(tài)有三個進(jìn)程:這三個進(jìn)程都可以互相訪問對方的資源,也可以在資源被其他進(jìn)程請求時進(jìn)行同步。

當(dāng)某個進(jìn)程被阻塞時,它的所有子進(jìn)程會從等待隊列中取出一個子進(jìn)程(或者其它子進(jìn)程),并把它加到阻塞隊列中。當(dāng)所有子進(jìn)程都被阻塞時,阻塞隊列中就沒有子進(jìn)程了。這時,等待隊列中的其他子進(jìn)程就會把當(dāng)前線程加到等待隊列中。這三個進(jìn)程在等待過程中不會互相影響,三個線程可以通過設(shè)置自己的優(yōu)先級和其他線程進(jìn)行同步。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    316

    瀏覽量

    21702
  • 信號量
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    8368

原文標(biāo)題:作為嵌入式開發(fā)工程師,關(guān)于Linux kernel同步機(jī)制的這些知識點你不得不知道!

文章出處:【微信號:嵌入式悅翔園,微信公眾號:嵌入式悅翔園】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    這些關(guān)于開源硬件的知識不得不知哦~

    ,CC等協(xié)議規(guī)范帶到硬件分享領(lǐng)域。如果有志于成為一個開源硬件方面的“創(chuàng)客”,以下這些關(guān)于開源硬件的知識
    發(fā)表于 02-28 16:57

    Linux內(nèi)核同步機(jī)制

    在現(xiàn)代操作系統(tǒng)里,同一時間可能有多個內(nèi)核執(zhí)行流在執(zhí)行,因此內(nèi)核其實象多進(jìn)程多線程編程一樣也需要一些同步機(jī)制同步各執(zhí)行單元對共享數(shù)據(jù)的訪問。尤其是在多處理器系統(tǒng)上,更需要一些同步機(jī)制同步
    發(fā)表于 08-06 07:08

    關(guān)于FPGA,不得不知道的那些事

    做了兩件事,首先,它使能夠自由地搭建需要的硬件平臺,取代了從前使用ASIC(專用集成電路)時所不得不承擔(dān)的長開發(fā)時間、高額開發(fā)經(jīng)費(fèi)以及設(shè)計風(fēng)險,另外一,相比于其它的硬件構(gòu)成,它允
    發(fā)表于 09-26 14:44

    在main函數(shù)運(yùn)行之前,不得不知的那些事

    在main函數(shù)運(yùn)行之前,不得不知的那些事在c_int00函數(shù)中完成的功能有哪些?
    發(fā)表于 04-20 06:03

    關(guān)于AUTOSAR架構(gòu)的知識點看完就懂了

    關(guān)于AUTOSAR架構(gòu)的知識點看完就懂了
    發(fā)表于 10-18 07:41

    不得不知道的嵌入式C的高級用法

    我們需要知道——變量,其實是內(nèi)存地址的一個抽像名字罷了。在靜態(tài)編譯的程序中,所有的變量名都會在編譯時被轉(zhuǎn)成內(nèi)存地址。機(jī)器是不知道我們?nèi)〉拿值模?b class='flag-5'>知道地址。
    的頭像 發(fā)表于 07-02 14:33 ?4233次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>不得不知道</b>的嵌入式C的高級用法

    知道linux 同步機(jī)制的complete?

    Linux內(nèi)核中,completion是一種簡單的同步機(jī)制,標(biāo)志"things may proceed"。 要使用completion,必須在文件中包含,同時創(chuàng)建一個類型為struct completion的變量。
    發(fā)表于 04-24 11:45 ?1314次閱讀

    了解Linux內(nèi)核的同步機(jī)制

    在現(xiàn)代操作系統(tǒng)里,同一時間可能有多個內(nèi)核執(zhí)行流在執(zhí)行,因此內(nèi)核其實象多進(jìn)程多線程編程一樣也需要一些同步機(jī)制同步各執(zhí)行單元對共享數(shù)據(jù)的訪問。
    發(fā)表于 05-12 08:26 ?648次閱讀

    可以了解并學(xué)習(xí)Linux 內(nèi)核的同步機(jī)制

    Linux內(nèi)核同步機(jī)制,挺復(fù)雜的一個東西,常用的有自旋鎖,信號量,互斥體,原子操作,順序鎖,RCU,內(nèi)存屏障等。
    發(fā)表于 05-14 14:10 ?716次閱讀

    關(guān)于可能不知道的printf

    可能不知道的printf
    的頭像 發(fā)表于 02-05 12:28 ?2667次閱讀
    <b class='flag-5'>關(guān)于</b><b class='flag-5'>你</b>可能<b class='flag-5'>不知道</b>的printf

    Linux內(nèi)核的同步機(jī)制

    在現(xiàn)代操作系統(tǒng)里,同一時間可能有多個內(nèi)核執(zhí)行流在執(zhí)行,因此內(nèi)核其實像多進(jìn)程多線程編程一樣也需要一些同步機(jī)制同步各執(zhí)行單元對共享數(shù)據(jù)的訪問,尤其是在多處理器系統(tǒng)上,更需要一些同步機(jī)制同步
    的頭像 發(fā)表于 09-22 09:46 ?2326次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核的<b class='flag-5'>同步機(jī)制</b>

    要用好高精度單片機(jī),那就不得不知道怎么使用浮點數(shù)!資料下載

    電子發(fā)燒友網(wǎng)為提供要用好高精度單片機(jī),那就不得不知道怎么使用浮點數(shù)!資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-16 08:46 ?4次下載
    <b class='flag-5'>你</b>要用好高精度單片機(jī),那就<b class='flag-5'>不得不知道</b>怎么使用浮點數(shù)!資料下載

    不得不收藏的PCB的Checklist!

    不得不收藏的PCB的Checklist
    發(fā)表于 02-09 10:46 ?37次下載
    <b class='flag-5'>不得不</b>收藏的PCB的Checklist!

    Linux中多線程編程的知識點

    Hello、Hello大家好,我是木榮,今天我們繼續(xù)來聊一聊Linux中多線程編程中的重要知識點,詳細(xì)談?wù)劧嗑€程中同步和互斥機(jī)制
    發(fā)表于 04-26 17:27 ?620次閱讀
    <b class='flag-5'>Linux</b>中多線程編程的<b class='flag-5'>知識點</b>

    淺談Linux kernel中的同步機(jī)制

    同步就是進(jìn)程與進(jìn)程之間,進(jìn)程與系統(tǒng)資源之間的交互。由于 Linux內(nèi)核采用的是多任務(wù),所以在多個進(jìn)程之間,必須要有同步機(jī)制來保證彼此協(xié)調(diào)。
    的頭像 發(fā)表于 05-04 17:06 ?961次閱讀
    主站蜘蛛池模板: 人禽l交视频在线播放 视频 | 亚洲美女视频高清在线看 | 最近最新的日本字幕MV | 久久亚洲精品成人综合 | 99久久蜜臀AV免费看蛮 | 天天靠天天擦天天摸 | 欲奴第一季在线观看全集 | 97久久精品人人槡人妻人 | 国产在线精品国自产拍影院午夜 | 成人国产精品日本在线 | 久久99AV无色码人妻蜜柚 | 精品无码国产自产在线观看水浒传 | 寂寞少妇直播 | 久久这里只精品国产99re66 | 哇嘎在线精品视频在线观看 | 无码爽死成人777在线观看网站 | 九色PORNY真实丨国产大胸 | 偷上邻居熟睡少妇 | 免费三级网址 | 伊人国产在线视频 | 三级叫床震大尺度视频 | 久久久无码精品一区二区三区 | 91看片淫黄大片.在线天堂 | 国产精品亚洲精品久久品 | 亚洲嫩草影院久久精品 | 中文中幕无码亚洲在线 | 久久综合九色综合国产 | 国产精品视频一区二区猎奇 | 一本久道久久综合狠狠躁AV | 国产人妻人伦精品A区 | 女性BBWBBWBBWBBW| 久久操热在线视频精品 | 国产福利视频第一导航 | 91精品婷婷国产综合久久8 | 国产亚洲高清视频 | 日韩丰满少妇无码内射 | 国产精品久久久久久久久久免费 | 日韩精品卡1卡2三卡四卡乱码 | xiah俊秀| 97久久精品视频 | 亚洲精品国产字幕久久vr |