• <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 閱讀(2489) 評論(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~  回復  更多評論   


            国产精品午夜久久| 久久国产精品99国产精| 亚洲国产成人久久一区WWW| 久久人人爽人爽人人爽av | 伊人久久无码中文字幕| 久久精品人人槡人妻人人玩AV| 国产精品一区二区久久国产| 国产精品九九久久免费视频| 久久久久波多野结衣高潮| 久久er国产精品免费观看2| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲午夜精品久久久久久人妖| 久久久久亚洲AV综合波多野结衣 | 久久人妻AV中文字幕| 99久久无码一区人妻a黑| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲香蕉网久久综合影视| 国产福利电影一区二区三区,免费久久久久久久精 | 国内精品久久久久久久影视麻豆| 久久精品久久久久观看99水蜜桃| 伊人色综合久久天天| 中文字幕无码免费久久| 久久精品三级视频| 国产激情久久久久影院老熟女| 久久棈精品久久久久久噜噜| 亚洲国产高清精品线久久| 97精品国产97久久久久久免费| 亚洲国产精品无码久久久蜜芽| 久久亚洲视频| 久久精品国产精品亚洲人人| 2021久久国自产拍精品| 人妻无码αv中文字幕久久| 亚洲欧美精品一区久久中文字幕| 久久99精品国产| 老司机国内精品久久久久| 久久99国产精品二区不卡| 久久777国产线看观看精品| 久久99精品国产麻豆宅宅| 精品久久久无码人妻中文字幕豆芽| 18禁黄久久久AAA片| 久久久精品国产免大香伊|