青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

風雨兼程

ring my bells
posts - 49, comments - 14, trackbacks - 0, articles - 0

linux的內(nèi)存管理機制

Posted on 2008-04-14 00:17 silentneil 閱讀(331) 評論(0)  編輯 收藏 引用
內(nèi)存管理是一個操作系統(tǒng)必不可少.并且.非常重要的一環(huán).linux的成功.和它優(yōu)秀的內(nèi)存管理聯(lián)系非常密切.因為一個系統(tǒng)的高效性欲穩(wěn)定性往往決定于它的內(nèi)存管理機制.我項很多人吃過dos下640k 的苦吧.

前面我們介紹了386保護模式.從今天起我們將在此基礎(chǔ)上,分析linux的虛擬存儲管理,對每個程序員來說.他們都希望有無窮大的快速的內(nèi)存,然而,現(xiàn)階段是不可能的,況且,無窮大與快速本身就可能矛盾

為了解決無窮大.linux 引入了虛擬存儲系統(tǒng),為了解決快速,linux 引入了cache ,交換機制等等,以使的存儲系統(tǒng),在容量上接近硬盤,速度上接近cache.(當然,我認為這是存儲系統(tǒng)的實際目的).

Linux 的內(nèi)存管理采取的是分頁機制.它的設(shè)計目的是分時多任務(wù).linux 可同時處理256個任務(wù)(這應(yīng)該與某個變量來定義,一時想不起來).同時它采用了兩級飽和機制來分別內(nèi)核進程與用戶進程.

在386 保護模式的0-4G 的線性虛擬地址中,3-4G 是留給內(nèi)核進程的.而0-3G分給用戶進程.內(nèi)核在內(nèi)核空間的尋址不同于用戶進程在用戶空間的尋址.因為內(nèi)核是在啟動時裝入內(nèi)存的.說以它可以直接吧地址映射到3G 以上.用戶若想訪問內(nèi)核就不許通過swapper_pg_div 中的指針來得到頁表.

相反,用戶進程,在用戶空間的尋址是通過所用戶頁目錄中的指針得到用戶的頁表.并通過頁表的指針直接指向相應(yīng)的物理內(nèi)存.

Linux虛擬內(nèi)存的實現(xiàn),需要幾種不同的機制來實現(xiàn):

地址映射機制

內(nèi)存的分配與回收

請頁機制

交換機制

內(nèi)存共享機制

在具體的讀源碼之前.我們先根據(jù)我們以前學過的操作系統(tǒng)知識.和C語言等知識.來考慮一下,這幾個機制如何實現(xiàn).現(xiàn)自己設(shè)計一下.在看別人是怎樣實現(xiàn)的.找到自己想不到.或者對效率空間有損的地方.這樣才有進步.我不止一次的說.操作系統(tǒng)的某一部分,就起實現(xiàn)來說,非常簡單.它的難點是如何將大量的功能集成出一個kernerl.

地址映射機制,說白了,就是在虛擬內(nèi)存與物理內(nèi)存上的一個橋梁.它要做的事情可能就是通過幾個不同的表.把虛擬地址轉(zhuǎn)換成物理地址,把物理地址轉(zhuǎn)化虛擬地址.

我們以前說過.因為有系統(tǒng)與用戶之分,它必須也要有不同的數(shù)據(jù)結(jié)構(gòu).為了解決速度等問題.它會有一個硬件的緩沖區(qū)

對于它的數(shù)據(jù)結(jié)構(gòu).我們可以先想一下.如虛擬地址的信息,虛擬地址在那個區(qū)域等等

至于請頁機制,更好理解.因為linux是頁式存儲的.因此必然會存在空白頁和使用頁.既然是頁.就必然會存在頁溢出.頁無效(是不是在win98 下經(jīng)常出現(xiàn)類似錯誤,當然linux的內(nèi)存管理不可能和windows一樣,可基本道理相同).因此.在每一個頁出錯.或者該頁存不下多余的數(shù)據(jù)時.就要要求內(nèi)核分配新的頁面

同時.當時用fork() 產(chǎn)生一個新的進程時.也需要分配新的葉面.這一部分大概講的就是進程如何向內(nèi)和描述自己需要怎么樣的和多少頁

在我們學習<<數(shù)據(jù)結(jié)構(gòu)>>是我們學了,很多內(nèi)存分配方式,如首次擬和.最佳擬和,最差擬和等等.但是我們可以想象.linux 大概不會用他們.那就一定是伙伴系統(tǒng)了.因此我們可以對于伙伴系統(tǒng)的分配,回收的基本算法.回想一下.這樣在讀者一部分源碼時,回有意象不到的收獲.

