導航:首頁 > 編程系統 > linux內核紅黑樹應用

linux內核紅黑樹應用

發布時間:2021-02-25 22:23:17

⑴ 求一個時間片輪轉調度演算法完整程序及流程圖。

其實Robert Love所編著的《linux內核設計與實現》裡面講到了CFS完全公平調度很詳細的介紹了演算法流程,無非就是BST加紅黑樹

⑵ BE如何查看虛擬帶庫剩餘的空間

一個進程的虛擬地址空間主要由兩個數據結來描述。一個是最高層次的:_struct,一個是較高層次的:vm_area_structs。最高層次的mm_struct結構描述了一個進程的整個虛擬地址空間。較高層次的結構vm_area_truct描述了虛擬地址空間的一個區間(簡稱虛擬區)。

1. MM_STRUCT結構

mm_strcut 用來描述一個進程的虛擬地址空間,在/include/linux/sched.h 中描述如下:

struct mm_struct {

struct vm_area_struct * mmap; /* 指向虛擬區間(VMA)鏈表 */

rb_root_t mm_rb; /*指向red_black樹*/

struct vm_area_struct * mmap_cache; /* 指向最近找到的虛擬區間*/

pgd_t * pgd; /*指向進程的頁目錄*/

atomic_t mm_users; /* 用戶空間中的有多少用戶*/

atomic_t mm_count; /* 對"struct mm_struct"有多少引用*/

int map_count; /* 虛擬區間的個數*/

struct rw_semaphore mmap_sem;

spinlock_t page_table_lock; /* 保護任務頁表和 mm->rss */

struct list_head mmlist; /*所有活動(active)mm的鏈表 */

unsigned long start_code, end_code, start_data, end_data;

unsigned long start_brk, brk, start_stack;

unsigned long arg_start, arg_end, env_start, env_end;

unsigned long rss, total_vm, locked_vm;

unsigned long def_flags;

unsigned long cpu_vm_mask;

unsigned long swap_address;

unsigned mpable:1;

/* Architecture-specific MM context */

mm_context_t context;

};

對該結構進一步說明如下:

在內核代碼中,指向這個數據結構的變數常常是mm。

每個進程只有一個mm_struct結構,在每個進程的task_struct結構中,有一個指向該進程的結構。可以說,mm_struct結構是對整個用戶空間的描述。

一個進程的虛擬空間中可能有多個虛擬區間(參見下面對vm_area_struct描述),對這些虛擬區間的組織方式有兩種,當虛擬區較少時採用單鏈表,由mmap指針指向這個鏈表,當虛擬區間多時採用「紅黑樹(red_black tree)」結構,由mm_rb指向這顆樹。在2.4.10以前的版本中,採用的是AVL樹,因為與AVL樹相比,對紅黑樹進行操作的效率更高。

因為程序中用到的地址常常具有局部性,因此,最近一次用到的虛擬區間很可能下一次還要用到,因此,把最近用到的虛擬區間結構應當放入高速緩存,這個虛擬區間就由mmap_cache指向。

指針pgt指向該進程的頁目錄(每個進程都有自己的頁目錄,注意同內核頁目錄的區別),當調度程序調度一個程序運行時,就將這個地址轉成物理地址,並寫入控制寄存器(CR3)。

由於進程的虛擬空間及其下屬的虛擬區間有可能在不同的上下文中受到訪問,而這些訪問又必須互斥,所以在該結構中設置了用於P、V操作的信號量mmap_sem。此外,page_table_lock也是為類似的目的而設置。

雖然每個進程只有一個虛擬地址空間,但這個地址空間可以被別的進程來共享,如,子進程共享父進程的地址空間(也即共享mm_struct結構)。所以,用mm_user和mm_count進行計數。類型atomic_t實際上就是整數,但對這種整數的操作必須是「原子」的。

另外,還描述了代碼段、數據段、堆棧段、參數段以及環境段的起始地址和結束地址。這里的段是對程序的邏輯劃分,與我們前面所描述的段機制是不同的。

mm_context_t是與平台相關的一個結構,對i386 幾乎用處不大。

在後面對代碼的分析中對有些域給予進一步說明。

2. VM_AREA_STRUCT 結構

vm_area_struct描述進程的一個虛擬地址區間,在/include/linux/mm.h中描述如下:

struct vm_area_struct

struct mm_struct * vm_mm; /* 虛擬區間所在的地址空間*/

unsigned long vm_start; /* 在vm_mm中的起始地址*/

unsigned long vm_end; /*在vm_mm中的結束地址 */

/* linked list of VM areas per task, sorted by address */

struct vm_area_struct *vm_next;

