matytan

matytan

操作系統導論

元數據#

[!abstract] 操作系統導論

  •  操作系統導論 | 200
  • 書名: 操作系統導論
  • 作者: 雷姆兹・H. 阿帕希杜塞尔 安德莉亚・C. 阿帕希杜塞尔
  • 簡介: 這是一本關於現代操作系統的書。全書圍繞虛擬化、並發和持久性這 3 個主要概念展開,介紹了所有現代系統的主要組件(包括調度、虛擬內存管理、磁碟和 I/O 子系統、檔案系統 )。 本書共 50 章,分為 3 個部分,分別講述虛擬化、並發和持久性的相關內容。本書大部分章節均先提出特定的問題,然後通過書中介紹的技術、算法和思想來解決這些問題。筆者以對話形式引入所介紹的主題概念,行文詼諧幽默卻又鞭辟入裡,力求幫助讀者理解操作系統中虛擬化、並發和持久性的原理。 本書內容全面,並給出了真實可運行的代碼(而非偽代碼),還提供了相應的練習,適合高等院校相關專業教師教學和高校學生自學。
  • 出版時間 2019-06-01 00:00:00
  • ISBN: 9787115508232
  • 分類: 電腦 - 電腦綜合
  • 出版社: 人民郵電出版社

高亮劃線#

前言#

  • 📌 虛擬化(virtualization)、並發(concurrency)和持久性(persistence)。 ^30179184-6-1240-1293
    • ⏱ 2021-11-07 09:36:51

第 1 章 關於本書的對話#

  • 📌 教授:歡迎閱讀這本書,本書英文書名為《Operating Systems Easy Pieces》,由我來講授關於操作系統的知識。請做一下自我介紹。學生:教授,您好,我是學生,您可能已經猜到了,我已經準備好開始學習了!教授:很好。有問題嗎?學生:有!本書為什麼講 “3 個簡單部分”?教授:這很簡單。理查德・費曼有幾本關於物理學的講義,非常不錯…… 學生:啊,是《別鬧了,費曼先生》的作者嗎?那本書很棒!這書也會像那本書一樣搞笑嗎?教授:呃…… 不。那本書的確很棒,很高興你讀過它。我希望這本書更像他關於物理學的講義。將一些基本內容匯集成一本書,名為《Six Easy Pieces》。他講的是物理學,而我們將探討的主題是操作系統的 3 個簡單部分。這很合適,因為操作系統的難度差不多是物理學的一半。學生:懂了,我喜歡物理學。是哪 3 個部分呢?教授:虛擬化(virtualization)、並發(concurrency)和持久性(persistence)。這是我們要學習的 3 個關鍵概念。通過學習這 3 個概念,我們將理解操作系統是如何工作的,包括它如何決定接下來哪個程序使用 CPU,如何在虛擬內存系統中處理內存使用過載,虛擬機監控器如何工作,如何管理磁碟上的數據,還會講一點如何構建在部分節點失敗時仍能正常工作的分佈式系統。學生:對於您說的這些,我都沒有概念。教授:好極了,這說明你來對了地方。 ^30179184-6-359

    • ⏱ 2021-10-13 09:10:43
  • 📌 首先聽課,聽老師講解並做好筆記,然後每個週末閱讀筆記,以便更好地理解這些概念 ^30179184-6-1738-1776

    • ⏱ 2021-11-07 10:17:48
  • 📌 特別是做項目,你會編寫真正的代碼來解決真正的問題,這是將筆記中的概念活學活用。就像孔子說的那樣…… ^30179184-6-1830-1879

    • ⏱ 2021-11-07 10:17:55
  • 📌 “不聞不若聞之,聞之不若見之,見之不若知之,知之不若行之。” ^30179184-6-1941-1971

    • ⏱ 2021-11-07 10:18:11
  • 📌 好問題!我覺得有時候將自己從敘述中抽離出來,然後進行一些思考會更有用。這些對話就是思考。 ^30179184-6-2532-2577

    • ⏱ 2021-11-07 10:19:27

