亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3540 | 回復(fù): 5
打印 上一主題 下一主題

Solaris、Linux和FreeBSD的內(nèi)核比較 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2006-07-01 23:17 |只看該作者 |倒序瀏覽
轉(zhuǎn)自:
http://tech.ccidnet.com/art/322/20060321/485291_1.html

1。我個人認(rèn)為作者MAX對Linux的了解不像他對Solaris那樣深入,我不知道也沒法知道他的下列關(guān)于Linux的內(nèi)容來自自己的代碼閱讀分析還是只是來自第三方的文檔資料而未經(jīng)自己實地驗證;
  2。我已經(jīng)盡量符合原意地翻譯了,當(dāng)然中間實在忍不住的地方也插兩句自己的話;
  3。無論是只閱讀這一篇文章,還是看其他東西,我都覺得,保持自己頭腦清醒很重要;
  4。謝謝

  Max Bruning 是一名教師/資訊專家,他的教授內(nèi)容包括Solaris內(nèi)部組織,設(shè)備驅(qū)動,內(nèi)核和應(yīng)用的crash分析及調(diào)試,網(wǎng)絡(luò)組織和其他一些特定科目(他的 blog在blogspot,不費點勁可能訪問不了,所以也可以看看www.bruningsystems.com)。

  在解釋這些子系統(tǒng)在Solaris中是如何實現(xiàn)的時候,他的學(xué)生們總會問“Linux里它是怎么工作的?”或者“FreeBSD里是這樣,Solaris里呢?”這種經(jīng)歷最終讓Max在OpenSolaris網(wǎng)站寫了這篇A Comparison of Solaris, Linux, and FreeBSD Kernels。

  文章里討論了調(diào)度,內(nèi)存管理和文件系統(tǒng)架構(gòu)--這3個子系統(tǒng)在任何操作系統(tǒng)中都有普遍應(yīng)用,而且他們是最well-understood 的組件。

  目前很多分析或?qū)Ρ任恼滤玫牟牧霞按a都比較老,與現(xiàn)實脫節(jié),Max推薦如下幾個多少比較up to date的網(wǎng)站:
Solaris Vs. Linux
Comparing MySQL Performance
Fast Track to Solaris 10 Adoption
Solaris 10 Heads for Linux Territory

  其實拋開3個系統(tǒng)之間的差別,他們也有很多相似之處。除了那些不同的命名習(xí)慣,這些OS在實現(xiàn)不同概念的時候采用了非常相似的方法。他們都支持線程的分時調(diào)度,支持最近未使用頁面替換算法實現(xiàn)請求調(diào)頁,支持虛擬文件系統(tǒng)層允許不同文件系統(tǒng)架構(gòu)。這個系統(tǒng)里的一個好概念在另一個系統(tǒng)里也會采用。比如 Linux也接受并實現(xiàn)了 Solaris slab 內(nèi)存分配算法的概念。FreeBSD 代碼里的很多術(shù)語在Solaris里也出現(xiàn)了(快去看看代碼。。。)?紤]到這3個系統(tǒng)的源代碼都能得到了, fxr.watson.org提供了系統(tǒng)源碼的交叉閱讀瀏覽,可能會發(fā)現(xiàn)很多有趣的地方。

  好了,溫情默默的套近乎結(jié)束,進入正題。

  調(diào)度和調(diào)度器
  Solaris的調(diào)度單位是kthread_t,F(xiàn)reeBSd是thread,Linux是task_struct。抬高一級,Solaris的進程是proc_t,當(dāng)然每個進程里的線程就是kthread_t;Linux的進程和線程都由task_struct 表示,單線程的進程在Linux里是一個task_struct。單線程的進程在Solaris里有一個proc_t,一個kthread_t,還有一個klwp_t表示。klwp_t提供了用戶和內(nèi)核模式線程切換的存儲區(qū)。FreeBSD里的單線程進程有一個proc ,一個thread 和一個ksegrp 。ksegrp 是“內(nèi)核調(diào)度的實體組kernel scheduling entity group”。三個系統(tǒng)的線程表示結(jié)構(gòu)不同,不過都支持調(diào)度線程。