pgprot_t vm_page_prot; /* 對這個虛擬區間的存取許可權 */

unsigned long vm_flags; /* 虛擬區間的標志. */

rb_node_t vm_rb;

/*

* For areas with an address space and backing store,

* one of the address_space->i_mmap{,shared} lists,

* for shm areas, the list of attaches, otherwise unused.

*/

struct vm_area_struct *vm_next_share;

struct vm_area_struct **vm_pprev_share;

/*對這個區間進行操作的函數 */

struct vm_operations_struct * vm_ops;

/* Information about our backing store: */

unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE

units, *not* PAGE_CACHE_SIZE */

struct file * vm_file; /* File we map to (can be NULL). */

unsigned long vm_raend; /* XXX: put full readahead info here. */

void * vm_private_data; /* was vm_pte (shared mem) */

};

vm_flag是描述對虛擬區間的操作的標志,其定義和描述如下

標志名 描述

VM_DENYWRITE 在這個區間映射一個打開後不能用來寫的文件

VM_EXEC 頁可以被執行。

VM_EXECUTABLE 頁含有可執行代碼。

VM_GROWSDOWN 這個區間可以向低地址擴展。

VM_GROWSUP 這個區間可以向高地址擴展。

VM_IO 這個區間映射一個設備的I/O地址空間。

VM_LOCKED 頁被鎖住不能被交換出去。

VM_MAYEXEC VM_EXEC 標志可以被設置。

VM_MAYREAD VM_READ 標志可以被設置。

VM_MAYSHARE VM_SHARE 標志可以被設置。

VM_MAYWRITE VM_WRITE 標志可以被設置。

VM_READ 頁是可讀的。

VM_SHARED 頁可以被多個進程共享。

VM_SHM 頁用於IPC共享內存。
VM_WRITE 頁是可寫的。

較高層次的結構vm_area_structs是由雙向鏈表連接起來的,它們是按虛地址的降順序來排列的,每個這樣的結構都對應描述一個相鄰的地址空間范圍。之所以這樣分割,是因為每個虛擬區間可能來源不同,有的可能來自可執行映象,有的可能來自共享庫,而有的則可能是動態分配的內存區,所以對每一個由vm_area_structs結構所描述的區間的處理操作和它前後范圍的處理操作不同。因此Linux 把虛擬內存分割管理,並利用了虛擬內存處理常式(vm_ops)來抽象對不同來源虛擬內存的處理方法。不同的虛擬區間其處理操作可能不同,Linux在這里利用了面向對象的思想,即把一個虛擬區間看成一個對象,用vm_area_structs描述了這個對象的屬性,其中的vm_operation結構描述了在這個對象上的操作,其定義在/include/linux/mm.h中:

/*

* These are the virtual MM functions - opening of an area, closing and

* unmapping it (needed to keep files on disk up-to-date etc), pointer

* to the functions called when a no-page or a wp-page exception occurs.

*/

struct vm_operations_struct {

void (*open)(struct vm_area_struct * area);

void (*close)(struct vm_area_struct * area);

struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused);

};

vm_operations結構中包含的是函數指針;其中,open、close分別用於虛擬區間的打開、關閉,而nopage用於當虛存頁面不在物理內存而引起的「缺頁異常」時所應該調用的函數。

3.紅黑樹結構

Linux內核從2.4.10開始,對虛擬區的組織不再採用AVL樹,而是採用紅黑樹,這也是出於效率的考慮,雖然AVL樹和紅黑樹很類似,但在插入和刪除節點方面,採用紅黑樹的性能更好一些,下面對紅黑樹給予簡單介紹。
一顆紅黑樹是具有以下特點的二叉樹:
每個節點著有顏色,或者為紅,或者為黑
根節點為黑色
如果一個節點為紅色,那麼它的子節點必須為黑色
從一個節點到葉子節點上的所有路徑都包含有相同的黑色節點數

⑶ 不會寫演算法的程序員的上限是什麼

作為一個剛入行的程序員,我是不會寫演算法的,當初剛入行的時候,我也在一直糾結這個問題,演算法是一個程序員必須要學的嗎?後來我明白了,這沒有什麼必然性。我來說一下我的淺見,我覺得問一個程序員會不會寫演算法,就相當於問一個廚師懂不懂化學?明明演算法就在那裡了,作為一個程序員,你只要把它運用到程序當中去,這就可以了。就像一個廚師,他只要知道菜與菜之間的搭配就好了,為什麼非要讓他知道菜與菜的元素構成呢?


什麼是演算法

計算機的演算法指的是按照一定規律的方式來構建計算機如何將輸入轉化為所要求的輸出的過程,換種說法,演算法是對計算機上執行的計算過程的具體描述。

