微内核与宏内核
在通常情況下,我們會(huì)想到把凡是能夠?yàn)檫M(jìn)程服務(wù)的模塊就應(yīng)該放在操作系統(tǒng)的內(nèi)核中。例如:文件管理模塊是為進(jìn)程服務(wù)的,所以放在內(nèi)核中;各種驅(qū)動(dòng)模塊是為進(jìn)程服務(wù)的,所以要放在內(nèi)核中;進(jìn)程模塊當(dāng)然要放在內(nèi)核中。隨著進(jìn)程服務(wù)請求的增加,操作系統(tǒng)內(nèi)核就會(huì)越來越大,隨之也將出現(xiàn)一系列的問題。
? ? ? ? 首先,內(nèi)核是常駐內(nèi)存的,因此大內(nèi)核占用的存儲空間就大,這樣在硬件系統(tǒng)比較小,存儲器資源比較緊張的系統(tǒng)就不太適用;其次,是維護(hù)起來也比較困難,假設(shè)內(nèi)核中的某一個(gè)服務(wù)模塊進(jìn)行了修改,那么修改之后就必修對整個(gè)系統(tǒng)進(jìn)行一次編譯,顯得極不方便;再次,就是使得處理器在內(nèi)核運(yùn)行的時(shí)間比較長,從而不適合在速度要求比較高的場合下應(yīng)用。
? ? ? ? ?總之,操作系統(tǒng)內(nèi)核大到一定程度之后,會(huì)出現(xiàn)一系列因?yàn)榇蠖a(chǎn)生的諸多問題。為了解決這些問題,人們想了一系列的辦法試圖在滿足應(yīng)用程序所需服務(wù)的前提下把內(nèi)核做小。其中一個(gè)有效的辦法是,把內(nèi)核各個(gè)服務(wù)程序模塊中的部分內(nèi)容移到內(nèi)核外面作為一個(gè)進(jìn)程來看待,在內(nèi)核中只保留內(nèi)核服務(wù)與用戶進(jìn)程的接口。內(nèi)核只作為一個(gè)消息的中轉(zhuǎn)站,這樣內(nèi)核就大大變小了。這樣的內(nèi)核就叫做微內(nèi)核。
? ? ? ? ?宏內(nèi)核和微內(nèi)核誰好誰壞也不是我這個(gè)菜鳥級水平的人能夠評判的。但是如果我把這些代表請上來的話也許大家會(huì)在內(nèi)心對他們有個(gè)自己的評價(jià)。
? ? ? ? ? 微內(nèi)核系統(tǒng)有WindowNT,Minix,Mac,etc.宏內(nèi)核的系統(tǒng)有Unix,Linux,etc。其中有個(gè)有意思的現(xiàn)象:Unix是宏內(nèi)核,而Mac卻是微內(nèi)核。另外廢話一句:minix和linux也都沒說服對方。
? ? ? ? ? 兩個(gè)系統(tǒng)的內(nèi)核是通過進(jìn)程的創(chuàng)建FORK的實(shí)現(xiàn)比較,因?yàn)檫M(jìn)程的創(chuàng)建涉及到系統(tǒng)調(diào)用,內(nèi)存管理,文件管理等系統(tǒng)的主要方面。因此可以通過比較fork來大致了解一下內(nèi)核的差別。
微內(nèi)核的代表Minix
? ? ? ? 在Minix中,操作系統(tǒng)的內(nèi)核,內(nèi)存管理,系統(tǒng)管理都有自己的進(jìn)程表,每個(gè)部分的表包含了自己需要的域。表是精確對應(yīng)的,為了保持同步,在進(jìn)程創(chuàng)建和結(jié)束時(shí),這三個(gè)部分都要更新自己的表。由內(nèi)存管理器協(xié)調(diào)。
? ? ? ?系統(tǒng)啟動(dòng)后,kernel,mm,fs系統(tǒng)進(jìn)程在各自的空間運(yùn)行main()函數(shù)循環(huán)等待消息
? ? ? while (true)
? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?……
? ? ? ? ? ? ? ? ? ? ? ? ? ? receive(ANY,&mm_in);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?……
? ? ? ? ? ? ? ? ? ?}
? ? ? ? 當(dāng)一個(gè)fork傳給mm的main(),main()調(diào)用do_fork(),do_fork()函數(shù)把父i函數(shù)的data、segment和stack segment創(chuàng)造了一個(gè)精確副本給子進(jìn)程,并把父進(jìn)程的text segment與子進(jìn)程共享,然后在mm的進(jìn)程表mproc[ ]中添加新進(jìn)程,并設(shè)置各屬性。添加完后發(fā)送消息給kernel(sys_fork(...))和fs(tell_fs(...)),kernel中的函數(shù)sys_task()接收到系統(tǒng)消息,調(diào)用do_fork( message *m_ptr),拷貝父進(jìn)程的proc 結(jié)構(gòu)體到子進(jìn)程,并設(shè)置進(jìn)程在內(nèi)核進(jìn)程表中的屬性。tell_fs( )是內(nèi)存管理器與文件系統(tǒng)之間的接口。tell_fs(...)調(diào)用_taskcall(...),文件管理器接收到fork系統(tǒng)消息,調(diào)用do_fork( )函數(shù),拷貝父進(jìn)程的 fproc 結(jié)構(gòu)體到子進(jìn)程并設(shè)置進(jìn)程在文件進(jìn)程表中的屬性。這樣整個(gè)進(jìn)程的屬性就設(shè)置完成。
? ? ? ?在Minix創(chuàng)建新進(jìn)程的過程中,可以看到一個(gè)很大特點(diǎn),就是整個(gè)系統(tǒng)按照功能分成幾個(gè)部分,各模塊之間利用消息機(jī)制通信,調(diào)用其他模塊的函數(shù)必須通過目標(biāo)模塊的守護(hù)進(jìn)程調(diào)用完成。
宏內(nèi)核的代表:linux
? ? ? 在linux中,進(jìn)程的結(jié)構(gòu)如下:
? ? ? ? struct task_struct{
? ? ? ? ? ? ? ?pid_t pid;
? ? ? ? ? ? ? ?pid_t pgrp;
? ? ? ? ? ? ? ...
? ? ? ? ? ? ?/*filesystem information*/
? ? ? ? ? ? struct fs_struct *fs;
? ? ? ? ? ?/*memory managment info */
? ? ? ? ? struct mm_struct *mm;
? ? ? ? ?... ??
? ? ? ? };
? ? ? ?在linux進(jìn)程的結(jié)構(gòu)定義中,task_struct包含了所有的信息,包括進(jìn)程的內(nèi)存情況,文件系統(tǒng)情況。在創(chuàng)建進(jìn)程時(shí),系統(tǒng)調(diào)用sys_fork調(diào)用do_fork(...)函數(shù)。
? ? ? 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);
? ? ? ? ? ...
? ? ? ? }
? ? ? ? ?在創(chuàng)建進(jìn)程時(shí),do_fork函數(shù)把所有的工作完成,分配pid。。。號,拷貝父進(jìn)程數(shù)據(jù)段,堆棧段,等等。linux的進(jìn)程創(chuàng)建過程是一個(gè)完整的過程,直接調(diào)用其他模塊的函數(shù),而不是消息傳遞。
? ? ? ? ? Minix與Linux創(chuàng)建新進(jìn)程的過程比較可以看出兩者之間的區(qū)別,Minix是建立在分模塊之上的,模塊之間以信息傳遞聯(lián)系。Linux內(nèi)部是分模塊的,但是在運(yùn)行的時(shí)候,它是一個(gè)獨(dú)立的二進(jìn)制大映像,其模塊之間的通訊是直接調(diào)用其他模塊中的函數(shù)實(shí)現(xiàn)的。宏內(nèi)核與微內(nèi)核的區(qū)別也就在此。微內(nèi)核是一個(gè)信息中轉(zhuǎn)站,自身完成的功能很少,主要是傳遞一個(gè)模塊對另一個(gè)模塊的功能請求,而宏內(nèi)核則是一個(gè)大主管,把內(nèi)存管理,文件管理等等一股腦全部接管。
? ? ? ? ? 從理論上來看,微內(nèi)核的思想更好一些,微內(nèi)核把系統(tǒng)分為各個(gè)小的功能模塊,降低了設(shè)計(jì)難度,系統(tǒng)的維護(hù)與修改也容易,但是通信帶來的損失效率是個(gè)問題。宏內(nèi)核的功能塊之間的耦合度太高造成修改與維護(hù)的代價(jià)太高,不過在目前的linux里面還不是太大的問題,因?yàn)槟壳發(fā)inux還不算太復(fù)雜,宏內(nèi)核因?yàn)槭侵苯诱{(diào)用的,所以效率比較高。
總結(jié)
- 上一篇: BIOS 工作原理
- 下一篇: 嵌入式操作系统内核原理和开发(内存分配算