論壇徽章:
0
2 [報告]
發(fā)表于 2006-07-01 23:20 |只看該作者
和大家熟悉的基本一樣,調(diào)度是基于優(yōu)先級的。小小的數(shù)學(xué)問題是,在Linux和FreeBSD里,數(shù)字越小,優(yōu)先級越高;而SUN的寶貝卻喜歡數(shù)字越大,優(yōu)先級越高。參考下表


  三個系統(tǒng)都更推崇interactive 線程/進程(下面會提到interactive怎么回事)。Interactive 線程比compute-bound 線程優(yōu)先級要高,不過得到的時間片要少一些。Solaris,F(xiàn)reeBSD和Linux都使用每CPU的“運行隊列 runqueue”。FreeBSD和Linux有一個active隊列和一個expired隊列。名字說得很清楚了--系統(tǒng)從active上按照優(yōu)先級選擇線程進行調(diào)度。用完自己時間片的線程就從active搬到expired上(或者為了避免“餓死”的其他情況),active空以后,內(nèi)核交換 active和expired。FreeBSD還多一個idle 隊列--其他兩個queue都空的時候才輪到這個。Solaris的概念是每CPU“調(diào)度隊列 dispatch queue”。線程用完時間片后,內(nèi)核給其一個新優(yōu)先級然后放回調(diào)度隊列。所有3個系統(tǒng)的runqueue,對不同優(yōu)先級的可運行線程都分別有鏈表。

  FreeBSD四個優(yōu)先級共享一個鏈表,Solaris和Linux則每個優(yōu)先級一個鏈表Linux和FreeBSD結(jié)合運行時間和睡眠時間計算線程的 interactive-ness,Solaris查表。他們都不支持“gang scheduling”(有興趣查Google即知,并行計算上的調(diào)度算法,大白話說就是一組任務(wù)一把disptach到各個CPU上。勞倫斯.利弗莫爾那幫造原子彈的家伙最喜歡了,他們有世界上最昂貴的玩具,可以理解)每個OS都調(diào)度下一個線程而不是N個線程開始運行。這3個OS都有利用CACHE (warm affinity)和負(fù)載均衡的機制。對超線程CPU,F(xiàn)reeBSD能盡量將多個線程保持在一個CPU節(jié)點上(當(dāng)然可能是不同的CPU超線程上)。 Solaris也有類似機制,不過是在用戶和應(yīng)用的控制下,而且并不限于CPU的超線程,他們的術(shù)語是processor sets,F(xiàn)reeBSD的叫法是processor groups和其他2個OS最大的不同是,Solaris同時支持多個“scheduling classes”。3個OS都支持POSIX的SCHED_FIFO,SCHED_RR和SCHED_OTHER (或者SCHED_NORMAL)。SCHED_FIFO 和SCHED_RR通常支持實時線程(我不同意。。。但是照翻。。。)。

[ 本帖最后由 compnik 于 2006-7-1 23:25 編輯 ]

論壇徽章:
0
3 [報告]
發(fā)表于 2006-07-01 23:21 |只看該作者
Solaris和Linux為支持實時線程都支持了內(nèi)核搶占。Solaris支持fixed priority類,system class的是系統(tǒng)線程(比如換頁線程),interactive的是在X控制下運行窗口環(huán)境的線程,還有一個Fair Share Scheduler 用于資源管理。具體可以參考Solaris資料。FreeBSD的調(diào)度器是在編譯時決定的,Linux的調(diào)度?--要看版本了。
支持在系統(tǒng)中加入新的調(diào)度類是要付出代價的。內(nèi)核中每個可能決定調(diào)度的地方都得有一個間接得函數(shù)調(diào)用去call調(diào)度類相關(guān)的代碼。比如,當(dāng)一個線程將要 sleep時,內(nèi)核調(diào)用調(diào)度類相關(guān)代碼,完成該類中線程sleep需要完成工作。在Linux和FreeBSD上,調(diào)度已經(jīng)完成了所有工作。不需要再來一個間接調(diào)用。額外的層次,就意味著Solaris的調(diào)度要占用稍微多一點的系統(tǒng)開銷--不過提供了更多的功能。

  內(nèi)存管理和分頁

  Solaris的進程地址空間由邏輯段segment組成。進程地址中的這些段可以通過pmap訪問。Solaris將其內(nèi)存管理代碼和數(shù)據(jù)結(jié)構(gòu)分為平臺無關(guān)和平臺相關(guān)部分(這不跟沒說一樣嘛。。。)。平臺相關(guān)部分位于HAT(hardware address translation)層。FreeBSD用vmspace描述進程地址空間,將其劃分為邏輯塊region。硬件相關(guān)部分在pmap (physical map)模塊,而vmap 例程處理硬件無關(guān)部分和數(shù)據(jù)結(jié)構(gòu)。Linux使用內(nèi)存描述符劃分進程地址空間,邏輯單位是memory areas。Linux也由pmap來examine 進程地址空間。
