代碼質(zhì)量

出版時間:2012-7  出版社:電子工業(yè)出版社  作者:季奧米季斯?斯賓耐立思(Diomidis Spinellis)  頁數(shù):512  譯者:左飛,吳躍,李潔  
Tag標簽:無  

前言

  編程和其他事情一樣,錯誤即重生。  --Alan J. Perlis  我希望自己能在前言中這樣寫道:你手邊的這本書是精心策劃而成的出版結果,其始于《代碼閱讀》,而終于《代碼質(zhì)量》。然而,這么做是對事實的一種歪曲,也是對我們這些工程師所喜愛的有序世界的一種媚從。其實真相是《代碼質(zhì)量》大體上源自一系列的偶然事件?! 『炏鲁霭妗洞a閱讀》一書的合同時,我手頭已有了一個綱要和一些完成的章節(jié)。基于這些完成章節(jié)的長度和所耗精力,我天真錯誤地估計了全書長度和成書日程。若你靠編寫軟件為生,可能已猜到,在書稿應完成之時,我僅僅完成了大綱章節(jié)的一半多一點,并已用完所有分撥篇幅。為體面脫身,我建議編輯將已完成的部分(除去關于可移植性的一章)作為《代碼閱讀》的第1卷出版,而將剩下的工作作為第2卷。我們達成了一致,于是《代碼閱讀》[Spi03a]出版。結果該書好評如潮,并獲得了2004年度軟件開發(fā)雜志生產(chǎn)效率大獎(The 2004 Software Development Magazine Productivity Awards),還被譯為其他6種語言?! ≡凇洞a閱讀》一書中,我以取自實際工作中的開源項目為例,嘗試覆蓋軟件開發(fā)人員可能面對的大多數(shù)與代碼相關的概念,包括程序結構、數(shù)據(jù)類型、數(shù)據(jù)結構、控制流、項目組織、編碼標準、文檔及架構。在第2卷中,我先前計劃涉及接口與面向應用的代碼,包括國際化與可移植性問題、常用庫與操作系統(tǒng)要素、底層代碼、領域特定語言與聲明性語言、腳本語言及混合語言系統(tǒng)。但當程序員們拿到《代碼閱讀》一書后,我從他們那里獲得了一些有益的看法。他們給我的反饋表明許多讀者都在焦急地等待著下一卷,不過他們期望的并不是一個對于設備驅(qū)動程序的詳細剖析(我之前為接下來的一卷保留的一章)。2003年7月,時任編輯Mike Hendrickson建議我撰寫一本名為Secure Code Reading的書。雖然作為一個科學家,IT安全是個讓我感興趣的領域,但是我懶于追逐寫作安全方面書籍的時尚,故而僅寫了一個與安全有關的章節(jié)。在有了一個與可移植性相關的章節(jié)和一個與安全相關的章節(jié)后,我突然找到了新書的書名和主題--《代碼質(zhì)量》,其應將重點放于閱讀和編寫軟件代碼及軟件代碼的質(zhì)量屬性上(這些也時常被稱為非功能屬性)?! 〗柚喿x軟件系統(tǒng)的代碼,我們可以發(fā)現(xiàn)非功能屬性與產(chǎn)品的非功能需求相關。該需求不與系統(tǒng)提供的特定功能直接相關,而是與更廣泛的重要系統(tǒng)屬性有一定的關系。常見的與系統(tǒng)屬性相關的非功能屬性為:可靠性、可移植性、易用性、互用性、適應性、相依性及可維護性。另外兩個與系統(tǒng)的效率有關的值得注意的非功能屬性是:系統(tǒng)與時間約束有關的性能和系統(tǒng)空間需求?! 〗柚喿x代碼來了解系統(tǒng)非功能屬性是開發(fā)者必不可少的一項技能,這里面有兩個原因。一是未滿足非功能需求所引發(fā)的結果可能是危險的,甚至是災難性的。一個系統(tǒng)若僅某些功能需求出現(xiàn)錯誤(大多數(shù)軟件系統(tǒng)都含有這樣的錯誤),則其還能以降級模式運行,用戶也會被告知避免使用其中的一些功能。但若非功能需求出現(xiàn)錯誤則較為嚴重:不安全的Web服務器或不可靠的防抱死系統(tǒng)(ABS)比無法使用更糟糕。二是非功能需求有時難于驗證。我們寫不出這樣一個測試用例使得它能夠驗證系統(tǒng)的可靠性或系統(tǒng)是否存在安全漏洞?;谝陨蟽牲c,我們在應對非功能需求及相關軟件屬性時,需利用我們所能利用的一切手段。將代碼與非功能屬性聯(lián)系起來的能力應是每一位軟件工程師都需具備的有力武器?! 〕ヒ暯遣煌?,《代碼質(zhì)量》沿用了《代碼閱讀》的成功秘訣,即重點關注已有代碼的閱讀;僅分析取自現(xiàn)有開源系統(tǒng)的實例;給出所有實例的來源;采用注釋來剖析代碼;提供有意義的練習來強化讀者的批判能力和技巧;在頁邊空白處指出編碼習慣及陷阱;以箴言錄的形式總結每章的建議;在“延伸閱讀”部分,給之前的實踐以理論的拓展;采用了UML(Unified Modeling Language)來繪制所有簡圖。其中最為精妙的元素就是我自行強加的規(guī)則--避免使用“玩具”示例(toy example),所有的用例都須取自現(xiàn)有開源項目。為踐行該規(guī)則,我常?;ㄙM數(shù)小時來尋找一個合適的例子,它應當既能表明我欲展示的概念,又要易于理解,并且還需足夠短小以便可放至一本書中。個人認為這樣的活動既有助于智力同時也可使作品更為嚴謹。通常在尋找某方面的缺點時,我會碰到其他值得討論的內(nèi)容。有時我對于某理論概念示例的尋找沒有什么結果,那么在此情形下,我就有理由認為在實踐中這些概念并未重要到必須將其囊括于本書的地步?!  洞a質(zhì)量》和《代碼閱讀》背后的原理與動機是一脈相承的--閱讀代碼可能是計算機專業(yè)人員最常見的活動之一,不過其卻較少被當做一門課程來教授或被正式當做一種學習程序設計和編碼的方法來使用。所幸開源軟件的盛行已向人們提供了大量可供自由閱讀和學習的代碼?;陂_源軟件的初級讀本是提高個人編程能力的有價值的工具。所以我希望這兩本書能夠引發(fā)人們在計算機教育課程中加入代碼閱讀的課程、活動及練習的熱情。如此一來,在不久的將來,就像是從優(yōu)秀的文學作品中學習寫作一般,我們的學生就可從現(xiàn)有的開源系統(tǒng)中學習編程了?! ?nèi)容及補充材料  我決定在《代碼質(zhì)量》中沿用同《代碼閱讀》中一樣的系統(tǒng)和分發(fā)版本作為開源代碼樣例。原因是我認為兩卷間必須存在一定的延續(xù)性,這樣方可允許讀者觀察到同樣的源代碼如何既能在《代碼閱讀》中被用于認識其所涵蓋的功能、架構及設計等功能特性,又能被用于《代碼質(zhì)量》中所涉及的非功能特性?! ”緯玫拇a來自于那些大多數(shù)僅有歷史意義的代碼快照。然而有了它們,我就可以借機展示那些在較新版本中已被發(fā)現(xiàn)并更正的安全漏洞、同步問題、可移植性問題、API調(diào)用的誤用及其他bug。這些許久之前的代碼可能表明,其作者目前或已晉升至管理崗位以致不喜于閱讀此類書籍,或視力退化至無法看清書中字體。我可借助這些變化來自由品評相關代碼,而不用擔心險惡的報復。雖如此,我還是可能被指責誹謗那些懷有推進開源運動信念的作者所貢獻之代碼,我對此表示理解,同時也認同我們應當改進這些代碼而非僅僅對其評論。若我的評論使某些源代碼的作者感到冒犯,請允許我預先在這里真誠的道歉。不過作為對自己言行的辯護,我個人認為在大多數(shù)實例中,我的評論并非針對特定的代碼片段而是借助其來指明開發(fā)者在實踐中應避免的行為。通常情況下,被我作為反例來使用的代碼都是易受此類傷害的對象,原因在于它們被編寫時,技術及其他方面的限制使得其也算是一種合理的行為,抑或我的一些特定的批評其實脫離了代碼所處上下文。無論何種情形,我都希望這些評論能得到你的善意一笑,同時我也坦率承認,我本人的代碼也包含有類似的,甚至可能更糟的錯誤?! ∵x擇本書示例所用系統(tǒng)時,出于實用的原因,我希望這些代碼能夠適于作為教學載體。故而我所尋找的內(nèi)容涵蓋代碼質(zhì)量、結構、設計、功用、流行度及無版權問題。我盡可能平衡語言的選擇,積極尋找合適的Java和C++代碼。然而,當類似概念可被多種語言演示時,我選擇采用C作為“最小公分母”。所以,本書中引用的61%的代碼為C代碼,這其中包括適用所有語言的實例及系統(tǒng)級編程(多用C語言)實例。另外19%的實例引用了Java代碼。選擇Java代碼是為了展示與面向?qū)ο蟾拍罴跋嚓PAPI有關的元素。這些概念多也適用于C#,并且許多也適用于C++(4%的實例引用了C++代碼)?! 〈送?,在本書中我也更為強調(diào)UNIX中的API和工具而非Windows中的類似元素。原因依然涉及“最小公分母”邏輯--許多UNIX中的工具和API在Windows中也有對應元素,而反之則不然。大量與UNIX相兼容的系統(tǒng),如GNU/Linux與BSD的一些變體,都是免費提供的,并且常常還向使用者提供可引導的CD-ROM,如此一來任何人都可輕松體驗這樣的系統(tǒng)。最后,UNIX中的API和工具,從我所引示例的細節(jié)方面來看,在過去30余年來一直保持著驚人的穩(wěn)定,這就為我們討論和展示通用規(guī)則提供了一個堅實的根基。雖然如此,我還是在一些地方引用了Windows API及命令來討論非UNIX平臺上的情況。但是請別讓這些引用欺騙了你--我并不認為本書涉及Windows平臺的編程問題要比涉及UNIX平臺的相關問題完整和廣泛?! 〕ピ谒袑嵗芯捎瞄_源軟件外,本書可能被(狹隘地)指為忽略了大量的流行時尚,如Java、C#、Windows、Linux及以解決現(xiàn)有問題為導向的寫作風格。其實我很看重前述這些元素:我這里29%的機器運行著Linux,我教授一門Java課程,我已在Windows平臺上寫了大量程序,并且我的書架上至少有10本書充滿了帶序號的段落來提供解決很多問題的具體建議。然而,我還是相信在當今這個充滿變化的世界,理解說教背后的原理至關重要。正如你在下面的章節(jié)中將會看到的,一旦我們將重點關注于原理,則:  · 底層技術的選擇常常會被虛化。  · 我們學到的東西就擁有更廣的應用性和更長的時效。  · 具體的建議會自行浮現(xiàn)(見每一章末的“那些值得記住的建議”)。  最重要的一點在于,是否理解編程講義背后的原理才是一個受尊重的軟件工程師同一個卑微的碼農(nóng)之間的區(qū)別?! ▲Q謝  許多人都慷慨貢獻了他們的建議、評注及時間來助我完成本書的寫作。首先,我要感謝本系列的編輯Scott Myers,他擔起了類似于讀者的角色,巧妙地為本書指引了方向,系統(tǒng)地闡明了本書可在哪些地方變得更加易讀和精悍。Hal Fulton、Hang Lau與Gabor Liptak閱讀了本書的樣章并提出了許多有用的評注和意見。Chris Carpenter與Robert L. Glass也審閱了本書的樣章及之后的整個草稿,他們的智慧和經(jīng)驗讓我受益匪淺。十分感謝Konstantinos Aboudolas、Damianos Chatziantoniou、Giorgos Gousios、Vassilios Karakoidas、Paul King、Spyros Oikonomopoulos、Colin Percival、Vassilis Prevelakis、Vassilis Vlachos、Giorgos Zervas,特別是Panagiotis Louridas,他們非正式地審閱了本書早期草稿的部分章節(jié),并提供了用以改進的具體評注和建議。此外,Stephanos Androutsellis-Theotokis、Lefteris Angelis、Davide P. Cervone、Giorgos Giaglis、Stavros Grigorakakis、Fred Grott、Chris F. Kemerer、Spyros Kokolakis、Alexandros Kouloumbis、Isidor Kouvelas、Tim Littlefair、Apostolis Malatras、Nancy Pouloudi、Angeliki Poulymenakou、Yiannis Samoladas、Giorgos Sarkos、Dag-Erling Sm·rgrav、Ioannis Stamelos、Dave Thomas、Yar Tikhiy、Greg Wilson、Takuya Yamashita、Alexios Zavras、Giorgos Zouganelis也提供了有價值的建議,我時常突然跑到他們那里請教一些專業(yè)領域中艱澀的問題。我還想感謝雅典經(jīng)濟與貿(mào)易大學管理科學與技術系的同事們對于我工作的支持。我也感謝下面這三人在本書寫作過程中一些必不可少的方面給予我的指導:Mireille Ducassé(技術寫作--1990)、John Ioannidis(代碼風格--1983)和Jan-Simon Pendry(時間與空間性能--1988)?! ddison-Wesley出版社的編輯Peter Gordon熟練地指導了本書的創(chuàng)作,處理了很多棘手的問題。Kim Boedigheimer以出眾的效率應對了日常事務。7小時的時差常常允許我們在一天內(nèi)以20個小時一輪換的方式來開展本書的工作?! ≡诒緯膭?chuàng)作過程中,Elizabeth Ryan如同一個專業(yè)指揮家一般,高效地協(xié)調(diào)和團結著我們這個全球化多學科的寫作團隊?! ∑渌髡邔⒈緯奈淖志庉婨velyn Pyle描述為如同鷹一般目光犀利。我同意該說法并且還要說一句:她的工作真是十分出色,她找出了很多我永遠也想象不出的手稿錯誤,同時她也比較注意細節(jié)和一致性,并據(jù)此對相關文字做了修改,僅有少數(shù)頂尖程序員才能與之相比。另外兩位具有類似編程技藝的人員也為本書的完成做出了自己的貢獻:Clovis L. Tondo依靠對書中工具的深入理解和書中代碼的驚人尊重完成了本書的排版工作,Sean Davey則依靠自身卓越的能力確保本書風格的一致?! ”緯^大多數(shù)所引實例來自于已有的開源項目。使用源自真實世界的代碼允許我能展示人們在實踐中可能遇到的代碼類型,而非被簡化過的“玩具”程序。所以我想感謝所有對本書中所引開源程序有貢獻的開發(fā)者,感謝他們向編程社區(qū)貢獻其工作成果。若書中代碼的作者姓名被列于相應的源代碼文件中,則其也會出現(xiàn)于本書的附錄中。

