當前位置: 華文問答 > 數碼

如何閱讀【深入理解電腦系統】這本書?

2013-05-27數碼

先占個坑 !2020年一月九號,今天開始擼這本書從頭開始,擼完過來回答。

2020.1.10

花了一天時間看完了這本書的第一章和第二章,做完了除了一道之外的所有練習題,家庭作業和編程大作業還沒做。第一章主要講此書的整體框架,如果已經學過一些電腦系統各個部份內容的話,可以快速過一下。如果一點電腦基礎沒有,可以看一下,能看懂多少算多少,然後往後推,看完後面的內容再回來看一下原來不懂的部份。第二章核心就是二進制,所有的知識點都可以透過畫二進制表來解決。裏面講了一些類別轉換帶來的程式不安全漏洞的問題,包括浮點數精度處理不足帶來的導彈攔截系統錯誤以及火箭墜毀。原來學過一段時間火箭設計,原來還對為啥一直用很老的程式語言版本有疑惑,不過看了這部份有點理解了,對於高可靠性系統,別整太復雜的軟件,否則bug太多不可控容易崩 。作為大多數程式設計師可以不太考慮這種問題,但是越是底層越是使用範圍大的軟件專案越要重視程式碼安全,寫高可靠性程式碼是一門藝術呀。歡迎大佬推薦這方面書籍哈哈哈

明天繼續開始看組譯做家庭作業

----------------------2020-1-12----------------------

目前在做第三章題,發現了一些錯誤:

1 中文版練習題3.1的習題答案應該是%rcx而不是$rcx,使用寄存器應該使用%符號

2 中文版練習題3.18題目跟英文版完全不同,習題答案印沒了哈哈

此題目的中文版

英文版

所以英文版的答案也不能直接用,下面是我做的答案,在x86-64 linux反編譯出來的組譯程式碼和中文版題目是吻合的。

C程式碼如下

long test11(long x, long y, long z)
{
long val = x + y + z;
if (x < -3)
{
if (z > y)
val = x * y;
else
val = y*z;
}
else if (x>2)
val = x * z;
return val;
}

組譯程式碼如下圖所示:

繼續擼書去了,非常建議立誌未來搞電腦的小朋友們,初中二年級就可以來刷這本書了,前提稍微學習一下C語言基礎就行,爭取初三之前刷完,別想我都27了才看到這麽好的教材,老大徒傷悲呀,組譯真的很麻煩,很多邏輯跟會高級程式語言是反的,好麻煩,我好難,我好菜

----------------

1月13號,又發現第三章中文版的錯誤,如下圖,英文版是正確的,中文版把前三條指令的地址寫錯了

下圖位英文版:

M1沒有問題,第二條和第三條指令地址錯誤

中文版如下

2020-1-15終於刷完了這本書的第三章內容,組合語言很蛋疼,一個簡單的演算法整成組譯實作就是一大坨,還容易錯!

繼續刷第四章,硬件部份,加油!

__------------------------------

2020-1-16

第四章刷了一半,刷到時序硬件設計,看不下去了,流水線也沒看,這章後一半內容直接略過去了,我目前暫時不會接觸到硬件部份,最多做到組譯級別最佳化,我原來學過eda,現代處理器設計起來太復雜了,還要做各種時序仿真,跟我目前的需求不是很吻合,就不看了,直接跳到下一章最佳化程式效能了!

2020-1-18號淩晨

刷完第五章最佳化程式效能,感覺要比前硬件部份容易很多,實在是不想搞處理器的時序分析。

這一章主要講如何最佳化自己的c程式碼,讓程式碼執行更快。核心是抽象數據流圖,simd只是提了一嘴沒細講差評。事實上完全可以略過上一章來看這章,作者在這一章預設認為讀者沒看處理器,有重新講了一下處理器的基本處理過程。幸運的是這本書作者常用的組譯指令不是太多,不會像最開始對組譯的不適應了哈哈哈

開張圖,練習題目不錯,跟內容聯系緊密,本章最後給了一本參考書,Software Optimization for High Performance Computing: Creating Faster Applications,這本書提供了更多最佳化程式的例子和方法,包括在並列機器上的處理,不過有點老,白天有空去看一下啥玩意哈哈,去做家庭作業去嘍

1月19號

刷完了記憶體階層。第六章書中的內容非常簡單,我不知道是因為看了前面內容積累的知識,讓我提升了,還是這章本來寫的就簡單

