日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > 綜合技術(shù) > 深入理解計算機系統(tǒng)9個重點筆記

深入理解計算機系統(tǒng)9個重點筆記

來源:程序員人生   發(fā)布時間:2014-12-19 08:30:20 閱讀次數(shù):5049次

引言

深入理解計算機系統(tǒng),對我來講是部大塊頭。說實話,我沒有從頭到尾完完全整的全部看完,而是選擇性的看了1些我自認為重要的或感興趣的章節(jié),也從中獲益很多,看清楚了計算機系統(tǒng)的1些本質(zhì)東西或原理性的內(nèi)容,這對每一個想要深入學(xué)習(xí)編程的程序員來講都是相當重要的。只有很好的理解了系統(tǒng)究竟是如何運行我們代碼的,我們才能針對系統(tǒng)的特點寫出高質(zhì)量、高效力的代碼來。這本書我以后還需要多研究幾遍,今天就先總結(jié)下書中我已學(xué)到的幾點知識。


重點筆記

  1. 編寫高效的程序需要下面幾類活動:

    • 選擇1組適合的算法和數(shù)據(jù)結(jié)構(gòu)。這是很重要的,好的數(shù)據(jù)結(jié)構(gòu)有時能幫助更快的實現(xiàn)某些算法,這也要求編程人員能夠熟知各種經(jīng)常使用的數(shù)據(jù)結(jié)構(gòu)和算法。
    • 編寫出使編譯器能夠有效優(yōu)化以轉(zhuǎn)換成高效可履行的源代碼。因此,理解編譯器優(yōu)化的能力和局限性是很重要的。編寫程序方式中看上去只是1點小小的變動,都會引發(fā)編譯器優(yōu)化方式很大的變化。有些編程語言比其他語言容易優(yōu)化很多。C語言的某些特性,例如履行指針運算和強迫類型轉(zhuǎn)換的能力,使得編譯器很難對其進行優(yōu)化。
    • 并行技術(shù),針對處理運算量特別大的計算,將1個任務(wù)分成多個部份,這些部份可以在多核和多處理器的某種組合上并行地計算。
  2. 讓編譯器展開循環(huán)
    說到程序優(yōu)化,很多人都會提到循環(huán)展開技術(shù)。現(xiàn)在編譯器可以很容易地履行循環(huán)展開,只要優(yōu)化級別設(shè)置的足夠高,許多編譯器都能例行公事的做到這1點。用命令行選項“-funroll-loops”調(diào)用gcc,會履行循環(huán)展開。

  3. 性能提高技術(shù):

    • 高級設(shè)計,為手邊的問題選擇適當?shù)乃惴ê蛿?shù)據(jù)結(jié)構(gòu),要特別警覺,避免使用會漸進地產(chǎn)生糟性能的算法或編碼技術(shù)。
    • 基本編碼原則。避免限制優(yōu)化的因素,這樣編譯器就可以產(chǎn)生高效代碼。
      • 消除連續(xù)的函數(shù)調(diào)用。在可能時將計算移到循環(huán)外,斟酌有選擇的讓步程序的模塊性以取得更大效力。
      • 消除沒必要要的存儲器援用。引入臨時變量來保存中間結(jié)果,只有在最后的值計算出來時,才能將結(jié)果放到數(shù)組或全局變量中。
    • 低級優(yōu)化。
      • 嘗試各種與數(shù)組代碼相對的指針情勢。
      • 通過展開通過展開循環(huán)下降循環(huán)開消。
      • 通過諸如迭代分割之類的技術(shù),找到使用流水線化的功能單元的方法。

    說到性能提高,可能有人會有1些說法:

    (1)不要過早優(yōu)化,優(yōu)化是萬惡之源;
    (2)花費很多時間所作的優(yōu)化可能效果不明顯,不值得;
    (3)現(xiàn)在內(nèi)存、CPU價格都這么低了,性能的優(yōu)化已不是那末重要了。
     ……

    其實我的看法是:我們或許沒必要特地把之前寫過的程序拿出來優(yōu)化下,花費N多時間只為提升那末幾秒或幾分鐘的時間。但是,我們在重構(gòu)他人的代碼或自己最初開始構(gòu)思代碼時,就需要知道這些性能提高技術(shù),1開始就遵照這些基本原則來寫代碼,寫出的代碼也就不需要讓他人來重構(gòu)以提高性能了。另外,有的很簡單的技術(shù),比如說將與循環(huán)無關(guān)的復(fù)雜計算或大內(nèi)存操作的代碼放到循環(huán)外,對全部性能的提高真的是較明顯的。

  4. 如何使用代碼剖析程序(code profiler,即性能分析工具)來調(diào)優(yōu)代碼?
    程序剖析(profiling)其實就是在運行程序的1個版本中插入了工具代碼,以肯定程序的各個部份需要多少時間。
    Unix系統(tǒng)提供了1個profiling叫GPROF,這個程序產(chǎn)生兩類信息:

    首先,它肯定程序中每一個函數(shù)花費了多少CPU時間。
    其次,它計算每一個函數(shù)被調(diào)用的次數(shù),以履行調(diào)用的函數(shù)來分類。還有每一個函數(shù)被哪些函數(shù)調(diào)用,本身又調(diào)用了哪些函數(shù)。

    使用GPROF進行剖析需要3個步驟,比如源程序為prog.c。
    1)編譯: gcc -O1 -pg prog.c -o prog(只要加上-pg參數(shù)便可)
    2)運行:./prog
     會生成1個gmon.out文件供 gprof分析程序時候使用(運行比平時慢些)。
    3)剖析:gprof prog
     分析gmon.out中的數(shù)據(jù),并顯示出來。
    剖析報告的第1部份列出了履行各個函數(shù)花費的時間,依照降序排列。
    剖析報告的第2部份是函數(shù)的調(diào)用歷史。
    具體例子可參考網(wǎng)上資料。

    GPROF有些屬性值得注意:

    • 計時不是很準確。它的計時基于1個簡單的間隔計數(shù)機制,編譯過的程序為每一個函數(shù)保護1個計數(shù)器,記錄花費在履行該函數(shù)上的時間。對運行時間較長的程序,相對準確。
    • 調(diào)用信息相當可靠。
    • 默許情況下,不顯示庫函數(shù)的調(diào)用。相反地,庫函數(shù)的時間會被計算到調(diào)用它們的函數(shù)的時間中。
  5. 靜態(tài)鏈接和動態(tài)鏈接1個很重要的區(qū)分是:動態(tài)鏈接時沒有任何動態(tài)鏈接庫的代碼和數(shù)據(jù)節(jié)真實的被拷貝到可履行文件中,反之,鏈接器只需拷貝1些重定位和符號表信息,便可使得運行時可以解析對動態(tài)鏈接庫中代碼和數(shù)據(jù)的援用。

  6. 存儲器映照
    指的是將磁盤上的空間映照為虛擬存儲器區(qū)域。Unix進程可使用mmap函數(shù)來創(chuàng)建新的虛擬存儲器區(qū)域,并將對象映照到這些區(qū)域中,這屬于低級的分配方式。
    1般C程序會使用malloc和free來動態(tài)分配存儲器區(qū)域,這是利用堆的方式。

  7. 造成堆利用率很低的主要緣由是碎片,當雖然有未使用的存儲器但不能用來滿足分配要求時,就會產(chǎn)生這類現(xiàn)象。
    有兩種情勢的碎片:內(nèi)部碎片和外部碎片。二者的區(qū)分以下:

    • 內(nèi)部碎片是在1個已分配的塊比有效載荷大時產(chǎn)生的。例如,有些分配器為了滿足對其束縛添加額外的1字的存儲空間,這個1字的空間就是內(nèi)部碎片。它就是已分配塊大小和它們的有效載荷大小之差的和。
    • 外部碎片是當空閑存儲器合計起來足夠滿足1個分配要求,但是沒有1個單獨的空閑塊足夠大可以來處理這個要求時產(chǎn)生的。
  8. 現(xiàn)代OS提供了3種方法實現(xiàn)并發(fā)編程:

    • 進程。用這類方法,每一個邏輯控制流都是1個進程,由內(nèi)核來調(diào)度和保護。由于進程有獨立的虛擬地址空間,想要和其他流通訊,控制流必須使用進程間通訊(IPC)。
    • I/O多路復(fù)用。這類情勢的并發(fā),利用程序在1個進程的上下文中顯示地調(diào)度它們自己的邏輯流。邏輯流被摹擬為“狀態(tài)機”,數(shù)據(jù)到達文件描寫符后,主程序顯示地從1個狀態(tài)轉(zhuǎn)換到另外一個狀態(tài)。由于程序是1個單獨的進程,所以所有的流都同享1個地址空間。
    • 線程。線程是運行在1個單1進程上下文中的邏輯流,由內(nèi)核進行調(diào)度。線程可以看作是進程和I/O多路復(fù)用的合體,像進程1樣由內(nèi)核調(diào)度,像I/O多路復(fù)用1樣同享1個虛擬地址空間。

    (1)基于進程的并發(fā)服務(wù)器
    構(gòu)造并發(fā)最簡單的就是使用進程,像fork函數(shù)。例如,1個并發(fā)服務(wù)器,在父進程中接受客戶端連接要求,然后創(chuàng)建1個新的子進程來為每一個新客戶端提供服務(wù)。為了了解這是如何工作的,假定我們有兩個客戶端和1個服務(wù)器,服務(wù)器正在監(jiān)聽1個監(jiān)聽描寫符(比如描寫符3)上的連接要求。下面顯示了服務(wù)器是如何接受這兩個客戶真?zhèn)€要求的。


    進程并發(fā)示例

    關(guān)于進程的優(yōu)劣,對在父、子進程間同享狀態(tài)信息,進程有1個非常清晰的模型:同享文件表,但是不同享用戶地址空間。進程有獨立的地址控件愛你既是優(yōu)點又是缺點。由于獨立的地址空間,所以進程不會覆蓋另外一個進程的虛擬存儲器。但是另外一方面進程間通訊就比較麻煩,最少開消很高。

    (2)基于I/O多路復(fù)用的并發(fā)編程
    比如1個服務(wù)器,它有兩個I/O事件:1)網(wǎng)絡(luò)客戶端發(fā)起連接要求,2)用戶在鍵盤上鍵入命令行。我們先等待那個事件呢?沒有那個選擇是理想的。如果accept中等待連接,那末沒法響應(yīng)輸入命令。如果在read中等待1個輸入命令,我們就不能響應(yīng)任何連接要求(這個條件是1個進程)。
    針對這類窘境的1個解決辦法就是I/O多路復(fù)用技術(shù)。基本思想是:使用select函數(shù),要求內(nèi)核掛起進程,只有在1個或多個I/O事件產(chǎn)生后,才將控制返給利用程序。
    I/O多路復(fù)用的優(yōu)劣:由于I/O多路復(fù)用是在單1進程的上下文中的,因此每一個邏輯流程都能訪問該進程的全部地址空間,所以開消比多進程低很多;缺點是編程復(fù)雜度高。

    (3)基于線程的并發(fā)編程
    每一個線程都有自己的線程上下文,包括1個線程ID、棧、棧指針、程序計數(shù)器、通用目的寄存器和條件碼。所有的運行在1個進程里的線程同享該進程的全部虛擬地址空間。由于線程運行在單1進程中,因此同享這個進程虛擬地址空間的全部內(nèi)容,包括它的代碼、數(shù)據(jù)、堆、同享庫和打開的文件。所以我認為不存在線程間通訊,線程間只有鎖的概念。

    • 線程履行的模型。線程和進程的履行模型有些類似。每一個進程的生明周期都是1個線程,我們稱之為主線程。但是大家要成心識:線程是對等的,主線程跟其他線程的區(qū)分就是它先履行。
      1般來講,線程的代碼和本地數(shù)據(jù)被封裝在1個線程例程中(就是1個函數(shù))。該函數(shù)通常只有1個指針參數(shù)和1個指針返回值。
      在Unix中線程可以是joinable(可結(jié)合)或detached(分離)的。joinable可以被其他線程殺死,detached線程不能被殺死,它的存儲器資源有系統(tǒng)自動釋放。

    • 線程存儲器模型,每一個線程都有它自己的獨立的線程上下文,包括線程ID、棧、棧指針、程序計數(shù)器、條件碼和通用目的寄存器。每一個線程和其他線程同享剩下的部份,包括全部用戶虛擬地址空間,它是由代碼段、數(shù)據(jù)段、堆和所有的同享庫代碼和數(shù)據(jù)區(qū)域組成。不同線程的棧是對其他線程不設(shè)防的,也就是說:如果1個線程以某種方式得到1個指向其他線程的指針,那末它可以讀取這個線程棧的任何部份。

  9. 甚么樣的變量多線程可以同享,甚么樣的不可以同享?
    有3種變量:全局變量、本地自動變量(局部變量)和本地靜態(tài)變量,其中本地自動變量每一個線程的本地棧中都存有1份,不同享。而全局變量和靜態(tài)變量可以同享。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 东北寡妇特级毛片免费 | 日韩黄色影视 | 午夜视频在线免费观看 | 日韩国产一区 | 精久久| 精品国产一区二区三区久久久 | 999免费视频| 国产在线高潮 | 国产免费黄色 | 高清国产一区二区三区 | a v视频在线播放 | 久久免费毛片 | 一区二区国产精品 | 欧美韩日一区 | 亚洲国产97在线精品一区 | 国产一级片网站 | 国产精品久久久久久久久久新婚 | 黄色在线免费 | 国产精品乱码一区二区三区 | 久久亚洲一区二区三区四区 | 国产精品第52页 | 国产精品久久久久久久9999 | 日韩一区二区免费电影 | 亚洲免费在线观看 | 日韩三区| 亚洲精品99 | 久久国产精品久久久久久久久久 | 国产日韩一区二区 | 九九av | 免费国产一区 | 2019国产精品视频 | 狠狠操很很干 | 韩国三级av | 毛片久久久 | 国产激情在线视频 | 日韩在线黄 | 久久国产精品影视 | 午夜av网站| 久久在线精品 | 成人综合久久 | 黄网站观看 |