主頁 > 作業系統 > Linux Cgroup v1系列中文翻譯(1):控制組Control Group

Linux Cgroup v1系列中文翻譯(1):控制組Control Group

2022-06-06 09:17:32 作業系統

英文原文:https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cgroups.html

1 控制組

1.1 什么是控制組?

控制組(Control Group)提供一種機制,把一組任務(task)及其子任務整合/分割成具有特殊行為的分層化的分組(groups),

定義:
控制組(cgroup),把一組任務跟一個或者多個子系統(subsystem)的一組引數進行關聯,

分組(subsystem),是一種模塊,利用cgroup提供的任務分組功能,以特定的方式來實作任務組,分組(subsystem)一般是資源控制器(resource controller),調度資源或者設定資源限制,但是他也可以是管理一組行程的任何方法,例如虛擬子系統,

分層(hierachy),是一組樹形結構的控制組,系統中的每個任務都會處在分層的控制組和子系統中,每個子系統有控制組相關的系統狀態,每個分層都有一個控制組虛擬檔案系統實體,

在任何時候,可以有多個激活的任務組分層,每個分層是系統中所有任務的一種隔離,

用戶級別的代碼可以根據cgroup虛擬檔案系統中的名稱創建和銷毀控制組,指定和查詢任務被分配給哪個控制組,列舉分配給控制組的任務PID,這些創建和分配只影響該控制組檔案系統相關的分層,

控制組的唯一作用就是簡化任務跟蹤,她的目標是其他子系統能掛載到通用控制組上,而這些通用控制組提供了新的控制組屬性,例如對控制組行程能訪問資源的統計和限制,舉個例子,cpusets允許把cpu和記憶體節點和每個控制組的任務進行關聯,

1.2 為什么需要控制組?

在linux內核中,有多種用來做資源跟蹤的行程聚合方式,像cpusets,CKRM/ResGroups,UserBeanCounters和虛擬服務命名空間(namespace),這些方式都需要了解行程分組/分割的基本概念,而這些在同一個分組(cgroup)中新產生的子行程作為他們的父行程,

內核的控制組補丁提供了最小的基本內核機制,根據需求有效的實作這種控制組,它對系統快速路徑(system fast paths)只有很小的影響,并提供了針對特定子系統的鉤子,像cpusets,

多級分層支持,允許分割任務到控制組,它明顯不同于一些有平行分層的子系統,允許每個分層作為自然的任務分隔,不必處理復雜的任務組合,而這些任務組合是出現在幾個不相關的子系統需要強制分配到同一個控制組樹的情況下,

在極端情況下,每個資源控制器或者子系統可能在單獨的分層中;另一種極端情況,所有的子系統可能隸屬于同一個分層,

有一個應用場景示例可能對多分層的理解有好處,假設一個有很多用戶(學生,教授,系統任務等)的大學服務器,這個服務器的資源規劃應該是下面這樣子的:

CPU :          "Top cpuset"
                /       \
        CPUSet1         CPUSet2
           |               |
        (Professors)    (Students)   
        In addition (system tasks) are attached to topcpuset 
        (so that they can run anywhere) with a limit of 20%
 Memory : Professors (50%), Students (30%), system (20%)
   Disk : Professors (50%), Students (30%), system (20%)
Network : WWW browsing (20%), Network File System (60%), others (20%)
                        / \
        Professors (15%)  students (5%)

瀏覽器firefox/lynx算作WWW網路類,而 (k)nfsd算作NFS網路類,與此同時,取決于誰來運行它,Firefox/Lynx將共享cpu/memory類,

為了能對不同的資源劃分任務,管理員很容易就能運行腳本來接收執行通知,然后根據是誰來運行的瀏覽器,他可以執行下面的命令:

# echo browser_pid > /sys/fs/cgroup/<restype>/<userclass>/tasks

在只有單個分層情況下,他現在可能必須要為每個啟動的瀏覽器創建一個單獨的控制組,然后關聯合適的網路和其他的資源類,這可能導致這種控制組的激增,

管理員可能臨時為一個學生的瀏覽器增加網路訪問,或者給一個學生的模擬器應用增加CPU算力,

下面的方式可以直接寫PIDs到資源類中:

