• <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>

            coreBugZJ

            此 blog 已棄。

            Minix 3 內存管理


            (Minix 3.1.0)

            Minix 3 不支持頁式存儲,進程在整個執行過程中,所占用內存的大小和位置不會變化。
            它的內存管理工作,主要是:
            1.調用 fork() 創建新進程時,為新進程申請內存;
            2.調用 exec() 等更換內存鏡像時,釋放舊鏡像占用的內存,為新鏡像申請內存(先釋放,后申請);
            3.進程結束(不管是自己退出,還是被殺死)時,釋放其所占用的內存;
            4.系統初始化時,系統進程申請內存。

            下面不考慮系統初始化時的內存管理工作。

            在 Minix 3 中,由進程管理器PM管理內存。

            Minix 3 中的程序可以被編譯為指令和數據不分離的形式,此時一個進程的正文,數據,堆棧共用一塊作為一個整體申請或釋放的內存;
            也可以被編譯為指令和數據分離的形式,兩部分占用的內存分別管理。

            指令和數據分離的好處在于可以通過共享正文來節約內存:
            1.當一個進程調用 fork() 來創建新進程時,只需要為新進程的數據和堆棧申請內存,而正文可以共享。
            2.當一個進程調用 exec() 等更換內存鏡像時,系統進程表會被搜索,以確定需要的正文是否已經由其它進程載入內存,
            若已經載入,則該正文被共享,就只需為新鏡像的數據和堆棧申請內存。
            3.進程結束時,它的數據和堆棧所占用的內存會被釋放,而正文所占用的內存,只有在該正文沒有被其它進程共享時才會釋放。

            Minix 3 雖不支持頁式存儲,但是提供一些用于交換的函數,由文件
            /include/minix/config.h 中的宏 ENABLE_SWAP 決定是否編譯進系統。

            進程管理器PM管理內存的主要數據結構為 struct hole,
            見 /servers/pm/alloc.c :

            PRIVATE struct hole {
                    struct hole *h_next;   /* pointer to next entry on the list */
                    phys_clicks h_base;   /* where does the hole begin? */
                    phys_clicks h_len;     /* how big is the hole? */
            } hole[ NR_HOLES ];

            使用單鏈表,按內存地址由低到高記錄內存塊。注意,進程中數據和堆棧間的空隙被認為已經分配給了進程,而不被記錄。
            鏈表節點所占用的內存,不是動態申請釋放的,而是定義了數組 hole,為鏈表節點提供內存。

            見該文件接下來的定義,
            PRIVATE struct hole *hole_head;    /* pointer to first hole */
            PRIVATE struct hole *free_slots;     /* ptr to list of unused table slots */

            hole_head 一個單鏈表頭指針,此鏈表用于維護尚未分配的內存塊,按內存塊地址由低到高記錄。
            free_slots 一個單鏈表頭指針,此鏈表用于維護數組 hole 中尚未被 hole_head 使用的節點。

            mem_init() 對內存管理的相關數據進行初始化。
            文件 /servers/pm/main.c 中的 main() 以適當的參數調用 mem_init() 完成內存管理的初始化。

            alloc_mem() 申請內存。
            當申請一定大小的內存時,遍歷鏈表 hole_head ,直至找到足夠大的內存塊,從中剪切出所需大小。
            即首次適應算法。

            free_mem() 釋放內存。
            與 alloc_mem() 功能相反,而且釋放內存后,還會調用 merge() 合并相鄰的內存塊。

            merge() 合并連續的未分配內存塊。
            本來連續的內存,經過若干次內存申請與釋放后,可能被切成多塊,由鏈表 hole_head 中的多個節點記錄,
            每次釋放內存后調用 merge() 以避免此情況出現。

            del_slot() 將一個鏈表節點從 hole_head 中刪除,移入 free_slots 。
            因為鏈表 hole_head 中的節點所占用的內存不是動態申請釋放的,而是定義了數組,
            需要新節點時,就從數組中取,所以需要一些相關的維護工作。

            posted on 2011-10-21 21:21 coreBugZJ 閱讀(2478) 評論(2)  編輯 收藏 引用 所屬分類: OperatingSystem

            Feedback

            # re: Minix 3 內存管理 2011-11-17 21:36 smy

            怎么還在玩3.1.0啊~都快3.2.0了~  回復  更多評論   

            # re: Minix 3 內存管理 2011-11-18 20:09 coreBugZJ

            @smy
            作為初學者,我先學3.1.0~  回復  更多評論   


            久久人人爽人人爽人人片AV东京热| 久久精品国产亚洲AV久| www.久久热| 草草久久久无码国产专区| 久久久黄片| 亚洲AV无码久久| 久久99亚洲综合精品首页| 午夜精品久久久久久中宇| 精品国产一区二区三区久久蜜臀| 日韩精品无码久久一区二区三| 伊人久久大香线蕉av不变影院| 久久久久久国产精品无码超碰| 久久久久国色AV免费看图片| 久久久女人与动物群交毛片 | 久久人爽人人爽人人片AV | 激情五月综合综合久久69| 久久天天婷婷五月俺也去| 99久久国产亚洲高清观看2024| 欧美麻豆久久久久久中文| 久久精品国产精品国产精品污| 午夜欧美精品久久久久久久| 欧美伊人久久大香线蕉综合69| 久久久国产精品福利免费| 亚洲精品乱码久久久久久中文字幕| 国产精品内射久久久久欢欢| 国内精品伊人久久久久AV影院| 久久久久久久女国产乱让韩| 日本久久中文字幕| 欧美精品一区二区精品久久 | 久久精品一区二区| 久久综合给合久久国产免费| 亚洲精品无码久久一线| 亚洲人成网站999久久久综合 | 亚洲乱码日产精品a级毛片久久| 国产三级精品久久| 免费精品99久久国产综合精品| 久久久久国产一级毛片高清版| 久久亚洲精品中文字幕三区| 精品久久一区二区三区| 亚洲国产精品久久久久网站 | 亚洲AⅤ优女AV综合久久久|