微核心與宏核心比較
核心按照體系結構分為兩類:微核心(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目前還不算太複雜,宏核心因為是直接呼叫,所以效率是比較高的。
微核心與宏核心比較
核心按照體系結構分為兩類:微核心(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目前還不算太複雜,宏核心因為是直接呼叫,所以效率是比較高的。