容器的底層實現與linux

2021-09-27 06:57:41 字數 1150 閱讀 9324

程序組顧名思義,即是多個程序的集合。linux系統中每乙個程序都屬於乙個程序組,每乙個程序組都有唯一的乙個程序組標識號。

1.當任意父程序呼叫fork()函式生成子程序時,子程序和父程序同屬於乙個程序組

2.每乙個程序組都有乙個組長程序,組長程序負責與其他程序組交換資料,但組長程序消亡,程序組並不會消失。

3.直到程序組中最後乙個程序死亡,程序組也隨之死亡。

getpgrp() //返回當前程序所屬程序組的標號
getpid() //返回當前程序標號
cgroup是linux核心中的乙個功能,提供了一系列的api函式來對程序組進行控制。常見的操作就是限制程序組資源,將某個程序加入到某個程序組,設定程序組的優先順序等。

1.限制程序組資源。如:memory子系統可以為程序組設定乙個memory使用上限,一旦程序組使用的記憶體達到限額再申請記憶體,就會觸發oom(out of memory)。

3.程序組隔離:使得不同的程序組有各自的檔案系統,網路棧(即位於a程序組的程序與位於b程序組的程序可以使用不同的網路協議)

4.掛起或執行某乙個程序組。

行文至此,不難發現,容器是乙個使用cgroup所提供服務所寫的乙個應用。容器是否可以簡單理解為作業系統中的乙個程序組呢?這個理解還不完全正確。與這樣錯誤理解相似的還有,資料結構就是結構體嗎?類就是成員變數嗎?對於後面兩個問題的答案,各類書籍中也給出了明確的答案。

資料結構 = (d,s)。其中d是資料的有限集,s是d上的關係。即資料結構 = 資料儲存方式 + 對資料的一組操作

類 = 成員變數 + 對成員變數的一組操作

由此,可以給出容器的定義。

容器 = 程序組+定義在程序組之上的一組操作

這樣理解容器就淺顯很多了。容器使得使用者只用建立程序組,然後便利的使用這些程序組,而不用考慮該如何為這些程序組分配資源,設定優先順序,隔離程序組這些細節問題。容器以及使用了cgroup將這些麻煩事情都處理好了。使用者只需要使用容器即可,不用深入了解到linux核心的具體功能。

從表象來看,不同容器就是不同的世界,每乙個容器中都能夠執行不同的應用。深究至此,容器實質上是通過cgroup提供程序組隔離功能達到這樣的效果。

28 實現容器的底層技術

為了更好地理解容器的特性,本節我們將討論容器的底層實現技術。cgroup 和 namespace 是最重要的兩種技術。cgroup 實現資源限額,namespace 實現資源隔離。cgroup cgroup 全稱 control group。linux 作業系統通過 cgroup 可以設定程序使用 ...

STL容器的區別及底層實現

在stl中基本容器有 vector list deque set map set 和map都是無序的儲存元素,只能通過它提供的介面對裡面的元素進行訪問 set 集合,用來判斷某乙個元素是不是在乙個組裡面,使用的比較少 map 對映,相當於字典,把乙個值對映成另乙個值,如果想建立字典的話使用它好了 底...

HashSet 與HashMap底層實現

1.hashset底層通過包裝hashmap來實現,hashset在新增乙個值的時候,實際上是將此值作為hashmap中的key來進行儲存。2.hashmap的底層實現是通過初始化化乙個entry陣列來實現key value的儲存。3.在hashmap的entry中有四個變數,key value h...