至于交換機制.我們也可以現(xiàn)想一想.內(nèi)存中總與很多使用者的頁.如果這些也已經(jīng)把所有的頁都用完了.再分配時必須把其中的某些頁釋放.釋放那些頁,需要考慮.如最近不用頁.近期少用頁,等等都可以在考慮之中.

這個算法,大概就是計算內(nèi)存中使用的頁,什么時候可以換處.說白了就是為所有的使用頁計算一個”權(quán)”,而這個”權(quán)”就決定了他什么時候被釋放以換如它的內(nèi)容.需要想的是對于經(jīng)常使用的頁.可以把它放入cahe.(盡管這一部分對程序員是透明的,但我們應(yīng)該理解他的原理).

最后的一部分共享內(nèi)存,我想和我門初學linux編程時,進程通訊里面的共享內(nèi)存沒有區(qū)別.大概也就是在它的數(shù)據(jù)結(jié)構(gòu)中加入可以允許不同進程訪問的tag 就行了.

以上,只是我們對linux的內(nèi)存管理機制的猜測,需要我們做的工作就是具體的讀源碼.更正不正確的猜想.同時學習別人的實際思路.

從下篇日記開始.我們將分別講解這幾部分的實現(xiàn)

地址的映射機制

地址的映射機制,主要完成主存.輔存.和虛存之間的關(guān)聯(lián).包括磁盤文件到虛存的映射和虛存與內(nèi)存的映射關(guān)系.為了虛擬存儲和進程調(diào)度相一致.linux 采用可一系列的數(shù)據(jù)結(jié)構(gòu),和一個硬件緩存(TLB)來實現(xiàn)地址映射機制.

mm_strut 用來描述進程的緩存.

struct mm_struct

{

struct vm_area_struct * mmap; /* list of VMAs */

struct vm_area_struct * mmap_avl; /* tree of VMAs */

struct vm_area_struct * mmap_cache; /* last find_vma result */

pgd_t * pgd;

atomic_t count;

int map_count; /* number of VMAs */

struct semaphore mmap_sem;

spinlock_t page_table_lock;

unsigned long context;

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_cnt; /* number of pages to swap on next pass */

unsigned long swap_address;

/*

* This is an architecture-specific pointer: the portable

* part of Linux does not know about any segments.

*/

void * segments;

};

他描述了一個進程的頁目錄,有關(guān)進程的上下文信息.以及數(shù)據(jù).代碼.堆棧的啟示結(jié)束地址.還有虛擬存儲取得數(shù)目.以及調(diào)度存儲用的鏈表指針.他的參差比較高

較高層次的vm_area-struct 是描述進程的虛擬地址區(qū)域.他形成一個算相鏈表.按虛地址下降排列.這樣當內(nèi)核需要在一個給定進程頁上執(zhí)行給定操作時.客從雙向列表中找到該項.在世想有關(guān)頁的處理.如.頁錯誤.頁換出等等

他的具體結(jié)構(gòu)如下:

struct vm_area_struct {

struct mm_struct * vm_mm; /* VM area parameters */

unsigned long vm_start;

unsigned long vm_end;

 

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

struct vm_area_struct *vm_next;

 

pgprot_t vm_page_prot;

unsigned short vm_flags;

 

/* AVL tree of VM areas per task, sorted by address */

short vm_avl_height;

struct vm_area_struct * vm_avl_left;

struct vm_area_struct * vm_avl_right;

 

/* For areas with inode, the list inode->i_mmap, 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;

unsigned long vm_offset;

struct file * vm_file;

unsigned long vm_pte; /* shared mem */

};

而page 結(jié)構(gòu) 則是對物理頁進行描述的一個數(shù)據(jù)結(jié)構(gòu),他不是一個真正的物理頁.而只不過是描述了一個物理頁的內(nèi)容和框架.作了邏輯頁的一個標志;.他的標志域定義了這個頁在進行的操作.鏈域則定義了一個雙項鏈表.時的頁框.可以很容易的查找到.為實際物理內(nèi)存的使用直到方便

他的具體結(jié)構(gòu)如下

typedef struct page {

/* these must be first (free area handling) */

struct page *next;

struct page *prev;

struct inode *inode;

unsigned long offset;

struct page *next_hash;

atomic_t count;

unsigned long flags; /* atomic flags, some possibly updated asynchronously */

wait_queue_head_t wait;

struct page **pprev_hash;

struct buffer_head * buffers;

int owner; /* temporary debugging check */

} mem_map_t;