# echo pid > /sys/fs/cgroup/network/<new_class>/tasks
(after some time)
# echo pid > /sys/fs/cgroup/network/<orig_class>/tasks

沒有這種機制的話,管理員將不得不切分控制組成多個單獨的控制組,然后關聯新的控制組和新的資源類,

1.3 控制組是如何實作的?

控制組在內核中的擴展方式如下:

  • 系統中每個任務task一個參考計數指標指向css_set,
  • css_set包含一個指向cgroup_subsys_state物件的參考計數指標集合,每個控制組子系統在系統中注冊一個該物件,(省略部分)
  • 一個控制組分層檔案系統能被從用戶空間掛載出來進行瀏覽和操作,
  • 可以根據PID列舉隸屬于任何控制組的任務,

控制組的實作需要幾個簡單的鉤子鉤到內核其余部分,但是不在關鍵性能的路徑上:

  • 在init/main.c中來初始化根控制組(root cgroups),在系統啟動時初始化css_set.
  • 在fork和exit時,從css_set中attach和detach任務,

除此之外,一個新的檔案系統型別cgroup可以被掛載出來,以便能夠瀏覽和修改控制組,當掛載一個控制組分層(cgroup hierachy)的時候,你可以指定一個逗號分隔符的子系統串列來作為掛載選項,默認情況下,掛載控制組檔案系統會試著掛載一個包含所有已注冊子系統的分層,

如果存在一個激活的分層有相同的子系統集合,它將被重用做新的掛載,如果沒有現存的分層匹配,以及現存分層中的任何子系統正在被使用,那么掛載將會失敗(失敗號-EBUSY),否則,一個新的分層就被激活,跟請求的子系統關聯起來,
系結新的子系統到激活的控制組分層中,或者從激活的控制組分層中解綁子系統,在當前是不可能,但是未來是可能的,但是它會充滿著嚴重的錯誤恢復(errot-recovery)問題,

當控制組檔案系統被卸載時,如果有任何子控制組被創建在頂級控制組下,即使已經卸載完畢,分層仍會保持激活;如果沒有子控制組,那么分層將會被停用,
沒有為控制組增加新的系統呼叫,對控制組的所有的查詢和修改的操作支持都是通過控制組檔案系統,

在/proc下的每個任務都有一個新增的cgroup檔案,對每個激活的分層來說,子系統命名和控制組名稱路徑都是相對控制組檔案系統根路徑的,

每個控制組是由控制組檔案系統中的目標表示的,它包含如下的檔案來描述控制組:

  • tasks:隸屬于控制組的任務串列(以PID來表示),這個串列不是按序排列的,寫入執行緒ID到這個檔案就表示移動執行緒到這個控制組,
  • cgroup.procs:執行緒組ID,這個串列不保證按序排列或者沒有重復的TGIDs,如果需要的話,用戶空間應當排序或者uniquify這個串列,寫執行緒組ID到這個檔案就會移動這個組中的所有執行緒到本控制組,
  • notify_on_release: 在exit退出時運行release agent,
  • release_agent: 用來釋放通知的路徑,(這個檔案僅僅存在頂層控制組中)

其他的子系統,像cpusets可能會在每個控制組路目錄下添加額外的檔案,

新的控制組可以通過mkdir系統呼叫或者shell命令來創建,控制組屬性,例如標簽,可以通過寫入該控制組目錄下的檔案來修改,

嵌套控制組的命名分層結構允許分割大系統成嵌套的、動態可變的軟磁區(soft-partitions),

每個任務系結到控制組時,在fork的時候會被該任務的子任務自動繼承,允許在系統中組織作業負載到相關的任務集合中,如果必要的控制組檔案系統目錄允許,一個任務可以被重新系結到任何控制組,

當任務從一個控制組移動到另一個控制組,他就會獲得一個新的css_set指標,如果有現存的css_set,帶有預期的可重用的控制組集合,那么就可以重用,否則,就分配一個新的css_set,現有的css_set通過查詢哈希表來定位,

要允許從控制組來訪問css_sets,一個g_cgroup_link物件集合形成一個格柵(lattice);每個g_cgroup_link被鏈接到一個g_cgroup_links串列(省略......)

