1. 程式人生 > >《程式設計師的自我修養--連結、裝載與庫》筆記--第一章溫故而知新

《程式設計師的自我修養--連結、裝載與庫》筆記--第一章溫故而知新

第一章 溫故而知新

計算機軟體體系結構

  • 開發工具與應用程式使用作業系統應用程式程式設計介面;應用程式介面的提供者是執行庫;執行庫使用作業系統提供的系統呼叫介面;系統呼叫介面在實現中往往以軟體中斷的方式提供。

cpu

  • 分時系統:每個程式執行一段時間後都主動讓出CPU,使得一段時間內每個程式都有機會執行一小段時間。

記憶體

  • 程式直接使用實體地址的缺點:

    • 地址空間不隔離:所有程式能直接訪問實體地址,如果一不小心修改了其他程式的資料,就會使其他程式也崩潰。
    • 記憶體使用效率低:大量資料換入換出,導致效率十分低下。
    • 程式執行的地址不確定:程式每次執行裝入時,都需要從記憶體中分配足夠大的空閒區域,這個空閒區域的位置是不固定的。
  • 空間隔離:每個程序都有自己的獨立的虛擬空間,而且每個程序只能訪問自己的地址空間。

  • 分段:把一段與程式所需要的記憶體空間大小的虛擬空間對映到某個地址空間。
  • 分頁:把地址空間人為地等分為固定大小的頁
  • 共享記憶體:把虛擬空間的有些頁對映到同一個物理頁

執行緒

  • 一般把頻繁等待的執行緒稱之為IO密集型執行緒;把很少等待的執行緒稱之為CPU密集型執行緒
  • IO密集型執行緒總是比CPU密集型執行緒容易得到優先順序的提升。
  • 餓死現象:執行緒優先順序比較低,總是有較高的優先順序的執行緒要執行,因此這個優先順序執行緒始終無法執行。
  • 改變執行緒優先順序的方法:
    • 使用者指定優先順序
    • 根據進入等待狀態的頻繁程度提升或降低優先順序
    • 長時間得不到執行而被提升優先順序
Linux多執行緒
  • 寫時複製:兩個任務可以同時只有讀取記憶體,但任意一個任務試圖對記憶體進行修改時,記憶體就會複製一份提供給修改方單獨使用,以免影響到其他人物的使用。
  • fork產生新任務的速度非常快,因為它並不複製原任務的地址空間,而是和原任務一起共享一個寫時複製的記憶體空間。
執行緒安全
  • 自增(++)操作在多執行緒環境下會出現錯誤是因為這個操作被編譯為彙編程式碼之後不止一條指令,在執行的時候可能執行了一半就被排程系統打斷。
  • 自增(++)操作實現:
    • 讀取i到某個暫存器x;
    • x++;
    • 將x的內容儲存回i;
  • 同步:在一個縣城訪問資料未結束時,其他執行緒不得對同一個資料進行訪問。
  • 函式重入:函式沒有執行完成,由於外部因素或者內部呼叫,又一次進入該函式執行。
  • 函式被重入有兩種情況:
    • 多個執行緒同時執行該函式
    • 函式自己呼叫自己
  • 可重入函式的要求:
    • 不使用任何(區域性)靜態或全域性的非const變數;
    • 不返回任何(區域性)靜態或全域性的非const變數的指標;
    • 僅依賴於呼叫方提供的引數;
    • 不依賴任何單個資源的鎖;
    • 不呼叫任何不可重入的函式;
  • volatile關鍵字:
    • 編譯器有時會過度優化導致程式錯誤,volatile關鍵字試圖阻止過度優化。
    • volatile作用:
      • 阻止編譯器為了提高速度將一個變數快取到暫存器內而不寫回。
      • 阻止編譯器調整操作volatile變數的指令順序。
    • volatile即使能夠阻止編譯器調整順序,也無法阻止cpu動態排程換序。

相關推薦

程式設計師自我修養--連結裝載筆記--第一故而

第一章 溫故而知新 計算機軟體體系結構 開發工具與應用程式使用作業系統應用程式程式設計介面;應用程式介面的提供者是執行庫;執行庫使用作業系統提供的系統呼叫介面;系統呼叫介面在實現中往往以軟體中

程式設計師自我修養--連結裝載筆記--第二 編譯和連結

第二章 編譯和連結 預編譯、編譯、彙編、連結 預編譯處理規則: 刪除所有“#define”,展開所有的巨集; 處理所有的預編譯指令,比如#if, #ifdef, #elif, #else,

Notes:《程式設計師自我修養——連結裝載

記錄下每章的知識點,便於以後對著這份知識圖譜,複習和重組。 溫故而知新 萬變不離其宗 掌握硬體中的核心部件:CPU、記憶體、I/O控制晶片 瞭解CPU核心頻率提升過程中硬體構架的演進:從Bus,到PCI/ISA,再到PCI Express

程式設計師自我修養——連結裝載》讀書筆記(1)

         大部分人都知道我們寫的程式碼要經過預處理、編譯、彙編成目標檔案,然後經過連結生成最終的可執行檔案,但是細節上是怎麼一回事就懶得管了。編譯的過程我還算有點了解,什麼詞法分析、語法分析、語義分析之類一系列複雜的步驟,最終得到目標檔案,然而連結就完全不知道是怎麼一回事了。讀這本書前,我曾經一直以為

編譯裝載那些事-《程式設計師自我修養-連結裝載》總結(讀後感)

         如果你想了解程式如何編譯、連結,動態庫、靜態庫如何載入以及可執行檔案生成過程,推薦俞甲子老師、石凡老師以及 潘愛民老師編著的《程式設計師的自我修養-連結、裝載和庫》。雖然相關知識並不能直觀的提升程式設計技能,但是對於程式編譯、執行過