所有的page 結(jié)構(gòu)將都被轉(zhuǎn)入一個叫做mem_map 的數(shù)組中.

當一個進程運行時,他的代碼段和數(shù)據(jù)段將都會被調(diào)入內(nèi)存.如果它使用了共享庫.共享客的內(nèi)容也將貝雕如內(nèi)存.進程運行時.系統(tǒng)首先分配一個vm_area_struct 給進程.并將這各進程連結(jié)到虛擬內(nèi)存的連標中去.這是根據(jù)進程的可執(zhí)行影像中的信息.吧數(shù)據(jù)段和客執(zhí)行代碼非配內(nèi)存.新分配的內(nèi)存必須和進程已有的內(nèi)存連結(jié)起來才能應(yīng)用.這樣聚會出現(xiàn)頁故障.系統(tǒng)利用了請頁機制來避免對物理內(nèi)存的過分使用.但進程訪問的虛存不在當前的物理內(nèi)存時,這時系統(tǒng)會將需要的頁調(diào)入內(nèi)存.同時修改進程的頁表.用來標志虛擬頁是否在物理內(nèi)存中.

因此,系統(tǒng)用了較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來跟蹤進程的虛擬地址.在task_struct 中包含一個指向mm_struct 結(jié)構(gòu)的指針.進程的mm_struct 中則包含了進程可執(zhí)行影像的頁目錄指針pgd.還包含了指向vm_area_struct 的幾個指針,每個vm_area_struct 包含一個進程的虛擬地址區(qū)域.

一個進程有多個vm_area_stuct 結(jié)構(gòu).linux 要經(jīng)常對進程分配..或調(diào)整vm_area_struct .這樣對vm_area_stuct 的查找效率.對系統(tǒng)很有影像.所以在這里將所有的vm_area_struct 形成了一個查找效率較高的平衡二叉樹結(jié)構(gòu).