Linux將機器相關(guān)層從更高層次的機器無關(guān)層中劃分出來。Solaris 和FreeBSD中大多數(shù)類似代碼比如page fault處理是機器無關(guān)的,而Linux處理page fault的代碼則非常機器相關(guān)--從fault處理開始就是這樣了。由此下來的結(jié)果是,Linux能很快地完成大多數(shù)分頁相關(guān)代碼--因為數(shù)據(jù)抽象更少。不過,代價是,下層硬件的改變需要大量修改代碼--Solaris和FreeBSD則分別把這樣的工作堵截在HAT和pmap層搞定。

  Segment,region和meory area的分割是:區(qū)域的虛擬地址segmetn/region/memory area映射的object/文件的位置權(quán)限map的大小
例如,程序的text(text段,即代碼)在一個segmetn/region/memory area中,OS管理地址空間的機制是類似的,不過數(shù)據(jù)結(jié)構(gòu)名字完全不同。
分頁3個系統(tǒng)都使用了最近最少使用least recently used算法的變種完成頁替換。他們都有一個守護daemon進程/線程完成頁替換。FreeBSD的是vm_pageout daemon,它周期性地,或者當(dāng)free的內(nèi)存不多時,被喚醒。當(dāng)可用內(nèi)存低于某個限制時,vm_pageout 運行例程vm_pageout_scan掃描內(nèi)存并釋放一些頁面。vm_pageout_scan例程可能需要異步地將更改過的頁面寫回到磁盤,在釋放他們之前。不論由多少顆CPU,只有一個這樣的daemon。Solaris的是pageout daemon,它也周期性地運行,處理空閑內(nèi)存不多的情況。Solaris中的分頁限制值在系統(tǒng)啟動時自動校準(zhǔn),這樣可以避免該守護進程過渡占用CPU或者向磁盤發(fā)出洪水般的換頁請求(嗯,flood這么翻正好 ; P )。

  FreeBSD的daemon在大多數(shù)情況下使用的值是固定的--不過也可以調(diào)整。Linux的LRU算法可以在運行時動態(tài)調(diào)整,而且可以有多個kswapd daemon,每CPU最多一個。這3個系統(tǒng)都使用global working set策略,而不是per process working set。FreeBSD有多個頁面鏈表來追蹤最近使用頁。包括active,inactive,cached和feee頁。根據(jù)使用情況,頁面在這些鏈表間走來走去。經(jīng)常訪問的頁面會在active上。退出的進程的數(shù)據(jù)頁面將被馬上放到free上。

[ 本帖最后由 compnik 于 2006-7-1 23:26 編輯 ]

論壇徽章:
0
4 [報告]
發(fā)表于 2006-07-01 23:22 |只看該作者
如果因為負(fù)載原因vm_pageout_scan 來不及掃描全部內(nèi)存的話,F(xiàn)reeBSD內(nèi)核可能將整個進程全部換出。如果內(nèi)存短缺十分嚴(yán)重,vm_pageout_scan 可能會kill系統(tǒng)中最大的進程。Linux也使用不同的頁面鏈表。物理內(nèi)存被分為(多個)3重zone:一個DMA頁面,一個普通頁面,一個動態(tài)分配內(nèi)存頁面。zone的實現(xiàn)很像由于x86架構(gòu)限制而很產(chǎn)生的。頁面在hot,cold和free鏈表間移動--機制和FreeBSD的類似。經(jīng)常用的頁面在 hot上?捎庙撁鎰t在cold或者free上。

  SUN的大佬使用free鏈,哈希鏈,vnode頁面鏈支持自己的LRU實現(xiàn)。后兩者大致相當(dāng)于FreeBSD和Linux的active/hot鏈--也是FreeBSD和Linux要掃描的鏈。Solaris要掃描的不是這兩個對象,它用two-handed clock算法掃描全部頁面(見Solaris Internals 或其他什么地方隨你便)。大致方法是,兩只手相隔固定舉例,前面的手將page的引用位清空以作為標(biāo)識,如果自此開始沒有進程引用這個頁,后面的手就釋放這個頁面(當(dāng)然如果需要就寫回磁盤)。

  3個系統(tǒng)在分頁時都考慮了NUMA本地性。他們都把IO buffer cache和虛擬內(nèi)存頁面的cache合并到一個系統(tǒng)頁cache中。系統(tǒng)頁cache用于讀寫文件已經(jīng)被mmap了文件,還有應(yīng)用的text段和data段。

  文件系統(tǒng)

  3個系統(tǒng)都使用數(shù)據(jù)抽象層向應(yīng)用隱藏文件系統(tǒng)實現(xiàn)細節(jié)。就是用大家熟悉的open,close,read,write,stat,等等系統(tǒng)調(diào)用訪問文件,無論下層的文件數(shù)據(jù)的實現(xiàn)和組織如何。Solaris和FreeBSD把這種機制稱為VFS(virtual file system),基本數(shù)據(jù)結(jié)構(gòu)是vnode(virtual node)。Solaris和FreeBSD里每個被訪問的文件都有一個賦給他們的vnode。除了generic 的文件信息外,vnode還包含到file-system-specific 信息的指針。Linux采用了詳細的機制,也叫VFS(virtual file switch),文件系統(tǒng)無關(guān)的數(shù)據(jù)結(jié)構(gòu)是inode。這個機構(gòu)和vnode類似(小心:Solaris和FreeBSD也另有自己的inode--是 UFS文件系統(tǒng)里file-system-dependent 的數(shù)據(jù))。Linux還有兩個不同的結(jié)構(gòu),一個用于文件操作,另一個用于inode操作。Solaris和FreeBSD將他們合并為vnode操作。