言歸正傳,這章內容對於最佳化程式效能還是很重要的。幾乎所有的電腦系統都是層次儲存結構,這一章內容雖然簡單,但是可以進一步延伸。比如說高效能計算領域,並列結構基本每個核內部都有快取,分布式系統也是這樣。在嵌入式端,尤其有圖形或者電腦視覺ai各個方面做終端推理,計算的,對極為有限的計算資源更是需求滿滿,都要用到這裏的基本概念。

我在參考文獻中看到提了一嘴快取不知曉的演算法,不知道啥東西,去看一下

中文轉譯也是醉了

友情提示一下,我在讀到第四節,快取記憶體,通用的快取記憶體組織結構的時候,我就很好奇它那麽算怎麽能跟記憶體地址完全對應上,後面的內容的確會講,但是先別往下看。停在這裏問自己問題,如果是你,如何設計出尋找,確定命中沒命中,數據傳輸的整個過程。先別看直接對映快取和後面內容,看自己能不能想出來。反正我想了一個小時沒想出來,再去看後面的內容豁然開朗。我還在好奇,怎麽就能保證和記憶體地址一一對應的關系呢,可惜沒證明出來。看了後面內容,我才發現我把證明過程想復雜了,哎!

擼論文和第七章連結了

ps我在別的評論看到有的答主,在cmu求學,他們實際的課程要比書裏面的難很多,好羨慕呀,真想去cmu讀博士,算了我也要給每章的實驗加難度,好羨慕人家能做高難度的事情 ,我還得一邊學一邊自己設計,查論文找需求,偶爾還得校審中文轉譯的錯誤。

2020-1-24

連結這一章刷了好幾天,但是感覺有的地方理解的還是不好。首先我覺得這本書這一章寫的不是特別好,靜態連結那個地方講的有點不清楚。我看了兩天,還是有點迷糊,後來報考了一下程式設計師的自我修養-庫,連結與裝載。

這本書的好處在於,連結這塊講的比較清晰,比csapp容易理解。而且csapp一些地方寫的非常不好。比如說

這個結構,我一上來很詫異直接用的類別原名。實際上linux的elf.h表頭檔中用的是typedef之後的名字,這樣更容易理解

這是源碼,更容易理解一些。

所以我非常推薦看這一章之前先看一下程式設計師的自我修養這本書,當然自我修養也存在一些問題,比如說年代有點久遠,使用的是32位元的體系,不過整體上原理相近,差別不是特別大。

還有讀者一章的內容,一定要使用好各種工具,來檢視目標文件的結構,否則不太容易理解連結的原理

學好這一章挺重要的,記得一年前,就整一個opencv/pcl庫都把我惡心的夠嗆,經常碰見LINK2019錯誤,都是看了這一章之後才明白更本質的原因,還是很有收獲的,等我把這本書刷完,我再回來刷一遍這章,看能不能有新的體會!!!

本來不到三十頁的內容我以為半天就能搞定,結果慘遭社會毒打,接著刷下一章去了

2020-1-27

剛刷完第八章,內容不是很多,主要將一些行程相關的內容,更系統的需要看一下面這本書

1500多頁又是一本大厚書呀,哈哈哈

我用vs2019遠端linux寫程式碼,這兩天踩了一堆坑,都是我環境沒配好,蛋疼。。。

2020-1-30

2020年的第一個月馬上就要過去了,這本書已經刷了三個星期,本打算三天刷完,無奈的推成了一個星期,又推成兩個星期,馬上就到第三個星期了,還剩三章,哎

第九章虛擬記憶體,在作業系統的書中都會講,本身這塊需要作業系統和硬件共同配合實作。我對書裏面為啥這麽熱衷用宏函數很費解,稍微會快一點還有其他原因嗎?

作業系統可以參考這三本

這三本中,我只看完了現代作業系統的半本書,還剩一半沒看,內核程式碼也沒看呢,os就是個深坑呢,不過我挺喜歡os的 。

有一個開源的動態記憶體分配dlmalloc,c和cpp實作都有,有空再去擼一下吧

後三章內容不多,抓緊刷吧

2020-1-31

第十章i/o講的挺好,就是內容太少了,講的比apue清晰,就是沒人家的全,下一章下一章

2020-2-1

第十一章並不能算擼完了,最後web一點東西沒看,略過去了。主要是覺得這塊講的不細致,第二是對web沒啥需求,以後用到再找細致的書籍看吧

2020-2-3

最後一次更新了。