內(nèi)容概要

  Jolt大獎素有“軟件業(yè)之奧斯卡”的美稱,本叢書精選自Jolt歷屆獲獎圖書,以植根于開發(fā)實踐中的獨到工程思想與杰出方法論為主要甄選方向。Diomidis
Spinellis首部著作《代碼閱讀》(Code
Reading)旨在闡明程序員應如何理解與修改代碼,與此不同的是,本書重點討論代碼的非功能特性,深入講述代碼如何滿足重要的非功能性需求,如可靠性、安全性、可移植性和可維護性,以及時間效率和空間效率。本書從Apache
Web應用服務器、BSD UNIX操作系統(tǒng)和HSQLDB
Java數(shù)據(jù)庫等開源項目中攫取數(shù)百個小例子,并以實例為基準點,輔以理論分析,從實用的角度講述每個專業(yè)軟件開發(fā)人員能立即運用的概念和技術。
  本書榮獲2007年Jolt大獎,適用于不同知識層次的軟件工作、程序開發(fā)和研究人員。

作者簡介

自1985年開始,本書作者Diomidis
Spinellis在開發(fā)大量開創(chuàng)性的,并受到極高評價的商業(yè)和開源項目的過程中,一直在鉆研、發(fā)展本書中所提及的各項技術,期間他編寫和維護的代碼行數(shù)超過25萬行。他在英國倫敦帝國理工學院獲得了軟件工程方向的碩士學位及計算機科學博士學位。目前,他是希臘雅典經(jīng)濟與商業(yè)大學管理科學與技術系的教授。他曾撰寫過多部暢銷世界的計算機技術圖書,包括《架構之美》、《代碼質(zhì)量》和《代碼閱讀》等。

