[作業系統] 計算機組織與結構
計算機組織與結構 計算機抽象化與科技 指令集架構 計算機算術 處理器 Pipeline 記憶體 參考資料 黃婷婷 清大開放式課程 計算機結構 Mr. opengate
計算機組織與結構 計算機抽象化與科技 指令集架構 計算機算術 處理器 Pipeline 記憶體 參考資料 黃婷婷 清大開放式課程 計算機結構 Mr. opengate
CPU 個數、核心數、執行緒數 定義 CPU 個數即 CPU 晶片個數。 **CPU 核心數(core)**是指物理上,也就是硬體上存在著幾個核心。比如,雙核就是包括 2 個相對獨立的 CPU 核心單元組,四核就包含 4 個相對獨立的 CPU 核心單元組。 **執行緒數(thread)**是一種邏輯的概念,簡單地說,就是模擬出的 CPU 核心數。比如,可以通過一個 CPU 核心數模擬出 2 執行緒的 CPU,也就是說,這個單核心的 CPU 被模擬成了一個類似雙核心 CPU 的功能。我們從工作管理員的效能標籤頁中看到的是兩個 CPU。比如 Intel 賽揚 G460 是單核心、雙執行緒的 CPU,Intel 酷睿 i3 3220 是雙核心、四執行緒,Intel 酷睿 i7 4770K 是四核心、八執行緒,Intel 酷睿 i5 4570 是四核心四執行緒等等。對於一個 CPU,執行緒數總是大於或等於核心數的。一個核心最少對應一個執行緒,但通過超執行緒(Hyper Thread)技術,一個核心可以對應兩個執行緒,也就是說它可以同時執行兩個執行緒。 CPU 的執行緒數概念僅僅只針對 Intel 的 CPU 才有用,因為它是通過 Intel 超執行緒技術來實現的,最早應用在 Pentium4 上。如果沒有超執行緒技術,一個 CPU 核心對應一個執行緒。所以,對於 AMD 的 CPU 來說,只有核心數的概念,沒有執行緒數的概念。 為何要增加執行緒數? CPU 之所以要增加執行緒數,是源於多工處理(multi-tasking)的需要。執行緒數越多,越有利於同時執行多個程式,因為執行緒數等同於在某個瞬間 CPU 能並行處理(concurrent)的任務數。因此,執行緒數是一種邏輯的概念,簡單地說,就是模擬出的 CPU 核心數。一個核心最少對應一個執行緒,但英特爾有個超執行緒技術可以把一個物理執行緒模擬出兩個執行緒來用,充分發揮 CPU 效能,即一個核心可以有兩個到多個執行緒。 intel x86:一核心有 2 個邏輯執行緒。 IBM power8:一核心有 8 個邏輯執行緒。 多核 CPU 多核心 CPU 主要分原生多核和封裝多核。 原生多核指的是真正意義上的多核,最早由 AMD 提出,每個核心之間都是完全獨立的,都擁有自己的前端匯流排,不會造成衝突,即使在高負載狀況下,每個核心都能保證自己的效能不受太大的影響,通俗的說,原生多核的抗壓能力強,但是需要先進的工藝,每擴充套件一個核心都需要很多的研發時間。 封裝多核是隻把多個核心直接封裝在一起,比如 Intel 早期的 PD 雙核系列,就是把兩個單核直接封裝在一起,但兩核心只能共同擁有一條前端匯流排,在兩個核心滿載時,兩個核心會爭搶前端匯流排,導致效能大幅度下降,所以早期的PD被扣上了高頻低能的帽子,要提高封裝多核的效能,在多工的高壓下儘量減少效能損失,只能不斷的擴大前端匯流排的總體大小,來彌補多核心爭搶資源帶來的效能損失,但這樣做只能在一定程度上彌補效能的不足,和原生的比起來還是差了很多,而且後者成本比較高,優點在於多核心的發展要比原生快的多。 核心 核心(Die)又稱為核心,是 CPU 最重要的組成部分。CPU 中心那塊隆起的晶片就是核心,是由單晶矽以一定的生產工藝製造出來的,CPU 所有的計算、接受/儲存命令、處理資料都由核心執行。各種 CPU 核心都具有固定的邏輯結構,一級快取、二級快取、執行單元、指令級單元和匯流排介面等邏輯單元都會有科學的佈局。 多核心處理器(Multi-core processor) 又稱多核心微處理器,是在單個 CPU 中,加入兩個或以上的獨立實體中央處理單元,或稱核心(core)。這些核心可以分別獨立地執行程式指令,利用平行計算的能力加快程式的執行速度。只有兩個核心的處理器,稱為雙核心處理器(dual-core processor)。多核心通常是對於中央處理器 CPU 而論的,但是某些時候也指 DSP 和 SoC。 把將兩個或更多獨立處理器封裝在一個單一積體電路(IC)中的方案稱為多核心處理器;而封裝在不同 IC 中的獨立處理器形成的計算機系統被稱為多處理器。 多核心處理器 != 多處理器 多核心處理器可以在不將每個核心分別獨立物理封裝的情況下進行多工處理(執行緒級併發處理(Thread-Level Parallelism, TLP),這種形式的TLP通常被認為是晶片級多處理。 單核多 CPU 與多核單 CPU 一台計算機的處理器部分的架構 ...
計算機作業系統 概述 進程管理 死鎖 記憶體管理 設備管理 鏈接 參考資料 cyc2018 Mr. opengate
準備中
準備中
準備中
進程管理 進程與執行緒 1. 進程(process) 進程是資源分配的基本單位。 進程控制塊(Process Control Block, PCB)描述進程的基本訊息和運行狀態,所謂的創建進程和撤銷進程,都是指對 PCB 的操作。 2. 執行緒(thread) 執行緒又稱線程,是獨立調度的基本單位。 一個進程可以有多個執行緒,它們共享進程資源。 以瀏覽器(browser)為例,瀏覽器進程有很多執行緒,如 HTTP 請求(request)、事件響應、渲染。執行緒的並行處理(concurrent)使得瀏覽器中點擊一個新的超連結從而發起 HTTP 請求時,瀏覽器還可以響應用戶的其它事件。 3. 區別 擁有資源 進程是資源分配的基本單位,但是執行緒不擁有資源,而是訪問隸屬進程的資源。 調度 執行緒是獨立調度的基本單位,在同一進程中,執行緒的切換不會引起進程切換,從一個進程中的執行緒切換到另一個進程中的執行緒時,才會進行進程的切換。 系統開銷 由於創建或撤銷進程時,系統都要為之分配或回收資源,如硬碟中的記憶體、I/O 設備等,所付出的開銷遠大於創建或撤銷執行緒時的開銷。 同樣的,在進行進程切換時,涉及當前執行進程 CPU 環境的保存及新調度進程 CPU 環境的設置,而執行緒切換只需保存和設置少量暫存器的內容,開銷較小。 通訊 執行緒可以通過直接讀寫同一個進程中的數據進行通訊,但是進程的通訊需要借助 IPC(inter-process communication)。 進程狀態的切換 就緒就態(ready):等待被調度 執行狀態(running) 阻塞狀態(waiting):等待資源 只有就緒狀態和執行狀態可以相互轉換,其它的都是單向轉換。就緒狀態的進程通過調度演算法從而獲得 CPU Time,轉為執行狀態;而執行狀態的進程,在分配給它的 CPU Time 片段用完之後就會轉為就緒狀態,等待下一次調度。 阻塞狀態是缺少需要的資源從而由執行狀態轉換而來,但是該資源不包括 CPU Time, 缺少 CPU Time 會從執行狀態轉換為就緒狀態。 進程調度演算法 不同環境的調度演算法目標不同,因此需要針對不同環境來討論調度演算法。 1. 批次處理系統(batch system) 批次處理系統沒有太多的用戶操作,在該系統中,調度演算法目標是保証吞吐量和周轉時間(從提交到終止的時間)。 1.1 先來先服務(first-come first-served, FCFS) 非搶占式的調度,按照請求的順序進行調度。 有利於長作業,不利於短作業,因為短作業必須一直等待前面的長作業執行完畢才能執行,而長作業又需要執行很長時間,造成短作業等待時間過長 1.2 短作業優先(shortest job first, SJF) 非搶占式的調度算法,按估計運行時間最短的順序進行調度。 長作業有可能會永遠做不完,處於一直等待短作業執行完畢的狀態。因為如果一直有短作業到來,那麼長作業永遠得不到調度。 1.3 最短剩餘時間優先(shortest remaining time next, SRTN) 最短作業優先的搶占式版本,按剩餘運行時間的順序進行調度。當一個新的作業到達時,其整個運行時間與當前進程的剩餘時間作比較。如果新的進程需要的時間更少,則夠停當下進程,運行新的進程;否則則讓新的進程進入等待。 2. 交互式系統(time-sharing system) 交互式系統有大量的用戶交互操作,在該系統中調度演算法的目標是快速地進行響應。 2.1 時間片段輪轉(robin round scheduling, RR) 將所有就緒進程按 FCFS 的原則排成一個佇列,每次調度時,把 CPU 時間分配給佇首進程,該進程可以執行一個時間片段,當時間片段用完時,由計時器發出時鐘中斷,調度程序便停止該進程的執行,並將它送往就緒佇尾,同時繼續把 CPU 時間分配給佇首的進程。 時間片段輪轉演算法的效率和時間片段的大小很有關係: 因為進程切換都要保存進程的訊息並且載入新進程的訊息,如果時間片段太小,會導致頻繁地切換進程,導致時間浪費。 而如果時間片段過長,那麼實時性就不能得到保証。 2.2 優先級調度(priority scheduling) 為每個進程分配一個優先級,按優先級進行調度。 為了防止低優先級的進程永遠等不到調度,可以隨著時間的推移增加等待進程的優先級。 2.3 多級反饋佇列(Multilevel Feedback-Queue Scheduling, MLFQ) 一個進程需要執行 100 個時間片段,如果採用時間片段輪轉調度演算法,那麼需要交換 100 次。 多級佇列是為這種需要連續執行多個時間片段的進程考慮,它設置了多個佇列,每個佇列時間片段大小都不同,例如 1, 2, 4, 8,…。進程在第一個佇列沒執行完,就會被移到下一個佇列。這種方式下,之前的進程只需要交換 7 次。 每個佇列優先權也不同,最上面的優先權最高。因此只有上一個佇列沒有進程在排隊,才能調度當前佇列上的進程。可以將這種調度算法看成是時間片段輪轉調度算法和優先級調度算法的結合。 3. 實時系統(real time system) 實時系統要求一個請求在一個確定時間內得到響應。 分為硬實時和軟實時,前者必須滿足絕對的截止時間,後者可以容忍一定的超時。 進程同步 1. 臨界區 對臨界資源進行訪問的那段代碼稱為臨界區。 為了互斥訪問臨界資源,每個進程在進入臨界區之前,需要先進行檢查。 // entry section // crtical section; // exit section 2. 同步與互斥(synchronization and mutex) 同步(synchronization):多個進程因為合作產生的直接制約關係,使得進程有一定的先後執行關係。 互斥(mutual exclusion, mutex):多個進程在同一時刻只有一個進程能進入臨界區。 3. 號誌(Semaphore) 號誌,或稱信號量,是一個整數變數,可以對其執行 down 和 up 操作,也就是常見的 P 和 V 操作。 down:如果號誌量大於 0,執行 -1 操作;如果號誌等於 0,進程睡眠,等待號誌大於 0。 up:對號誌執行 +1 操作,喚醒睡眠的進程讓其完成 down 操作。 down 和 up 操作需要被設計成原語,不可分割,通常的做法是在執行這些操作的時候屏蔽中斷。 如果號誌的取值只能為 0 或者 1,那麼就成為了互斥(mutex),0 表示臨界區已經加鎖,1 表示臨界區解鎖。 typedef int semaphore; semaphore mutex = 1; void P1(){ down(&mutex); // critical section up(&mutex); } void P2(){ down(&mutex); // critical section up(&mutex); } 使用號誌實現生產者-消費者問題 ...
作業系統 簡介 電腦系統主要可分成四個部分,或分成硬體(hardware)、軟體(software)、數據(data) 硬體(hardware):為系統提供基本的計算資源。 中央處理器(central processing unit, CPU) 記憶體(memory) I/O 裝置 應用程式(Application programs):定義資源如何用來解決使用者的計算問題。 使用者(users) 作業系統(Operating system, OS): 作業系統(Operating system, OS) 是管理電腦硬體與軟體資源的電腦程式,同時也是電腦系統的核心與基石。 OS 最主要的兩個功能是: 資源分配:根據需求調配資源分配率(resource utilization)與效能(performance) 監控使用者程式的執行,避免不正常的運作造成對系統的危害。 一個標準的 PC 作業系統應該提供以下的功能: 行程管理(Processing management) 記憶體管理(Memory management) 檔案系統(File system) 網路通訊(Networking) 安全機制(Security) 使用者介面(User interface) 驅動程式(Device drivers) PC 基本特徵 1. 並行計算(Concurrent computing) Concurrent computing 是指宏觀上在一段時間內能同時運行多個進程,微觀上是交替發生的;而平行計算(parallel computing) 則指同一個時間內能運行多個指令。 平行計算需要硬體支持,如多線程(multi-thread)、多核處理器(multi-core processor)或者分散式計算機系統(distributed OS)。 作業系統通過引入進程(process)與線程(thread),使程式能夠並行運作。 2. 分享(Sharing) 共享是指系統中的資源可以被多個並行進程共同使用。 有兩種共享方式:互斥共享(mutual exclusion)與同時訪問(time sharing)。 互斥共享的資源稱為臨界資源(critical resources),例如印表機等,在同一時間內只允許一個進程訪問,需要用同步機制來實現互斥訪問。 3. 虛擬(Virtual) 虛擬技術把一個物理實體轉換為多個邏輯實體。 主要有兩種虛擬技術:分時技術(time sharing)、空間分享技術。 多個進程能在同一個處理器上並行處理使用了分時技術,讓每個進程輪流占用處理器,每次只執行一小個時間片段並快速切換。 虛擬記憶體使用了空間分享技術,它將物理記憶體抽象化為地址空間,每個進程都有各自的地址空間。地址空間的頁被映射到物理記憶體中,地址空間的頁並不需要全部在物理記憶體中,當使用到一個沒有物理記憶體的頁時,執行頁面置換演算法,將該頁置換到記憶體中。 4. 異步(Asynchronous) 異步指進程不是一次性執行完畢,而是走走停停,以不可知的速度向前推進。 基本功能 1. 進程管理(Process management) 進程管理、進程同步、進程通信、死鎖處理、處理調度等。 2. 記憶體管理(Memory management) 記憶體分配、地址映射、記憶體保護與共享、虛擬記憶體等。 3. 文件管理(File management) 文件儲存空間的管理、目錄管理、文件讀寫管理和保護等。 4. 設備管理(Equipment management) 完成用戶的 I/O 請求,方便用戶使用各種設備,並提高設備的利用率。 主要包含緩衝管理、設備分配、設備處理、虛擬設備等。 系統調用 如果一個進程在用戶模式(user mode)需要使用內核模式(kernel mode)的功能,就進行系統調用從而陷入內核,由作業系統代為完成。 Linux 的系統調用主要有以下這些: Task Commands 進程控制 fork(); exit(); wait(); 進程通信 pipe(); shmget(); mmap(); 文件操作 open(); read(); write(); 設備操作 ioctl(); read(); write(); 訊息維護 getpid(); alarm(); sleep(); 安全 chmod(); umask(); chown(); 內核與微內核 ...
準備中
計算機的抽象化與科技 1.1 簡介 有賴於科技高速的成長,計算機工業出現了嶄新的型態,計算機導致了文明的第三次革命-資訊革命,與農業革命和工業革命並駕齊驅。如科幻電影般的生活應用,也如雨後出筍般的出現。 汽車 手機 人類基因組計劃(Human genome project) 全球網路(World Wide Web) 搜尋引擎 計算機的應用分類與其特性 個人電腦(Personal Computer, PCs) 伺服器(Servers) 通過網路連接其它的工作站或電腦,通常面向單一且複雜大型的科學或工程應用,也可能是多而小的工作。 成本和功能的差異性也最廣,可以是沒有螢幕沒有鍵盤的桌電,也可以是如超級計算機(supercomputers)這樣的極端。 嵌入式計算機(Embedded Computers) 最大的計算機類別,也涵蓋最廣泛的應用和性能。 通常具有獨特的應用要求,這些要求將最低效能發揮的淋漓盡致,使成本與功耗成為很重要的指標。 後PC時代 個人行動裝置(Poersonal Mobile Device, PMD) 如智慧型手機與平板的出現,取代的 PC 的地位。 雲端計算(Cloud Computing) 取代了傳統伺服器,這些雲端計算建構在「倉庫規模計算機」(Warehouse Scale Computer, WSC)。 企業如Google、Amazon,提供了 WSC 的租借服務,這類通過雲端佈署的「軟體即服務」(Software as a Service, SaaS),正在改變軟體業。 學習目標 過去在硬體的限制下,程式設計師需要嚴格的考慮程式的效能:減少記憶體空間以使程式更快。 在計算機設計與記憶體科技的進步下,取而代之程式設計師要考量的事情變成:處理器的並行性和記憶體的分層,或諸如在 PMD 或雲端上運行的程式的能源效率問題。 以下是我們將要學習的目標: 用高級語言編寫的程式如何翻譯成硬體語言,以及硬體如何執行生成的程式?藉此可以理解硬體與軟體的關係,也與程式的性能有關聯。 軟體和硬體間的介面是什麼,軟體如何指示硬體執行所需的工作?這些概念對於理解如何編寫多種軟體至關重要。 什麼決定了一個程式的性能,程式設計師如何提高性能?這關係了源始碼編譯成電腦的語言時,硬體執行程式的效率。 硬體設計人員可以使用哪些技術來提高性能(Performance)? 硬體設計人員可以使用哪些技術來提升能源效率(Energy Efficiency)?程式設計師又如何協助改善? 什麼理由導致了循序處理(Sequential processing)轉變成了平行處理(Parallel processing)? 自第一台商用計算機問世以來,計算機架構師提出了哪些想法來奠定現代計算的基礎? 1.2 計結中八個重要的思想 摩爾定律(Moore’s Law)之於設計 摩爾定律源於 Intel 創辦人之一的 Gordon Moore 對 IC 容量增長的預測。 由於計算機設計需耗時數年,而晶片的成長使得計算機架構師在設計時,必須將眼光放到設計完成時的技術狀態,而非當下。 用抽象化(Abstraction)來簡化設計 程式設計師與計算機架構師都必須要不斷發明新的技術以面對日益更新的科技, 抽象化是一種分層設計的概念。對程式設計師而言,低階的細節被忽略,只需要遵從簡單的模型或規範去進行設計。而硬體工程師則是要去實現出這個定義好的模型的硬體、細節部分。 快速處理常見情況 將常使用的指令進行優化(common case fast),比起其它不常使用的指令,更能提升效能。 何者為最常使用的指令,必須透過嚴密的實驗與測量才以得知。 平行處理(parallelism) Pipeline 預測 某些情況下,將硬體的效能預測的高一點,好過於等到效能滿足才開始設計。 記憶體的結構化(hierarchy) 透過將記憶體分層,將最快、最小、最昂貴的部分置於層狀結構的頂層;而最慢、最大、最便宜的記憶體置於層狀結構的底層。 用多餘創造可靠性(dependability) 計算機不只要速度快,還要具有可靠性。任何物理設備都可能發生故障,此時可以透過引入冗餘的元件來使系統變的更可靠,這些冗餘的元件可以在發生故障時接管工作並協助檢測故障。 1.3 抽象化 ...