第 2 章 操作系統介紹#

  • 📌 虛擬化讓許多程序運行(從而共享 CPU),讓許多程序可以同時訪問自己的指令和數據(從而共享內存) ^30179184-7-2403-2450

    • ⏱ 2021-10-13 09:11:38
  • 📌 兩個數相加、訪問內存、檢查條件、跳轉到函數等) ^30179184-7-734-757

    • ⏱ 2021-11-07 10:18:57
  • 📌 操作系統通過哪些機制和策略來實現虛擬化?操作系統如何有效地實現虛擬化?需要哪些硬體支持? ^30179184-7-1754-1798

    • ⏱ 2021-11-07 10:19:11
  • 📌 如果你正在讀本科操作系統課程,那麼應該已經初步了解了計算機程序運行時做的事情。如果不了解,這本書(和相應的課程)對你來說會很困難:你應該停止閱讀本書,或跑到最近的書店,在繼續讀本書之前快速學習必要的背景知識(包括 Patt / Patel [PP03],特別是 Bryant / O’Hallaron 的書 [BOH10],都是相當不錯的)。程序運行時會發生什麼?一個正在運行的程序會做一件非常簡單的事情:執行指令。處理器從內存中獲取(fetch)一條指令,對其進行解碼(decode)(弄清楚這是哪條指令),然後執行(execute)它(做它應該做的事情,如兩個數相加、訪問內存、檢查條件、跳轉到函數等)。完成這條指令後,處理器繼續執行下一條指令,依此類推,直到程序最終完成 [插圖]。這樣,我們就描述了馮・諾依曼(Von Neumann)計算模型 [插圖] 的基本概念。聽起來很簡單,對吧?但在這門課中,我們將了解到在一個程序運行的同時,還有很多其他瘋狂的事情也在同步進行 —— 主要是為了讓系統易於使用。實際上,有一類軟體負責讓程序運行變得容易(甚至允許你同時運行多個程序),允許程序共享內存,讓程序能夠與設備交互,以及其他類似的有趣的工作。這些軟體稱為操作系統(Operating System,OS)[插圖],因為它們負責確保系統既易於使用又正確高效地運行。關鍵問題:如何將資源虛擬化我們將在本書中回答一個核心問題:操作系統如何將資源虛擬化?這是關鍵問題。為什麼操作系統這樣做?這不是主要問題,因為答案應該很明顯:它讓系統更易於使用。因此,我們關注如何虛擬化:操作系統通過哪些機制和策略來實現虛擬化?操作系統如何有效地實現虛擬化?需要哪些硬體支持? ^30179184-7-359

    • ⏱ 2021-11-07 10:21:48
  • 📌 執行指令 ^30179184-7-657-661

    • ⏱ 2021-11-07 10:23:46
  • 📌 獲取(fetch)一條指令,對其進行解碼(decode)(弄清楚這是哪條指令),然後執行(execute)它(做它應該做的事情,如 ^30179184-7-669-734

    • ⏱ 2021-11-07 10:23:53
  • 📌 如何將資源虛擬化 ^30179184-7-1626-1634

    • ⏱ 2021-11-07 10:32:53
  • 📌 儘管我們只有一個處理器,但這 4 個程序似乎在同時運行!這種魔法是如何發生的? ^30179184-7-4049-4314

    • ⏱ 2021-11-07 10:35:34
  • 📌 將單個 CPU(或其中一小部分)轉換為看似無限數量的 CPU,從而讓許多程序看似同時運行,這就是所謂的虛擬化 CPU(virtualizing the CPU),這是本書第一大部分的關注點。 ^30179184-7-4399-4491

    • ⏱ 2021-11-07 10:35:57
  • 📌 如果兩個程序想要在特定時間運行,應該運行哪個?這個問題由操作系統的策略(policy)來回答。 ^30179184-7-4680-4727

    • ⏱ 2021-11-07 10:36:15
  • 📌 操作系統承擔了資源管理器(resource manager)的角色。 ^30179184-7-4812-4846

    • ⏱ 2021-11-07 10:36:21
  • 📌 讀取(read)內存,必須指定一個地址(address),才能訪問存儲在那裡的數據。要寫入(write)或更新(update)內存,還必須指定要寫入給定地址的數據。 ^30179184-7-4996-5078

    • ⏱ 2021-11-07 10:50:35
  • 📌 不要忘記,程序的每個指令都在內存中,因此每次讀取指令都會訪問內存。 ^30179184-7-5178-5211

    • ⏱ 2021-11-07 10:50:51
  • 📌 每個正在運行的程序都在相同的地址(00200000)處分配了內存,但每個似乎都獨立更新了 00200000 處的值!就好像每個正在運行的程序都有自己的私有內存,而不是與其他正在運行的程序共享相同的物理內存。 ^30179184-7-6454-6723

    • ⏱ 2021-11-07 10:54:54
  • 📌 私有虛擬地址空間(virtual address space)(有時稱為地址空間,address space),操作系統以某種方式映射到機器的物理內存 ^30179184-7-7116-7191

    • ⏱ 2021-11-07 11:00:47
  • 📌 物理內存是由操作系統管理的共享資源。 ^30179184-7-7261-7279

    • ⏱ 2021-11-07 11:00:54
  • 📌 程序利用 Pthread_create () 創建了兩個線程(thread)。你可以將線程看作與其他函數在同一內存空間中運行的函數, ^30179184-7-8694-8907

    • ⏱ 2021-11-07 11:01:38
  • 📌 指令每次執行一條。遺憾的是,上面的程序中的關鍵部分是增加共享計數器的地方,它需要 3 條指令 ^30179184-7-10069-10113

    • ⏱ 2021-11-07 11:03:54
  • 📌 持久性需要哪些技術才能正確地實現?需要哪些機制和策略才能高性能地實現?面對硬體和軟體故障,可靠性如何實現? ^30179184-7-11947-12000

    • ⏱ 2021-11-07 11:06:49
  • 📌 open () 的調用,它打開文件並創建它。第二個是 write (),將一些數據寫入文件。第三個是 close () ^30179184-7-12068-12121

    • ⏱ 2021-11-07 11:07:11
  • 📌 硬體以某種輸入 / 輸出(Input/Output,I/O)設備的形式出現。 ^30179184-7-10527-10563

    • ⏱ 2021-11-07 11:07:20
  • 📌 大多數文件系統都包含某種複雜的寫入協議,如日誌(journaling)或寫時複製(copy-on-write) ^30179184-7-12788-12843

    • ⏱ 2021-11-07 11:08:52
  • 📌 CPU、內存或磁碟等物理資源(resources),並對它們進行虛擬化(virtualize)。它處理與並發(concurrency)有關的麻煩且棘手的問題。它持久地(persistently)存儲文件,從而使它們長期安全。 ^30179184-7-13143-13255

    • ⏱ 2021-11-07 11:09:26
  • 📌 它取得 ^30179184-7-13140-13143

    • ⏱ 2021-11-07 11:09:29
  • 📌 抽象使得編寫一個大型程序成為可能,將其劃分為小而且容易理解的部分,用 C這樣的高級語言編寫這樣的程序不用考慮匯編,用匯編寫代碼不用考慮邏輯門,用邏輯門來構建處理器不用太多考慮晶體管 ^30179184-7-13411-13623

    • ⏱ 2021-11-07 11:10:45
  • 📌 設計和實現操作系統的一個目標,是提供高性能 ^30179184-7-13736-13757

    • ⏱ 2021-11-07 11:11:02
  • 📌 另一個目標是在應用程序之間以及在 OS 和應用程序之間提供保護(protection ^30179184-7-14007-14047

    • ⏱ 2021-11-07 11:13:00
  • 📌 保護是操作系統基本原理之一的核心,這就是隔離(isolation)。讓進程彼此隔離是保護的關鍵,因此決定了 OS 必須執行的大部分任務。 ^30179184-7-14134-14200

    • ⏱ 2021-11-07 11:13:19
  • 📌 這些開銷會以多種形式出現:額外時間(更多指令)和額外空間(內存或磁碟上)。如果有可能,我們會尋求解決方案,儘量減少一種或兩種。但是,完美並非總是可以實現的,我們會注意到這一點,並且(在適當的情況下)容忍它。 ^30179184-7-13875-13978

    • ⏱ 2021-11-07 11:15:03
  • 📌 虛擬化和讓系統易於使用是非常值得的,但不會不計成本。因此,我們必須努力提供虛擬化和其他操作系統功能,同時沒有過多的開銷。 ^30179184-7-13815-13875

    • ⏱ 2021-11-07 11:15:34
  • 📌 使用者坐在計算機前使用它,大部分時間它都會閒置,所以會導致設施每小時浪費數千美元 [BH00 ^30179184-7-15348-15392

    • ⏱ 2021-11-07 11:16:27
  • 📌 在這些老的大型機系統上,一次運行一個程序,由操作員來控制。這個操作員完成了你認為現代操作系統會做的許多事情(例如,決定運行作業的順序)。如果你是一個聰明的開發人員,就會對這個操作員很好,這樣他們可以將你的工作移動到隊列的前端。 ^30179184-7-15130-15243

    • ⏱ 2021-11-07 11:16:45
  • 📌 系統調用和過程調用之間的關鍵區別在於,系統調用將控制轉移(跳轉)到 OS 中,同時提高硬體特權級別(hardware privilege level)。 ^30179184-7-15928-16002

    • ⏱ 2021-11-07 11:17:14
  • 📌 在內核模式下,操作系統可以完全訪問系統的硬體,因此可以執行諸如發起 I/O 請求或為程序提供更多內存等功能。當 ^30179184-7-16210-16263

    • ⏱ 2021-11-07 11:17:40
  • 📌 早期的操作系統,如 DOS(來自微軟的磁碟操作系統),並不認為內存保護很重要。因此,惡意程序(或者只是編程不好的應用程序)可能會在整個內存中亂寫亂七八糟的東西。 ^30179184-7-17795-17876

    • ⏱ 2021-11-07 11:18:07
  • 📌 進程的機器狀態的另一部分是寄存器。 ^30179184-9-2248-2265

    • ⏱ 2021-11-08 13:54:05

第 1 部分 虛擬化#

  • 📌 第 3 章 關於虛擬化的對話教授:現在我們開始講操作系統 3 個部分的第 1 部分 —— 虛擬化。學生:尊敬的教授,什麼是虛擬化?教授:想像我們有一個桃子。學生:桃子?(不可思議)教授:是的,一個桃子,我們稱之為物理(physical)桃子。但有很多想吃這個桃子的人,我們希望向每個想吃的人提供一個屬於他的桃子,這樣才能皆大歡喜。我們把給每個人的桃子稱為虛擬(virtual)桃子。我們通過某種方式,從這個物理桃子創造出許多虛擬桃子。重要的是,在這種假象中,每個人看起來都有一個物理桃子,但實際上不是。學生:所以每個人都不知道他在和別人一起分享一個桃子嗎?教授:是的。學生:但不管怎麼樣,實際情況就是只有一個桃子啊。教授:是的,所以呢?學生:所以,如果我和別人分享同一個桃子,我一定會發現這個問題。教授:是的!你說得沒錯。但吃的人多才有這樣的問題。大多數時間他們都在打盹或者做其他事情,所以,你可以在他們打盹的時候把他手中的桃子拿過來分給其他人,這樣我們就創造了有許多虛擬桃子的假象,每人一個桃子! ^30179184-8-375
    • ⏱ 2021-11-07 11:18:54

第 4 章 抽象:進程#

  • 📌 進程就是運行中的程序。程序本身是沒有生命周期的,它只是存在磁碟上面的一些指令(也可能是一些靜態數據)。是 ^30179184-9-433-485

    • ⏱ 2021-11-08 13:50:32
  • 📌 操作系統讓這些字節運行起來,讓程序發揮作用。 ^30179184-9-485-507

    • ⏱ 2021-11-08 13:50:38
  • 📌 進程的機器狀態有一個明顯組成部分,就是它的內存 ^30179184-9-2124-2147

    • ⏱ 2021-11-08 13:54:03
  • 📌 類似地,堆疊指針(stack pointer)和相關的幀指針(frame pointer)用於管理函數參數堆疊、局部變量和返回地址。 ^30179184-9-2434-2498

    • ⏱ 2021-11-08 13:54:34
  • 📌 機制看作是系統的 “如何(how)” 問題提供答案。例如,操作系統如何執行上下文切換?策略為 “哪個(which)” 問題提供答案。 ^30179184-9-2644-2706

    • ⏱ 2021-11-08 13:56:30
  • 📌 將兩者分開可以輕鬆地改變策略,而不必重新考慮機制 ^30179184-9-2724-2748

    • ⏱ 2021-11-08 13:56:48
  • 📌 所有現代操作系統都以某種形式提供這些 API ^30179184-9-3002-3023

    • ⏱ 2021-11-08 13:57:19
  • 📌 就是程序如何轉化為進程。 ^30179184-9-3970-3982

    • ⏱ 2021-11-08 13:57:59
  • 📌 必須為程序的運行時堆疊(run-time stack 或 stack)分配一些內存。你可能已經知道,C 程序使用堆疊存放局部變量、函數參數和返回地址。 ^30179184-9-4753-4823

    • ⏱ 2021-11-08 13:59:20
  • 📌 操作系統也可能為程序的堆(heap)分配一些內存。在 C 程序中,堆用於顯式請求的動態 ^30179184-9-4920-4961

    • ⏱ 2021-11-08 13:59:27
  • 📌 通過將代碼和靜態數據加載到內存中,通過創建和初始化堆疊以及執行與 I/O 設置相關的其他工作,OS 現在(終於)為程序執行搭好了舞台 ^30179184-9-5337-5399

    • ⏱ 2021-11-08 13:59:52
  • 📌 這樣做可以通過保持 CPU 繁忙來提高資源利用率。 ^30179184-9-7648-7671

    • ⏱ 2021-11-09 09:27:18
  • 📌 任何時刻,我們都可以清點它在執行過程中訪問或影響的系統的不同部分,從而概括一個進程。 ^30179184-9-1943-1985

    • ⏱ 2021-11-09 09:57:14
  • 📌 程序計數器(Program Counter,PC) ^30179184-9-2359-2384

    • ⏱ 2021-11-09 09:58:15
  • 📌 代碼和所有靜態數據(例如初始化變量)加載(load)到內存中,加載到進程的地址空間中。 ^30179184-9-4061-4104

    • ⏱ 2021-11-09 09:59:03
  • 📌 啟動程序,在入口處運行,即 main ()。通過跳轉到 main () 例程(第 5 章討論的專門機制),OS 將 CPU 的控制權轉移到新創建的進程中,從而程序開始執行。 ^30179184-9-5411-5487

    • ⏱ 2021-11-09 09:59:53
  • 📌 有一些關鍵的數據結構來跟蹤各種相關的信息。例如,為了跟蹤每個進程的狀態,操作系統可能會為所有就緒的進程保留某種進程列表(process list) ^30179184-9-7865-7938

    • ⏱ 2021-11-09 10:01:11
  • 📌 以及跟蹤當前正在運行的進程的一些附加信息。操作系統還必須以某種方式跟蹤被阻塞的進程。 ^30179184-9-7939-7981

    • ⏱ 2021-11-09 10:01:18
  • 📌 當一個進程停止時,它的寄存器將被保存到這個內存位置。通過恢復這些寄存器(將它們的值放回實際的物理寄存器中),操作系統可以恢復運行該進程。 ^30179184-9-8217-8285

    • ⏱ 2021-11-09 10:01:40
  • 📌 這是比較簡單的一種,但是,任何能夠同時運行多個程序的操作系統當然都會有類似這種結構的東西,以便跟蹤系統中正在運行的所有程序。有時候人們會將存儲關於進程的信息的個體結構稱為進程控制塊(Process Control Block,PCB),這是談論包含每個進程信息的 C 結構的一種方式。 ^30179184-9-10235-10375

    • ⏱ 2021-11-09 10:02:23
  • 📌 模擬作業以模擬器的形式出現 ^30179184-9-12159-12172

    • ⏱ 2021-11-09 10:05:10

第 5 章 插敘:進程 API#

  • 📌 這種分離 fork () 及 exec () 的做法在構建 UNIX shell 的時候非常有用,因為這給了 shell 在 fork 之後 exec 之前運行代碼的機會,這些代碼可以在運行新程序前改變環境,從而讓一系列有趣的功能很容易實現。 ^30179184-10-7408-7515

    • ⏱ 2021-11-09 10:06:46
  • 📌 讓我們更詳細地理解一下 p1.c 到底發生了什麼 ^30179184-10-2186-2208

    • ⏱ 2021-11-09 10:08:55
  • 📌 UNIX 系統採用了一種非常有趣的創建新進程的方式,即通過一對系統調用:fork () 和 exec () ^30179184-10-631-679

    • ⏱ 2021-11-09 10:09:06

第 6 章 機制:受限直接執行#

  • 📌 運行一個進程一段時間,然後運行另一個進程,如此輪換。通過以這種方式時分共享(time sharing)CPU,就實現了虛擬化。 ^30179184-11-456-519

    • ⏱ 2021-11-09 10:09:44
  • 📌 第一個是性能:如何在不增加系統開銷的情況下實現虛擬化?第二個是控制權:如何有效地運行進程,同時保留對 CPU 的控制?控制權對於操作系統尤為重要,因為操作系統負責資源管理。如果沒有控制權,一個進程可以簡單地無限制運行並接管機器,或訪問沒有權限的信息。因此,在保持控制權的同時獲得高性能,這是構建操作系統的主要挑戰之一。 ^30179184-11-570-727

    • ⏱ 2021-11-09 10:09:55

第 15 章 機制:地址轉換#

  • 📌 1.用種子 1、2 和 3 運行,並計算進程生成的每個虛擬地址是處於界限內還是界限外?如果在界限內,請計算地址轉換。2.使用以下標誌運行:-s 0 -n 10。為了確保所有生成的虛擬地址都處於邊界內,要將 - l(界限寄存器)設置為什麼值?3.使用以下標誌運行:-s 1 -n 10 -l 100。可以設置界限的最大值是多少,以便地址空間仍然完全放在物理內存中?4.運行和第 3 題相同的操作,但使用較大的地址空間(-a)和物理內存(-p)。5.作為邊界寄存器的值的函數,隨機生成的虛擬地址的哪一部分是有效的?畫一個圖,使用不同隨機種子運行,限制值從 0 到最大地址空間大小。 ^30179184-20-14592
    • ⏱ 2021-10-13 09:08:27

第 16 章 分段#

  • 📌 如果我們將整個地址空間放入物理內存,那麼堆疊和堆之間的空間並沒有被進程使用,卻依然佔用了實際的物理內存。 ^30179184-21-548-599

    • ⏱ 2021-10-13 09:14:00
  • 📌 怎樣支持大地址空間 ^30179184-21-761-770

    • ⏱ 2021-10-13 09:14:04
  • 📌 分段:泛化的基址 / 界限 ^30179184-21-975-986

    • ⏱ 2021-10-13 09:14:08
  • 📌 一個基址和界限寄存器對,而是給地址空間內的每個邏輯段(segment)一對。一個段只是地址空間裡的一個連續定長的區域,在典型的地址空間裡有 3 個邏輯不同的段:代碼、堆疊和堆。 ^30179184-21-1106-1191

    • ⏱ 2021-10-14 12:41:07

第 26 章 並發:介紹#

  • 📌 第 26 章 並發:介紹 ^30179184-33-350-360
    • ⏱ 2022-01-14 09:15:03

第 46 章 關於分佈式的對話#

  • 📌 消息會丟失,機器會故障,磁碟會損壞數據,就像整個世界都在和你作對! ^30179184-51-1170-1203
    • ⏱ 2021-11-09 10:10:42

第 47 章 分佈式系統#

  • 📌 不只是與一台機器進行交互 ^30179184-52-510-522

    • ⏱ 2021-11-09 10:11:50
  • 📌 我們關注的主要是故障(failure) ^30179184-52-670-689

    • ⏱ 2021-11-09 10:12:02
  • 📌 系統性能(performance)通常很關鍵 ^30179184-52-1471-1493

    • ⏱ 2021-11-09 10:12:41
  • 📌 故障將是重點:通信層應如何處理故障? ^30179184-52-1824-1842

    • ⏱ 2021-11-09 10:13:35
  • 📌 丟包是網絡的基本現象。所以問題變成:應該如何處理丟包? ^30179184-52-2489-2516

    • ⏱ 2021-11-09 10:14:16
  • 📌 現代網絡的核心原則是,通信基本是不可靠的 ^30179184-52-1933-1953

    • ⏱ 2021-11-09 10:14:30
  • 📌 數據包都會經常丟失、損壞,或無法到達目的地。 ^30179184-52-1990-2012

    • ⏱ 2021-11-09 10:14:34
  • 📌 這種不可靠層的一個很好的例子,就是幾乎所有現代系統中都有的 UDP/IP 網絡棧 ^30179184-52-2727-2765

    • ⏱ 2021-11-09 10:15:39
  • 📌 UDP 是不可靠通信層的一個很好的例子 ^30179184-52-5420-5438

    • ⏱ 2021-11-09 10:19:55
  • 📌 使用校驗和檢查完整性 ^30179184-52-5705-5715

    • ⏱ 2021-11-09 10:20:08
  • 📌 我們需要一種額外的機制,稱為超時(timeout ^30179184-52-6866-6890

    • ⏱ 2021-11-09 10:20:40
  • 📌 超時和重試的組合導致一些人稱這種方法為超時 / 重試(timeout/retry)。非常聰明的一群人,那些搞網絡的,不是嗎?圖 47.4 展示了一個例子。 ^30179184-52-7020-7122

    • ⏱ 2021-11-09 10:20:53
  • 📌 這個例子中,丟失的不是原始消息,而是確認消息 ^30179184-52-7165-7187

    • ⏱ 2021-11-09 10:21:01
  • 📌 因此,發送方收到確認,但消息未被接收兩次,保證了上面提到的一次性語義。 ^30179184-52-7992-8027

    • ⏱ 2021-11-09 10:21:41
  • 📌 該機制被稱為順序計數器 ^30179184-52-8195-8206

    • ⏱ 2021-11-09 10:21:59
  • 📌 發送消息後,發送方遞增該值(到 N + 1) ^30179184-52-8334-8383

    • ⏱ 2021-11-09 10:22:42
  • 📌 因此接收器知道它已經接收到該消息。因此它會確認該消息,但不會將其傳遞給應用程序。以這種簡單的方式,順序計數器可以避免重複。 ^30179184-52-8754-8815

    • ⏱ 2021-11-09 10:23:06
  • 📌 常用的可靠通信層稱為 TCP/IP,或簡稱為 TCP ^30179184-52-8845-8869

    • ⏱ 2021-11-09 10:23:09
  • 📌 分佈式共享內存(Distributed Shared Memory,DSM)系統使不同機器上的進程能夠共享一個大的虛擬地址空間 [LH89] ^30179184-52-9727-9796

    • ⏱ 2021-11-09 10:23:46
  • 📌 例如,在第一次超時之後,客戶端可能會將其超時值增加到更高的量,可能是原始值的兩倍。這種指數倒退(exponential back-off)方案,在早期的 Aloha 網絡中實施,並在早期的以太網 [A70] 中採用,避免了資源因過量重發而過載的情況。健壯的系統力求避免這種過載。 ^30179184-52-9504-9639

    • ⏱ 2021-11-09 10:24:08
  • 📌 另一個問題是性能 ^30179184-52-10271-10279

    • ⏱ 2021-11-09 10:25:11
  • 📌 遠程過程調用(RPC ^30179184-52-10496-10506

    • ⏱ 2021-11-09 10:25:57
  • 📌 主要的抽象是基於遠程過程調用(Remote Procedure Call),或簡稱 RPC [BN84]。 ^30179184-52-10591-10757

    • ⏱ 2021-11-09 10:26:11
  • 📌 其餘的由 RPC 系統處理,RPC 系統通常有兩部分:存根生成器(stub generator,有時稱為協議編譯器,protocol compiler)和運行時庫(run-time library)。接下來將更詳細地介紹這些部分。 ^30179184-52-10882-10994

    • ⏱ 2021-11-09 10:26:30
  • 📌 並發性的伺服器組織方式 ^30179184-52-13277-13288

    • ⏱ 2021-11-09 10:29:00
  • 📌 如果一個 RPC 調用阻塞(例如,在 I/O 上),就會浪費伺服器資源。因此,大多數伺服器以某種並發方式構造。常見的組織方式是線程池(thread pool) ^30179184-52-13342-13417

    • ⏱ 2021-11-09 10:29:16
  • 📌 線程不斷接收其他請求,並可能將其發送給其他工作線程。 ^30179184-52-13488-13514

    • ⏱ 2021-11-09 10:29:27
  • 📌 當前互聯網協議提供的主機名和端口號 ^30179184-52-13872-13889

    • ⏱ 2021-11-09 10:37:17
  • 📌 可靠的通信層之上構建 RPC 可能會導致性能的低效率 ^30179184-52-14371-14395

    • ⏱ 2021-11-09 10:37:43
  • 📌 可靠的通信層如何工作:確認和超時 / 重試 ^30179184-52-14404-14423

    • ⏱ 2021-11-09 10:37:48
  • 📌 許多 RPC 軟體包都建立在不可靠的通信層之上,例如 UDP。 ^30179184-52-14580-14608

    • ⏱ 2021-11-09 10:37:59
  • 📌 47.6 小結我們介紹了一個新主題,分佈式系統及其主要問題:如何處理故障現在是常見事件。正如人們在 Google 內部所說的那樣,當你只有自己的桌面計算機時,故障很少見。當你擁有數千台機器的數據中心時,故障一直在發生。所有分佈式系統的關鍵是如何處理故障。我們還看到,通信是所有分佈式系統的核心。在遠程過程調用(RPC)中可以看到這種通信的常見抽象,它使客戶端能夠在伺服器上進行遠程調用。RPC 包處理所有細節,包括超時 / 重試和確認,以便提供一種服務,很像本地過程調用。真正理解 RPC 包的最好方法,當然是親自使用它。Sun 的 RPC 系統使用存根編譯器 rpcgen,它是很常見的,在當今的許多系統上可用,包括 Linux。嘗試一下,看看所有這些麻煩到底是怎麼回事。參考資料 [A70]“The ALOHA System — Another Alternative for Computer Communications”Norman AbramsonThe 1970 Fall Joint Computer ConferenceALOHA 網絡開創了網絡中的一些基本概念,包括指數倒退和重傳。多年來,這些已成為共享總線以太網網絡通信的基礎。[BN84]“Implementing Remote Procedure Calls” Andrew D. Birrell, Bruce Jay NelsonACM TOCS, Volume 2:1, February 1984 基礎 RPC 系統,其他所有理論都基於此。是的,它是我們在 Xerox PARC 的朋友們的另一項開創性努力的結果。 ^30179184-52-16865

    • ⏱ 2021-11-09 10:38:39
  • 📌 要構建可靠的文件傳輸,必須包括端到端的可靠性檢查,例如,在整個傳輸完成後,讀取接收方磁碟上的文件,計算校驗和,並將該校驗和與發送方文件的校驗和進行比較。按照這個準則的推論是,有時候,較低層提供額外的功能確實可以提高系統性能,或在其他方面優化系統。因此,不應該排除在系統中較低層的這種機制。實際上,你應該小心考慮這種機制的實用性,考慮它最終對整個系統或應用程序的作用。RPC 包通常在其消息格式中提供明確定義的字節序,從而處理該問題。在 Sun 的 RPC 包中,XDR(eXternal Data Representation,外部數據表示)層提供此功能。如果發送或接收消息的計算機與 XDR 的字節順序匹配,就會按預期發送和接收消息。 ^30179184-54-14643

    • ⏱ 2022-01-14 09:14:39

第 48 章 Sun 的網絡文件系統(NFS)#

  • 📌 分佈式客戶端 / 伺服器計算的首次使用之一,是在分佈式文件系統領域。在這種環境中,有許多客戶端機器和一個伺服器(或幾個)。伺服器將數據存儲在其磁碟上,客戶端通過結構良好的協議消息請求數據。圖 48.1 展示了基本設置。[插圖] 圖 48.1 一般的客戶端 / 伺服器系統從圖中可以看到,伺服器有磁碟,發送消息的客戶端通過網絡,訪問伺服器磁碟上的目錄和文件。為什麼要麻煩,採用這種安排?(也就是說,為什麼不就讓客戶端用它們的本地磁碟?)好吧,這種設置允許在客戶端之間輕鬆地共享(sharing)數據。因此,如果你在一台計算機上訪問文件(客戶端 0),然後再使用另一台(客戶端 2),則你將擁有相同的文件系統視圖。你可以在這些不同的機器上自然共享你的數據。第二個好處是集中管理(centralized administration)。例如,備份文件可以通過少數伺服器機器完成,而不必通過眾多客戶端。另一個優點可能是安全(security),將所有伺服器放在加鎖的機房中。關鍵問題:如何構建分佈式文件系統如何構建分佈式文件系統?要考慮哪些關鍵方面?哪裡容易出錯?我們可以從現有系統中學到什麼? ^30179184-53-359
    • ⏱ 2021-11-09 10:40:01

讀書筆記#

第 4 章 抽象:進程#

劃線評論#

  • 📌 目前還不清楚這是不是一個很好的決定 ^7265636-7uG78TXby
    • 💭 可以按優先級分配,如果立即切換可能造成一個頻繁切換上下文,效率更低.
    • ⏱ 2021-11-09 09:28:51

劃線評論#

  • 📌 ,當進程向磁碟發起 I/O 請求時,它會被阻塞,因此其他進程可以使用處理器。 ^7265636-7uG6WqgFc
    • 💭 線程阻塞
    • ⏱ 2021-11-09 09:25:47

第 16 章 分段#

劃線評論#

  • 📌 分段(segmentation)的概念應運而生。分段並不是一個新概念,它甚至可以追溯到 20 世紀 60 年代初期 [H61, G62]。這個想法很簡單,在 MMU 中引入不止一個基址和界限寄存器對,而是給地址空間內的每個邏輯段(segment)一對。一個段只是地址空間裡的一個連續定長的區域,在典型的地址空間裡有 3 個邏輯不同的段:代碼、堆疊和堆。分段的機制使得操作系統能夠將不同的段放到不同的物理內存區域,從而避免了虛擬地址空間中的未使用部分佔用物理內存。 ^7265636-7u2LJkG3F
    • 💭 原來如此呀
    • ⏱ 2021-10-14 12:41:45

第 46 章 關於分佈式的對話#

劃線評論#

  • 📌 複製,重試,以及各種其他技巧。人們隨著時間的推移開發了這些技巧,用於檢測故障,並從故障中恢復。 ^7265636-7uG9Uidei
    • 💭 分佈式一
    • ⏱ 2021-11-09 10:11:04

第 47 章 分佈式系統#

劃線評論#

  • 📌 在第一種(最佳)情況下,頁面已經是機器上的本地頁面,因此可以快速獲取數據。在第二種情況下,頁面目前在其他機器上。發生頁面錯誤,頁面錯誤處理程序將消息發送到其他計算機以獲取頁面,將其裝入請求進程的頁表中,然後繼續執行。 ^7265636-7uGaS0mwP
    • 💭 不實用.穩定性和性能問題
    • ⏱ 2021-11-09 10:25:46

劃線評論#

  • 📌 為了讓接收方能夠檢測重複的消息傳輸,發送方必須以某種獨特的方式標識每個消息,並且接收方需要某種方式來追蹤它是否已經看過每個消息 ^7265636-7uGaER0eS
    • 💭 原來序號是這樣來的、確認可能丟失
    • ⏱ 2021-11-09 10:22:32

劃線評論#

  • 📌 為了讓接收方能夠檢測重複的消息傳輸,發送方必須以某種獨特的方式標識每個消息,並且接收方需要某種方式來追蹤它是否已經看過每個消息 ^7265636-7uGaC1Akt
    • 💭 序號
    • ⏱ 2021-11-09 10:21:50
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。