書籍目錄

表目錄
圖目錄
原書序言
前言
第1章 導論
 1.1 軟件質(zhì)量
  1.1.1 用戶、制造者和管理者眼中的質(zhì)量
  1.1.2 質(zhì)量屬性
  1.1.3 緊張的世界
 1.2 如何閱讀本書
  1.2.1 排版約定
  1.2.2 圖示
  1.2.3 圖表
  1.2.4 匯編代碼
  1.2.5 練習
  1.2.6 補充材料
  1.2.7 工具
第2章 可靠性
 2.1 輸入問題
 2.2 輸出問題
  2.2.1 不完整輸出或輸出缺失
  2.2.2 錯誤時刻的正確結果
  2.2.3 錯誤的格式
 2.3 邏輯問題
  2.3.1 偏差為一的錯誤與循環(huán)迭代
  2.3.2 被忽視的極端情況
  2.3.3 被遺漏的情況、條件測試或步驟
  2.3.4 被遺漏的方法
  2.3.5 多余的功能
  2.3.6 誤解
 2.4 計算問題
  2.4.1 不正確的算法或計算
  2.4.2 表達式中錯誤的操作數(shù)
  2.4.3 表達式中不正確的運算符
  2.4.4 運算符優(yōu)先級問題
  2.4.5 溢出、下溢和符號轉換錯誤
 2.5 并行性與時序問題
 2.6 接口問題
  2.6.1 不正確的例程或參數(shù)
  2.6.2 沒有測試返回值
  2.6.3 未做錯誤探查或恢復
  2.6.4 資源泄漏
  2.6.5 面向?qū)ο蠊δ艿恼`用
 2.7 數(shù)據(jù)處理問題
  2.7.1 不正確的數(shù)據(jù)初始化
  2.7.2 引用錯誤的數(shù)據(jù)變量
  2.7.3 越界引用
  2.7.4 不正確的下標使用
  2.7.5 不正確的比例或數(shù)據(jù)單位
  2.7.6 錯誤的數(shù)據(jù)打包與解包
  2.7.7 不一致的數(shù)據(jù)
 2.8 容錯
  2.8.1 管理策略
  2.8.2 空間冗余
  2.8.3 時間冗余
  2.8.4 可復原性
第3章 安全性
 3.1 脆弱代碼
 3.2 緩沖區(qū)溢出
 3.3 競態(tài)條件
 3.4 問題API
  3.4.1 容易出現(xiàn)緩沖區(qū)溢出的函數(shù)
  3.4.2 格式字符串漏洞
  3.4.3 路徑和命令行解釋器元字符漏洞
  3.4.4 臨時文件
  3.4.5 不適合做加密用途的函數(shù)
  3.4.6 可篡改數(shù)據(jù)
 3.5 不可信輸入
 3.6 結果驗證
 3.7 數(shù)據(jù)與特權泄漏
  3.7.1 數(shù)據(jù)泄漏
  3.7.2 特權泄漏
  3.7.3 Java的方案
  3.7.4 分離特權代碼
 3.8 特洛伊木馬
 3.9 工具
第4章 時間性能
 4.1 測量技術
  4.1.1 負載描述
  4.1.2 受限于I/O的任務
  4.1.3 受限于內(nèi)核的任務
  4.1.4 受限于CPU的任務和剖析工具
 4.2 算法復雜性
 4.3 獨立的代碼
 4.4 與操作系統(tǒng)交互
 4.5 與外設交互
 4.6 非故意的交互
 4.7 緩存
  4.7.1 一個簡單的系統(tǒng)調(diào)用緩存
  4.7.2 替換策略
  4.7.3 預先計算結果
第5章 空間性能
 5.1 數(shù)據(jù)
  5.1.1 基本數(shù)據(jù)類型
  5.1.2 聚合數(shù)據(jù)類型
  5.1.3 對齊
  5.1.4 對象
 5.2 內(nèi)存組織
 5.3 內(nèi)存層級結構
  5.3.1 主存及其高速緩存
  5.3.2 磁盤緩存和后備存儲器
  5.3.3 交換區(qū)和基于文件的磁盤存儲
 5.4 進程/操作系統(tǒng)接口
  5.4.1 內(nèi)存分配
  5.4.2 內(nèi)存映射
  5.4.3 數(shù)據(jù)映射
  5.4.4 代碼映射
  5.4.5 訪問硬件資源
  5.4.6 進程間通信
 5.5 堆內(nèi)存管理
  5.5.1 堆碎片
  5.5.2 堆剖析
  5.5.3 內(nèi)存泄漏
  5.5.4 垃圾回收
 5.6 棧內(nèi)存管理
  5.6.1 棧幀
  5.6.2 棧空間
 5.7 代碼
  5.7.1 設計期
  5.7.2 編碼期
  5.7.3 構建期
第6章 可移植性
 6.1 操作系統(tǒng)
 6.2 硬件與處理器架構
  6.2.1 數(shù)據(jù)類型的屬性
  6.2.2 數(shù)據(jù)存儲
  6.2.3 特定于機器的代碼
 6.3 編譯器與語言擴展
  6.3.1 編譯器錯誤
 6.4 圖形用戶界面(GUI)
 6.5 國際化與本地化
  6.5.1 字符集
  6.5.2 區(qū)域
  6.5.3 消息
第7章 可維護性
 7.1 測量可維護性
  7.1.1 可維護性指數(shù)
  7.1.2 面向?qū)ο蟪绦虻亩攘?br />  7.1.3 包的相關性度量
 7.2 可分析性
  7.2.1 一致性
  7.2.2 表達式格式化
  7.2.3 語句格式化
  7.2.4 命名慣例
  7.2.5 語句級注釋
  7.2.6 版本注釋
  7.2.7 視覺結構:塊與縮進
  7.2.8 表達式、函數(shù)以及方法的長度
  7.2.9 控制結構
  7.2.10 布爾表達式
  7.2.11 可辨認性與內(nèi)聚性
  7.2.12 依賴和耦合
  7.2.13 代碼塊注釋
  7.2.14 數(shù)據(jù)聲明注釋
  7.2.15 恰當?shù)臉俗R符名字
  7.2.16 依賴的位置
  7.2.17 不確定性
  7.2.18 可復查性
 7.3 可變性
  7.3.1 識別
  7.3.2 分離
 7.4 穩(wěn)定性
  7.4.1 封裝與數(shù)據(jù)隱藏
  7.4.2 數(shù)據(jù)抽象
  7.4.3 類型檢查
  7.4.4 編譯時斷言
  7.4.5 運行時檢查和查看時斷言
 7.5 可測試性
  7.5.1 單元測試
  7.5.2 集成測試
  7.5.3 系統(tǒng)測試
  7.5.4 測試覆蓋度分析
  7.5.5 偶發(fā)性測試
 7.6 開發(fā)環(huán)境的影響
  7.6.1 增量構建
  7.6.2 調(diào)整構建性能
第8章 浮點運算
 8.1 浮點數(shù)表示
  8.1.1 量度誤差
  8.1.2 舍入
  8.1.3 內(nèi)存格式
  8.1.4 規(guī)格化和隱含的一位
  8.1.5 階碼偏移
  8.1.6 負數(shù)
  8.1.7 反向規(guī)格化數(shù)
  8.1.8 特殊值
 8.2 舍入
 8.3 溢出
 8.4 下溢
 8.5 消去
 8.6 合并
 8.7 無效運算
 附錄A 源代碼致謝人員名單
 參考文獻 

章節(jié)摘錄

版權頁:   插圖:   上述與日志記錄器進程之間的通信僅僅是高開銷的本地IPC操作的一個例子。其他IPC開銷的例子包括管道線中的過濾器進程之間的通信、與本地運行的RDBMS的交互及通過一個本地X Window系統(tǒng)服務進行的I/O操作。(最后一個例子適用于所有的X客戶端GUI程序。)值得注意的是,在某些情況下,所舉的例子中某些數(shù)據(jù)的復制是可以消除的。例如,在FreeBSD系統(tǒng)里,當一個發(fā)送進程通過一個足夠大的緩沖區(qū)(PIPE MINDIRECT——8192字節(jié)長)把數(shù)據(jù)寫入到管道里時,寫入緩沖區(qū)會完全映射到內(nèi)核的內(nèi)存空間中,而接收進程能夠從發(fā)送進程內(nèi)存空間中直接復制這些數(shù)據(jù)。在5.4.2節(jié)中討論文件映射操作時將會分析更多的例子。消除網(wǎng)絡棧中不同層之間的數(shù)據(jù)副本也是網(wǎng)絡技術研究人員最喜歡的一種消遣。 最后,看一個遠程的進程間通信的例子,例如聯(lián)系一個遠程的DNS服務器來獲得一個主機的地址。每次當工作站的一個用戶在不同的主機上訪問一個web頁面時,類似的交互都會發(fā)生。表4—2中列出的最后一組數(shù)字就對應這樣的操作。注意,遠程IPC的時間開銷要比本地IPC的時間開銷(已經(jīng)很大了)大三個數(shù)量級。通過研究圖4—8中描述的相應的交互有助于我們理解這個開銷。這幅圖描述的是當使用ping命令向一個遠程DNS服務器查詢一個主機的地址時發(fā)生的系統(tǒng)調(diào)用。系統(tǒng)調(diào)用的初始序列——socket、connect及sendto——與我們之前討論的本地IPC中的初始序列相同。

名人推薦

如果《代碼質(zhì)量》和《代碼閱讀》得到了應有的關注,我認為,在提高代碼專業(yè)化水平方面,它們將會給業(yè)界帶來諸多更加顯著的改變,與過往20年以來任何滾滾襲來的浪潮相比,這種改變都會更加迅猛。 ——Dr.Dobb's Journal雜志社 Gregory V.Wilson

圖書封面

圖書標簽Tags

評論、評分、閱讀與下載


    代碼質(zhì)量 PDF格式下載


用戶評論 (總計22條)

 
 

  •   寫了這么年代碼系統(tǒng)這本書能讓我在質(zhì)量上有所進步
  •   很詳細的針對編程中需要考慮的方方面面做了介紹,例子主要是C語言,所以對C語言有一點要求哦
  •   這個系列的書,在一定成都上減輕了程序員的痛苦
  •   國外的學者就是不一樣,著書對他們來說是一種享受,是一種與讀者共同分享科研成果的喜悅。很好的寫程序參考書籍!
  •   一直想找本類似的書,感覺獲益匪淺
  •   經(jīng)典書,值得一看
  •   看了一次又一次,結合工作心得。感覺寫的很好,希望后面有改版增加一些新內(nèi)容,畢競過去很多年了。
  •   能學到很多東西,建議購買
  •   看目錄,內(nèi)如應該不錯,慢慢研讀研讀
  •   提高編程修養(yǎng)必備
  •   還沒開始看的,沖著名氣,希望有用
  •   本書的印刷質(zhì)量很差,有些內(nèi)容印得很模糊。
  •   書是不錯,就是剛收到就開膠了,不太好
  •   感覺很一般。。。
  •   坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你坑死你
  •   所有編程的人都應當學習,不僅僅是專業(yè)程序員,還有許許多多的需要編程的科研工作者。好習慣能夠減少大麻煩
  •   書的質(zhì)量和內(nèi)容都很不錯,主要是講以C/C++內(nèi)容,若是以Java為主就完美了,現(xiàn)在正在學習Java.
  •   和代碼閱讀一起買了。兩本書都不錯,從另一個角度增強能力。
  •   好書值得收藏了慢慢看
  •   看上去很厲害的樣子
  •   買錯了,講的是C#的
  •   心里引導
 

250萬本中文圖書簡介、評論、評分,PDF格式免費下載。 第一圖書網(wǎng) 手機版

京ICP備13047387號-7