您好,登錄后才能下訂單哦!
可以毫不夸張地說,UNIX模型就是現代操作系統的原型!不管是原汁原味的UNIX各大系列比如AIX,Solaris,HP-
UX,FreeBSD,NetBSD,...還是類UNIX比如Linux...還是基于Windows
NT架構的各種微軟操作系統,其基本思想都是來源于UNIX。雖然這些系統一個比一個復雜,但是請記住一句話:所有的基本思想都是也必須是樸素的,簡單
的!
也許,很多人看到這里就覺得有點不屑一顧,畢竟他們覺得自己是技術狂人,覺得只有擺弄復雜的東西才能證明自己的學識和技術,認為上世紀70年代的被
UNIX
v6是一個過時的系統,里面的內容早就被歲月無情地拋棄了,但事實上,如果你真的看了那個時代的UNIX源碼,或者讀了萊昂氏的神書,并且細細琢磨之后,
你會發現,那些樸素的觀念一點也不過時,我們如今的很多技術所依托的思想早在1975年的時候就已經被樸素地實現了。三歲看老,無視歷史就是藐視未來。
如果你想知道下一步我們要做什么,聽別人講是沒用的,你必須親自翻開歷史。正如給你一條曲線的一部分,問你該曲線的下一步走勢,你肯定可以猜個八九不離
十,因為任何事物都是循著歷史前進的,這就是讀史使人明智。前些日子和朋友一起吃飯,請客的是位芯片專家,但是對除芯片以外的任何事物都是不屑一顧,好一
個中國傳統的所謂術業有專攻,就好像世界上除了芯片是高科技之外,其它的都是小兒科,好一個排他!但是你有沒有通過這件事想到些什么,這位朋友是典型的中
國式學究,所謂的術業有專攻的學究,正是這種所謂的專攻,導致我們中國事實上從來沒有引領過一個時代,我們從早的說,農業革命發力于美索不達米亞以及尼羅
河中下游,青銅時代是西亞和東歐游牧民族引領的,民主觀念來自于希臘,帝國主義來自于羅馬,工業革命來自于西歐,電力革命來自西歐,計算機革命來自美國,
關于最后這一點我會詳細說,以上這些我并沒有提到文藝復興,那是我故意的,因為如果我提到了文藝復興,很多人就會說,我們中國也有很多這類事情,比如周昭
共和,秦王掃六合,漢武大帝,光武中興,貞觀之治,...康乾盛世,但是你要知道,這些和文藝復興一樣,都是局域性事件,不管怎樣,我們現在住著樓房,玩
手機,玩電腦,開汽車,坐高鐵,所有這些都是舶來品,沒有一樣是我們自己的,原因就在于我們的思維不夠發散,我們做軟件就是做軟件,不知道一些思想還可以
用于硬件,我們學OO學得很精通,精通了C++,Java,卻不知道OO來自AI...知道列維飛行卻不知道它和計算機內存訪問模型的關聯...
說了這么多看似沒用的,事實上是想說,弄點別的吧,雖然我們都是搞IT的。很多編程高手可能真的不屑于1975年的UNIX源代碼,那就是歷史,這位高手
知道怎么設計類,知道怎么實現一個排序算法,但是也僅僅如此,說到底,他只是一個高價的雇傭兵,永遠都成不了將軍,而且隨時都可能陣亡。我寫這個系列的文
章,就是想說明一點,用歷史的眼光看操作系統以及任何技術的發展,你會得到更多,往窄的說,UNIX就是一座寶庫,凡是你在現代軟件中能找到的思想,在
UNIX中都是它的影子。
在正式開始之前,簡單的說一下背景。我們現在所面對的計算機早就不是40年前的計算機了,由于需要產業化和降低門檻,整個計算機產業和通訊產業經歷了多次
整合,最終我們把軟件和硬件嚴格區分開來,并且在軟件和硬件的各個組成部分之間也嚴格劃分了界限,這樣的結果就是有利于社會化分工,人們走上了術業有專攻
的專業化道路(其實很多思想家從古希臘梭倫時×××始就開始抨擊專業化了),但是其缺點也是顯而易見的,那就是“對于geek而言,現代計算機已經不好玩
了”。
看了Linus的自傳,認同一點,現在的計算機已經不適合玩了,主要原因是已經
不好玩了。Linus始終認為技術為娛樂而生!值得注意的是,Linus的自傳《Just for
fun》并非要表達“計算機已經不好玩”這樣的觀點,但是Linus認為,現在的計算機“和你的汽車一樣復雜”,已經不適合讓你隨性折騰了。
事實上,由于計算機已經不再好玩,我們也就無法或者很難就計算機本身再創造所謂的“時代”!現在搞計算機已經淪為了一種職業,一種謀生的手段,其內容也隨之淪為了套路和規則!要想創造一個時代,你必須不能術業有專攻,你必須是全才。
時代是玩出來的,我以為!當時的那幫人是無心為之的,之后當所有的玩法標準化時,利益便主宰了一切。能玩得轉的東西必須是簡單的,太復雜的東西在藝術上沒
有美感,在工程學上你必須花費巨大的精力去進行復雜性管理,因此本質的東西便被隱藏在復雜性之下了,你很難去挖掘它,欣賞它。近期讀了幾本書,頗有感受。
太復雜的東西,可以向不懂的人大肆炫耀,但事實上,聽的人根本不知道你在說什么,你只是自說自話,孤芳自賞罷了。你可曾想過,為何大師都是扎堆出現的,古
希臘的哲學家,中國先秦的諸子,文藝復興時期的畫家,20世紀初的物理學家,20世紀50-60年代的計算機天才,20世紀70年代的***...
計算機產業也是從全民折騰時×××始的,這就和希臘的梭倫改革一樣,但是和希臘的伯里克利終結了一個時代一樣,產業化,專業化也終結了計算機的嬉皮時代,現
如今,只有Richard Stallman,Eric S
Raymond他們還在盡力延續那個geek的時代,而事實上,如今的專業化讓很多準geek面對復雜的計算心有余而力不足。那么,這個geek時代是怎
么被終結的呢?我從軟件和硬件相遇的地方說起。
最初設計的機器并不是想讓每個人都可以操
控它的,它是隸屬于精英階層的。但是如果有人發現了這些機器中蘊藏的巨大的商機,他便會推動一種全民化運動,全民化運動發展到一定程度,技術已經足夠復
雜,就會出現專業化,于是這種技術便逐漸遠離了大眾,再次被精英所壟斷,正如它最初時那樣。
對于計算機技術而言,我把前一個精英時代的技術成為硬件,我把后一個精英時代的技術稱為軟件,如今在硬件領域,擁有硅晶體技術,Verilog,HDL
等,在軟件領域,有JAVA,Python,PHP,OO,設計模式,敏捷開發等術語,專業性讓所有這些東西都具有了排他的性質,而創造計算機時代的地
方,正是軟件和硬件相遇的地方,那就是匯編語言向C語言進化的地方。
要知道,如果你不懂機器的特性,你是用不好匯編語言的,如果你不懂機器的特性,你也不可能用C寫出最高效的代碼,反過來,如果你只懂C語言,你也不可能將
機器的能力發揮的淋漓盡致,匯編和C,這就是軟件和硬件相遇的地方,時代就是它們開創的,歷史就是它們寫就的。
匯編語言編程讓人循著機器指令走,程序員很難構建自己的高層邏輯,因為你要花費大量的精力在指令本身上,C語言出現后,人們的邏輯思維被解放了,你可以寫
諸如a=b+c這類語句了,而不必“先將立即數放入一個寄存器,再將立即數....兩個寄存器的值相加或者一個寄存器和一個立即數直接相加,結果存
在...”。C語言的最大共享在于解決了“尋址問題”,這就意味著它解決了所有的問題,因為計算機編程可以歸為尋址的藝術,C將所有的尋址問題歸結為一個
概念,那就是指針!要知道,現代存儲式計算機的運行,唯一的問題就是尋址問題,不管是數據還是指令,都存在內存中,你必須有辦法可以在正確的地方找到指令
或者數據。C指針屏蔽了所有的尋址細節,讓輕松構建應用邏輯成了可能,這些應用邏輯包括復雜的條件語句,循環語句,goto語句,甚至緩沖區溢出。
硬件和軟件的關系就是怎么做和做什么的關系,編程人員告訴硬件做什么之后就可以放心做別的事了,因為他相信硬件知道怎么做。這個接口就是C語言,而硬件的內部電路邏輯則實現了“怎么做”的邏輯。
水不知冰有多冷,冰不知水的多情。同一個東西,一旦被隔離,那就是隔行如隔山,本來硬件和軟件是一家的,可如今變成了排他的兩個行業,就算在軟件行業內
部,還經常有各種排他性的隔離,諸如什么“搞底層的”,“搞協議棧的”,“寫類的”,...軟硬通吃的全棧程序員現在被人和酷(苦)逼聯系在了一起。但是
在30-40年前,計算機時代就是這幫全棧程序員開創的!在軟件和硬件相遇的地方,那幫人同時屬于硬件精英和軟件精英,實際上他們引領的是一種全民玩轉計
算機的嘻哈時代,這個時代被20世紀70-80年代的***們所延續,眾所周知的業界名人幾乎都出自那個由UNIX開啟被***精神延續的時代,比如喬布斯的
Apple,比爾.蓋茨的Microsoft,理查德.斯托曼的GNU,比爾.喬伊的BSD,IBM PC,Intel
IA32,...不勝枚舉。這是一個簡單純真的時代,一個精簡濃縮的年代。
軟件和硬件相遇的地方就是UNIX誕生的地方,UNIX作為一個營養豐富的根,注定會長成參天大樹,這棵樹上的果實太多,以至于幾乎囊括的所有現如今我們在使用的技術。
PC技術使得計算機小型化,進而出現了微型化的趨勢,隨著工藝越來越先進,硬件越來越小,越來越便宜,巨大的商機促進了PC技術的發展,但是軟件這方面卻
沒有實時跟進。多用戶多任務分時系統當時最風靡的就是UNIX,然而UNIX卻受制于各種非技術因素的控制,正因為如此,才讓微軟,蘋果等公司占了先機,
它們兩家你追我趕,一直到今天,導致這個結果的另一個原因是UNIX從來都不屬于草根(正因為如此才有了GNU),而不管是蘋果還是微軟,都和一個叫“家
釀俱樂部”的草根組織有關,大家在一個相對平和的環境中展示自己的機器和技術,那個時代是***的時代。可以說,UNIX并沒有趕上PC時代的潮流,但是這
就是UNIX,正如啟蒙思想家本人不參加法國大革命一樣,UNIX作為一位思想先驅,它的一些古老的觀念,甚至Windows 8系統還在使用。SVR4
VM的設計概念,
可以說是顛覆了傳統對記憶體的理解;文件抽象使得IO接口變得簡單;基于頁面交換和按需調頁實現的虛擬內存的思想影響了幾乎所有的操作系統設計;分級存儲
思想更絕妙,在CPU內部,CPU緩存是內存的Cache,在VM里面,物理內存是虛擬內存的Cache,在MMU,物理內存是磁盤或者網絡的
Cache...;最重要的還是UNIX進程模型(線程模型和進程組模型都是進程模型的擴展),它的重要性我真的不知道該怎么才能說得清。
不得不提到的是Intel和微軟以及PC技術這三者的關系,但是這個話題過大,也只能在此提示一下,總之,PC技術造就了兩大帝國,而Intel和微軟配合太默契,以至于成了一個好像羅馬帝國那樣的存在...
可
以說,PC技術所依托的Intel技術和微軟的技術是并行發展的,其間出現了太多太多花哨的特性,甚至很多東西都直接固化在了硬件中。如今,蘋果也采用了
Intel芯片,然而它并沒有采用微軟的技術,而是采用了UNIX系統Mach/BSD來構建自己的操作系統Mac OS
X,可以說正是蘋果將PC技術拉進了UNIX,在另一個方向,Android正在和iOS爭奪市場,但是不管是Android還是iOS,其底層都是基于
直接的UNIX思想構建的系統,一個是Linux,一個是Mach/BSD。返璞歸真,UNIX技術歷經40年,其基本觀念以及核心基本沒有變過,這足以
說明它的設計是多么的優秀。
UNIX成功的觀念是,它從來不關注實現細節,因為細節會將你拉離目標。UNIX只提供基本理念,因此,不管是
AIX,Solaris,Mach,xxBSD,它們的實現絕對截然不同,但是都叫做UNIX。如果微軟愿意,Windows
NT也可以稱為UNIX,因為NT系統在70%的程度上實現了UNIX的基本理念。
在UNIX之外,有另一條演進道路,那就是復雜性演化。它是嚴格遵循硬件的最新特性,軟件迎合硬件,硬件慣壞軟件,大家彼此阿諛奉承,實際上大家都忘了,
其實原本大家都是一家。有些時候,僅僅為了一些單一的商業利益,就會把一些復雜但不普適的機制固化在硬件中,這一點的反例就是RISC架構,它就是
UNIX在硬件領域的直接體現。
數據的地址按照其類型的長 度倍數自然對齊是一個不成文的編程約定。可是為何作如此的約定呢?難道不對齊就不行嗎?在某些架構的處理器上,真的就是不行,比如很多的RISC處理器。 然而在CISC架構的處理器,比如Intel/AMD x86架構處理器上,為了編程的方便,核心可以替你完成這種費力的操作。這一切的根源在哪里?
在對整個事情分析之前,必須要明白的是,現代微處理器是超大規模集成電路的結晶,芯片是雕刻在硅這種半導體上的,工藝極其考究,因此布線的簡單就是一切的
根本,在硅晶體上雕刻電路是多么的令人崇拜啊(還記得我們學過的《核舟記》嗎)。硅晶體雕刻不像高級語言編程,它甚至不允許你將事情搞得太復雜(主要是晶
體的布線難度),因此很多事情就要規定死,比如數據的自然對齊。完美的處理器架構只需要實現一個完成任意操作的最小指令集即可,架構簡單,可以將更多的硅
晶體的空間用于實現高效的流水線而不是復雜的指令(某個復雜的指令往往和其他復雜指令擁有公共部分,這就造成了空間的浪費),這種處理器叫做RISC處理
器。以上這個事實是人們在早期集成電路技術開啟這個新時代的伊始,走了很多彎路才總結出來的,只可惜,Intel就是那個最先吃螃蟹的人,隨后它獲得了巨
大的成功,兼容它的指令集將AMD也拉下了水。
我們知道,拋開微處理器內部必須實現的運算邏輯,其與外部的接口就是尋址和IO。
Intel在最初實現16位微處理器的時候,恨不得為每個我們能想到的尋址邏輯都實現一條硬件指令,事實上它也是這么努力做的。翻開任何一本匯編語言的
書,首先映入眼簾的就是大量的尋址指令,如果你對著Intel的手冊觀摩,你會發現很多寄存器都不是作為操作數存在的,而是內置于指令本身!因此mov
eax 1和mov ebx
1可能就是兩條完全不同的指令,而不僅僅是操作數的不同,就這樣,復雜指令的實現占據了大量的芯片面積,由于單獨指令完成的事務依然可分割,且長度不
一,Intel便很難實現高效的長流水線。機器指令就是硬件和軟件相遇的地方,是軟件請求到硬件落實的唯一接口,為了兼容曾經的軟件,接口是不能隨意更改
的,但是當Intel意識到指令必須是足夠簡化,功能足夠單一以便實現長流水線時,它上面的應用程序已經遍地開花了。于是Intel和AMD的策略就是修
改指令的實現,取指令之后,將單條的復雜指令分割為多條簡單指令,即使用了萬變不離其衷的神喻-添加一個中間層!
于是,Intel的指令事實上最終也是由簡單操作實現的,這些操作稱為微操作,實現一條指令的微操作集合稱為微程序,所有的微程序稱為微碼。于是乎,x86架構實際上只是在接口是CISC體系架構,其內核已經是RISC體系架構了!
為了解釋內存對齊問題,必須知道其物理構造,關鍵并不是如何設計內存芯片,而是如何將內存芯片的引腳和CPU引出的地址總線對應起來,如何建立兩者之間的
關系是最重要的,別忘了,計算機在CPU之外要解決的唯一問題就是尋址問題!如果數據是任意對齊的,那么在CPU發出尋址指令時,就可能出現數據存在兩片
芯片上的情況,而為了布線的簡單,這種尋址指令必須兩次完成,如果兩次操作之間鎖住總線,就會大大降低效率,如果不鎖總線,就會有原子性問題。要求編譯器
或者程序員不寫出那樣的指令是最簡單的,因此這個任務就落在了編譯器或程序員的頭上。這就是為何在某些機器上數據一定要自然長度對齊。
應 用程序蓬勃發展的今天,很難想到UNIX等分時系統在構建之初的目標。分時系統是為了讓系統以一種流水線的方式代替批處理,讓用戶不必長時間等待,實際上 當時的分時系統是以一種時間片錯覺的方式展示給系統用戶的,事實上,系統的吞吐量和總的工作延遲并沒有改善,改善的只是人們對這種錯覺的認可。這就是最初 的分時系統。那么UNIX呢?UNIX在很多方面走得更遠,對于AT&T來講,它的電話業務是大頭,它當然希望用一種性價比更加高的投資為用戶提 供一種基于錯覺的服務方式,而用戶根本就感覺不到這種差異。貝爾實驗室最初的分時系統并非去運行什么應用,而是為了控制語音通話,但是后來,它走向了終 端。
電話用戶很容易和打印機,終端用戶聯系起來,因為它們都屬于遠程用戶,共享同一主機資源。分時系統出現之前,要么等,要么建立并行系統,不管對于用戶來
講,還是對于投資回報而言,都不是令人滿意的,分時系統解決了所有的問題。文件抽象也是為了更方便的I/O,因此可以看到,早期的UNIX的I/O扮演了
什么角色。正如現在的路由器,交換機一樣,早期的UNIX在進程模型抽象層面提供控制平面,在文件抽象層面提供數據平面,它的內核就是為控制平面而生,而
數據平面應該盡可能使用用戶態的I/O來完成,遵循這一原則的,將會得到回報,直到今天依然如是。
幸運的是,今天很多的廠商已經走向了這條路,也出現了很多這樣的技術,比如PF_RING技術。而這一切,早在樸素的UNIX時代就已經被決定了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。