国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux下進程的調(diào)度與切換

這篇具有很好參考價值的文章主要介紹了Linux下進程的調(diào)度與切換。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??進程的調(diào)度與切換


文章目錄:

進程的調(diào)度與切換

????進程切換

????進程調(diào)度
??????活動狀態(tài)進程隊列
??????位圖判斷
??????過期隊列

????總結(jié)


前言:

??在Linux操作系統(tǒng)中,進程的調(diào)度與切換是操作系統(tǒng)核心功能之一,它直接影響著系統(tǒng)的性能和響應速度。那么話不多說,開啟我們今天的話題!

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器


??進程切換

??CPU中存在眾多寄存器,不同的寄存器有不同的功能,這些寄存器都在CPU中保存著,每一個都能裝一定的數(shù)據(jù)。

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器
??運行隊列控制著PCB排隊執(zhí)行,每執(zhí)行到一個進程的時候,內(nèi)存里的eip指針會逐條追蹤下一條指令。

??我們要知道,所有的保存都是為了恢復,保存在CPU寄存器里的數(shù)據(jù),是當前進程時間片用完之前所執(zhí)行的進度,而 所有的恢復,都是為了從上次的運行位置繼續(xù)運行。

??并且,CPU內(nèi)的所有臨時數(shù)據(jù),我們稱之為進程的 硬件上下文! 硬件上下文,由我們的 進程進行保存,得以保護上下文。

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器

??當進程在進行第二次及第N次調(diào)度進程的時候,進程被放到CPU上開始運行,將曾經(jīng)保存的硬件上下文進行恢復。

??所以進程切換最重要的就是 進程上下文的保存和恢復。

??我們可以看一下內(nèi)核中的一些寄存器:

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器
注意: CPU中的寄存器只有一套,而寄存器保存的數(shù)據(jù)可以有多套。雖然寄存器數(shù)據(jù)放在了共享的CPU設備內(nèi),但是 所有的數(shù)據(jù)都是被進程私有的!


??進程調(diào)度

??活動狀態(tài)進程隊列

??我們上次說過,Linux實現(xiàn)進程調(diào)度的算法,需要考慮 優(yōu)先級,考慮進程饑餓,以及效率。那么CPU是如何實現(xiàn)進程調(diào)度的呢?

??我們來看一下Linux下CPU的運行隊列的各項屬性:
Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器

??我們首先看藍色框內(nèi)的內(nèi)容,有一個叫做 queue[140] 的數(shù)組,這里的 queue數(shù)組表示活動狀態(tài)進程的進程隊列

??其中在queue數(shù)組中,索引0~99號下標我們是不用的,這是因為0-99號下標對應的是 實時進程的優(yōu)先級,實時進程是內(nèi)核里更加重要的進程,放 在前100位由操作系統(tǒng)控制,避免系統(tǒng)搶占的情況

??所以我們只剩下 100-139 這個范圍可操控,其實這也就和我們優(yōu)先級的可控范圍大小相同,正好對應隊列的四十個空位,而OS通過 某種映射關系,將可控優(yōu)先級映射到數(shù)組 100-139的下標。

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器


??位圖判斷

??我們看藍色框內(nèi)還有一項 bitmap數(shù)組,類型為int,這個數(shù)組用來干嘛呢?只能存儲5個整形變量。

??數(shù)組的名字叫做bitmap已經(jīng)很明顯了,就是位圖,5個整形元素有 32 * 5 = 160 個比特位,比特位的位置,表示哪一個隊列。比特位的內(nèi)容,表示該隊列為不為空

?比如:0000 … 0000 ,如果最左側(cè)0對應queue[100]的位置,那么如果該比特位為0表示在該下標映射的優(yōu)先級下該隊列為空,否則不為空。

??有人會問:為什么要用位圖?不得不說,這是個愚蠢的問題,遍歷整個隊列的時間開銷要遠大于查找位圖。

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器

??所以,bitmap是用來檢測隊列中是否有進程,檢測對應的比特位是否為1!

??而藍色框內(nèi)還有一個元素:nr_active,在Linux中,nr_active 是運行隊列中用于表示活躍進程數(shù)量的計數(shù)器nr_active 的值可以告訴內(nèi)核有多少進程正在等待執(zhí)行,從而幫助內(nèi)核進行進程調(diào)度和資源分配。


??過期隊列

??在紅色框中的三項屬性與藍色框中的三項屬性完全相同,也就是另外一個隊列,被稱為——過期隊列

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器

??活躍隊列表示當前CPU正在執(zhí)行的運行隊列,而 正在執(zhí)行的運行隊列(也就是活躍隊列)是不可以增加新的進程的。

??所以操作系統(tǒng)設置了一個 和活躍隊列相同屬性的過期隊列,當活躍隊列正在執(zhí)行時如果有進程需要添加進運行隊列,那么就會添加至過期隊列當中也就是說 活躍隊列的進程一直在減少,而過期隊列中的進程一直在增多!

??當活躍隊列的進程執(zhí)行完畢后,就會和過期隊列進行交換,它們交換的方式是通過兩個結(jié)構(gòu)體指針:

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器

??就是 activeexpired 結(jié)構(gòu)體指針,它們分別指向活躍隊列和過期隊列,而活躍隊列與過期隊列由于屬性完全相同,于是被放在了一個叫做 prio_arry_t[2] 的數(shù)組里,prio_arry_t[0]指向活躍隊列,prio_arry_t[1]指向過期隊列

struct q{//q是我隨意取的名字
	int nr_active;
	int bitmap[5];
	task_struct queue[140];
}

struct q *active;//活躍隊列
struct q *expired;//過期隊列

struct q *active = &prio_array_t[0];
struct q *expired = &prio_array_t[1];

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器
??當活躍隊列被CPU執(zhí)行完畢后,我們 只需要交換兩個指針的內(nèi)容即可,這樣僅僅是指向的內(nèi)容變了,活躍隊列變?yōu)檫^期隊列,過期隊列變活躍隊列,并且時間復雜度為 O(1):

swap(active, expried);//直接交換兩個指針的內(nèi)容

??新增進程在過期隊列里插入,此時正在執(zhí)行的是活躍隊列,所以這個時候在過期隊列里就有時間處理競爭饑餓的問題了。

??這樣,我們競爭饑餓,優(yōu)先級,以及進程效率都解決了。


????總結(jié)

  • ?進程切換最重要的部分就是 進程上下文的保護和恢復。
  • ?進程調(diào)度的優(yōu)先級問題由 活躍進程數(shù)組的下標與進程優(yōu)先級形成一種映射關系 解決。
  • ?進程調(diào)度的時間復雜度問題由 位圖和兩個結(jié)構(gòu)體指針 解決,時間復雜度控制在了O(1)。
  • ?進程調(diào)度的進程饑餓問題由 活躍隊列和過期隊列 解決。

Linux下進程的調(diào)度與切換,Linux系統(tǒng)編程,linux,運維,服務器
??創(chuàng)作不易,如果這篇文章對你有幫助的話,還望三連支持博主呀~~文章來源地址http://www.zghlxwxcb.cn/news/detail-841352.html