總結:當然啦,我上面說演算法只是一種固定的模式,並不是有意的去貶低演算法的地位,相反我承認演算法是一種很重要的東西,但是這也不意味著不會演算法就寫不出來優質的代碼。

⑷ 為什麼STL和linux都使用紅黑樹作為平衡樹的實現

紅黑樹是平衡二來叉樹的一種,自它有很好的性質,樹中的結點都是有序的,而且因為它本身就是平衡的,所以查找也不會出現非常惡劣的情況,基於二叉樹的操作的時間復雜度是O(log(N))。Linux內核在管理vm_area_struct時就是採用了紅黑樹來維護內存塊的...
紅黑樹是平衡二叉樹的一種,它有很好的性質,樹中的結點都是有序的,而且因為它本身就是平衡的,所以查找也不會出現非常惡劣的情況,基於二叉樹的操作的時間復雜度是O(log(N))。Linux內核在管理vm_area_struct時就是採用了紅黑樹來維護內存塊的...

⑸ 如何利用linux內核中的紅黑樹庫,調試和運行紅黑樹

1、 初識紅黑樹
從網上搜索了許多紅黑樹的介紹,這些文章中主要介紹了紅黑回樹的性質,然後答就是紅黑樹的旋轉如下示意圖。

左旋、右旋,旋轉過程中爸爸變成了兒子,兄弟變成了孫子;紅的變成黑的,黑的變成紅的。經過一系列的旋轉,就把我旋轉的暈頭轉向了,腦子里攪成了一團漿糊。相信,沒有學過二叉樹的同學肯定會遇到和我一樣窘況。

⑹ linux內核哪些地方用到了紅黑樹

Linux內核[kernel]是整個操作系統的最底層,它負責整個硬體的驅動,以及提供各種系統所需版的核心功能,包括防火權牆機制、是否支持LVM或Quota等文件系統等等,如果內核不認識某個最新的硬體,那麼硬體也就無法被驅動,你也就無法使用該硬體。 計算...

⑺ 紅黑樹和平衡二叉樹 區別

紅黑樹抄和平衡二叉樹區別如襲下:
1、紅黑樹放棄了追求完全平衡,追求大致平衡,在與平衡二叉樹的時間復雜度相差不大的情況下,保證每次插入最多隻需要三次旋轉就能達到平衡,實現起來也更為簡單。
2、平衡二叉樹追求絕對平衡,條件比較苛刻,實現起來比較麻煩,每次插入新節點之後需要旋轉的次數不能預知。
平衡二叉樹又被稱為AVL樹(有別於AVL演算法),且具有以下性質:它是一
棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。構造與調整方法
平衡二叉樹的常用演算法有紅黑樹、AVL、Treap等。
最小二叉平衡樹的節點的公式如下
F(n)=F(n-1)+F(n-2)+1
這個類似於一個遞歸的數列,可以參考Fibonacci數列,1是根節點,F(n-1)是左子樹的節點數量,F(n-2)是右子樹的節點數量。

⑻ linux內核數據結構鏈表隊列哈希映射紅黑樹有什麼用

紅黑樹是平衡二叉樹的一種,它有很好的性質,樹中的結點都是有序的,而且因為它本身版就是平衡的,所以查找權也不會出現非常惡劣的情況,基於二叉樹的操作的時間復雜度是O(log(N))。Linux內核在管理vm_area_struct時就是採用了紅黑樹來維護內存塊的.

閱讀全文

與linux內核紅黑樹應用相關的資料

熱點內容
韓國古裝電影 床戲 瀏覽:933
哈薩克電影全集免費 瀏覽:405
韓國電影比尿尿尿的遠 瀏覽:340
一部悲傷的電影用英語怎麼說 瀏覽:303
大數據的論壇有哪些 瀏覽:854
筆記本沒網路怎麼上網 瀏覽:518
國產 電影區 小說區 圖片 瀏覽:379
滴滴app怎麼支付 瀏覽:832
沒有u盤怎麼列印店裡面的文件 瀏覽:134
css兼容性工具 瀏覽:757
任帥和檳榔妹妹的愛情故事啥電影 瀏覽:633
還有一個p開頭的網站 瀏覽:275
中央新下達文件50個省 瀏覽:613
銅仁網站製作多少錢 瀏覽:991
電影14路末班車免費觀看 瀏覽:665
ak愛看福利電影院 瀏覽:438
配置文件的工具 瀏覽:886
跨平台編程語言哪個好 瀏覽:316
win7桌面文件整理 瀏覽:757

友情鏈接