第一週做業:使用gcc編譯器的經常使用選項、使用gdb調試技術、makefile基本原理及語法規範html
第二週做業:vi測試、gcc測試git
第三週做業:信息的表示和處理算法
第四周做業:實現myod、head,tail的使用數據庫
第五週做業:彙編語言、指令編程
第六週做業:使用gdb跟蹤彙編代碼、異常控制流、系統級I/Owindows
第七週做業:Y86-64處理器數組
第八週做業:網絡編程安全
第九周做業:存儲器層次結構服務器
第十週做業:實現state命令、研究Linux下IPC機制網絡
第十一週做業:虛擬內存
第十二週做業:無
第十三週做業:總結學的最好的一章
第十四周做業:重學學的最差的一章
實驗一 開發環境的熟悉:交叉編譯
實驗二 固件程序設計:MDK、LED、URAT、國密算法
實驗三 實時系統:客戶端-服務器通訊
實驗四 外設驅動程序設計:在虛擬設備驅動源碼目錄下編譯並加載驅動模塊
實驗五 通訊協議設計:OpenSSL、混合密碼系統進行防禦
截圖 git log --pretty=format:"%h - %an, %ar : %s" 的結果
代碼驅動的學習作到沒有?
不算徹底作到吧,主要仍是參考別的代碼再進行編寫。
加點代碼,改點代碼是理解的最好方式,參考編程的智慧,談談你的心得
代碼學習主要仍是在已有代碼的基礎上,加上本身的理解對代碼進行改編,這學期的實踐項目比較多,在必定程度上也提升了本身編寫代碼的能力。實踐上有什麼經驗教訓
課堂實踐仍是須要提早的預習,在充分理解題意的狀況下才能完成,臨時抱佛腳是一種不可取的行爲。
第1周做業中的問題主要針對每章主題裏的部份內容進行了提問,好像沒有特別抓住其中的重點,主要仍是對未學習內容提出了問題。
第一章:虛擬內存與物理內存的區別?
物理內存是安裝在主機板上的內存。
虛擬內存是做業系統在硬盤上創建一個檔案,把物理內存中不經常使用的部分拷貝起來,再把那個部分的物理內存清空,方便別的程序寫入。虛擬內存的大小是能夠自定,可是大小一般在物理內存的1到2倍之間,太大的話,虛擬內存的效能會降低。
由於虛擬內存在硬盤上,因此它的速度是取決於硬盤的存取速度、碎片的多少等。另外,由於它不像物理內存同樣,資料與停機後消失,因此虛擬內存是能夠透過解密方法讀取其中的資料。第二章:布爾代數如何在實際中應用?
布爾代數不只能夠在數學領域內實現集合運算,更普遍應用於電子學、計算機硬件、計算機軟件等領域的邏輯運算:當集合內只包含兩個元素(1和0)時,分別對應{真}和{假},能夠用於實現對邏輯的判斷。
常見的應用包括: 數字電路設計,0和1與數字電路中某個位的狀態對應,例如:高電平、低電平。 計算機的網絡設置,利用計算機的二進制特性,將子網掩碼與本機IP地址進行邏輯與運算,能夠獲得計算機的網絡地址和主機地址。 數據庫應用,經過SQL語句查詢數據庫時須要進行邏輯運算,肯定具體的查詢目標。第三章:機器級代碼與C語言代碼的區別?
對於機器級編程來講,兩種抽象很重要:
一、指令集體系結構(Instruction set architecture ISA)
它定義了處理器狀態、指令的格式,以及每條指令對狀態的影響。
IA32將程序的行爲描述成好像每條指令時按順序執行的,一條指令結束後,下一條再開始。(實際上處理器併發地執行許多指令,可是能夠採起措施保證總體行爲與ISA指定的順序執行徹底一致)
二、機器級程序使用的存儲器地址是虛擬地址
提供的存儲器模型看上去是一個很是大的字節數組。存儲器系統的實際實現是將多個硬件存儲器和操做系統軟件組合起來。
程序存儲器(program memory)包含:程序的可執行機器代碼、操做系統須要的一些信息、棧、堆。程序存儲器用虛擬地址來尋址(此虛擬地址不是機器級虛擬地址)。操做系統負責管理虛擬地址空間(程序級虛擬地址),將虛擬地址翻譯成實際處理器存儲器中的物理地址(機器級虛擬地址)。C語言
C語言是一個有結構化程序設計、具備變量做用域(variable scope)以及遞歸功能的過程式語言。
C語言傳遞參數均是以值傳遞(pass by value),另外也能夠傳遞指針(a pointer passed by value)。
不一樣的變量類型能夠用結構體(struct)組合在一塊兒。
只有32個保留字(reserved keywords),使變量、函數命名有更多彈性。
部份的變量類型能夠轉換,例如整型和字符型變量。
經過指針(pointer),C語言能夠容易的對存儲器進行低級控制。
預編譯處理(preprocessor)讓C語言的編譯更具備彈性。第四章:SEQ具體指什麼?
SEQ是 Sequential CPU的實現,表如今指令的執行要依次經歷各個階段(Fetch->Decode->Execut->Memory->WriteBack->PC Update).每個指令在一個時鐘週期內完成。第五章:寄存器溢出的弊端?
不能很好的實現循環並行性,對維護多個累積變量的優點有必定影響。第六章:局部性對存儲器層次結構的重要意義?
有良好局部性的程序比局部性差的程序運行得快。第七章:如何進行重定位?
重定位就是把程序的邏輯地址空間變換成內存中的實際物理地址空間的過程,也就是說在裝入時對目標程序中指令和數據的修改過程。第八章:如何有效處理異常?
1.直接終止程序(自殺)
2.返回一個錯誤的值,附加錯誤碼
3.返回一個合法的值,讓程序處於某種非法的狀態
4.調用一個預先準備好在出現"錯誤"的狀況下使用的函數.
5.經過暴力的方式解決:abort()函數和常見exit()函數.
6.使用goto語句
7.使用setjmp()與longjmp()第九章:虛擬內存對系統的重要意義?
虛擬內存是用於當作內存來彌補計算機RAM空間缺少的硬盤空間。當實際RAM滿時(實際上,在RAM滿以前),虛擬內存就在硬盤上建立了。當物理內存用完後,虛擬內存管理器選擇最近沒有用過的,低優先級的內存部分寫到交換文件上。這個過程對應用是隱藏的,應用把虛擬內存和實際內存看做是同樣的.第十章:I/O如何進行重定向?
所謂的I / O重定向也就是讓已建立的FD指向其餘文件。在I / O重定向的過程當中,不變的是FD 0/1/2表明STDIN / STDOUT / STDERR,變化的是文件描述符表中FD 0/1/2對應的具體文件,應用程序只關心前者。本質上這和接口的原理是相通的,經過一個間接層把功能的使用者和提供者解耦。第十一章:如何進行C/S編程模型通訊?
服務器調用socket()、bind()、listen()完成初始化後,調用accept()阻塞等待,處於監聽端口的狀態,客戶端調用socket()初始化後,調用connect()發出SYN段並阻塞等待服務器應答,服務器應答一個SYN-ACK段,客戶端收到後從connect()返回,同時應答一個ACK段,服務器收到後從accept()返回。第十二章:基於不一樣類型的併發編程的異同?
不管哪一種併發機制,同步對共享數據的併發訪問都是一個困難的問題。
進程是由內核自動調度的,並且由於它們有各自獨立的虛擬地址空間,因此要實現共享數據,必需要有顯式的IPC機制。
事件驅動程序建立它們本身的併發邏輯流,這些邏輯流被模型化爲狀態機,需用I/O多路複用來顯式地調度這些流。
同基於進程的流同樣,線程也是由內核自動調度的。
項目 PWD
無。
本身的收穫(投入,效率,效果等)
總的來講這學期其實仍是自學的比較多,課堂實踐內容相對來講要比課本學習複雜一點。C語言的編程能力有了必定的提高,對Linux操做系統和windows的不一樣有了更直觀的感覺。本身須要改進的地方
這學期的學習效率好像要更低?自學容易抓不住重點,好像在一些沒必要要的內容上浪費了很多時間。若是有結對,寫一下你提供的幫助或接受了什麼幫助,並對老師提供參考建議
在實驗的時候可以高效的完成實驗內容。
若是從新學習這門課,怎麼作才能夠學的更好?
多敲敲代碼,有選擇性的參考網絡文章,能對課本內容有更好的瞭解。
你平均每週投入到本課程多長時間?
18-20小時每週的學習效率有提升嗎?
有的吧。學習效果本身滿意嗎?
通常。課程結束後會繼續一週至少一篇博客嗎?(若是能作到,畢業時我把你的博客給你集結成一本書送給你做記念)
不會吧。你以爲這門課老師應該繼續作哪一件事情?
課下測試。你以爲這門課老師應該中止作哪一件事情?
課堂筆記互評。你以爲這門課老師應該開始作什麼新的事情?
暫時沒有什麼好的建議。