控制組中的任務集合可以通過參考該控制組的css_set來列舉,

使用linux虛擬檔案系統vfs來表示控制組分層,最小化改動內核代碼,為控制組提供了常見的權限和命名空間,

1.4 notify_on_release是做什么的?

如果控制組中的notify_on_release標記被使能,那么只要控制組中的最后一個任務離開(退出或者系結到其他的控制組)并且最后的子控制組被移除,內核就會運行分層根目錄下的release_agent檔案內容中定義的命令,提供廢棄的控制組的路徑名(相對控制組檔案系統的掛載點),這樣能自動移除廢棄的控制組,

在系統啟動的時候,根控制組中的notify_on_release的默認值是diabaled(0).其他的控制組在創建時候的默認值是他們的父控制組的notify_on_release的當前值,

控制組分層的release_agent路徑的默認值是空,

1.5 clone_children是做什么的?

這個標簽僅僅影響cpuset控制器,如果clone_children標記在控制組中被使能enbale(1),一個新的cpuset控制組在初始化的時候就能復制父控制組的配置,

1.6 如何使用控制組?

要啟動一個將要包含在某個控制組中的新作業任務,使用cpuset控制組子系統,操作步驟如下:

1) mount -t tmpfs cgroup_root /sys/fs/cgroup
2) mkdir /sys/fs/cgroup/cpuset
3) mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset
4) Create the new cgroup by doing mkdir's and write's (or echo's) in
   the /sys/fs/cgroup/cpuset virtual file system.
5) Start a task that will be the "founding father" of the new job.
6) Attach that task to the new cgroup by writing its PID to the
   /sys/fs/cgroup/cpuset tasks file for that cgroup.
7) fork, exec or clone the job tasks from this founding father task.

舉個例子,下面的命令序列將會創建一個名稱為“Charlie”的控制組,僅僅包含CPU2和3,記憶體節點1,在控制組中啟動一個子shell ‘sh’:

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/cpuset
mount -t cgroup cpuset -ocpuset /sys/fs/cgroup/cpuset
cd /sys/fs/cgroup/cpuset
mkdir Charlie
cd Charlie
/bin/echo 2-3 > cpuset.cpus
/bin/echo 1 > cpuset.mems
/bin/echo $$ > tasks
sh
# The subshell 'sh' is now running in cgroup Charlie
# The next line should display '/Charlie'
cat /proc/self/cgroup

2 應用示例和語法

2.1 基本用法

創建、修改和使用控制組可以通過控制組虛擬檔案系統來完成,

要掛載一個所有子系統都可用的控制組分層,輸入命令:

# mount -t cgroup xxx /sys/fs/cgroup

內核代碼解讀不了“xxx”,但是它會出現在/proc/mounts中,因此它就可以是你想用的有用的身份字串,

注意:沒有用戶提前輸入的話,一些子系統不能作業,例如,如果cpusets被使能,用戶必須為每個已經創建但是還沒使用的控制組寫入資料到cpu和mem檔案中,

正如1.2章節所述,我們為什么需要控制組?你應該為每個你想要控制的資源或者資源組創建不同的控制組分層,因此,你可以掛載在/sys/fs/cgroup中tmpfs,然后為每個控制組資源或者資源組創建目錄:

# mount -t tmpfs cgroup_root /sys/fs/cgroup
# mkdir /sys/fs/cgroup/rg1

要掛載只有cpuset和memory子系統的控制組分層,輸入如下命令:

# mount -t cgroup -o cpuset,memory hier1 /sys/fs/cgroup/rg1

重新掛載控制組當前是支持的,但是不推薦使用,重新掛載允許改變子系統和release_agent,重新系結幾乎沒有什么用,它只在分層為空并且release_agent本身應當被常規fsnotify替換的時候才會生效,重新掛載在未來會被移除,

要定義分層的release_agent:

# mount -t cgroup -o cpuset,release_agent="/sbin/cpuset_release_agent" xxx /sys/fs/cgroup/rg1

注意,如果多次定義release_agent,將會回傳失敗,

注意,子系統集合的變更當前被支持,僅限于由單個(根)控制組組成的分層,能夠隨時從現存的控制組分層系結/解綁子系統,未來會考慮支持實作,