到了這里,關于Linux下進程的調(diào)度與切換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 操作系統(tǒng)理論:Linux進程與進程狀態(tài)(進程調(diào)度的大O(1)算法數(shù)據(jù)結(jié)構(gòu)模型)

    操作系統(tǒng)理論:Linux進程與進程狀態(tài)(進程調(diào)度的大O(1)算法數(shù)據(jù)結(jié)構(gòu)模型)

    馮諾依曼體系的計算機在運行時,內(nèi)存中會預加載許多程序(數(shù)據(jù)+運算指令集),然而CPU 同一時刻只能執(zhí)行一個程序 (多個程序競爭CPU資源),此時就需要操作系統(tǒng) 對內(nèi)存中的諸多程序進行管理 ,讓CPU資源得到合理的分配,于是便有了進程的概念: 進程:描述程序的結(jié)構(gòu)體對象( PCB結(jié)構(gòu)體

    2024年02月15日
    瀏覽(20)
  • Linux網(wǎng)絡編程:多進程 多線程_并發(fā)服務器

    文章目錄: 一:wrap常用函數(shù)封裝 wrap.h? wrap.c server.c封裝實現(xiàn) client.c封裝實現(xiàn) 二:多進程process并發(fā)服務器 server.c服務器 實現(xiàn)思路 代碼邏輯? client.c客戶端 三:多線程thread并發(fā)服務器 server.c服務器 實現(xiàn)思路 代碼邏輯? client.c客戶端 ???? ??read 函數(shù)的返回值 wrap.h? wrap

    2024年02月12日
    瀏覽(31)
  • [Linux] 網(wǎng)絡編程 - 初見TCP套接字編程: 實現(xiàn)簡單的單進程、多進程、多線程、線程池tcp服務器

    [Linux] 網(wǎng)絡編程 - 初見TCP套接字編程: 實現(xiàn)簡單的單進程、多進程、多線程、線程池tcp服務器

    網(wǎng)絡的上一篇文章, 我們介紹了網(wǎng)絡變成的一些重要的概念, 以及 UDP套接字的編程演示. 還實現(xiàn)了一個簡單更簡陋的UDP公共聊天室. [Linux] 網(wǎng)絡編程 - 初見UDP套接字編程: 網(wǎng)絡編程部分相關概念、TCP、UDP協(xié)議基本特點、網(wǎng)絡字節(jié)序、socket接口使用、簡單的UDP網(wǎng)絡及聊天室實現(xiàn)…

    2024年02月16日
    瀏覽(32)
  • Linux中 socket編程中多進程/多線程TCP并發(fā)服務器模型

    一次只能處理一個客戶端的請求,等這個客戶端退出后,才能處理下一個客戶端。 缺點:循環(huán)服務器所處理的客戶端不能有耗時操作。 模型 源碼 可以同時處理多個客戶端請求 父進程 / 主線程專門用于負責連接,創(chuàng)建子進程 / 分支線程用來與客戶端交互。 模型 源碼 模型 源

    2024年02月12日
    瀏覽(23)
  • Linux系統(tǒng)編程(終端和進程的關系)

    Linux系統(tǒng)編程(終端和進程的關系)

    本篇文章帶大家學習終端和進程的關系,終端相信大家都聽過,那么真的理解終端是什么嗎?應該有很多同學對于終端只是有一個模糊的概念。那么這篇文章就詳細的來講解一下終端的概念。 在Linux系統(tǒng)中,終端(Terminal)和控制臺(Console)是兩個不同的概念。它們都提供了

    2024年02月11日
    瀏覽(23)
  • Linux系統(tǒng)編程——進程間通信的學習

    學習參考博文: 進程間的五種通信方式介紹 Linux 信號介紹 Linux系統(tǒng)編程學習相關博文 Linux系統(tǒng)編程——文件編程的學習 Linux系統(tǒng)編程——進程的學習 Linux系統(tǒng)編程——線程的學習 Linux系統(tǒng)編程——網(wǎng)絡編程的學習 常規(guī)學習Linux系統(tǒng)編程的內(nèi)容是復雜且繁多的,不推薦剛開始

    2024年02月08日
    瀏覽(23)
  • Linux下的系統(tǒng)編程——進程的執(zhí)行與回收(八)

    Linux下的系統(tǒng)編程——進程的執(zhí)行與回收(八)

    前言: 前面我們對進程已經(jīng)有了一個初步的了解與認識,現(xiàn)在讓我們學習一下進程中一些函數(shù)的具體使用,比如exec可以執(zhí)行一些指定的程序,wait / waitpid可以回收子進程,什么是孤兒進程,什么是僵尸進程,下面讓我們一起對這些進行中的操作進行學習吧 目錄 一、exec函數(shù)族

    2024年02月09日
    瀏覽(26)
  • Linux系統(tǒng)編程:采用管道的方式實現(xiàn)進程間通信

    Linux系統(tǒng)編程:采用管道的方式實現(xiàn)進程間通信

    目錄 一.?進程間通信概述 二.?管道的概念? 三.?通過管道實現(xiàn)進程間通信 3.1?實現(xiàn)原理 3.2?匿名管道創(chuàng)建系統(tǒng)接口pipe 3.3?管道通信的模擬實現(xiàn) 3.4?管道通信的訪問控制規(guī)則 3.5?管道通信的特點 四.?通過匿名管道實現(xiàn)進程池 4.1?進程池的概念 4.2?進程池的模擬實現(xiàn) 五.?命名

    2024年02月12日
    瀏覽(24)
  • Linux下的系統(tǒng)編程——進程間的通信(九)

    Linux下的系統(tǒng)編程——進程間的通信(九)

    前言:? 前面我們已經(jīng)對進程已經(jīng)有了一個簡單的了解與認識,那么進程間的通信是什么樣的呢,什么是父子進程,什么是兄弟進程,沒有血緣關系間的進程是如何實現(xiàn)進程通信的,下面讓我們一起學習一下什么是進程間的通信吧。 目錄 一、進程間通信常用方式 IPC方式:

    2024年02月09日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包