●第0周做業:虛擬機安裝、學習導引html
●第1周做業:Linux桌面環境、命令行快捷鍵、git連接配置、Linux的重要命令node
●第2周做業:VIM的學習、gcc編譯器及gdb調試技術linux
●第3周做業:計算機中各類數的表示和運算git
●第5周做業:程序的機器級表示、彙編語言逆向思惟的學習程序員
●第6周做業:Y86指令集體系結構(及安裝)、瞭解ISA抽象編程
●第7周做業:存儲器系統的瞭解、局部性原理和緩存思想的應用vim
●期中總結:總結前七週知識點、查漏補缺數組
●第9周做業:瞭解Unix I/O緩存
●第10周做業:實踐經常使用指令的代碼,加深對指令的理解安全
●第11周做業:控制流、異常、進程控制的學習
●第12周做業:第9-11周學習彙總、實驗彙總、第11周學習的補充
●第13周做業:網絡編程
●第14周做業:虛擬存儲器的概念及其做用
●託管連接
●本學期對於代碼的要求更多的是運行和理解,在理解代碼的過程當中可以更加深刻的掌握每一章的重點內容,對於知識點的認識更加透徹,而不只僅是停留在書本表面,實踐出真知,這是我在期中前就造成的深入認識,經過《代碼驅動的程序設計》這篇博客的學習更是get到了本身學習代碼的方法,能夠經過幫助文檔來深刻分析和理解某個函數或是學習一個新的指令,層層分析,把每一步不懂的函數理解清楚,最後串到一塊兒,就得到對代碼的總體印象,好比:who命令到底是怎麼實現的,實現了哪些功能等。
●可是對於後面兩週的代碼實踐的不夠,學習的還比較淺,光是書本上的內容理解起來就比較費力,尤爲是線程部分的代碼比較抽象難懂。總之代碼實踐這個環節真的須要付出時間並認真思考,你必定會有所收穫。
●其實最大的教訓仍是開始學習《信息安全系統設計基礎》這門課的前幾周吧,當時對它不夠重視,並且沒有摸索出合適的學習方法,倒不是說沒有實踐,當時虛擬機安裝出了問題,由於自身電腦的問題,安裝虛擬機時老是卡,因此一直用的實驗樓學習,跟着步驟一步步作完以後卻很難在腦海中留下印象,包括前幾週考試成績也不理想,本身很快被落下了,就開始反思本身學習的過程,學習中必定要有本身的思考和理解,而不是盲目的敲代碼、敲指令,不然不只一無所得更是浪費時間和生命;以及,必定要看書,完成書上習題:這在後面知識的學習中顯得尤其重要,不看書再去實踐太過盲目,缺少理論指導,不知道代碼之間的關係、不清楚相關的知識。因此在初學階段,實踐必不可少,可是理論重於實踐,我的見解。還有,不要欠債!該作的必定要作!前幾周落下以後我就下定決心必定要裝好虛擬機弄好git託管,無論花多久。好在,在補了本身欠下的環節後,學習終於步入正軌,比較順利。
1. 第一章 編譯系統是如何工做的?
●從源文件到目標文件的轉化是由編譯器驅動程序完成gcc -o hello hello.c
編譯系統:預處理器、編譯器、彙編器和連接器
預處理階段:.c->.i
,根據以字符#開頭的命令,修改原始的C程序
編譯階段:.i->.s
,彙編語言程序
彙編階段:.s->
機器語言指令,打包成可重定位目標程序
連接階段:可重定位目標程序->可執行目標程序
2. 第二章 浮點數的表示在計算機當中是如何實現的?
●在計算機中,表示浮點數由兩種經常使用的格式:單精度浮點數和雙精度浮點數,IEEE 754 用科學記數法以底數爲 2 的小數來表示浮點數。
3. 第三章 全部程序的機器級表示都是經過彙編指令實現的嗎?
●程序的機器級表示指的就是彙編代碼。相比二進制格式的機器級代碼,彙編代碼可讀性更好,它是機器代碼的文本表示,給出了程序中的每條指令。理解彙編代碼和原始C代碼的聯繫,是理解計算機如何執行程序的關鍵一步。
4. 第四章 如何解決Y86異常?
●Y86是一個指令體系結構(ISA),它是計算機系統這本書的做者簡化出的指令集。目的是爲了讓咱們更加清晰的瞭解ISA,就像你讀編譯原理,做者會教你作個編譯器,是同樣的道理。對於Y86來講,程序員可見的狀態中就有stat狀態碼,它標識了程序執行的狀態。Y86須要有能力根據stat去作一些處理。不過爲了簡單起見,這裏除了正常執行以外,都將中止指令的執行。真實當中,會有專門的異常處理程序。 Y86有四種不一樣的狀態碼,AOK(正常)、HLT(執行halt指令)、ADR(非法地址)和INS(非法指令)。
5. 第五章 如何消除循環程序的低效率?
●充分利用空間局部性和時間局部性原理。
6. 第六章 存儲器層次結構是怎樣的?
7. 第七章 怎樣從應用程序中加載和連接共享庫?
●加載時連接的基本思路是在建立可執行文件時,即傳統的連接階段,靜態執行一些連接,獲得一個部分連接的可執行文件,而後在程序加載時動態完成連接過程。實際上連接時並未拷貝共享庫的任何代碼和數據節,而是拷貝了一些重定位和符號表信息,它們使得在運行時能夠解析對共享庫中的代碼和數據的引用。
●而在程序加載時,加載器拷貝可執行文件以後,再也不像一般那樣將控制傳遞給應用,而是加載和運行動態連接器。動態連接器先重定位共享庫的代碼和數據到某個存儲器段,而後重定位程序中全部對共享庫的符號的引用,最後動態連接器將控制傳遞給應用程序。
8. 第八章 用戶模式和內核模式有什麼區別?
●在內核模式下用戶能夠訪問全部的內存和硬件資源。
●在用戶模式下訪問受到限制,例如用戶訪問了禁區,則用戶進程將被殺死。用戶模式必須經過系統調用或庫函數切換至內核模式後,才容許訪問硬件資源。
9. 第九章 虛擬存儲器如何提供一種機制?
●虛擬存儲技術的實現思想:根據程序執行的局部性原理,在做業信息不所有裝入內存的狀況下,做業是能夠運行的。例如對於一個4頁大小的做業,當前只有3個空閒內存塊,運行改做業的可行的辦法就是將做業的3頁裝入內存的3個空閒塊,先運行這3頁,而將剩餘的頁暫時存放在外存上,待須要使用在第4頁上的信息時,再選中在內存中的一頁交換出內存,從而讓出一個內存塊以便裝入第4頁。做業的頁面在內存與外存上的交換這一過程對用戶是透明的,它是由操做系統自動完成的,這也至關於利用外存的空間擴充了內存空間。這就是虛擬存儲技術的實現思想。
10. 第十章 文件元數據有哪些,表示什麼含義?
●數據(Metadata),又稱中介數據、中繼數據,爲描述數據的數據(data about data),主要是描述數據屬性(property)的信息,用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等功能。元數據算是一種電子式目錄,爲了達到編制目錄的目的,必須在描述並收藏數據的內容或特點,進而達成協助數據檢索的目的 元數據就是數據的數據。
●任何文件系統中的數據分爲數據和元數據。數據是指普通文件中的實際數據,而元數據指用來描述一個文件的特徵的系統數據,諸如訪問權限、文件擁有者以及文件數據塊的分佈信息(inode...)等等。在集羣文件系統中,分佈信息包括文件在磁盤上的位置以及磁盤在集羣中的位置。用戶須要操做一個文件必須首先獲得它的元數據,才能定位到文件的位置而且獲得文件的內容或相關屬性。
●文件系統元數據(metadata)的更改都被保存在一份單獨的日誌裏,當發生系統崩潰時能夠根據日誌正確地恢復數據。除此以外,日誌使系統從新啓動時沒必要進行文件系統的檢查,從而縮短了恢復時間。
11. 第十一章 如何可以讓某臺源主機跨過全部不兼容網絡發送數據到另外一臺目的主機?
●解決方法是一層運行在每臺主機和路由器上的協議軟件,它提供兩種基本能力:(1)命名機制(2)傳送機制
●下圖展現了一個主機和路由器如何使用互聯網絡協議在不兼容的局域網間傳送數據的事例:
12. 第十二章 基於I/O多路複用的併發程序和基於線程的併發程序有何異同?
●I/O多路複用的基本思想
好比個人程序須要從多個I/O上等待數據到來並讀取
pipe fd1
tcp socket1 fd2
tcp socket2 fd3
udp socket fd4
那麼定義一個數組{fd1,fd2,fd3,fd4}存儲好,並通知內核,我對這幾個fd的輸入事件感興趣,此時內核會說你等着吧,等他們誰有數據了我會通知你,而後你就睡眠了。 當某個fd有數據到達可讀時,內核會當即通知你,嘿,有數據來了,快醒了。因而你趕快醒來,找到哪一個fd有數據,而後接收處理,處理完了,一輪結束繼續告知內核感興趣的事件,而後睡眠。
linux支持I/O多路複用的系統調用有select、poll、epoll。
●基本多線程模型
整個模型相似與基於多進程的設計,主線程不斷的等待鏈接請求,而後建立一個線程處理該請求。 這個模型中有個微妙的問題,主線程創建某一新鏈接的fd,若是直接傳遞給子線程,那麼頗有可能在子線程處理前,主線程創建了另外一個鏈接,並更新了fd,那麼不幸的結果就是,如今兩個線程在同一個描述符上執行輸入輸出。如下是示例代碼:
1 connfd = accept(listenfd, &clientaddr, &clientlen); 2 pthread_create(&tid, NULL, thread, &connfd);
另外一個問題是在線程例程中避免存儲器泄露,要麼顯示回收內存,要麼必須分離線程。
——我是經過優秀做業、以及加分項目來實現的。
●優秀做業
●加分項目
●本身的收穫
▶收穫了知識與技能:首先是掌握了虛擬機的基本使用和一些Linux的重要命令,其次學會了使用git託管代碼,對文檔、代碼進行分類管理,學會了vim的基本使用(經過作vim深刻研究這個項目我深知要想真正掌握vim還須要花大量的時間精力去學習)、瞭解了計算機系統的基本知識:計算機中的信息表示、程序的機器級表示及運行(對彙編語言的理解更加深刻)、處理器如何運行(程序和硬件兩方面)、存儲器如何工做、虛擬存儲器如何工做、進程線程異常的概念等等。
▶收穫了自我學習的方法:知道了怎樣的學習方法適合本身,初步總結爲:閱讀課本(瞭解新知識)、習題訓練(加深對知識的理解,走出思惟的誤區)、(代碼)實踐(加深認知,運用知識)、總結反思(自我提高)。
▶增強了對於不少事物的認知,刷新了見解:多實踐、多動手、不能拖延。積極主動的學習比被動學習要高效且容易。
●本身須要改進的地方
▶git commit次數不夠,確實,基本上每次的註釋都不會給的太多,這樣形成的後果就是再回過頭看這些代碼的時候只知道是第幾章的、大概是幹什麼的,可是具體的功能就不得而知,對於之後的學習或者使用形成了不便,這個問題我之後會注意。
▶代碼實踐的不夠深刻,對於其功能及實現理解的不夠透徹。
▶有畏難心理,閱讀課本時,看到大段的概念就會看不下去,以爲本身沒法理解,但有時靜下心來閱讀實際上是能夠理解的,要注意克服這種情緒。
●給學弟學妹們的建議
▶按照老師的要求作,每週的任務當週完成,不要拖延;
▶多多實踐,只有動手你才能真正掌握知識而且體會到學習的樂趣:「紙上得來終覺淺,絕知此事要躬行」;
▶堅持,遇到困難不要輕易放棄,積極請教老師、同窗,到最後你必定會有所收穫。
●問卷調查
●你平均每週投入到本課程多長時間?
▶10~18小時。
●每週的學習效率有提升嗎?
▶不必定,這要看當週的狀態。
●學習效果本身滿意嗎?
▶還行,但還能夠作得更好。
●課程結束後會繼續一週至少一篇博客嗎?(若是能作到,畢業時我把你的博客給你集結成一本書)
▶會啊,由於還有一門課叫作《網絡攻防》。或者用博客記錄生活、記錄時光、記錄學習收穫與能夠。
●你以爲這門課老師應該繼續作哪一件事情?
▶每週一次課堂測驗、加分項目。這都是鼓勵同窗們學習的好方法。且比期末只考一次更能讓你們學到知識,提升學習效率,不荒廢一學期的時光。
●你以爲這門課老師應該中止作哪一件事情?
▶中止扇貝打卡加分。提高英語水平是本身的事情,考四六級也是本身的事情,只要想過,天然會努力。用加分的方式的確能起到鼓勵背單詞的效果,但更多的是爲了加分而打卡,只打卡並無真正記憶單詞,這樣不只違背了老師的初衷,對於其餘同窗也不公平。
●你以爲這門課老師應該開始作什麼新的事情?
▶但願老師在之後給出的代碼中增長一些比較關鍵的註釋,這樣能夠便於你們理解,學得更好。
●本文連接
▶感謝婁老師一年以來的指導與付出,您辛苦了。願您的付出獲得回報,你們一塊兒繼續努力,繼續進步。