然后在/sys/fs/cgroup/rg1下,你能找到系統中的控制組樹,例如/sys/fs/cgroup/rg1也可以是容納整個系統的控制組,

如果你想要更改release_agent的值:

# echo "/sbin/new_release_agent" > /sys/fs/cgroup/rg1/release_agent

它也可以在重新掛載時更改,

如果你想在/sys/fs/cgroup/rg1下創建新的控制組:

# cd /sys/fs/cgroup/rg1
# mkdir my_cgroup

現在你想要用這個控制組來做些什么的話:

# cd my_cgroup

在這個目錄下,你可以找到幾個檔案:

# ls
cgroup.procs notify_on_release tasks
(plus whatever files added by the attached subsystems)

現在系結你的當前shell到這個控制組:

# /bin/echo $$ > tasks

你也能在你的控制組內部創建控制組,在這個目錄下使用mkdir:

# mkdir my_sub_cs

要移除控制組,只要使用rmdir就可以:

# rmdir my_sub_cs

如果控制組正在使用中(內部有控制組,或者有行程系結系結,或者其他子系統相關的參考保持激活狀態),這操作就會失敗,

2.2 系結行程

# /bin/echo PID > tasks

注意,這里是PID而不是PIDs,一次只能系結一個任務,如果你有幾個任務,只能一個個的系結:

# /bin/echo PID1 > tasks
# /bin/echo PID2 > tasks
        ...
# /bin/echo PIDn > tasks

你也可以通過寫入0來系結當前的shell任務:

# echo 0 > tasks

你也可以使用cgroup.procs檔案來代替tasks檔案,一次性移除執行緒組中的所有任務,寫入執行緒組中任何的任務PID到cgroup.procs中,執行緒組中的所有任務將會被系結到該控制組,寫入0到cgroup.procs中就會移動當前寫任務的執行緒組中的所有任務,

注意:因為每個任務總是某個已掛載分層下的控制組的成員,要從當前控制組移除任務,你必須移動它到新的控制組(可能是根控制組),就是通過寫入新控制組的tasks檔案的方式,

注意:由于受到一些控制組子系統的強制限制,移動行程到另外的控制組可能會失敗,

2.3 按名字掛載分層

當掛載控制組分層時傳遞name=選項,就會以給定的名字來關聯分層,這么做是有用的,對于掛載一個已存在(pre-existing)的分層時,為了按名參考而不是按激活子系統的集合參考,每個分層或者是無名的或者是有一個唯一的名字,

名字應當匹配 [w.-]+

當傳遞name=選項給新的分層時,你需要手動定義子系統;當你給一個子系統命名一個名字,掛載所有子系統而什么都沒有定義,這種行為是不被支持的,

子系統的名字作為分層的一部分會出現在/proc/mounts和/proc//cgroups中,

3 Kernel API

省略原文大概90行!我個人并不關注這一部分,所以沒有翻譯!!!

4 擴展屬性用法

控制組檔案系統支持它的目錄和檔案中擴展屬性的特定型別,當前支持的型別是:

Trusted (XATTR_TRUSTED)
Security (XATTR_SECURITY)

他們都需要設定CAP_SYS_ADMIN功能,

跟在tmpfs中一樣,控制組檔案系統中的擴展屬性使用內核記憶體來存盤,建議保持最小使用,這就是為什么用戶定義的擴展屬性不支持的原因,因為任何用戶都能這么做并且沒有大小限制,

這個功能當前的已知用戶是SELINUX,用來限制控制組在容器中和systemd的使用,以便對諸如控制組(systemd為每個服務創建的控制組)中的主PID這樣的meta資料進行分類,

5 答疑

Q: 為什么要使用'/bin/echo'?  
A: bash內嵌的echo命令不會檢查對write()呼叫的錯誤,如果你在控制組檔案系統中使用它,你將不知道命令是否執行成功還是失敗,  

Q: 當我系結很多行程時,只有第一行被真正系結?  
A: 每次對write()的呼叫只能回傳一個錯誤,所以你應該就放一個PID, 

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/486177.html

標籤:Linux

上一篇:JavaScript:是否有與Pythonsetattr()函式等效的函式?

下一篇:linux命令__du

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more