連結裝載——程序的棧

記憶體是承載程式的介質,是程式進行運算和表達的場所。 未有特殊說明,則預設在32bit作業系統中。 1. 程式的記憶體佈局 作業系統會將記憶體空間中的一部分分給核心使用,應用程式無法訪

連結裝載——計算機組成

*從這篇開始連續記錄我的讀書筆記,將書中重要的知識點總結,方便自己以後快速回憶與閱讀。那就先從《程式設計師的自我修養——裝載、連結與庫》第一章開始嘍。* 第一章 溫故而知新 1.1 從Hello World 說起 無 1.2 萬變不離其宗

程式設計師自我修養-連結裝載筆記

花了近一個禮拜的時間算是把這本書看完了大部分的內容,因為工作接觸的是linux有關windows的部分沒有去看。個人覺得如果要做底層的話,這本書不得不看,看完之後雖然沒有全部理解,但是對於我之前的知識體系結構有了很大的一個補充。現在就要記錄下書中一些重難點,可以以後去回顧,

程序員的自我修養—鏈接裝載pdf

自我修養 開發工具 理解 weight 有符號 簡單的 png 系統架構師 8.4 下載地址:網盤下載 內容簡介編輯《程序員的自我修養:鏈接、裝載與庫》對裝載、鏈接和庫進行了深入淺出的剖析,並且輔以大量的例子和圖表,可以作為計算機軟件專業和其他相關專業大學本科高年級學生

程序員的自我修養—鏈接裝載.pdf

擁有 color 2.3 接口 pos 內存 深入學習 mar family 下載地址:網盤下載 內容簡介編輯《程序員的自我修養:鏈接、裝載與庫》對裝載、鏈接和庫進行了深入淺出的剖析,並且輔以大量的例子和圖表,可以作為計算機軟件專業和其他相關專業大學本科高年級學生深入學習

關於《程式設計師自我修養》中提到的裝載方式

w6r559詬竿仲凡市閹《http://baobao.baidu.com/question/84d5ae2b2045cb2e1d6905e443eceb01?nV》 4740fb鞘倜猛俜春付《http://baobao.baidu.com/question/9e58cdb8a

程式設計師自我修養的那些事兒

本篇部落格主要是:程式設計師的自我修養—連結、裝載與庫的一些學習筆記與心得。 1、首先得注意最大的坑:這本書基於32位系統講解,因此跟著書本的例子操作一遍的時候,記得要在32位的系統上進行,否則可能出現以下錯誤:Linux ubuntu 14.04 x86_64平臺 gcc編譯錯誤 Error:

一個半路出家的10年程式設計師:談工作學習Qt

    安曉輝,2014年CSDN博文大賽程式語言組冠軍(小組賽文章、決賽文章)、CSDN Qt論壇的版主(http://bbs.csdn.net→移動開發→Qt)。他於1998年保送入西安交大教改班,2002年畢業進入西安大唐電信從事售後技術支援工作,2005年3月離職,始習程式設計之術。在此期間,有個人

連結裝載 第4 靜態連結

靜態連結 /* a.c */ extern int shared; int main() { int a = 100; swap( &a, &shared); } /* b.c */ int shared = 1; void swap(int* a, i

連結裝載 第8 linux共享的組織

由於動態連結的優點,大量的程式使用動態連結機制,導致系統裡面存在數量極為龐大的共享物件。必須得有很好的機制來管理這些共享庫,否則這些共享物件散落在各個目錄下,長期的維護,升級,都有會很大的問題。 8.1 共享庫版本 8.1.1 共享庫的相容性 共享庫的版本會不斷的更新,以修正原有

連結裝載 第7 動態連結

7.1 為什麼要動態連結 靜態連結的缺點: 浪費磁碟和記憶體空間 更新困難。如果某個模組發生更新,就需要重新打包整個程式,使用者需要下載整個程式。 動態連結能夠解決以上兩個問題,動態連結的思想即是將程式和模組分隔開來,等到執行時才進行連結。所以在記憶體中,多個

連結裝載 第6 可執行檔案的裝載程序

可執行檔案的裝載與程序 在第一章中講到,程式直接使用實體記憶體地址有以下缺點: 地址空間不隔離。惡意程式可以很容易的改寫其他程式的資料。 記憶體使用效率低。一個程式需要執行時,需要將整個程式裝入記憶體之中。 程式執行地址的不確定。因為無法保證每次都將程式載入到相同

連結裝載 第4 靜態連結

靜態連結 /* a.c */ extern int shared; int main() { int a = 100; swap( &a, &shared); } /* b.c */ int shared = 1; void s

連結裝載—目標檔案裡有什麼

編譯器編譯原始碼後生成的檔案叫做目標檔案。 目標檔案從結構上將,它是已經編譯後的可執行檔案格式,只是還沒有經過連結的過程,其中可能有些符號或地址還沒有被調整。其實它本身就是按照可執行檔案格式儲存的,只是跟真正的可執行檔案在結構上稍有不同。 3.1 目標檔案的

Mohican_2/4 連結裝載 學習筆記故而 計算機硬體基本結構

第一章 計算機軟硬體基本結構 引言: 本章是對於計算機軟硬體的基本瞭解和回顧,包括大致如下內容: ü  CPU與外部件的連線 ü  計算機軟硬體層次結構 ü  SMP與多核 ü  作業系統,虛擬空間,物理空間 ü  多訊號 PV原語的理解 ü  對於執行緒和程序的理解,和