第十一章將的並行編程,多行程在超算或者分布式用的多一些,多路復用用的不多,更多是融合進入到多執行緒中,多執行緒非常重要,這部份也是編程課程不會講的,反正我原來在大學裏的c語言課程沒提過,都是工作後我才接觸到,被社會毒打!這一章的內容是非常重要的。

最後面要做一個多執行緒的伺服器,把大量前面學的知識結合在一起,還是挺好的訓練,有空應該做一下。並行,多核編程這塊還有基本參考書

第一本

將posix多執行緒庫並行編程的,不過有點老了,C++標準庫都支持多執行緒了哈哈

第二本

也是多執行緒編程的

第三本

講並列編程的

全書都讀完了,做一個總結吧!這本書很基礎,如果一個程式設計師把這本書拿過來翻一番,發現大量不理解的地方,實際上都應該讀一下這本書,實際上這本書是大學裏裏面給大一學生看的,所以不用擔心難度問題,不會大,尤其對於轉行過來的,既然是轉行就要做的比科班更好,學的更多,技術更強,否則轉過來受虐幹啥。而且對於轉行過來工作的人群,看這本書如果都費勁,意味著不會在社會上coding方面獲得高級職位。

對於我自己,只是感嘆自己的水平太差勁,基礎不好,都看了恩多後續課程,依然花了三個多星期才啃完,家庭作業也沒全部做完,大部份家庭作業也不難,編程實驗程式碼量還是有了,完整擼下來上萬行程式碼量是沒得跑的。都是基礎訓練,也感嘆自己不能拿出好的學習狀態,遇到自己不熟悉的領域,激情和效率下降明顯,還有就是很多參考文獻沒在讀這本過程中讀完,如果能把重要的參考文獻在這過程中也能過一遍,一定收獲更多,不過目前我的收獲也是很大的,只不過沒達到期望的收益率,投入時間太多了。

總結完自己,也對讀者給一些過來人的建議吧,我分為幾類討論:

科班在學的大學生

這部份人,跟著老師學習就好,國內好一點的電腦學校哈工大,北郵等及以上,這些學校的青年教師的水平都是有保證的,有一些年輕有為的老師在講授這門課的過程中,可能還會做課程創新,加入更多新的知識進來,所以跟緊這樣的老師就好,如果是大佬,肯定會做的比老師講的快。這部份同學在學習中遇到一些難以理解的問題都很正常,因為之前沒接觸過嘛,踏踏實實的研究學習就是,沒啥好著急的。

轉行的工作人員

如果自己基礎比較好,後續課程都學了,而且在工作中套用起來了,其實這本書可以看看,查缺補漏,形成完整的知識體系,快速掃過,只在自己新的知識上花點時間,一兩個星期妥妥的,別像我這麽菜雞

如果轉行過來工作,看這本大部份內容還費勁,抓緊補,要比上一類人投入多倍的精力,集中刷,別拖個七八個月,學生無所謂,但是工作的人,時間非常緊張,更要更有效率。而且刷完會讓你的工作技能更專業,用業余時間刷不要超過兩個月,戰線拖的太長,就看不下去了,但是也要保證好質素,這本書比較人性化的地方就是習題安排和知識點契合比較好,做題卡殼,基本就是知識點沒有掌握,抓緊回去溫習鞏固,也不要把這本是想的過於神化,把它踩在腳底下才能讓你站得更高

小學生,初中生,高中生

我估計會有一部份這個年齡段的小朋友會看到我的回答。我認為這些孩子是希望,如果是由於對電腦感興趣,想去更好理解電腦,可以來看這本書的,在你們這個年齡階段,如果做好引導,加上興趣的精神加成,是可以讀懂這本書的核心知識點的,除非極為天賦異稟,否則需要旁邊有人帶一帶。時間下半年到一年,因人而異。如果有成人輔導這些孩子,尤其對於小學生和初中生,因為整體的知識體系孩子還沒有建立起來,要有耐心,量不要太大,根據孩子接受程度調整好速度,別為了灌輸,把孩子的興趣澆滅了。對於高中生,我覺得沒啥問題,我上高一就在自學大學課程了,大量的清華報送生也是這麽幹的,不過我是菜雞,沒法跟大神比,要是學起來有困難,可以找老師問一問,或者上網自己解決。國內每個省前幾的好中學,都配有相應方面的教師,輔導起來沒太大問題,現在的中學老師都是研究生起步,沒有壓力的。如果學校沒那麽好,教育不公平,我也沒辦法,自己上網,自己能打到哪裏算哪裏吧,就像我,只能感嘆自己的無能。

這個問題的回到就不在更新了,歡迎大佬批評指正