VFS允許在系統(tǒng)里實現(xiàn)多種文件系統(tǒng)。這意味著他們相互訪問對方的文件系統(tǒng)沒問題。只要相關(guān)的文件系統(tǒng)例程和數(shù)據(jù)結(jié)構(gòu)已經(jīng)被移植到VFS上。所有這3個系統(tǒng)都允許文件系統(tǒng)堆疊stacking。下表列出了每個OS實現(xiàn)的文件系統(tǒng)類型,不是全部哈。


  結(jié)論
  Solaris,F(xiàn)reeBSD和Linux顯然都在從對方身上獲益。隨著Solaris的開源,這種相互促進有望更快。Max個人已經(jīng)感覺到 Linux的變化是最快的。新技術(shù)被快速地集成進系統(tǒng),只是文檔和健壯性可能有點落后。Linux有很多--或者有時是看上去有很多--開發(fā)者。 FreeBSD則大概是(從某種意義上)3個系統(tǒng)中歷史最長的。Solaris來自BSD Unix和AT&T Bell實驗室Unix的結(jié)合,使用了更多數(shù)據(jù)抽象層,因而一般說來能更簡便地支持更多功能。不過,內(nèi)核中大多數(shù)這樣的分層都沒有文檔描述?赡茈S著代碼的開放這一點會有所改善。

  至于他們的差別,最大的地方之一是page fault處理了。在Solaris中,發(fā)生page fault時,代碼是從平臺相關(guān)的trap handler開始執(zhí)行的(以大家的智商,這好像不用說了吧。。。),然后會調(diào)用generic的as_fault例程,這個例程判斷發(fā)生page fault的segment,然后調(diào)用segment driver處理page fault。segment driver調(diào)用文件系統(tǒng)代碼,后者再調(diào)用進驅(qū)動程序,換入頁面。換入完成后,segment driver 調(diào)用HAT層來更新頁表項。在Linux上,發(fā)生page fault后,內(nèi)核調(diào)用的代碼在會馬上進入平臺相關(guān)部分,這些處理可能更快,不過可能不太容易擴展和移植(后半段說得太省,不知道作者有沒有真的研究過 Linux下對應(yīng)的處理過程)。

  內(nèi)核觀察和調(diào)試工具對正確理解系統(tǒng)行為有關(guān)鍵意義。在這方面,Solaris有kmdb,mdb和DTrace 。在開源之前,Max就對Solaris做過多年“反向工程”--他發(fā)現(xiàn)解決問題的時候使用工具總比閱讀代碼來得快--我也知道,不過得看什么場合,大家可不要被他誤導(dǎo)。Linux嘛,我看作者Max不太熟,所以認(rèn)為沒有太多工具。對FreeBSD,他也認(rèn)為只是可以用GDB調(diào)試內(nèi)核的dump-- Liux也可以。
(e129)

[ 本帖最后由 compnik 于 2006-7-1 23:24 編輯 ]

論壇徽章:
0
5 [報告]
發(fā)表于 2006-07-01 23:59 |只看該作者
恩,謝謝了,是篇好文章

論壇徽章:
0
6 [報告]
發(fā)表于 2006-07-02 10:35 |只看該作者
原帖由 compnik 于 2006-7-1 23:17 發(fā)表
轉(zhuǎn)自:
http://tech.ccidnet.com/art/322/20060321/485291_1.html

1。我個人認(rèn)為作者MAX對Linux的了解不像他對Solaris那樣深入,我不知道也沒法知道他的下列關(guān)于Linux的內(nèi)容來自自己的代碼閱讀分析 ...


作者Max今年大概都50多了吧,美國人,經(jīng)常穿梭于中國美國之間,下面的link是去年max來北京做的演講,題目就是這篇文章,親眼見過Max對solaris內(nèi)核的熟悉程度,簡直佩服的五體投地:

http://blogs.sun.com/roller/page/JoeyGuo/20051209
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP