日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微内核与宏内核

發布時間:2024/4/18 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微内核与宏内核 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在通常情況下,我們會想到把凡是能夠為進程服務的模塊就應該放在操作系統的內核中。例如:文件管理模塊是為進程服務的,所以放在內核中;各種驅動模塊是為進程服務的,所以要放在內核中;進程模塊當然要放在內核中。隨著進程服務請求的增加,操作系統內核就會越來越大,隨之也將出現一系列的問題。

? ? ? ? 首先,內核是常駐內存的,因此大內核占用的存儲空間就大,這樣在硬件系統比較小,存儲器資源比較緊張的系統就不太適用;其次,是維護起來也比較困難,假設內核中的某一個服務模塊進行了修改,那么修改之后就必修對整個系統進行一次編譯,顯得極不方便;再次,就是使得處理器在內核運行的時間比較長,從而不適合在速度要求比較高的場合下應用。

? ? ? ? ?總之,操作系統內核大到一定程度之后,會出現一系列因為大而產生的諸多問題。為了解決這些問題,人們想了一系列的辦法試圖在滿足應用程序所需服務的前提下把內核做小。其中一個有效的辦法是,把內核各個服務程序模塊中的部分內容移到內核外面作為一個進程來看待,在內核中只保留內核服務與用戶進程的接口。內核只作為一個消息的中轉站,這樣內核就大大變小了。這樣的內核就叫做微內核。

? ? ? ? ?宏內核和微內核誰好誰壞也不是我這個菜鳥級水平的人能夠評判的。但是如果我把這些代表請上來的話也許大家會在內心對他們有個自己的評價。

? ? ? ? ? 微內核系統有WindowNT,Minix,Mac,etc.宏內核的系統有Unix,Linux,etc。其中有個有意思的現象:Unix是宏內核,而Mac卻是微內核。另外廢話一句:minix和linux也都沒說服對方。

? ? ? ? ? 兩個系統的內核是通過進程的創建FORK的實現比較,因為進程的創建涉及到系統調用,內存管理,文件管理等系統的主要方面。因此可以通過比較fork來大致了解一下內核的差別。

微內核的代表Minix

? ? ? ? 在Minix中,操作系統的內核,內存管理,系統管理都有自己的進程表,每個部分的表包含了自己需要的域。表是精確對應的,為了保持同步,在進程創建和結束時,這三個部分都要更新自己的表。由內存管理器協調。

? ? ? ?系統啟動后,kernel,mm,fs系統進程在各自的空間運行main()函數循環等待消息

? ? ? while (true)

? ? ? ? ? ? ? ? ? ?{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?……

? ? ? ? ? ? ? ? ? ? ? ? ? ? receive(ANY,&mm_in);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?……

? ? ? ? ? ? ? ? ? ?}

? ? ? ? 當一個fork傳給mm的main(),main()調用do_fork(),do_fork()函數把父i函數的data、segment和stack segment創造了一個精確副本給子進程,并把父進程的text segment與子進程共享,然后在mm的進程表mproc[ ]中添加新進程,并設置各屬性。添加完后發送消息給kernel(sys_fork(...))和fs(tell_fs(...)),kernel中的函數sys_task()接收到系統消息,調用do_fork( message *m_ptr),拷貝父進程的proc 結構體到子進程,并設置進程在內核進程表中的屬性。tell_fs( )是內存管理器與文件系統之間的接口。tell_fs(...)調用_taskcall(...),文件管理器接收到fork系統消息,調用do_fork( )函數,拷貝父進程的 fproc 結構體到子進程并設置進程在文件進程表中的屬性。這樣整個進程的屬性就設置完成。

? ? ? ?在Minix創建新進程的過程中,可以看到一個很大特點,就是整個系統按照功能分成幾個部分,各模塊之間利用消息機制通信,調用其他模塊的函數必須通過目標模塊的守護進程調用完成。

宏內核的代表:linux

? ? ? 在linux中,進程的結構如下:

? ? ? ? struct task_struct{

? ? ? ? ? ? ? ?pid_t pid;

? ? ? ? ? ? ? ?pid_t pgrp;

? ? ? ? ? ? ? ...

? ? ? ? ? ? ?/*filesystem information*/

? ? ? ? ? ? struct fs_struct *fs;

? ? ? ? ? ?/*memory managment 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還不算太復雜,宏內核因為是直接調用的,所以效率比較高。


總結

以上是生活随笔為你收集整理的微内核与宏内核的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。