我個人認為,在整個linux內(nèi)核中這個地方.數(shù)據(jù)結(jié)構(gòu)是最復(fù)雜的.如果把這一部分肯下來以后,整個內(nèi)核便開始清晰了

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美高清在线精品一区| 99国产精品一区| 欧美激情成人在线视频| 午夜精品久久久久久久99樱桃| 亚洲第一综合天堂另类专| 久久高清免费观看| 久久久噜噜噜久久| 久久亚洲欧美| 欧美高清在线播放| 欧美激情一区二区三区不卡| 欧美高清视频免费观看| 91久久久亚洲精品| 亚洲免费在线观看| 久久精品一区二区三区不卡牛牛| 久久一区中文字幕| 欧美经典一区二区| 国产精品一区二区欧美| 在线电影国产精品| 在线一区二区三区做爰视频网站 | 欧美有码视频| 老**午夜毛片一区二区三区| 欧美日韩国产91| 国产亚洲一区二区在线观看| 亚洲人成亚洲人成在线观看图片 | 欧美日韩亚洲视频一区| 国产乱码精品一区二区三区五月婷| 国产午夜亚洲精品羞羞网站| 亚洲国内欧美| 久久精品国产亚洲5555| 亚洲日本va午夜在线电影| 亚洲免费视频一区二区| 鲁大师影院一区二区三区| 国产精品久久综合| 亚洲精品久久久一区二区三区| 午夜精品一区二区三区四区| 欧美国产日韩一区二区在线观看| 一区二区三区高清在线| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品无码永久免费888| 亚洲精品乱码久久久久久蜜桃麻豆| 性欧美在线看片a免费观看| 亚洲国产一区二区a毛片| 欧美怡红院视频| 国产精品青草久久久久福利99| 91久久久久久| 美日韩精品视频免费看| 午夜在线不卡| 国产精品露脸自拍| 亚洲调教视频在线观看| 欧美激情a∨在线视频播放| 欧美在线free| 国产午夜精品一区二区三区视频| 亚洲影院在线观看| 日韩亚洲欧美成人| 欧美精品一区二区久久婷婷| 黄色小说综合网站| 久久视频在线免费观看| 欧美一区二区女人| 国产亚洲免费的视频看| 性欧美大战久久久久久久免费观看| 国产毛片一区二区| 国产日韩欧美成人| 久久精品1区| 欧美在线观看你懂的| 国产一区在线观看视频| 久久在线免费观看| 久久久91精品国产| 樱花yy私人影院亚洲| 噜噜噜噜噜久久久久久91| 久久精品视频在线| 亚洲国产欧美一区二区三区丁香婷| 美国三级日本三级久久99| 久久综合九色欧美综合狠狠| 亚洲国产精品久久久久秋霞不卡 | 欧美成人资源网| 欧美sm重口味系列视频在线观看| 亚洲国产小视频在线观看| 亚洲高清不卡在线| 欧美日韩福利视频| 午夜久久福利| 久久久久久久91| 日韩午夜剧场| 亚洲先锋成人| 狠狠狠色丁香婷婷综合激情| 欧美freesex8一10精品| 欧美激情综合色| 亚洲欧美日韩区| 久久精品免费看| 99re热精品| 午夜精品久久久久久久久久久久久 | 久久成人精品一区二区三区| 久久久亚洲精品一区二区三区| 最新中文字幕一区二区三区| 一本色道**综合亚洲精品蜜桃冫| 国产午夜精品美女视频明星a级| 欧美国产免费| 国产精品久久久久一区二区| 女人香蕉久久**毛片精品| 欧美日韩午夜视频在线观看| 久久久久久亚洲精品杨幂换脸| 欧美激情 亚洲a∨综合| 久久精品国产欧美亚洲人人爽| 欧美成人资源网| 久久精选视频| 欧美日韩精品一本二本三本| 久久米奇亚洲| 国产精品福利在线观看网址| 欧美成人黄色小视频| 国产伦精品一区二区三区视频黑人 | 伊大人香蕉综合8在线视| 亚洲日本在线观看| 狠狠色丁香婷婷综合久久片| 99在线热播精品免费99热| 在线精品国产欧美| 欧美一级片一区| 久久久国产精品一区二区中文| 国产精品福利av| 欧美激情亚洲激情| 国语对白精品一区二区| 中文亚洲欧美| 一区二区高清在线| 美女诱惑黄网站一区| 久久久精品999| 国产精品久久久久久久久果冻传媒 | 亚洲影视在线| 亚洲视频一区二区| 欧美精品一区二区三区很污很色的| 久久夜色精品一区| 国产一区二区电影在线观看 | 久久天天躁狠狠躁夜夜爽蜜月| 亚洲自拍偷拍一区| 欧美三级网址| 99av国产精品欲麻豆| 亚洲每日更新| 欧美国产丝袜视频| 最新国产乱人伦偷精品免费网站| 激情综合中文娱乐网| 久久精品人人做人人爽| 久久久噜噜噜久久| 一区二区亚洲| 免费高清在线一区| 欧美国产日韩一二三区| 136国产福利精品导航网址| 久久精品国产亚洲精品| 久久综合99re88久久爱| 在线观看日韩av先锋影音电影院| 久久精品女人的天堂av| 欧美a级大片| 99精品国产在热久久婷婷| 欧美日产国产成人免费图片| 亚洲老司机av| 午夜视频精品| 国产一区二区按摩在线观看| 久久久久久伊人| 亚洲成色精品| 中文无字幕一区二区三区| 国产精品美女久久久浪潮软件| 亚洲欧美日韩中文播放| 老司机午夜免费精品视频| 亚洲精品护士| 国产欧美日韩视频在线观看| 久久免费黄色| 亚洲蜜桃精久久久久久久| 欧美在线播放一区| 亚洲欧洲一区二区三区| 欧美性生交xxxxx久久久| 久久成人免费日本黄色| 亚洲欧洲在线观看| 久久国产一二区| 亚洲国产欧美一区二区三区久久| 欧美激情一区二区三区成人| 在线一区二区日韩| 欧美成人亚洲成人| 亚洲永久免费| 亚洲大胆在线| 国产精品女主播| 蜜桃久久精品一区二区| 亚洲一区二区三区久久 | 欧美freesex交免费视频| 亚洲精品字幕| 久久九九国产精品怡红院| 亚洲美女一区| 国产午夜精品久久久久久久| 免费观看成人www动漫视频| 亚洲欧美日韩一区二区在线| 亚洲黄色小视频| 久久男人av资源网站| 中文精品99久久国产香蕉| 亚洲高清二区| 国产美女精品| 欧美日韩伦理在线| 久久野战av| 欧美一级黄色网| 亚洲一二三级电影| 亚洲精品日韩在线观看| 免费精品视频| 久久精品午夜| 欧美一区二区三区四区视频| 亚洲少妇自拍| av成人免费观看|