回覆列表
  • 1 # 使用者5480262765187

    微核心與宏核心比較

    核心按照體系結構分為兩類:微核心(microkernel)與宏核心(macrokernel). 微核心的系統有WindowNT,Minix,Mach,etc.宏核心的系統有Unix,Linux,etc.透過比較Minix和Linux來比較微核心和宏核心是很有意思的,因為當年兩個系統的創始人對兩種核心的優劣有過爭論.

    兩個系統的核心是透過程序的建立FORK的實現來比較,因為程序的建立涉及到系統呼叫,記憶體管理,檔案管理等系統的主要方面.因此透過比較FORK的實現可以大致看到核心的差別.

    微核心的代表:Minix

    在Minix中,作業系統的核心,記憶體管理,系統管理都有自己的程序表,每個部分的表包含了自己需要的域。表象是精確對應的,為了保持同步,在程序建立或結束時,這三個部分都要更新各自的表。

    由記憶體管理器協調。

    系統啟動後,kernel,mm,fs系統程序在各自的空間執行main()函式迴圈等待訊息

    While(TRUE)

    {…

    receive(ANY,&mm_in);

    …}

    當一個FORK傳給mm’main(),main()呼叫do_fork(),do_fork()函式把父程序的data segment和stack segment創造了一個精確副本給子程序,並把父程序的text segment 與子程序共享,然後在mm的程序表mproc[]中新增新程序,並設定各屬性。新增完後傳送訊息給kernel(sys_fork(…))和 fs(tell_fs(…)).,kernel中的函式sys_task()接收到系統資訊,呼叫do_fork(message * m_ptr),copy parent’proc struct to child.並設定程序在核心程序表中的屬性。tell_fs()是記憶體管理器與檔案系統之間的介面,tell_fs(…)呼叫 _taskcall(…),檔案管理器接收到FORK系統訊息,呼叫do_fork()函式,copy parent’fproc struct to child.並設定程序在檔案程序表中的屬性。這樣整個程序的屬性就設定完成.

    在Minix建立新程序的過程中,可以看到一個很大特點,就是整個系統按功能分成幾個部分,各模組之間利用訊息機制通訊,呼叫其他模組的函式必須透過目標模組的守護程序呼叫.

    宏核心的代表:Linux

    在Linux中,程序的結構如下:

    Struct task_struct{

    pid_t pid;

    pid_t pgrp;

    /* filesystem information */

    struct fs_struct *fs;

    /* memory management info*/

    struct mm_struct *mm;

    };

    在Linux程序的結構定義中,task_struct包含了所有的資訊,包括程序的記憶體情況,檔案系統情況。在建立新程序時,系統呼叫sys_fork呼叫do_fork(…)函式.

    int do_fork(unsigned long clong_flags,… )

    {

    struct task_struct *p;

    p->pid = get_pid(clone_flags);

    /* copy all the process information*/

    copy_files(clone_flags,p);

    copy_fs(clone_flags,p);

    copy_mm(nr,clone_flags,p);

    }

    在建立程序時,do_fork函式把所有的工作完成,分配pid…號,複製父程序資料段,堆疊段,等等。Linux的程序建立過程是一個完整的過程,直接呼叫其他模組的函式,而不是訊息傳遞。

    Minix與Linux建立新程序的過程比較可以看出二者之間的區別,Minix是建立在分模組之上的,模組之間以資訊傳遞聯絡。Linux內部也是分模組的,但在執行的時候,他是一個獨立的二進位制大映像,其模組間的通訊是透過直接呼叫其他模組中的函式實現的。宏核心與微核心的區別也就在這吧,微核心是一個資訊中轉站,自身完成很少功能,主要是傳遞一個模組對另一個模組的功能請求,而宏核心則是一個大主管,把記憶體管理,檔案管理等等一股腦全部接管。

    從理論上來看,微核心的思想更好些,微核心把系統分為各個小的功能塊,降低了設計難度,系統的維護與修改也容易,但通訊帶來的效率損失是個問題。宏核心的功能塊之間的耦合度太高造成修改與維護的代價太高,不過在目前的Linux裡面還不算大問題,因為Linux目前還不算太複雜,宏核心因為是直接呼叫,所以效率是比較高的。

  • 中秋節和大豐收的關聯?
  • 若蓴這個名字好嗎,是什麼意思?