Featured image of post 作業系統筆記

作業系統筆記

作業系統的筆記

[058]

作業系統怎麼念?筆記看熟,蓋起來唸,念架構,可以自己把章節結構畫出來

image-20230416131258531

申論題平常在練習時,假設一天練習十題的情境下,

3題動手去寫,剩下7題把架構畫出來就好

[TOC]

Chapter1 Intruduction

管理硬體的軟體就是作業系統,硬體包含CPU,Memory,I/O設備等等…作業系統就是負責管理這些硬體的系統。一個電腦系統可以被粗略的劃分成下面四個組件:

  • 硬體(hardware)
  • 作業系統(operating system)
  • 應用程式(application programs)
  • 使用者(user)

image-20220918222340597

Hardware

包括CPU(Central Processing Unit),記憶體(Memory),Input/output設備…提供給系統基本的計算資源

Operating System

負責協調硬體與應用程式,給不同的使用者

Application Programs

例如Word,Excel,Chrome之類的應用程式,來處理使用者的計算問題(Computing Problems)

補充:

  1. Bare Machine(裸機): 純粹只有硬體組成,沒有OS及System Programs
  2. Extended Machine: Bare Machine加上OS/system programs

image-20221029143145761

  • In Memory
    • Command Interpreter(命令解譯器)

Multiprogramming System

  1. 定義:系統允許多個Jobs(Process)同時執行,即是Multiprogramming
  • 主要目的:提高CPU Utilization
  • 作法:透過Job Scheduling or CPU Scheduling技術達成

example:當執行中的process waiting for I/O completed, 則OS可將CPU切換給另一個process執行,避免CPU idle 。

即只要系統內有夠多的工作存在,則CPU IDLE的機會就下降

  1. Mulitiprogramming Degree之定義
  • 系統內的Process的數目:一般而言,Degree越高,CPU利用率就越高。

(Note:Virtual Memory Thrashing狀況除外)

  1. 多個Process的定義、以及如何執行

    1. Concurrent execution(並行):一顆CPU,大家一起輪番使用

    image-20221102220045970

    1. Parallel execution(平行):多顆CPU或是Multi-core(多核),各自執行

image-20221102220202298

Time-Sharing System

分時系統

定義:又叫Multitasking[恐龍本如是說]

It’s a logical extension of Multiprogeamming system

與Multiprogramming的最大差異:CPU的切換頻率極高

  • Time-Sharing System features

    • 強調對User Response的時間(<1秒)
    • 適用於user interactive的Computing/ Environment
    • 對每一個process都公平

Main Frame(主機)

image-20221102223550343

  • CPU Scheduling採取RR的排班法則(第四章會介紹)
  • 使用Virtual Memory的技術,擴展Logical Memory Space
  • 使用Spooling的技術(不太會考)實現I/O Device的共用,類似現代的Buffering技術,讓每個user,皆以為自己有專屬的的Computer

Multiprocessors System

定義:又叫Multiprocessing or Paraller or Tightly-coupled system(緊密耦合系統)

faeture:

  1. 一個機器(or MotherBoard)內,有多個Processors(or CPUs)
  2. 這些CPUs彼此共享此機器的Memory,Bus,I/O-Device, power-supplier etc…
  3. 通常受同一Clock之時脈控制
  4. 由同一個OS管理
  5. processors之間的溝通大都採shared Memory方式

image-20221106193948248

Benefits(好處):

  1. Increased Throughput:產能增加
  2. Increased Reliability:可靠度的提升
  3. Economy Of Scale:運算能力的擴充比較好

 分析如下:

Increased Throughput:

可支持多個工作在不同CPU上平行執行(paraller Computing),注意,N顆CPU之產能絕對小於1顆CPU產能xN倍,意即CPU數量的提升與產能的提升並非線性成長。原因是因為

  1. Resource Contetion(資源的競爭)
  2. Processors間的Communication會抵消產能

Increased Reliability:

某一顆CPU壞了,則System不會因此而停頓,因為其他CPU仍可運作

  1. Graceful degradation(漸進式的滅亡)
  • System不至因為某些Hardward/Software之元件故障而停頓,仍然保有持續運作的能力,這性質就稱為fail-soft
  1. Fault-Tolerant system(容錯系統)考試不太會考

    • 具有graceful degradation性質之系統就叫做Fault-Tolerant system,想要達成容錯的技術需要有兩件事情的支援
    1. 要有backup的系統,切換也要流暢

Economy of Scale:

運算能力擴充符合經濟效益

  • ∵N顆CPU在一部機器內,與N部機器相比,成本較便宜∵這些CPUs共享同一機器之Memory, Bus, I/O-Device, etc

Two SubType in Multiprocessors System

  1. SMP(Symmetric MultiProcessors) 對稱的
  2. ASMP(Asymmetric MultiProcessors) 非對稱的

SMP

定義:每個Processor的工作能力是相同的(Identical),且每個CPU都有對等、平等的權利來存取資源

優點:

  1. 可靠度較ASMP高,因工作能力相同,即使其中一個cpu掛了也可以被立刻取代
  2. 效能較高

缺點:

  1. SMP的OS設計開發較為複雜(互斥存取的機制設計,資源的競爭)

ASMP

定義:每個Processor之工作能力不盡相同,通常是採取Master-Slave的架構(恐龍本有時候會寫成Boss-Employee

Master-Processor負責工作分派及資源分配,監督Slaves等管理工作

Slave Processors負責執行工作

優點:ASMP的OS設計開發較為Simple,∵與Simple-Cpu Os版類似

缺點:

  1. 可靠度低,Master CPU如果壞了,就會停擺,直到另一顆CPU被Train接手
  2. 效能較低∵Master CPU是瓶頸

image-20221108212149764

Multiprocessors System VS MultiCores CPU

從作業系統來看差異不大,主要差異是硬體的差異(主要),以OS來看,你裝了一顆兩核的CPU,OS會視作兩顆CPU;裝四核的視作四顆CPU

  1. MultiProcessors

image-20221108214627937

  1. MultiCores CPU

image-20221108214639509

優點

  1. Power Saving:相較MultiProcessor,在一個CPU上提供兩個Core的能源耗損會比在一張板子上提供兩顆CPU的能源耗損還來得低。
  2. Speed比較快(∵處在同一個晶片內資料傳輸速度較快)

Distribute System

定義:又叫Loosely-Coupled system(鬆散耦合系統),主要的Feature如下

  1. 多部機器彼此透過Network(or Bus)相互串連

  2. 每部機器之CPU有各自私有的Memory, Bus, I/O-Device, etc 並非共享

  3. 各CPU之Clock時脈控制不一定相同

  4. 各CPU上之OS也不一定相同

  5. 各Processors之間的溝通大都採**“Message Passing”**方式

    Message Passing (類似講電話)

    Step

    1. 建立Communication Link
    2. Message 相互傳輸
    3. 釋放Link

image-20221110232152377

Advantage of Distribute-System

  1. Increased Throughput(支持Paraller Computing)
  2. Increased Reliability(一個掛掉,還有其他可以擋)
  3. Resource Sharing(資源共享因此成本降低)

支持"Client-Server" Computing Model之實施

  1. Server(伺服器):提供某些服務的機器 example: mail server, file server ,DNS,printer server, computing server …
  2. Client:本身不提供服務,且它需要某些服務時,則發請求至Server, Server服務完再將結果回傳Client

Note

Peer-to-Peer model:peer意指同時具有server及Client的角色,英文意思是同等的、對等的

  1. Remote sites Communication的需求被滿足 example:email, FTP via Internet

Real-Time System

(即時系統)

分成兩種

  1. Hard real-time System
  2. Soft real-time System

Hard real-time system

定義:This system must ensure the critical tasks complete on time,即工作必須在規定的時間限制內完成,否則即算失敗

舉例:軍事防衛系統、核能安控系統、工廠自動化生產…

image-20221114224122357

設計考量:

  • 所有時間延遲之因素皆須納入考量 eg:sensor data 傳輸速度、運算速度、Signal的傳輸 etc,確保這些時間的加總能夠滿足時間deadline的要求
  • 所有會造成處理時間過久或無法預測之設備或機制,盡量少採用或不用 eg:Disk不用或少用、Virtual Memory 絕對不採用
  • 就CPU Scheduling設計(Ch4)而言,需先考量Schedulable與否,再進行排程(eg rate-monotonic, EDF scheduling),確定CPU能負荷再進行排程
  • Time Sharing system 無法與之並存(Time sharing是屬於Multitasking,可以同時執行多個程序,並透過一些風勢去優先執行某些程序,而Hard real-time比較像單運算系統,要求在指定時間內完成,因此更專注於單一程序的執行,由於這兩個系統有這樣的差異,因此無法共榮)
  • OS所造成的Dispatch latency etc. 宜降低(interrupt的處理, system call的請求),一般實務上,hard-real-time system,鮮少有OS的存在(幾乎不存在),尤其是embedded real-time system,因需要及時的響應
  • 現行的商用OS不支援Hard real-time features 通常都是客製化的特殊設計eg : Linux, Unix, Window, Apple Os, Solaris etc

Soft real-time system

定義:This system must ensure the real-time process get the hightest priority than the others and retain(維持) this priority level unit it completed

舉例:Multimedia System, Simulation system, VR system, etc

設計考量:

  • 就 CPU Scheduling 設計(ch4)而言,
    1. 必須支持preemptive priority scheduling
    2. 不可提供Aging技術(活得越久,priority越高)
  • 盡量降低kernel的Dispatch latency time
  • 可支援virtual memory 並存,但前提是real-time-process的全部pages必須皆待在memory中,直到完工,高優先權的Process不要使用virtual memory
  • 與Time-sharing system 可以並存,eg:solaris
  • 一般商用OS都支援Soft-real-time system

Batch System

定義:將一些較不緊急,定期性、非交談互動性的Job,累積成堆,再分批次,送入系統處理

舉例:庫存系統、報稅系統、掃毒、磁碟重組、清算系統…

主要目的:提高resource utilization,尤其是在冷門時段,不適合用在real-time-system, user-interactive application eg:電腦遊戲

Hand Held system

定義:單手可掌握操作的系統

  • Hardware 天生之限制,帶來software必須配合之處
Hardware天生限制Software必須配合之設計
Slower processor
(背後之限制)
1. power 供應的問題,電供不足
2. 散熱系統的設計
運算不能太複雜,要簡單
Memory空間有限程式的Size要小,不用的記憶體要立刻釋放
DisplayMonitor很小顯示的內容要有所刪減

Chapter2 Computer System Architecture

I/O Operating And Hardware Resources Protection

  • 學習路線

I/O運作方式

Polling I/O

Interrupted I/O

DMA

Interrupt機制處理與種類

HW Resource Protection

基礎建設

Dual Model Operation

Privileged Instruction

I/O

Memory Protection

CPU

I/O Operating

Polling I/O I/O

Polling(輪巡,詢問式) I/O

定義:又叫Busy_waiting I/O or Programmed I/O

步驟如下

  1. I/O Request 給 OS (執行中的Process不會自己做I/O)
  2. OS收到請求後,(可能)會暫停此Process執行,並執行對應的System Calls.
  3. Kernel 的 I/O-subsystem(專門用來處理I/O的請求,只是個過水而已)會Pass此請求給Device driver
  4. Divice Driver 依此請求,設定對應的I/O Commands參數給Device Controller
  5. Device Controller 啟動監督I/O-Device之I/O運作進行
  6. 在這段時間內,OS(可能)將CPU切給另一個process執行
  7. 然而,沒人主動去告訴CPU I/O的執行狀況,因此CPU在執行process工作過程中,卻要不斷去Polling Device Controller,已確定I/O運作是否完成或有I/O error

image-20221116231017998

缺點:

  • CPU耗費大量時間用於polling I/O Device Controller上,並未全用於process execute上,故CPU utilization低throughput不高

Interrupted I/O

Interrupted (中斷,中斷式)I/O I/O

定義:

步驟如下:

  1. I/O Request 給 OS (執行中的Process不會自己做I/O)

  2. OS收到請求後,(可能)會暫停此Process執行,並執行對應的System Calls.

  3. Kernel 的 I/O-subsystem(專門用來處理I/O的請求,只是個過水而已)會Pass此請求給Device driver

  4. Divice Driver 依此請求,設定對應的I/O Commands參數給Device Controller

  5. Device Controller 啟動監督I/O-Device之I/O運作進行

  6. 在這段時間內,OS(可能)將CPU切給另一個process執行

  7. 當I/O運作完成,Device Controller 會發出 I/O-Completed Interrupt 通知OS(CPU)

  8. OS收到中斷後(可能)會暫停目前Process的執行(因有些Interrupt優先權可能很低,可以先暫時不處理)

  9. OS必須查詢 Interrupt Vector,確認何種中斷發生,同時也要找到該中斷的服務處理程式(ISR:Interrupt Service Routine)的位址(每一個中斷都有一個對應的中斷處理服務程式

  10. Jump to ISR位址 執行ISR

  11. ISR完成後,return control to kernel,kernel也許做一些通知工作

  12. 恢復(resume)原先中斷前的工作執行或交由CPU Scheduler決定

優點:CPU不須耗費時間用於Polling I/O-Device,而是可以用於Process execute上,CPU utilization提升,throughout提高,improve the system performance

缺點:

  1. Interrupt之處理仍需耗費CPU time,如果 I/O運作時間 小於 Interrupt處理時間,則使用Interrupt I/O就不划算,不如使用polling I/O
  2. 中斷的頻率過高,則大量的中斷處理會占用幾乎全部的CPU Time,則系統效能會很差
  3. CPU仍需耗費一些時間用於監督I/O-Divice與Memory之間的Data Transfer過程

DMA (Direct Memory Access) I/O

  • 定義:DMA Controller 負責 I/O-Device(設備)與Memory 之間的Data transfer(傳輸)工作,過程中不需CPU之參與監督,因此CPU有更多時間用於Process execute上

優點:

  1. CPU Utilization更高
  2. 適合用在Block-Transfer oriented I/O-Device上(代表中斷發生的頻率不致於過高 eg:Disk, 磁碟的控制器會和DMA的控制器兩個會相互合作,磁碟控制器會去指揮磁碟的運作,讀出來的資料會通知DMA的控制器,DMA會把資料輸進Memory裡) 不是用於Byte-transger oriented I/O-Device

缺點:

  1. 引進DMA Controller會增加HW設計複雜度(Complicated the HW design)

原因:DMA的Controller會跟CPU競爭爭奪Memory(記憶體)、Bus(匯流排)的使用權,若DMC Controller 占用了memory , Bus 時,CPU要被迫等待

補充:DMA Controller通常採用"Cycle Stealing"技術 (or Interleaving)與CPU 輪番(交替)使用memory跟Bus,如果CPU與DMA Controller發生conflict(同時要用Memory 與 bus),則會給DMA較高的的優先權

  1. 通常系統會給予「對該資源需求量、頻率等較」的對象有較高的優先權,這樣會獲得

    1. 平均等待時間較小
    2. 平均產能較高

    的好處

  2. 機器指令的Stages (CPU執行的幾個階段)

IFDEFOEXWM
  1. IF:Instruction Fetch 抓指令:根據Programming Counter的值,到記憶體去把指令抓出來
  2. DE:Decode 解碼:知道這條指令到底做什麼事情
  3. FO:Fetch Operands 抓取運算元:運算元可能來自記憶體、也可能來自暫存器
  4. Ex:Execution 執行
  5. WM:Write Result to Memory 將結果寫入記憶體
CPU會不會Memory Access(到記憶體抓東西)DMA要用Memory
IF衝突(Conflict)
DE不會(指令已經拿出來放到IRinstructor registor)OK,歡迎
FO可能 (運算元有可能在Registor,也有可能放在Memory)OK,或有衝突
EX不會 (ALU去做了)OK,歡迎
WM可能 (結果有可能寫回Memory也有可能是暫存器)OK,或有衝突

Cycle Stealing:當CPU會使用或不會使用Memory Access時,DMA都會去爭奪Memory的使用權,亦為Stealing(偷),因為DMA擁有最高使用權。

DMA Six Steps

(早:中央、清華、交大)

  1. Device Driver User Process 告訴 I/O subsystem(kernel)告訴 Device Driveris told to transfer Disk data to Buffer address X
  2. Device Driver tells disk controller to transfer C bytes from disk to Buffer at address X從磁碟讀C byte的量,分配到記憶體位址X的地方
  3. Disk controller initiates DMA Transfer
  4. Disk controller sends each byte to DMA controller
  5. DMA transfer bytes to Buffer X in creasing memory address and decreasing Counter utill Counter =0
  6. When C=0, DMA interrupts CPU to signal transfer compeletion

image-20221119122438718

Life cycle of I/O-request via Interrupted I/O

image-20221119161000584

Blocking and Non-Blocking I/O

Blocking(會暫停的) and Non-Blocking(不會暫停的)I/O

所謂的Blocking的意思是,當User process發出I/O請求之後,接下來這個prcess就會suspend,直到這個I/O被完成

Blocking-I/O:

(等於Synchronous):Process suspended until I/O completeed

  • 優:Easy to use and understand, process在waiting的時候,可以把CPU放出去給其他process做使用
  • 缺:Insufficient for some needs

image-20221119221052160

Non-Blocking I/O:

I/O calls returns as much as available I/O請求發出去後,控制權立刻返回給user process

  • example:user interface, data copy
  • Implemented via multi-threading
  • Returns quickly with count of Bytes read or written

Asynchronous-I/O:

(屬於Non-blocking):Process runs while, I/O executes

  • Difficult to use
  • I/O subsystem signals process when I/O-completed

image-20221119221104281

Asynchronous與Non-Blocking的小差異

Asynchronous I/O:整個I/O完成,才通知Process

Non-Blocking I/O:I/O完成Data return as much as possible (能回傳就回傳, 少量即可回傳)

舉例說明:userProcess發出100 byte的I/O請求

  • Asynchronous的方式,會將100byte的I/O做完後,才告訴Process做完了
  • Non-Blocking的方式,每讀25Byte就通知一次, 逐步回報給Process,會發出比較多次的Interrupt

Interrupt Policy and

  1. 當Interrupt發生,OS之處理Steps如下:
    1. OS收到中斷後(若此中斷要被立即處理,則OS會暫停目前Process之執行,且保存其Status and Registers Contents)
    2. OS會依照Interrupt ID(No.)查詢Interrupt Vector中斷向量表,確認何種Interrupt發生,且找出其ISR的位址
    3. Jump to ISR 位址,執行ISR
    4. ISR完成後,控制權返回Kernel
    5. OS會恢復(resume)中斷之前Process之執行

image-20221121000410540

  1. Interrupt種類

    1. 早期恐龍分為三種

      1. External Interrupt:CPU以外的周邊設備、控制卡、etc,所發出的中斷

      例:I/O-Completed, I/O-error, Machine-check,

      1. Internal Interrupt:CPU在執行Process過程中,遭遇重大錯誤而引發

      例:Divide-by-zero除以零、執行非法的特權指令、etc

      1. Software Interrupt:user process 在執行中,若須要OS提供服務時,發出此類型的中斷,目的是通知作業系統,請它執行對應的服務請求

      例:I/O-request 好比是KTV的服務鈕,按下去就會有人過來問你要幹嘛

    2. 現在恐龍分為兩種

      1. Interrupt:硬體所產生就叫Interrupt
      2. Trap:軟體所產生的就叫Trap

    image-20221121003713007

    例:設備發出I/O-Completed,I/O-Error,Machine-check,etc及Time-out by Timer

    用途主要有二

    • Catch the arithematic error

    例:Divide-by-zero, 執行非法特權指令, illegal memory access

    • user process 執行需要OS提供服務時,也會發trap通知OS

    例:I/O Request

    1. 分成兩類背後哲學:中斷之間也有優先權高低之分
      1. Maskable Interrupt遮罩:此類中斷發生後,可被Ignored或延後處理不一定要馬上處理
        • 例如:Software-interrupt
      2. Non-Maskable不可遮罩:此類中斷必須立刻處理
        • Internal interrupt(重大error), I/O-error,etc

Hardware Resources Protection

  • 基礎建設
    • Dual-modes operation(雙重模式)
    • Privilege instructions

Dual-modes operation

定義:System之運作模式至少(可再往下分,依照系統設計的必要性)可被區分為2種modes

  1. kernel mode
  2. user mode

kernel mode

又叫做system mode, supervisor mode, privileged mode, monitor mode(早期有,現移除),代表此刻是kernel取得系統控制(取得CPU執行權),允許privilege instructions(特權指令)在此mode下執行

user mode

代表user process取得CPU執行,在此mode,不允許執行privilege instructions(特權指令),若執行則會發生trap的重大錯誤

此外,Dual-modes必須要有HW的支持,才可實現

例如:CPU內會有Mode Bit,用以區分現在是哪個mode當CPU在執行機器指令時,IF、DE...之類的階段,若解碼完發現是個特權指令,這時候Control unit就要檢查目前的mode bit,判斷是否可不可以執行,若不行就丟出一個interrupt,不允許執行

Priveleged instruction(特權指令)

定義:任何可能會造成系統重大危害的指令,可設為特權指令(端看工程師如何設計),只可以在Kernel Mode去執行,不可以再User mode下執行,一旦在User Mode下執行,會發Trap通知OS,將此user process terminates.

如果把所有的指令設為特權指令,好處就只有超級安全,因為這些指令都只有OS可以做,如果user想做就只能委託OS執行,但這樣performance會很差,因為所有事情都要給OS處理

例如:

  • Turn-off(Disable) interrupt, clear memory, I/O instruction(for I/O protection),Timer值 set/change (for CPU protect)

  • Base/Limit register 修改/set (for memory protection)

  • Change mode from user mode to kernel mode

  • 1
    2
    3
    4
    5
    6
    7
    8
    
    1). Set value of Timer
    2). Read the clock
    3). Claer memory
    4). Turn-off interrupt
    5). Switch from user to monitor mode
      
    哪些是特權指令?
    1,3,4,5
    
  •  1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    1. Change to user mode
    2. Change to monitor mode
    3. Read from monitor memory
    4. Write into monitor memory
    5. Fetch an instruction from memory
    6. Turn on timer interrupt 
    7. Turn off timer interrupt
      
    哪些是特權指令?
    2,4,7
      
    詳解:
    6. 本身就是打開的,因為要做CPU的保護
    7. 但關掉不是
      
    有爭議的部分
    3. user process去讀kernel process的資料,恐龍認為是,因為kernel裡面掌管所有Process的information,而process間不應該各個process的狀態
    5. 從Monitor memory(Kernel)裡面去讀指令出來,恐龍認為不是,因為就算抓了,但你的mode不是Privilege instruction就會把你擋掉
    

為什麼Dual-mode跟Privilege Isntruction可以構成保護基礎

所有會危害OS的操作都是在Kernel 發生,因此不可以放任user可以直接操作Kernel

image-20221122221832833

I/O-Protection

目的:由於I/O運作較為繁瑣複雜,為了降低user processes 操控I/O之複雜度`,讓user processes去處理應用的問題,I/O則交由OS去處理;及避免user process對I/O-Devices之不當操作,胡搞瞎搞,因此才有I/O protection。簡單來講就是不要讓user processes去操作I/O

作法:把所有I/O指令皆設為privileged instruction配合Dual-modes, 一律讓user process委託 kernel執行I/O運作

Memory Protection

目的:防止user process 存取其他user processes 之 memory area 及 kernel memory area

作法:(以 contiguous Memory Allocatation 為例) 針對每個Process, kernel會提供一套Registers:叫base/limit register, 其中

  • Base register紀錄Process之起始位址
  • Limit register紀錄Process之大小

將來Process執行,會進行下列的Checking

image-20221122234041249

為什麼Address的判斷是由Hardware來做而不是OS來做呢?

因為交給OS來做就會產生中斷interrupt,又因程式在執行的時候對記憶體的存取是很頻繁的,兩個影響之下會導致你的CPU一直被interrupt打擾,因此交給Hardware來做會比較符合成本一點。

並且,還要將 Base與Limit register 值之set/change須設為"Privilege Code(特權指令)",避免user Process把Base跟Limit的位址直接改成無限,這樣就完成了Memory的Protection

CPU Protection

目的:防止user process無限期/長期佔用CPU而不釋放

作法:利用Timer實施,同時OS會規定Process使用CPU time之最大配額值(MAX. Time Quantum)

當process 取得CPU後,Timer初值即設為Max Time Qauntum值,隨著Process執行 time增加, Timer值會逐步遞減,直到Timer值為0, Timer會發出 Time-out的interrupt通知OS,OS便可強迫此process放掉CPU,此外,Timer值之set/change 也須設為特權指令

OS Structure Operating-System

OS之Development

OS應提供的服務項目

OS之服務元件種類

System Calls之介紹(使用者程式跟OS之間溝通的介面)

OS之Structure種類

Simple

More Complex than simple

Layered Approach

Microkernel

Module

Hybrid(混合?)

設計原則:Policy與Mechanism policy管行為,比較常變,例如數值的變動; mechanism負責處理how,比較不會變,例如邏輯的判斷

Virtual Machine介紹

System Call

定義:作為執行中user process與kernel之間的溝通界面,當user process需要OS提供某種服務時,會先trap通知OS,並帶入System call ID(No)及所需參數,然後OS執行對應的System call

It’s a programming Interface to the services privided by the OS

用舉例來講的話

  • Trap = 服務紐
  • System call = 服務項目

System Call的種類(中央考過類似的題目)

  1. Process Control eg:建立、終止、暫停、恢復執行process, set/read attribute
  2. File Management eg:建立、read, write, open, close, delete …
  3. Device Management eg:建立、read, write, open, close, delete …
  4. Information of Maintenance eg:取得系統日期/時間、取得Process屬性 etc
  5. Communications eg: Processes之間的通訊而且只針對Message Processing方式提供服務
  6. Protection eg: Hw resources protection, File access contorller, etc

image-20221124224120796

System Call的參數(Parameters)傳遞方式:3種方式

  1. 利用暫存器(Registers)保存參數
    • 優點:
      1. 最簡單
      2. 存取速度最快( without memory access)
    • 缺點:
      1. 不適用於大量參數之情況
  2. 利用Memory,以一個Block(Table)儲存這些參數,並將這些表格的起始位址置於1個Register中,Pass給OS
    • 優點:
      1. 適用於大量參數
    • 缺點:
      1. 存取速度較慢,且操作較為麻煩
  3. 利用Stack將參數push入此Stack, OS再pop from stack, 以取得參數
    • 優點:
      1. 適用於大量參數之情況
      2. 也很簡單
    • 缺點:
      1. Stack的空間須要預先準備,避免stackoverflow

OS之系統架構分類

OS之Structure種類

Simple: MS-DOS系統

More Complex than simple: UNIX系統

  • Limited by Hardware functionality
  • The original UNIX had limited structuring
  • The UNIX 包含兩個Separate parts
    1. System Programs
    2. The Kernel

image-20221125013311284

  • Beyond simple but not fully layered(分層)

Layered Approach

  • 定義:採取Top-Down方式,切割系統功能/元件,以降低複雜度。元件/模組之間呼叫關係分層

    上層可以使用下層的功能,但下層不可以使用上層的功能。完成後要使用Bottom-up方式進行測試,debugging(由底層一路往外測)

  • 層次的劃分沒有明確規定

    image-20221125014733544

  • 優點:

    • 降低設計複雜度
    • 有助於分工
    • 測試、除錯、維護容易
  • 缺點:

    • 很難做到精準的分層劃分
    • 若Layer數太多,則System performance is very poor( 切到四層剛好、五層太多,極限中的極限是七層)

Microkernel(微核心):由CMU(卡內基-美隆大學)率先提出,代表產品:Mach o.s。它們認為UNIX的服務項目太多、太龐大,不利移植

  • 定義:將Kernel中一些Non-essential services(比較不是那麼基本、重要、必要),自Kernel當中移除,改成在User Mode(Site)提供這些服務,以System programs方式存在,如此一來,可以得到一個比較小的kernel,稱之為microkernel, 一般而言,Microkernel提供下列三個minimum service:
  1. Porcess Controll
  2. Memory Management(不包括Virtual memory)
  3. Process Communications(提供message Processing服務而已)

image-20221126165547853

  • Benefits(好處)
  1. Easier to extend a microkernel
    • 服務的增加/刪除是容易的,因為這些服務是在user site執行,所以服務的增、刪不需要牽扯到Kernel也要變更,即使要,也是少量
  2. Easier to port the OS to new architectures
    • 因為Kernel很小,所以移植到新的硬體平台之更改幅度不大(因為只有三個服務run在kernel)
  3. More Reliable
    • 萬一某一個服務在執行中掛掉了,充其量只是相當於一個user process死掉而已,所以對HW, kernel, 其他user process沒有不良影響,因為把大部分的服務移到user mode去做了,因此更加安全、可靠
  4. More secure
    • 萬一某一個服務在執行中掛掉了,充其量只是相當於一個user process死掉而已,所以對HW, kernel, 其他user process沒有不良影響,因為把大部分的服務移到user mode去做了,因此更加安全、可靠
  • 缺點
  1. Performance overhead of user space to kernel space communication(效能較差),因為process Communication充斥大量訊息傳遞

Note:microkernel的相反詞Monolithic kernel

定義:所有的Services皆須Run in kernel mode,大部分的商用OS幾乎都是Monolithic kernel,因為如果把所有的service移到user site去做,那它的控制就會很低。當這個控制力很低的時候,user或program就可以自己去Inhence一些東西,影響OS

優點、缺點:和microkernel相反

Module

  • Many OS implement loadable(有需要才載入) kernel modules
  • use Object-oriented approach
  • Each core component is separate
  • Each talks to the others over known interface
  • Each is loadable as heeded within the Kernel
  • 簡而言之:similar to Layers but with more flexible, 效能更好

image-20221126173047816

例如:Linux, solaris, etc …

Hybrid(混合?):現在作業系統很難純粹歸屬於某一型

  • Linux(中央考過) and Solaris 是 Monolithic (所有東西都run在kernel mode),且也是Modular for dynamic loading
  • 例:windows mostly monolithic,有時針對不同客戶需求,會再加上microkernel for subsystem
  • 例:Apple Mac Os 也是混合的

kernel 包含

Mach microkernel

部分的BSD UNIX

I/O Kit

dynamic Loadable module(叫做 kernel extension)

image-20221126175630716

Virtual Machine

定義:利用sofeware技術模擬出一份與底層HW一模一樣的功能介面之抽象代理器(abstract machine),稱之Virtual Machine模擬的方式類似於CPU schdueling

名詞解析:

Host:undelying hardware system, os

VMM(Virtual Machine Manage)或Hypervisor:creates and managing/ runs virtual machines

Guest:process provided with virtual copy of the host

恐龍本之其他英文

  • Abstract hardware of a single computer into several different execution environments
  • Similar to layered approach, But layer crates virtual machine(VM)

優點

  • 作為測試開發中的OS,提供一個良好的負載平台,具有下列好處:

    1. 其他user, user processes工作,仍可持續運作,不須暫停
    2. 萬一測試中的OS不穩定、掛掉/失敗了,也不會影響host Hw, OS, 其他user processes 之工作,因為只是相當於一個user process fails而已,不會對system有重大危害

    image-20221126221141028

    1. 同一部Host Hardware上可以執行多個OS running on 多個virtual machines,這樣可以節省成本

    2. Consolidation(合併):在 Cloud computing environment,我們會用有限的機器,建立為數注眾多的virtual machines,我們可以依VM上的Applications之執行負擔輕重,調用Host machines資源,做因應的支援,有需要就在加開,沒需要就關掉,做資源的合併與調度

    3. VM較為安全(如果VM被病毒入侵,不致擴散,因為各VM之間是相互獨立的)

    4. 可以Freeze, suspend, running VM, 及Clone(複製) VM

    image-20221126223550540

VMM的Implementation

Hypervisor : 虛擬機管理程式

  1. Type0 Hypervisor(硬體層次):

    1. Hardware-based solutions via firmware
      • 例如:IBM LPARS and Oracle LDOMs
  2. Type1 Hypervisor(Kernel Mode層次)

    1. OS-like software

      • 例:VMware ESX, Joyent SmartOS, Crtrix XenServer
    2. general purpose OS that provide VMM functions (services)

      • 例如Microsoft Window Server with HyperV, Redhat Linux with KVM
  3. Type2 Hypervisor(user mode層次):

    1. Applications level provides VMM functionality

      eg. Paraller Desktop, Oracle VirtualBox

還有一些其他的變形上面那三類都是要創造跟底層硬體(Host HW)一樣的Virtual Machine,但下面這些卻不是

  1. Paravirtualization☆考試重點

    • The guest OS need modify to work in cooperation with VMM to optimize performance
    • presents guest(run 在virtual Machine上的都叫guest) with similar but Not identical to Host Hardware
    • Guest must be modified(必須要被修改才可以用) to Run ON Paravirtualization virtual hardware
  2. Programming-environment virtualization

    • VMMs do not virtualize, HW but instead create on optimized virtual system .(創造全新的Virtual Machine)

      eg. Java virtual machine(JVM), Microsoft .NET

      JVM is a SPECification(規格), not an implementation

      規範

      1. Class Loader(把bype code load下來)
      2. Class verifier(驗證器,驗證byte Code安不安全,比如是否包含pointer)
      3. Java interpreter(執行byte code)

      image-20221128233907844

  3. Emulators:Allow application written for one HW to run on a very different HW such as different type of CPU。例:PS4模擬器、3DS模擬器

  4. Application containment (底層沒有Virtual Machine,而是 創造執行環境,而不是模擬)

    eg. Oracle Solaris Zones BSD Jails, IBM AIX WPARs application

    image-20221127130242062

    Policy(政策、策略 ) 與 Mechanism

    1. Policy定義

      1. “What” to be proovided
      2. 經常改變、朝令夕改
    2. Mechanism定義

      1. How to do that
      2. The underlying(基本的) mechanism甚少改變或不變
    3. 設計原則:

      Policy與Mechanism宜separate,以增進system flexibility

    4. 舉例

      • 運用Timer作為CPU protection > Mechanism
      • Max.Time Quantum大小制定 > Policy
      • CPU排版採Priority Scheduling 排班 > Mechanism
      • Priority大小之定義 > Policy

Chapter 3 System Structure

這個部分和第二章寫在一起了

Chapter4 Process Management And Thread Management

Process 定義與Progeam比較

PCB內容 考試重點

Process State Transition Diagram (S.T.D)考試重點

Scheduler的種類(解釋名詞)

長期

短期

中期

Context Switching (解釋名詞)

Dispatcher, Dispatch latency(較少考)

Process Controller Operations(UNIX, System Call為主的程式追蹤) 考試重點

評估CPU Scheduling 效能的好或不好的5個Criteria(清大喜歡考)

各種CPU 排班法則(7個)介紹及相關名詞(Starvation,Aging,Preemptive,Non-preemptive,Convoy effect) 考試重點

特定System的排班設計

MultiProcessors System

Real-time System

Soft (考申論題)

Hard(考計算題)

Thread Management

Process Definition

定義:A program in execution[恐]

  • Process 建立後,其主要組成有:
    • Process No(ID): Process被生成出來時,會有一個Process Id,作為識別
    • Process State
    • Code Section, Data Section:Process占用的 Memory Space
    • Programming Counter(PC):程式計數器,告訴我們現在這個Process執行到哪裡,裡面放下一條指令的位址
    • Stack
    • CPU Register value
    • 是OS 分配 **Resource(CPU,I/O-Divice, Memory) **之對象單位:跟Thread的差別
  • 與Program(程式)的比較
ProcessProgram
執行中的程式Just a File stored in storage device
“Active” entity(活動中、執行中)“Passive” entity(沒有活動的)

Process Control Block

(PCB內容)

定義:OS為了管理所有Processes,會在Kernel memory中,替每個Process,各自準備一個Block(Table, 表格),用來記錄Process之所有相關資訊

PCB的主要內容有(要背,考選擇):

  1. Process No(ID):是Unique(唯一的)

  2. Process state:eg. ready, running, wait, etc

  3. Programming Counter:內放 the next instruction’s address

  4. **CPU Registers:eg. 紀錄使用到的暫存器的值 eq. Accumulator, PSW(Process Status Word), Stack Top ,etc **

  5. CPU Scheduling Info:eg. Process 的優先權,First-In First-Out(FIFO)

  6. Memory Management Info(隨OS的記憶體管理方法不同,紀錄不同資訊):eg. Base/Limit register或 Page Table 或 Segment Table

  7. Accounting Info:eg. Process已使用了多少CPU Time, 哪些資源, 還剩多少資源,多少CPU Time可以用 Note:目的

    計算使用量,記帳、收$

    Administrator 調教Performance的依據

  8. I/O Status Info:eg. process已經發出多少I/O-Request, 完成 狀況如何,占用那些I/O Resource(目前還沒釋放的)

Process State Transition Diagram

狀態轉換圖(S.T.D)

目的:描述Process之Life Cycle,用來記錄Process建立,到它被終止之間,所發生的事

各個版本的STD定義都不太一樣

  1. [恐] 5個State的STD
  2. [Stalling]7個State STD (比恐龍多兩個狀態)
  3. [Stalling] UNIX的STD

5 Steps of State Transition Diagram

要會畫,會說明,超基礎,考出來是送分題

image-20221204010203958

StateDescription
New(Create)Process被建立,已分得PCB的空間,尚未載入記憶體、未取得記憶體資源,因應Batch的系統
ReadyProcess在記憶體了,且OS已經把它放到Ready Queue內,且具有資格爭奪CPU
RunningProcess取得CPU 執行中
Wait(Block)表示Process待在waiting Queue中,Waiting For I/O-Completed or event occurs, 不會與其他Processes 競爭CPU
Exit(Terminate)(Zombie)(Abort)Process完成工作,正常結束異常終止,可能其PCB尚未回收,因為要等其父親(Parent Process)Collect 該子process之成果後,才會回收PCB Space其他資源(Memory, CPU, I/O-Devices)已回收
TransitionDescription
1.也叫Admit,當Memory Space足夠時,可由Long-term Scheduler(in Batch System,因為放在Job Queue裡頭),決定將此Job載入到Memory中
2.也叫Dispatch,由short-term scheduler(CPU Scheduler)決定,讓高優先權的Process取得CPU控制權
3.也叫Time-Out/Interrupt,執行中的Process會因某些事件發生而被迫放棄(不是自願的)CPU,回去Ready Queue, eg. Time-Out, Interrupt發生,更高優先權的Process到達,插隊
4.叫wait for I/O-Completed or event occurs(自願放棄CPU)
5.I/O-Completed 或 Event occurs
6.Process完工或異常終止 (自願放棄CPU)

7 Steps of State Transition Diagram[Stalling]

補上Middel Term Scheduler

為了解決一個問題

當記憶體被占滿了,有一個更高優先權的Process近來,該如何處理?

把wait狀態的process踢出去,放到磁碟去保存

image-20221204120509402

StateDescription
Blocked/SuspendProcess被Swap Out到 Disk中暫存,即Blocked(asleep) in Disk
Ready/Suspendevent occurs or I/O-Completed, READY IN DISK
TransitionDescription
Suspend(Swap Out)當Memory空間不足,又有其他高優先度的Process需更多Memory空間時,會由Medium-Term Scheduler決定將Blocked Process或低優先權的Process Swap out到Disk,以空出Memory Space
Activate(Swap In)當Memory space有空,Medium-term scheduler可將它們Swap In回memory中,Ready for execution
Suspend(Swap Out)支持此Transition之理由有二
1.所有Blocked Processes皆Swap out後,Memory Space仍不足時
2. 所有Blocked State Processes之優先權,皆高於Ready State Process時

image-20221204120421430

TransitionDescription
1把從在磁碟睡覺的process拉到記憶體裡面睡覺,This is a poor design,但仍可支持,理由如下:若所有Blocked/suspend` state之Processes優先權皆高於ready/ suspend processes, 且OS believes them will become ready soon |
2It’s also a poor design 但可支持之理由如下:若有一個高優先權的process從blocked/suspend變成ready/suspend時,則OS可以強迫低優先權但已執行的process放棄CPU的使用以及Memory的空間,供高優先權使用

UNIX STD[Stalling]

image-20221204131334041

Scheduler Type(Important)

  1. Long-term Scheduler

    • 定義:又叫Job Scheduler,目的是從Job Queue中挑選一些Jobs載入到Memory中
    • 特色:
      1. 執行頻率最低,所以才叫長期
      2. 可以調控Multiprogramming Degree
      3. 可以調控 I/O-Bound Job與CPU-Bound Job之混合比例(下面有解釋)
      4. Batch System採用,但是real-time system以及time-sharing不會採用這種機制。因為real-time系統處理的process都是比較緊急的,因此就需要直接丟進memory去執行。而time-sharing系統要求對每一個user公平,沒有優先度需要處理,如果memory不夠則調用virtual memory,因此time-sharing系統只存在medium-term以及short-term
  2. Short-term Scheduler:

    • 定義:又叫CPU SchdulerProcess Scheduler,目的是從Ready Queue中挑出一個高優先權的process,分派CPU,給CPU執行
    • 特色:
      1. 執行速度是三者裡面最高的
      2. 無法調控Multiprogramming Degree,因為它不是負責將程式load進memory與Swap out出去的人
      3. 無法調控I/O-Bound Job與CPU-Bound Job之混合比例,頂多決定誰要先做,不能決定比例
      4. 所有的 System採用
  3. Medium-term Scheduler(最常被考):

    • 定義:Time-Sharing System採用,當Memory空間不足,且又有其他高優先權Processes需要Memory Space時,此Scheduler會啟動,它會挑選一些Processes(eg. Blocked Process, 低優先Process) 將其Swap Out到Disk中,保存,以空出Memory Space,供其他Process使用,將來等到有足夠的Memory Space released後,此Scheduler可再將它們Swap In 回Memory, ready for execution

    • 特色:

      1. 執行速度是三者裡面居中的

      2. 可以調控Multiprogramming Degree,因為它不是負責將程式load進memory與Swap out出去的人

      3. 可以法調控I/O-Bound Job與CPU-Bound Job之混合比例,頂多決定誰要先做,不能決定比例

      4. Time-Sharing System採用

Multiprogramming Degree:系統內的Process的數目:一般而言,Degree越高,CPU利用率就越高。

I/O-Bound Job與CPU-Bound Job

  1. I/O-Bound(受限) Job

    定義:此類型工作大都是需要大量的I/O operation(resource),但對於CPU Time(Computation)需求很少,因為其工作效能受限於I/O-Device之速度,稱之I/O-Bound,對CPU有最高優先權,因為它占用CPU的時間最短

    例如:Data Base Management, 財報的處理列印

  2. CPU-Bound(受限) Job

    定義:需要大量的CPU計算,產生數筆資料,對I/O有最高優先權,因為它占用CPU的時間最短

    例如:氣象預估、科學模擬

如果OS發現I/O-Bound過多,則會透過Schduler來調控兩者之間的比例

Context Switching

  • 定義:當CPU要從Running Process切給另一個Process使用之前,Kernel必須**保存(Store) Running Process的目前狀態資訊(eg. Programming Counter的值,Stack的值,CPU Register的值,etc),即存回此Process之PCB **。且要載入(restore)另一個Process之狀態資訊from此Process PCB,這樣的行為就叫做Context Switching,Context Switch本身是一個額外的負擔,因為需要花CPU的時間去做切換,不能用在Process的執行上,因此時間大多取決於硬體的因素居多(eg. Register的數量夠不夠,Memory存取指令速度

  • 如何將低Context Switching負擔

    1. 如果Register的數量足夠多,則可以讓每一個Process皆有自己的(Private) Register Set,OS只要切換Point指向另一個process之Register Set 即可完成Context Swtitching without memory store/restore ,因為速度夠快。但這個方法不太切實際,因為Register的成本關係
    2. 使用Multithreading機制。
    3. 讓System process及User Process各自擁有自己的Register set,如此兩者之切換只要Registers Set的Pointer即可

Dispatcher And Dispatch Latency

分派器與分派延遲

  • 定義:Dispatcher,此一模組的目的是要將CPU控制權授予經由CPU Scheduler依據CPU排班法則所選出之Process,選好後CPU Scheduler會將工作交給CPU Dispatcher,主要的工作項有下列三項

    1. Context Switching
    2. Change Mode from to Kernel mode to User Mode
    3. Jump to the execution entry of that selected proces

    上述這三個工作所耗費的時間總和就是Dispatch Latency

  • 希望Dispatch Latency越短越好,這些Process可以盡早開工

Process Control Operations☆☆☆☆☆

Lession 1 Theory

  • 定義:Process建立、終止、暫停、恢復執行、設定/修改/讀取 Process Attributes值 etc.

    上述這些皆是OS應該提供的服務(i.e System Call)

  • Procss是可以建立自己的Process(Child Process),目的是要Child Process做工作

  • Child Process所做的工作,可以分為2類:

    1. 與Parent 相同的工作(子承父業)
    2. 特定工作(與Parent不同)
  • Parent與Child之間的互動關係為:

    1. Concurrent execution(交錯使用,通常是執行第一類的工作(子承父業))
    2. Parent waits for Child until child terminated(等著收割Child的成果)
  • Child Process 所須的資源由何處取得?

    1. OS供應(這種情況OS會去限制每個process最大可產生多少個Child Process)
    2. Parent供應(整個家族Process的資源都是共享,Parent Process的Sharing Time有一小時,那麼整個家族的Sharing Time 就是一個小時
  • Parent 若終止,則Child Process會如何處理?

    1. 一併終止(最常被使用) :稱之為Cascading(層疊的) termination

    2. Parent Process死了,但Child Process存活,那Child的資源由以下兩者提供

      • 向OS取得資源

      • 向祖先Process取得資源

Lession 2 Example - UNIX System Call

  • fork():此System call. 用以建立 Child Process,而fork()之傳回結果,對象如下

失敗:因為資源不足(記憶體不夠,PCB也不夠),無法建立,會傳回負值(-1)給OS, then Pass to parent process,通常失敗的話,OS也會順便把Parent process砍死

成功:OS會傳回一個值,用以區分child or parent:

0值:給child process

.> 0值:給Parent,且此值為Child Process ID

image-20221205225943369

  • wait():此System Call用以暫停Process execute, 直到某個事件發生,eg. 父等子直到子終止 。

  • exit():此System Call用以終止Process的執行,回收其資源但PCB的空間可能還留著,直到父把子的結果回收回來才回收通常exit(0)表示正常終止,exit(-1)表示異常終止子Process做完工作後,子Process要自己發出一個exit的System Call,讓OS來殺掉子Process。

  • execlp()或exec(), execve():此system call用於請OS載入特定的binary code(可執行的檔案),來執行。這個System call可以交由子process執行,讓子process執行特定的工作,去執行之後就不會再回來執行原程式下面的指令了,因為已經去執行特定的工作了

    eg. execlp(“目錄名稱”,“檔名”,參數)

  • getpid():此System Call用以取得Prcess的Id

​ 說明:

image-20221205232325242

​ OS會配置child process memory space, 此空間是占用不同的記憶體空間,且子process的Data section 及 code section內容均來自父process的copy, initially。

若子process所作之工作與父process相同,則fork()完,就已經達成目的。

若子process要做特定工作(與父process不同),則子process必須執行execlp()這個system call

image-20221205233942669

Lession3 Programming

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
//例題1;建立Child process執行ls命令檔,且父等子完成後才列印Child completed

    void main(){
    int pid ;
    pid = fork();
    if(pid<0){
        printf("fork fails \n");
        exit(-1); //爸爸自己自殺
    }else if (pid ==0){
        //兒子要做的事情
        execlp("/bin/ls","ls",null);
        exit(); //這段code不會執行,原因是因為execlp()會把process指向/bin/ls的binary code,接著就是去執行那段binary code了,就不會回來執行這個exit();
    }else //pid >0{
        //爸爸要做的事情
        wait(); //父Process子Process直到子Process終止 子Process做完工作後,子Process要自己發出一個exit的System Call,讓OS來殺掉子Process。
        printf("child Completed");
        exit();
    };
	{
        //不管怎樣都會執行的地方
    }
}	

image-20221206002505232

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//例題2 假設Parent, child 之process ID為2600, 2603 求line A, B, C, D 印出值
void main(){
    pid-t pid, pid1; //pid-t: 一個名為pid 的type,就是整數,是C語言的寫法
    pid-fork(); //pid 放的是子process的ID, pid1放的是自己process的ID
    if(pid==0){
        pid1=getpid();
        printf(pid); //A 0
        printf(pid1); //B 2603
    }else if(pid >0){
        pid1=getpid(); 
        printf(pid); //C 2603
        printf(pid1); //D 2600
    }
}

image-20221212233944674

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
//例題3  問A的值value是多少 

int value =5;
void main(){
    pid-t pid;
    pid = fork();
    if(pid ==0){
        value +=15;
        return 0;
    }else if(pid >0){
        wait(null);
        print(value);  //A=5 就算是global的變數,也是只能在自己的process作用
        return 0;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//例題4 求列印結果
(1.)
void main(){
    int pid;
    pid =fork();
    if(pid==0){
        printf("A\n");
    }else //pid >0{
        printf("B\n");
    }
}
Ans: 父與子是並行的,因為父process沒有wait(), 因此答案可能是AB或BA
(2.)
void main(){
    int pid;
    pid =fork();
    if(pid==0){
        printf("A\n");
    }else //pid >0{
        printf("B\n");
	    wait();
    }
	printf("C\n");
}
Ans: ACBC,ABCC,BACC,
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//例題5 假設Count,是一個父與子Process的共享變數 ,初值為5
(1.)
void main(){
    int pid;
    pid=fork();
    if(pid==0){
        count++;
        printf(count);
    }else if (pid >0){
        wait();
        count--;
        printf(count);
    }
}
Ans.6,5
    (2.) //父與子並行
void main(){
    int pid;
    pid=fork();
    if(pid==0){
        count++;
    }else if (pid >0){
        count--;
    }
     printf(count);
}
Ans. 45,54,55 //這是基本情況
    
    //以高階程式語言的角度來看,count++實際上是兩條code
    //count+1跟count=count+1
    //先加然後再附值
    //如果以組合語言的角度來看,就是三行code
    //LOAD R1, Count
    //INC R1, 1;
    //STORE Count,R1
    //但Process沒有辦法保證這三條Code會連續做完,有可能做到一半就被另一個Process搶走了
    //所以還有一種情況是+1完之後,還來不及Assign,CPU就被另一個Process搶走了

    Ans.66,44,46,64
    

image-20221213223929951

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//例題6
(1.) How mant processes are created? (include main())
    
    void main(){
    fork();
    fork();
    fork();
}
Ans.8
(2.)
    void main(){
    if(fork()==0){ //等同於 pid=fork(); if(pid ==0) ....
        fork();
        fork();
    }
    fork();
}
Ans.10
(3.)
    void main(){
    fork();
    if(fork()>0){
        fork();
    }else if(fork() ==0){
        fork();
        fork();
    }
}
Ans.14
(4.)
    void main(){
    for(i=0;i<3;i++){
        if(fork()==0){
            fork();
            fork();
            fork();
        }
    }
}
Ans.729
(5.)
    void main(){
    for(i=0;i<3;i++){
        if(fork()==0){
            fork();
        }else if(fork() > 0){
            if(fork()==0){
                fork();
            }
        }
    }
}

(6.) 
	void main(){
        int a =2;
        fork();
        a--;
        printf(a);
        if(fork()==0){
            a--;
            printf(a);
            fork();
        }else{
            a++;
            fork();
            printf(a);
        }
    }
(i.) printf(a)共做了幾次?
(ii.)印出0的有幾次?
(iii)印出1的有幾次?
(iiii.)印出2的有幾次?

例題1

image-20221213224958887

例題2

image-20221213230321504

例題3

image-20221213231138167

例題4

parse1image-20221213233229409

parse2

image-20221213233442414

parse3

image-20221213233645680

例題5

parse1

image-20221213235008337

parse2,3

image-20221213235124681

例題6

image-20221214001735125

Evalue CPU Scheduling Performance 5 criteria

  1. CPU utilization:cpu花在Process exec time / CPU total time(process exec time + context switching time+ idle time)

    • 舉例:Process平均花5ms在exec上 ,context switching = 1ms,則CPU utilization = 5/5+1 =5/6
  2. Throughput(產能):單位時間內完成的Job數目

  3. Waiting Time(等待時間,考試重點):process花在ready queue中等待獲得CPU之等待時間加總

    image-20221214224920098

  4. Turnaround Time(完成時間):從Process進入(到達)到它工作完成的這段時間差值

    image-20221214225625777

  5. Response Time(回應時間):自user(user process) input 命令/Data 給系統到系統產生第一個回應的時間差,沒有一個特定的量法去量它,稱之Time-sharing system, user-mteractive, application特別重視這一塊

由上述得知,排班的目標必是,**利用度越高、產能越高,時間相關的東西越短越好 **

CPU排班法則行為介紹

  1. FIFO
  2. SJF
  3. SRTF
  4. Priority
  5. RR
  6. Multilevel Queues
  7. Multilevel Feedback Queues (MFQs)

FIFO法則

  • 定義:到達時間最小的process,優先取得CPU

  • 例如:

    ProcessCPU(burst) Time 要花的CPU time
    P124
    P23
    P33

    到達時間皆為0(從一開始就到了)

    到達順序為:P1, P2, P3(擺到ready queue的順序)

    Question

    1. 畫出Gantt Chart
    2. 求Avg. waiting time
    3. 求Avg. Turnaround Time

    image-20221214235730530

  • 分析

    1. 排班效能最差,即Waiting time & Turnaround time 最長

    2. 可能會有**Convoy Effect(護衛效應:許多Processes 均在等待一個需要很長CPU time之process 完成工作,才能取得CPU,造成Avg waiting time 很長之不良效應) **

    3. 公平

    4. No Starvation

      • (沒有飢餓現象:Process因為長期無法取得完工所需各式資源,導致它遲遲無法完工,形成Indefinite Blocking 現象,稱之Starvation,容易發生在不公平對待之環境,若再加上Preemptive機制,則更是容易發生,補償方案:“Aging(老化)“技術,隨著Process待在System內的時間逐漸增加,我們也逐步提高此process的優先權,故可取得Process Resources完工,因為不會Starvation。注意:Soft real-time System不採用Aging,因為Soft real-time system是為了確保real-time process取得最高優先權,如果加入Aging機制,就有可能有process的priority高於real time process)
    5. Non-preemptive(不可插隊;不可搶奪)法則

      • 版本1(白話文)

        1. Non-preemptive法則

          • 定義:除非執行中的process自願放掉CPU,其他Process才會有機會取得CPU,否則就只能wait,不可逕自搶奪CPU
          • 例如:完成工作、Wait for I/O-completed after issue I/O-request
          • 優點:
            1. Context Switching的次數比較少,因為不可插隊,所以Switching的頻率小很多
            2. process之完工時間點較可預期(Predictable),因為不可插隊
            3. 比較不會有Race Condition Problem
          • 缺點:
            1. 排班的效能較差,因為可能有Convoy effect
            2. 不適合用在Time-sharing System, Real time System,因為這兩個都需要插隊的機制
        2. Preemptive法則

          • 定義:執行中的Process有可能被迫放棄CPU,回到ready Queue,將CPU切給別人使用,eg. Time-out, interrupt etc
          • 優點:
            1. 排班效益較佳,平均waiting/ turnound Time較小,可以把耗時較長的Process Preemptive掉
            2. 適用於Real-time sysem(要能夠把real time 的process插入進去) 及Time-Sharing System
          • 缺點:
            1. 完工時間較不可預期
            2. Context Switching次數多,負擔較重
            3. 須注意Race Condition之發生
      • 版本2:從CPU排班決策(啟動)之時機點來做區分(可以參考 State Transition,以下是五種情況做解說)

        1. Running —> Block eg: wait for I/O completed [自願放棄]
        2. Running —> Ready eg: time-out [被迫放棄]
        3. Wait —> Ready eg: I/O-completed [尊爵不凡的process醒來了,所以要啟動CPU scheduling,獲得CPU,低優先權的process被迫放棄CPU]
        4. Running —> Exit eg:完成工作 [自願放棄]

        所以若排班決策之啟動點只包含1,4,未包含2,4,則為Non-preemptive,否則preempt。

        Note:凡是 xxx —> ready 皆列入preemptive元素(選項),所以

        ready/suspend —> ready

        New —> Ready

        皆列入preemptive

SJF(Shortest Job First)法則

  • 定義:具有最小的CPU TIME之Process,優先取得CPU,若都一樣小,則採FIFO。

  • 例如:

    ProcessCPU Time
    P16
    P28
    P37
    P43

    Process到達時間皆為0,求Avg waiting time

    image-20221217132504544

  • 分析:

    1. 排班效益最佳(optimal),即Avg waiting/ turnaround time最小

      • 說明:Why optimal?

        image-20221217133256469

        因為Short Job所減少的等待時間必定>= Long-Job所增加的等待時間,因為平均等待時間會最小

    2. 不公平,偏好short Job

    3. 可能會Starvation(for long Job)

    4. 可以分成

      Non-preemptive —> SJF做代表

      Preemptive —> 另外叫做SRTF法則

    5. 較不適合用在Short-term scheduler(比較不恰當啦,但你要用也是可,因為Short-term scheduler執行頻率太高,所以很難在極短的時間間隔內去預估出精確的CPU Burst time for each process 且排出最小值,不易真正呈現出SJF之行為,反倒是適合用long-term scheduler

      Short time scheduler是指專門負責處理短暫的工作的計劃程序。這些工作通常會在短短的時間內完成,並且有許多工作要求同時進行。在這種情況下,使用short job first(SJF)法則來處理工作可能不是最佳選擇。這是因為SJF法則是基於工作預計完成時間的,並假設工作的預計完成時間是可以預先知道的。但是,在short time scheduler中,大多數工作的預計完成時間都是未知的,因此無法準確地應用SJF法則。另一個原因是,SJF法則會將短工作放在優先執行的位置,因此會把許多短工作排在一起。在short time scheduler中,這可能會導致許多短工作之間的競爭,從而導致效率降低。總的來說,short time scheduler更適合使用其他計劃策略,例如基於先進先出(FIFO)或基於最短剩餘時間(SRT)的策略,來處理短暫的工作。)

      如何評估process之the next cpu burst time?

      1. 公式(加權指數平均公式)

        image-20221217153209006

        t0t1t2t3
        實際值20104020
        預估值20(一開始還沒預估,所以都是抓t0的值)?
        T0T1T2T3T4

        image-20221217154217150

      2. 意義: 

        image-20221217160852665

SRTF,SRJF,SRTN( Shortest Remaining-Time Job First(Next))

  • 定義:即為Preemptive-SJF法則,即剩餘CPU Burst Time(CPU完成一次短時間工作所需的時間)最小的 Process,取得CPU。也就是若新到達的Process其CPU Burst TIme 小於目前執行中process剩下的CPU time, 則新到達之Process可以**插隊(preemption)**執行。

  • 舉例:

    Process到達時間CPU Time
    P108
    P214
    P329
    P435

    求Avg waiting Time for

    1. SRTF

      image-20221217234802588

    2. SJF(不可插隊)

      image-20221217235757038

    3. FIFO

      image-20221217235808248

  • 分析:

    1. 與SJF相比,SRTF之平均waiting/Turnaround time會比較小(SRTF是SJF的一個子類,因為SRTF可插隊,所以會有最小的waiting time, 但是付出較大的Context Switching的overhead(負擔)
    2. 不公平,偏好Short remaining-time Job
    3. 會有Starvation的問題
    4. Preemptive法則

Priority法則

  • 定義:可參數化的法則,具有Highest Priority之Process,優先取得CPU,若多個Process權值相同,則以FIFO為準,也有分成Non-preemptive, Preemptive的差異。

  • 舉例:不可插隊

    ProcessCPU timePriority No.
    P1103
    P211
    P323
    P414
    P552

    且,Priority No越小,優先權越大The Smaller Priority No. Implies the higher priority。求Avg waiting Time

  • 分析:

    1. 是一個具參數化的法則,即給予不同的priority高低定義,可展現出不同的排班行為。

      Priority定義行為
      抵達時間越早,優先權更高FIFO
      CPU Time越小,優先權越高SJF
      剩餘時間越小,優先權越高SRTF

      因此FIFO, SJF, SRTF都是屬於Priority的一種

    2. 不公平

    3. 會有Starvation (可用Aging去解決)

    4. 分為Non-preemptive, preemptive兩種

RR(Round Robin)法則(考試重點)

  • 定義:Time-Sharing System採用,OS會規定一個CPU time Quantun(or Slice),當Process取得CPU執行後,若未能在此Quantum內完成工作,則Timer會發出"Time-out” interrupt通知OS,OS會強迫此process放掉CPU,且回到ready queue中,等待下一輪再取得CPU執行,每一輪之中,process是以FIFO排隊方式取得CPU

  • 舉例1:

    ProcessCpu time
    P18
    P24
    P39
    P45

    到達時間皆為0,順序是P1~P4, 使用RR(Quantum=4), 求Avg waiting time

    image-20221218124859568

    舉例2:

    ProcessArrival TimeCpu Time
    P1010
    P225
    P373
    P4138

    image-20221218130748491

舉例3:

ProcessArrival time行為
P105CPU+6I/O+4CPU
P2315CPU
P383CPU+10I/O+9CPU
P4148CPU

Quantum= 5,問turnaound time ? waiting time ?

image-20221218200907489

  • 注意:有些題目是有爭議的

​ eg.

Process到達CPU time
P106
P249
P386

​ 採RR(Q=4)

image-20221218201710742

  • 分析:

    1. Time-sharing System 採用
    2. 也是一個可參數化的法則(ie. Quantum)
    3. 公平
    4. No starvation
    5. preemptive法則(Real-Time, Time-Sharing適用,RR超過Quantum time後會被迫回到ready
  • 舉例2

    Quantum=∞

    則RR會變成FIFO法則—> 排班效能很差

    注意:也因此,FIFO屬於RR的一種

  • 舉例3

    Quantum =極小值

    則Context Switching太頻繁,CPU Utilization會很低

    依經驗法則,若Quantum值能讓**80%**的Job在Quantum內完成,效能較佳。

  • 補充:RR雖然是公平的,但也可支持差異化(優先權差異)之實現,How do you achieve this?

    Ans.

    1. 針對高優先權Process在ready Queue中置入多個PCB pointer 指向此Process,使得每一輪當中,它有多次取得CPU之機會
    2. 針對高優先權Process給予較大的Time Quantum

MultiLevel Queues(多層佇列)法則

  • 定義:

    1. 將原本單一一條ready queue變成多條ready queues且高、低優先權不同
    2. Queues之間的排班法則,通常採取Preemptive and Priority法則
    3. 每個Queue 可以有自己的排班法則 eg. RR
    4. Process一旦被置入於某個Queue中,就不可(不允許)在不同ready queues之間移動
  • 舉例:I/O-Bound與CPU-Bound Job你會置於哪個Queue中?

    Ans:I/O-Bound Job —>Q1

​    CPU-Bound Job —>Q3

  • 分析:

    1. 可參數化的項目眾多1. Queue的數目 2. Queue之間的排班法則 3. 每個Queue自己的排班法則 4. Process被放入哪個Queue之Criteria ,有助於排班設計及效能調校之Flexibility

    2. 不公平

    3. Starvation(被放在Q3 的Process永世不得翻身,因為Process一旦被置入於某個Queue中,就不可(不允許)在不同ready queues之間移動☆☆☆☆☆

    4. Preemptive

MultiLevel Feedback Queues(MFQs)(多層回饋佇列)

  • 定義:與MultiLevel Queue相似,差別:允許Process 在不同Queues 之間移動,可採取類似Aging技術,甚至可以搭配降級的做法,來避免Starvation
  • 分析:
    1. 可參數化的項目眾多1. Queue的數目 2. Queue之間的排班法則 3. 每個Queue自己的排班法則 4. Process被放入哪個Queue之Criteria 5.Process在不同佇列之間移動的規則,有助於排班設計及效能調校之Flexibility
    2. 不公平
    3. 不會有Starvation(被放在Q3 的Process永世不得翻身,因為Process一旦被置入於某個Queue中,就不可(不允許)在不同ready queues之間移動☆☆☆☆☆
    4. Preemptive

小結

  1. 哪些是Non-preemptive法則

    Ans. FIFO,SJF,SRTF, Non-preemptive priority

  2. 哪些是No Starvation

    Ans. FIFO, RR, MFQs

  3. 哪些包含於(∊)關係是錯的

​ A. FIFO ∊ Priority

​ B. SJF ∊ Priority

​ C. FIFO ∊ RR

​ D. SJF ∊ RR

​ E. RR ∊ MFQs 是喔,MFQs的參數可以設定成一條Queue

​ Ans. (D)

補充 CPU Utilization計算

例1.

假設採RR排班

Time Quantum值= Q

Context Switch Time = S

Process 平均執行每隔T時間會發出I/O-request, 求下列Case之CPU Utilization(cpu花在Process exec time / CPU **total time(process exec time + context switching time+ idle time)** )

  1. 0 < S < T «Q

    image-20221219205831174

  2. 0<S<Q«T

image-20221219210325226

  1. 0<S=Q «T

    image-20221219211653789

  2. Q非常小

    image-20221219211707198

例2. [恐] (看不懂)

10個I/O-Bound Tasks(很花I/O)

1 個CPU-Bound Tasks(很花CPU)

I/O-Bound task執行每隔1ms 發出 I/O-request,每個I/O-運作花10ms

Context Switching Time = 0.1 ms, 求CPU utilization, 採RR法則

  1. Quantum = 1ms

    image-20221219215757814

  2. Quantum = 10ms

    image-20221219220609086

​ 寫完之後會發現有個info沒有用到「每個I/O-運作花10ms 」,因為有CPU-Bound的存在,所以不存在idle Time,如果不存在CPU-Bound,則可能存在idle的情形,就需要考慮這種情形

特殊系統之排班設計考量

Multiprocessors System

  1. Multiprocessors分為

    1. ASMP(非對稱的,Master-slave架構) —> 沒有什麼特殊設計,嘻嘻,因為只有Master這個CPU去看ready queue以及job的assign,所以其實沒啥特殊設計

    2. SMP(對稱式) —>

      1. 每個CPU共享同一條Ready Queue,當CPU完成某Process後,就去存取ready Queue,取走一個Process執行。設計重點:必須提供ready queue的互斥存取機制,若未提供,則可能發生Process重複執行或Process被ignored(無人執行)之錯誤

        image-20221220225037817

        例如:CPU去取得Process之工作如下

        1. 取得(read) Ready Queue, Frond End的process之PCB Pointer
        2. 刪除此Process Pointer from Queue
        CPU1CPU2
        T1: step1: 取得P1 PCB pointerT2:step1取得P1 PCB pointer
        T3: Dequeue執行T4: Dequeue執行

        設計重點:

        1. 必須提供ready Queue的互斥存取機制
        2. 不須考量Load Balancing
      2. 每個CPU有自己的Ready Queue

        每個CPU只會檢查自己的ready Queue, 有工作就執行,無工作就idle

        設計重點:

        1. 不須有互斥存取的考量,一旦發生idle,則把其他CPU的queue調整過來
        2. 需考量Load Balancing,避免有CPU沒事,有CPU很忙。通常使用兩種機制來調整CPU Loading
          1. Push migration(移轉)
          2. Pull migration(移轉)

Processor affinity

  • 定義:在multiprocessors system中,當process已決定某CPU上執行,則在他執行過程當中,盡量不要將之移轉到其他CPU上執行(除非有其必要,eg. processor BAD, load Balancing, etc)避免CPU內之cache等內容要複製,且刪除,影響到效能表現,可以有
    1. Hard affinity:規定process不可移轉
    2. Soft affinity:盡可能不轉,但不強制限制,若有需要還是可以轉

Real-Time System排班設計考量

Hard real-time system

  • 排班設計考量

    Step

    1. 先確定這些工作是否schedulable(可排程化,CPU可以負荷的了)

    2. 確定可schedulable後,然後在考慮是否可以滿足各工作的DeadLine

      兩個排班法則

      1. Rate-Montonic scheduling
      2. EDF(Earliest Deadline First)法則
  • Schedulable與否之判斷公式:

    image-20221221220452472

    例:有下列4個Real-time event. 其CPU burst time,Period Time 分別是:

    CPU Burst TimePeriod Time
    20ms80ms
    50ms100ms
    30ms30ms
    Xms1Sec

    ,則在Schedulable要求下,x不可超過?ms

    Ans

    image-20221221222752875

  • 怎麼排程以滿足個工作DeadLine after Schedulable?

    • Rate-Monotonic法則

      1. 採取Static priority(一旦process的優先權高低順序訂定了,就不會再改變) 且 preemptive 法則

      2. Period Time愈小,優先權越高

      3. 舉例

        ProcessPeriod TimeCPU time
        P15020
        P210035

        Q1. schedulable與否?

        image-20221221233303344

        Q2. 若規定P2的優先高,且preemptive, 這樣是否滿足DeadLine?這題感覺怪怪的,不懂

        image-20221222001538807

        Q3. 採用Rate-Monotonic, 是否滿足Deadline?

        image-20221222001627140

      4. 分析:

        1. 並不保證可以滿足DeadLine
        2. 在Static priority要求下,它是Optimal(若它無法滿足DeadLine,其他Static priority 法則也是無法滿足
    • EDF(Earliest Deadline First)

      • 定義:採用Dynamic priority 且Preemptive

      • 規定:DeadLine越小(早)優先權越高

      • 舉例:

        ProcessPeriodCPU Time
        P15025
        P28035

        是否滿足Deadline?

        1. Rate-Monotonic

          image-20221222222736843

        2. EDF

          image-20221222231738347

      • 分析:

        1. EDF保證是optimal in the schedulable case(任何工作都可以滿足 DeadLine)
        2. 理論上,CPU utilization 可達100%,但實際上不可能,因為有Context switching, interrupt handling 等額外負擔

Soft real-time system

  • 定義:這個系統要確保real-time的process取得最高優先權,同時,這個real-time的process priority不能做衰減

  • 就CPU Scheduling Design 而言,必須

    1. 支援preemptive-priority
    2. 不支援Aging技術
    3. 盡可能降低Kernel Dispatch latency time, 使得real-time process可以及早開工
  • 降低kernel Dispatch latency

    1. 困難度(緣由) :大部分的OS,皆不允許當kernel正在執行System Call or 其他System processes時,被user process任意插隊(preemption),目的是為了確保kernel Data Structures的正確性(即不要有Race Condition),然而此種做法,對於Soft real-time system極為不利

      eg. 假設目前kernel 正在執行一個Long-time system call(eg. I/O operation),而此時real-time process到達/fork(),它必須等到kernel完成此long-time system call後,才能取得CPU,所以

      Dispache latency太長,要解決此一問題,原則是: 必須插隊kernel 且要保障kernel Data Structure之正確性

      方法

      1. Preemption Point:

        • 定義:在此System calls code中,加入一些Preemption Point(在此時點插隊時,Kernel是安全的)將來,System call執行時若遇到Preemption Point ,System call會先暫停,Kernel會檢查此時是否還有real-time process存在/到達,若有,則Kernel system call暫停執行,CPU分派給real-time Process使用,若無,則System Call繼續執行,直到遇見下一個Preemption Point
        • 缺點:System Call中可以加入的Preemption Point數目不夠多,因為Dispatch Latency仍然很長。
      2. Kernel可隨時被real-time process插隊,但要對於Kernel的共享Data Structure/resoruce提供嚴謹的互斥存取(Synchronization 機制),以確保資料之正確性(當P1對某個Data進行操作,執行到一半時被real-time process給搶走,此時會把該Data給Lock住,不讓real-time process操作該Data,以保護資料)

        • 缺點:可能造成Priority Inversion問題(優先權反轉),高優先權的Process所須的共享Data/resources恰好被一些低優先權的Process把持,無法存取(所以互斥存取控制之故),造成高優先權等待低優先權Process之情況(即高process要等低process釋放這些共享Data/resource)

          image-20221225000043643

          當高優先權的Process因為遲遲等不到Lock解除,會因為time-out的關係而放棄CPU,此時可能有其他中優先權的Process取得CPU的使用權,因此低優先權的Process完成不了,進而完成對共享Data/resources之使用進而Release, 所以高優先權process被迫要等一段很久的時間

        • 解決方法:Priority Inheritance

          • 定義:讓低優先權的Process暫時繼承高優先權之權值,使得低優先權Process可以很快取得CPU完成對共享Data/Resouce之使用,並release them. 同時,也立刻恢復其原本的低權值

Real-time system之Dispatch Latency 組成

image-20221225005405637

Dispatch Latency有兩個phase組成

  1. Conflict Phase:
    1. Preempts kernel
    2. 低優先權realse高優先權所需之Data/resource
  2. Dispatch Phase
    1. Context Switching
    2. Change mode to user Mode
    3. Jump

Thread Management(貝多芬)

Thread( or Multithreading)定義、優點

Process(Single-Threaded) vs Thread (Multithreading)

user-level thread 與 kernel-level thread

Multithreading Model(3種)

Multithreading issue

fork()

signal delivery

Threads pool

程式追蹤(PThread library)

Thread

  • 定義:又叫lightweight-process(傳統的process就叫heavyweight process),是OS分配CPU time 之對象單位**(恐:It’s a basic unit of CPU Library)**

  • Thread 建立後,其私有的(private)內容組成包含有(都是與執行相關的)

    1. Programming Counter
    2. CPU registers value
    3. Stack
    4. Thread ID, State, etc …(Note: record in TCB[Thread Control Block])此外,同一個Process內不同之Threads彼此共享此Process的
      1. Code Section(合稱Memory space, address space)
      2. Data Section(合稱Memory space, address space)
      3. other OS resources eg. open files, I/O resources ,singal, etc …
  • 圖示

    1. MultiThreading Model

      image-20221225124253929

    2. Process = Single-Threaded Model

      image-20221225125053668

      Note: 類比

      Process —> 汽車

      Thread —> 引擎

      汽車會有一個引擎,也可以有很多,MutliThread就像是一部車子有多個引擎,然後共享車子有的配件(儀表板、方向盤等等)。CPU Time是以Thread為對象在畫分

  • 優點(Benefits)

    1. Responsiveness:當Process內執行中的Thread被Blocked,則CPU可以切給此Process內其他available Threads 執行,故整個Process不會被Blocked,仍持續Going, 所以Multithreading用在user-interactive application, 可增加對User 之回應程度
    2. Resource Sharing:因為Process內之多條Threads 共享此Process code section,所以在同一個Memory space上可有多個工作同時執行
    3. Economy:因為同一個Process內之不同Threads彼此共享此Process的memory 及 other OS resources, 因為Thread 之 私有成分量少,故Thread之Creation, Context Switching fast, Thread management cost is cheap(fork一個Process的成本遠大於複製一個Thread)
    4. Scalability(Utilization of Multiprocessors Architecture):可以做到同一個Process內之不同Threads可以在不同CPUs上平行執行,所以可以增加對Multiprocessors System之效益(平行程度)提升

Process Vs Thread

其實是在比Singal Thread and MultiThread

Thread的的優點

ProcessThread
Heavyweight processLightweight process
Single-Threaded ModelMultiThreading Model
是OS分配Resource之對象單位是OS分配CPU Time之對象單位
不同的Process不會有共享的Memory及Other Resources (除了Shared Memory溝通之外)同一個Process內之Threads彼此共享此Process之memory 及Other Resources
若Process內的single Thread is Blocked, 則整個Process亦Blocked只要Process內尚有Available Thread可執行,則整個Process不會被Blocked
Process之Creation context Switching慢,管理成本高Thread快,成本低
對於MultiProcessors架構之效益發揮較差較佳

Thread的的缺點

ProcessThread
Process無此議題(除非是採用Shared Memory溝通)因為同一個Process內之Threads彼此共享此process Data Section,因此必須對共享的Data 提供互斥存取機制,防止race Condition

Philosophy

Process與Thread沒有功能差異,只有效能差異(你會的,我也可以,你不會的,我也不會)。

哪些工作適合用MultiThreads?

Ans. 一個時間點有多個工作要執行。例:Client-server Model(同時有人過來要檔案,看檔案)

哪些工作不適合用MultiThreads?

Ans. 一個時間點最多只有一個工作可以做。例:命令解譯器(eg. UNIX 之 Shell)

Thread分類:user-Thread與Kernel-Thread

區分角度:**Thread Management工作(如:Thread Creation, Destroy, Suspend, wakeup, Scheduling, Context Switching, etc)**由誰負責

  1. User-Level Thread

    • 定義:Thread Management是由在User Site之Thread Library提供APIs, 供User Process呼叫使用,進而管理,稱之
    • Kernel 完全不知道(is Unaware of) Use-Level Threads 之存在Note:只知有Process(Singal-Threaded)image-20221227215115098
    • Thread management不須Kernel介入干預**(kernel unware user-thread)**
    • 優點:There creation, context switching 等,Management is fast 成本較低
    • 缺點:
      1. 當Process內某條執行中的user-thread is blocked(eg. i/o),會導致整個Process亦被Blocked(即使process內還有其他available threads)這個process都是user Thread,發出一個blocking的system call, kernel會認為是這個Single process發出的請求,因為kernel不知道process裡頭還有其他user Thread的存在,於是就把整個process block住,CPU切到其他process去執行
      2. MultiProcessors架構效益發揮較差(因為無法做到process內之多條user-threads平行執行,但這樣也是有好處的,整個thread的管理不需要kernel的干預,不需要再user, kernel間切換,降低管理的成本)
    • 例:舉凡Thread library皆是user-threads(eg. POSIX 的 PThread library是規格,只在UNIX系統上, Mach的C-Thread Library, Solaris2以上的 UI Thread Library及Green Thread Library).
  2. Kernel-Level Thread

    • 定義:Thread Management完全由kernel負責,Kernel知道每一條Thread之存在並進行管理

    • 優缺點與user-thread相反

    • 例:大部分OS皆支援 (Windos系列 etc. 2000, Xp, UNIX, LINUX, Solaris)

    • 舉例:[Module版]

      image-20221227221417715

      • CPU Time依分配對象數,平均分配(10個人就分10%,20個人就分5%)
      • 則Pa, Pb各分到?%CPU Time,if All Threads are
        1. User Thread:kernel只知道有兩個Process要來搶CPU,來分CPU Time,Pa,Pb各分50%
        2. Kernel Thread:kernel知道有5條Thread要分CPU time,1條分20%,Pa分到3條,所以是60%, Pb是40%

MultiThreading Model [恐龍本獨有]

恐龍本用來詮釋user Thread跟Kernel Thread的見解

[user thread mapping kernel thread的數目]

  1. Many-to-One Model
  2. One-to-One Model
  3. Many-to-Many Model
  1. Many-to-One

image-20221228220250841

  • 定義:This model maps many use threads to one kernel Thread. Thread Management is done in use space
  • 優、缺點:如同user thread
  • 例:thread library皆是
  • 圖示:

image-20221228220049555

image-20221229212527117

  1. One-to-One Model
  • 定義:This model maps each use Threads to a kernel Thread. Thread Management is done in use space
  • 優點:同kernel thread
  • 缺點:
    1. Slower
    2. Process每建立一條user-thread, system就必須配合生一條kernel thread與之,所以user thread數目眾多,系統負擔會很重,耗資源
  • 例:Window NT, Window2000, OS/2, Linux(個人電腦系列幾乎都是ONE-TO-ONE)

image-20221229220124154

  1. Many to Many
  • 定義:This model maps many use Threads to a small or equal number of kernel Thread. Thread Management is done in use space
  • 優點:同前述kernel thread, 負擔也不像one to one的model來的重
  • 缺點:1. slower 2. 製作設計上,較為複雜

image-20221229222340644

image-20221229224155328

MultiThreading Issue

原本Single Thread沒這問題

  1. fork() issue

image-20221229230232766

  1. Signal delivery(傳送) issue

    1. Signal:it is used in UNIX to notify(通知) the process that a particular event has occurred

    image-20221229231422602

    當process收到signal通知後,它必須處理(可由process自己處理或交給default signal handler處理)

    image-20221229232030659

    1. Signal的種類

      1. Synchronous signal[自作自受,這件事情是由你這個Process發生的,所以Signal就是發給你]eg. Divide-by-zero, illegal memory access,
      2. Asynchronous signal[池魚之殃,事情不是你做的,但別人發出,卻是砍你] eg. ctrl-c by administrator, time-out by timer

      image-20221229233929050

      1. Signal Delivery issue

        4個options

        1. 發給那個thread

        image-20221230220600034

        1. 發給大家

          image-20221230220706683

        2. 發給一些threads

          image-20221230220735243

        3. 發給一個thread,這個thread再把signal轉派給大家

          image-20221230220744830

  2. Threads Pool

    • 緣由:在Client-Server Model中,當Server 收到Client’s request後,Server才建立Thread去服務此一請求,然而Thread creation 仍須耗用一些時間,所以對client 之回應不是那麼迅速
    • 解法:採用Thread pool機制,process(server)先建立一些Threads,置於threads pool中,當收到Client’s request後,就從Thread pool中指派一條 available thread去服務此請求,不須creation回應較fast,當此Thread 完成工作以後,再回到Threads pool中Stand By 如果Threads Pool中無可用的Threads,則Client’s request 須等待
    • 缺點:
      1. 萬一Process事先生出過多的Threads in the Thread pool, 對System resource耗用很高,Note:通常OS會限制Threads pool size

Thread程式追蹤

(以PThread library為例)

例:P4-49

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <Pthread.h>
int sum;
void *runner (void * param){
    sum =0;
    for(int i=1;i<=upper;i++){
        sum+= i;
        Pthread-exit(0); //thraed終止
    }
};
main(){
    Pthread-t tid; //tid就代表Thread的id
    Pthread-attr_t arrt; //代表attribute屬性 Thread attributes set
    ...
   Pthread-attr-init(&attr) ;//取得attr 初始值
   Pthread-create(&tid, &attr, runner, argv[1]); //根據attr 屬性值建立一條Thread,Id記在tid中,執行runner()副程式
   Pthread-join(tid, NULL); //main() thread 在此等待,直到tid thread結束
   printf(sum);
}

image-20230101163345552

例:P4-50 程式二

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
int value = 0; 
void main(){
    int pid ;
    pthread-t tid;
    Pthread_arrt_t attr;
    pid = fork(); //create child process
    if(pid==0){ //子prcess要做的事情
        pthread_create(&tid, &attr , runner,NULL); //子Process去create一條thread
        printf(value); //line C   
    }else if(pid > 0){
        wait();
        printf(value); //line P
    }
}
void *runner(){
    value =5;
    pthread_exit();
}

image-20230101164807174

例 p4-70

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
shared by threads
A. static local variables(共享)
B. program text/exec, binary (code sec)共享
C. register value of CPU(私有)
D. heap memory (code+ Data sec memory space)共享
E. Programming Counter (私有)
F. Stack memory(私有)
G. Open Files(共享)
H. I/O resources(共享)
I. local variable(私有)
J. Global variables(共享)

Chapter 5 DeadLock

  • 定義:成立的四個必要條件,例子, 與Starvation做比較

  • Deadlock的處理方法

    1. Deadlock Prevention ★★★★
    2. Deadlock Avoidance(Banker’s Algo★★★★★)
    3. Deadlock Detection and Recovery★★
    4. Ignores it .
  • 定理★★★★★:

  • 相關圖形

    Resource Allocation Graph(RAG)+3點結論★★★★★

    Claim edgy+RAG(for Avoidance)

    wait for Graph(for Detection)★

DeadLock

  • 定義:系統中存在一組Processes彼此形成循環等待之情況,造成這些Processes皆無法往下執行(和starvation不同,Starvation還有一絲可能會做到),並降低Throughput之現象。

  • 死結成立的4個必要條件(4 necessary condition),即缺一個,死結就不會發生. Ex. if there 4 conditions are true, then the deadlock will arise. Ans. False,都有不代表一定會發生

    1. Mutual Exclusion

      互斥性質,這是對Resource(正在搶奪的資源)而言,具有此性質的Resouce,在任何時間點最多只允許一個Process持有使用,不可多個process同時持有/使用。

      例:大多數的資源皆具此性質,eg. CPU, Memory, Disk, printer, etc …

      例:read-only file:不具互斥性質

    2. Hold & wait

      持有並等待,Process持有部分資源,且又在等待其他Process持有的資源

    3. No preemption

      不可搶奪,**Process不可以任意剝奪其他Process所持有的資源,**必須等到對方釋放資源後才有機會取得資源若可Preemption,則必無DeadLock,頂多只有Starvation

    4. Circular Waiting

      循環等待,系統中存在一組Processes形成循環等待之情況,eg.

      image-20230102162108560

    恐龍本:4 implies 2

    其他版本:4 implies 1,2,3eeeee

    ex. Why Singl-process不會造成DeadLock?

    A:因為Circular waiting 不存在,只少要有兩個process才可以形成循環等待,因此四個必要條件有一個不符合,即不會造成DeadLock

  • 例子:

    image-20230102163619321

    • 與Starvatiom比較

      不同點:

      DeadLockStarvation
      一組Processes形成Circular waiting,造成這些Processes皆無法往下執行,Waiting foreverProcess因為長期無法取得完工所需的各式資源,造成它遲遲無法完工,有完工的機會喔,只是機會渺茫
      會連帶造成throughput低落與throughput高低無關
      有4個必要條件,其中一定是No preemptive容易發生在Preemption的環境(沒有一定,只是容易)
      解法有prevention, Avoidance, Detection & recovery採用Aging技術防止

      相同點:

      DeadLock 7 Starvation
      皆是資源分配管理機制設計不恰當相關。

Resource Allocation Graph(R.A.G)

資源分配圖

  • 定義:令G=<V,E> 有向圖代表RAG,其中

    1. Vertex(頂點):有兩個類型:

      1. Process:以O來表示

      2. Resource:以image-20230102171928690表示

        其中”·“數目代表The Number of instances

    2. Edge(邊):分為2種edge:

      1. Allocation Edge:image-20230102172625471
      2. Requset Edge:image-20230102172716745
  • 例子 :

    image-20230102173423507

RAG的三點結論☆☆☆☆☆必考

  1. No Cycle則No DeadLock
  2. 有Cycle不一定有死結 例:image-20230102175224638因為P3一定可以完工,會釋放1個R2, 可佩給P2,此時圖無Cycle,No DeadLock
  3. 除非(若)每一類型的資源,皆為Single instance(單一數量),則有Cycle必為死結

DeadLock處理方式

  1. DeadLock Prevention
  2. DeadLock Avoidance(避免) Banker’s Algo
  3. DeadLock Detection & Recovery

1.2

  • 優點:

    1. 保證System is Deadlock free (or never enters the deadlock state)
  • 缺點:

    1. 對Resource的使用/取得限制多,因為resource utilization 偏低,連帶throughput 也偏低
    2. 可能造成Starvation

3

  • 優點:
    1. Resources utilization相對較高. throughput也連帶較高
  • 缺點:
    1. System有可能進入DeadLock state
    2. Detection & Recovery之cost相當高

DeadLock Prevention

  • 原則:破除4個必要條件之其中一個,則死結必不發生
  1. 破除 “Mutual Exclusion” -> 兩個字「辦不到」!因為這是Resource與生俱來(inheritance)的性質

  2. 破除 “Hold & wait " - > 兩個方法(protocols)可用,想辦法讓Hold不成立,或是讓Wait不成立

    1. OS實施規定:除非Process可一次取得全部所需資源,才准許持有資源,否則不得持有任何資源,但這樣子會有資源利用度低的問題(明明可用,但卻要等到全部都可以用才可以使用)
    2. OS實施規定:Process可先持有部分資源,但當Process要申請其他資源時,必須Release持有的全部資源(不再Hold),才可提出申請。但資源利用率一樣很低,因為有可能會把即將要使用的資源釋放出去
  3. 破除"No preemption” -> 改為"preemption” 即可, eg. based on priority-level

  4. ☆☆☆☆☆破除"Circular waiting" -> 方法叫做"resource ordering" ,

    1. OS會賦予每一個類型資源一個Unique(唯一的)Resource id

    2. OS會規定Process必須按照Resource Id Ascending(遞增、遞減都行,你爽就好)的方式對資源提出申請

      持有的欲申請的允許或不允許
      R1R3允許
      R5R3必須先放到R5,才可提R3(因為不符合遞增)
      R1,R5R3必須先放到R5,才可提R3(因為不符合遞增)

      WHY?

      pf:假設在這樣的規定下,系統仍存在一組Processes形成Circular waiting如下

      image-20230103215842475

      依規定,我們可以推導出資源ID大小關係如下

      r0 < r1 < r2 < … <rn < r0

      竟推出 r0 <r此一矛盾式子,因此Circular waiting必不存在

Deadlock Avoidance

  • 定義:當某個Process提出某些資源申請時,則OS必須執行Banker’s Algorithm,以確定倘若分配給process其申請資源後,System未來處於safe state,若Safe則核准其申請,否則(unsage)則否決其申請,process必須等一段時間後,再重提申請。

    image-20230103223800287

  • Deadlock是unsafe之subset

Banker’s Algo ☆☆☆☆☆

本章的計算題都在這 Banker's Alog and Safety Algo

  • 定義:使用的Data Structures

  • 看不懂的話直接看下面範例比較快

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    假設
    n:process個數
    m:  resource種類數
    1. Request i :[1..m]of int
      -> Pi提出之各式資源申請量
    2. Allocation : n*m martrix 
      -> 各個process目前持有的各式資源數量
    3. MAX: n*m martrix
      -> 各process完工所需之各式資源最大數量
    4. Need:n*m martrix(自己算)
      -> 各process尚須(欠)各式資源數量才能完工,因此Need= MAX -Allocation
    5. Avaliable:[1..m]of int 
      -> 系統目前可用的,各式資源數量,因此Available=資源總量-Allocation
    舉例說明:假設有人來貸款3,000萬,那麼Requesti =3000萬、Allocation就是自己的存款,假設這邊是2,000萬,想買一棟9,000萬的房子,這9,000萬就是他的MAX,那麼Need= 9,000-2,000= 7,000萬,Available 就是銀行目前金庫裡能借給你的錢,這邊假設是10,000萬。
      
    Step1. Check Request <= Need ?若成立,則往下執行,若不成立,則終止Process。
    Request=3,000萬,Need= 7,000萬。這樣就是合理的,但假設你今天需求7,000萬,可是卻貸了3,000兆,遠超於你的需求,那就有問題了
      
    Step2. Check Request <=Available?若成立,則往下執行,若不成立,則Pi waits until resouce availalbe
    概念就是你去貸3,000萬,可是銀行金庫目前的錢不夠,需要你稍等一下
      
    Step3 (試算)
    假設貸款成功
    Allocation = Allocation + Request
    Need = Need - Request
    Available = Available - Request
      
    Step4 依上述試算值,必須執行 "safety" algo,若回傳"Safe" state則核准Pi此次申請。若回傳"unsafe" state,則否決Pi此次申請。Pi必須等一段時間再重提申請
    

Safety Algorithm

  1. Data Structures used 除上述之外,另外加入

    1. Work:[1..m] of int -> 表系統目前可用Resources之累計數量

    2. Finish:[1..m] of Boolean -> 針對Process

      Finish[i]=

      True: 表Pi可完工

      False: 表Pi尚未完工

      ∀1<=i<=n

  2. Procedures

    Step

    1. 設定初值

      Work = Available

      Finish[i]皆為False

      ∀1<=i<=n

    2. 看可否找到Pi滿足:

      1. Finish[i]為False且
      2. Needi <= Work (我所需要的資源,)

      若可找到,則進3,否則則進4

    3. 設定Finish[i]=True,且Work= Work + Allocationi, then, 回到2

    4. Check Finish Array, 若皆為True,則傳回Safe State,否則傳回Unsafe state

範例

1
2
3
4
5
6
5個Process(P0,P1,P2,P3,P4)
3種resource(A,B,C)
資源量(A,B,C) = (10,5,7)

1. 求出Need及Available
2. P1提出(A,B,C)= (1,0,2)申請,是否核准?Why?

Ans.

  • Allocation-各個Process身上所持有的資源
ABC
P0010
P1200
P2302
P3211
P4002
  • MAX- Process完成工作最多所需要的資源數量分別是多少
ABC
P0753
P1322
P2902
P3222
P4433
  • Need= MAX-Allocation
ABC
P07-0=75-1=43-0=3
P13-2=12-0=22-0=2
P2600
P3011
P4431
  • Available= 系統目前還剩的可用資源數,資源總量()-已經配置出去的(Allocation出去的)
ABC
10-(2+3+2)=35-(1+1)=37-(2+1+2)=2

Request=(1,0,2), Banker’s Algo

  1. Check Request <= Need ? (你所要求的小於你真正需要的,亦即你買東西只要500,不能跟銀行借到500萬)

    image-20230107115630812

  2. Check Request <= Available (你要的借的錢是否小於銀行本身所持有的錢,亦即如果你要借1億,但銀行只有一百萬)?

    image-20230107120047287

  3. (試算)

    P1:

    Allocation = <2,0,0>+<1,0,2>(申請量) = <3,0,2>

    Need = <1,2,2> - < 1,0,2>(申請量) = <0,2,0>

    Available = <3,3,2> - <1,0,2>(申請量) = <2,3,0>

  4. 依上述調整值,來執行"Safety" Algo

  • Allocation
ABC
P0010
P1(要調整)302
P2302
P3211
P4002
  • MAX
ABC
P0753
P1322
P2902
P3222
P4433
  • Need
ABC
P0743
P1(要調整)020
P2600
P3011
P4431
  • Available
ABC
230

Safety Algo

  1. 初值的設定

    • Work = Abailable = <2,3,0>

    • Finish

      01234
      FFFFF

    尋找有沒有Process還沒完成工作,並且它的needi <= work的

  2. 可找到P1滿足Finish[i]= False且Need <=work

image-20230107123442941

  1. 設定Finish[i]=True,且Work= Work+Allocation = (2,3,0) + (3,0,2) = (5,3,2) , then goto 2
  2. work = (2,3,0) > (5,3,2)

image-20230107123951216

  1. 選擇P3滿足 Need<= Work,且Finish[i] = False

  2. 設定Finishj[3]=True,且Work=(5,3,2) +(2,1,1) = (7,4,3), then goto 2

  3. … 以此類推,P0, P2, P4皆可Finish,直到大家都Finish,因此大家都滿足了。

  4. Check Finish陣列,因為皆為True,所以傳回Safe State因此核准P1此次的申請

  5. 列出上述其中一組Safe SequenceSafe Sequence/ Safe State定義:至少可以找到>=1組,Safe Sequence,成為Safe State,否則unsafe state。代表OS未來依此Processes順序可分配各Process所need的資源,使得大家皆可順利完工

    Ans. P1,P3,P0,P2,P4

  6. 依現在狀況,若P4提出(3,3,0)申請,是否核准?why? (練習題)

    Ans. Banker’s algo

    1. Check Request (3,3,0) <= Need(4,3,1) 通過

      • Need
      ABC
      P0743
      P1020
      P2600
      P3011
      P4431

​ 2. Check Request4(3,3,0) <= Available (2,3,0)?

​ 不成立,因為無法核准,可用資源不足

  1. 依現在情況,若P0提出(0,2,0),是否核准? Why?

    Ans. Banker’s Algo

    1. 快速跑過,確認可以過,資源分配改變如下

      • Allocation

        ABC
        P0030
        P1302
        P2302
        P3211
        P4022
      • Need

        ABC
        P0723
        P1020
        P2600
        P3` | 0 | 1 | 1 |
        P4431
      • Available

        ABC
        210
    2. 執行Safety’s algo

      1. 設定初值,Work=(2,1,0)
      2. 找尋是否有符合Needi <= Work 的Process,且還有Process為False**(不通過)**,所以unsafe

範例二

  • Allocation

    ABC
    P0030
    P1302
    P2302
    P3211
    P4002
  • Need

    ABC
    P0723
    P1020
    P2600
    P3011
    P4431
  • Available

    ABC
    21x

求x的最小值,使其成為Safety

  1. 設置初值,work= (2,1,x)
  2. 找尋 Need <= work
  3. 找到了,P3,先暫定x=1 (2,1,1)
  4. P3因為可以完成,完成後資源就可以釋放出來,因此work (2,1,1) > (4,2,2)
  5. 繼續找尋Need <=work
  6. 找到了,P1
  7. P1因為可以完成,完成後資源就可以釋放出來,因此work(4,2,2) > (7,2,4)
  8. …往復循環,以此類推

x= 1;

image-20230107194309689

Banker’s Algo 之 Time Complexity

先講結論,複雜度就是O(n^2*m)

(n: Process 數目, m:resource 種類數)

Banker’s Algo Time Complexity

Step

  1. O(m)Check Request <= Need
  2. O(m) Check Request <=Available
  3. O(m)試算
  4. Run safety algo
  5. 設置初值work -> 1~m的一維陣列,因此複雜度為O(m)。Finish ->1~n的一維陣列,因此複雜度為 O(n)
  6. 先來看看Safety’s algo的步驟image-20230109221851317

​ 第一次最多會檢查n次,再來第二次檢查n-1次…

​ =(n+1)n/2個Processes。每次檢查Need <=Work 花O(m)的時 間,最多花O(n^2*m) time

  1. 花O(n) Check Finish

因此複雜度就是O(n^2*m)

針對每一項類型資源,皆為Single-instance情況下,有較簡易的Avoidance作法

  1. 利用RAG,搭配Claim edge(宣告邊)使用

  2. Claim edge:

    image-20230110213506269

    代表Pi未來會對Rj提出申請(即表MAX/NEED之意義)

  3. Steps:

    當Pi提出Rj申請後

    1. 檢查有無Pi對Rj的這條宣告邊(Claim edge)存在,若有,則goto2否則,終止Pi

    2. Check Rj是否Available,若是,則goto3,否則Pi waits(變成申請邊)

    3. (試算)暫時把宣告邊改為配置邊image-20230110234601069

    4. 執行safety’s Algo, check 圖中是否有cycle存在

      若沒有,則為safe -> 可核准

      有Cycle,則為unsafe -> 否決

  4. 例:

    image-20230110233244192

    1. 若P1提出R2之申請,是否核准?

      Ans.

      image-20230110235023904

    2. 若P2提出R2之申請,是否核准?

      image-20230111000113366

補充:Deadlock是unsafe之subset(或unsafe有可能導致死結,也有可能不會導致死結)

image-20230111001212290

  1. 可能不會死結

    ans. 搞不好P1在提出R2的申請時,就使用完R1了,這時就不會有死結。或是P2在P1提出申請之前就使用完R2了,此時也不會有死結。

  2. 可能會有死結

    ans. P1立刻對R2提出申請,此時RAG有Cycle,且資源都是Single Instance

也就是說死結產生與否取決於宣告邊在哪個moment提出申請

定理

系統若有n個processes,m個resource量(單一種類)滿足下列2個條件:

  1. 1≦MAXi≦m(每個process的最大需求量至少要有1個,最多不超過m)

  2. 且所有n個process的Maxi加總,小於n+m

    $$ \sum_{i=1}^nMAXi<(n+m) $$

    則System is Deadlock free.

例1. 有6部printers被process使用,每個process最多需要2部printers才可以完工,則System 最多允許?個process執行以確保deadlock Free?

ans. m=6, Max=2

開始跑定理

  1. 1 ≦ Maxi ≦ m -> 1 ≦ 2 ≦ 6成立

  2. $$ \sum_{i=1}^nMaxi<(n+m) $$

​ 所以2n<n+6,n<6,Ans: 最多5個processes

詳解

  1. 所謂死結的發生,就是系統已經將所有的資源都投入下去,但依然沒有產出,不會有一個系統是佔據著資源不分配,看著底下的Process進入Deadlock還很開心

    image-20230112221927497

  2. 應此將資源分配下去後,就是長這樣

    image-20230112222025831

  3. Process取得2個Resource後就可以執行,執行完後又釋放2個Resource給其他的Process使用

    image-20230112222203015

  4. 持續的把Resource分配給Process… 往復循環,即可完成。

  5. 若很不幸的是,如果今天是6個Process,就會發生死結

    image-20230112222340478

  6. 推導公式,若今天題目改成,每個Process需要3台印表機,現在有10部列表機,最多能允許幾個Process(MAX=3, m=10)

    3n<n+10

    =2n<10

    =n<5

​ ans. n=4

例2. 證明:

​ proof:假設資源全部配置出去

$$ 即\sum_{i=1}^n Allocationi = m $$

​ 又因為

$$ \sum_{i=1}^nNeedi = \sum_{i=1}^nMaxi-\sum_{i=1}^n Allocationi(Banker’s Algo) \
= \sum_{i=1}^nMaxi-m \
∴\sum_{i=1}^nMaxi=\sum_{i=1}^nNeedi+m $$

​ 再依據條件(2)

$$ \sum_{i=1}^nMaxi < (n+m) \
∴\sum_{i=1}^nNeedi+m<(n+m) \
$$

​ 得出這個結論

$$ ∴ \sum_{i=1}^nNeedi < n $$

​ 此事代表至少有>=1個Process之Needi為0,代表Process可以完工,且Pi至少會Release出>=1個Resource**(∵條件(1) -> MAX>=1,而Needi=0 ∴Allocation >=1)**使得剩下的Process當中又會有>=1個process之Need為0又可以完工。使得剩下的process中又會有>=1個Process之Need為0又可以完工,依此類推,所有Process皆可完工,∴Deadlock Free

解釋的數學式子如下,類似離散的鴿籠原理

$$ \sum_{i=1}^{n-1}Needi<n-1 $$

Deadlock Detection & Recovery

  1. 如果放任resource使用較無限制,雖然Utilization高,但是System有可能進入死結而不自知。因為需要有一個死結偵測演算法,及萬一偵測出有死結,如何破除這個死結(recovery)的作法。

  2. Recovery做法:

    1. Kill Process in the deadlock

      方法一:Kill All Processes in the deadlock寸草不生,眼不見為淨

      缺點:成本太高,先前的工作成果全部作廢。

      方法二:Kill processes one by oneKill一個之後,須再跑偵測Algo,若死結仍存在,再Repeat上述步驟

      缺點:成本太高,Loop次數*偵測成本

    2. Resource Preemption

      步驟一:選擇"Victim" process(假設此Process擁有資源A,B,C)

      步驟二:剝奪他們身上的資源(剝奪B,保留A,B,這是最基本的情況)

      步驟三:回復此Victim process當初未取得此剝奪資源的狀態(這一步非常困難,成本極高,也不一定做得好,此外也可能有Starvation的問題)

Deadlock Detection Algorithm(考比較多的是Banker,Detection稍微知道就好)

  1. Data Structures used

    n:process數

    m:resource種類

    1. Allocation:n*m matrix
    2. Availavle:[1…m] of int 目前可用資源數量
    3. Work: [1…m] of int
    4. Finish:[1…n] of Boolean
    5. Request:n*m matrix,各process目前提出之各式資源申請量

    Note:

    1. Avoidance(Banker’s Algo)含有未來(Future)info(MAX,Need)
    2. Detection:只有現在(Current)info
  2. Procedures

    步驟一:初值設定

    Work=Available

    Finish[i]= True: if Allocation ==0

    ​ False: **if Allocation ≠0 **

    步驟二:看可否找到Pi滿足:

    1. Finish[i]為False
    2. Requesti ≦ Work

    找到,則進入步驟三,否則進入步驟四

    步驟三:設定Finish[i]=True,且Work=Work+Allocationi, then 回到步驟二,找不到則回到第四步

    步驟四:Check Finish Array,若皆為True,因此目前無死結,否則則有死結,且Finish[i]= False者,即為陷入死結中

  3. Time:O(n^2 *m) –> 死結偵測一次,cost很高,再加上乘以偵測頻率

範例1:

  • Allocation
ABC
P0010
P1200
P2303
P3211
P4002
  • Request
ABC
P0000
P1202
P2000
P3100
P4002
  • Available
ABC
000

偵測目前有哪些死結?

若有,那些process in the Deadlock

Ans.

  1. Work = Available = (0,0,0)

    Finish

    01234
    FFFFF

    因為Allocation皆≠(0,0,0)

  2. ∵可以找到P0滿足Finish[0]為F,且Request≤work ∴到第三步驟

  3. 設定Finish[0]為True,且Work=(0,0,0)+(0,1,0)=(0,1,0),回到第二步驟

  4. ∵可以找到P2滿足Finish[2]為F,且Request2 ≤ Work,∴到第三步驟

  5. 設定Finsh[2]為True,且Work=(0,1,0)+(3,0,3)=(3,1,3),回到第三步驟

  6. 在步驟二與步驟三之間抽插,往復循環,P1, P3, P4皆可Finished

  7. Check Finish Array ∵皆為True,∴目前無死結

若每一類型資源資源皆為Single-instance,則有較簡化的Detection作法-使用Wait-For Graph

  • 定義:令G=<V,E>有向圖,代表Wait-For Graph,其中
  1. Vertex:只有Process Only,沒有Resource頂點
  2. Edge:Pi 等待—>Pj,稱之為wait edge
  • 是從RAG簡化而得,即若RAG中存在:

    1
    2
    
    graph LR;
    Pi --申請--> R --配置--> Pj
    

    則在Wait-For Graph 以

    1
    2
    
    graph  LR;
    Pi --等待--> Pj
    

    呈現

  • 偵測作法:在Wait-For Graph中,若有Cycle,則目前有死結,否則目前無死結

  • 例:RAG如下

image-20230115163340361

  1. 化成Wait-For Graph

  2. 目前有無死結

    Ans.∵有Cycle,∴目前有死結

    image-20230115163349303

Chapter 6 Process Synchronization

Process Communication,Inter Processes Communication; IPC

Process的關係就兩種

  1. Independent
  2. Cooperating(有資訊交換的需求)

何謂同步(Synchronization)?Process在執行的過程當中,因為某件事情的發生或沒有發生,導致它必須停下來,等對方完成,才可以接著往下做,符合這些事情的就是同步。

  • Process Communication兩大方式

    1. Shared Memory

    2. Message Passing

  • Race Condition Problem

  • 解決Race Condition之兩大策略

    1. Disable interrupt
    2. Critical section design
  • C.S.Design 必須滿足的3個Criteria(Mutual Exclustion, Progress, Bounded Waiting)

  • C.S Design 方法(架構)

    • SoftWare Solutions
    • HardWare Instructions Support(Test-and-Set, SWAP)
    • semaphore☆☆☆☆☆(號誌)
    • Monitor
    • 解決著名的同步問題
      • Producer-Consumer Problem
      • Reader/Writer Problem
        1. First
        2. Second
      • The Sleeping Barber problem
      • The Dining-Philosophers Problem
  • Message Passing 溝通方式(較少考)

Process communication之兩大方式

Shared Memory(本篇重點)

定義:Processes透過共享變數(shared Variable)之存(Write)取(Read)達到溝通(Info exchange)之目的

image-20230122193004264

分析:

  1. 適用於大量Data(message)傳輸之狀況
  2. 傳輸速度較快(因為不須kernel介入干預/支持,Shared memory是Programmer的責任,Programmer要負責去處理互斥的問題)
  3. 不適合用於Distributed System
  4. Kernel不需提供額外的支援(頂多供應Shared memory space)
  5. 是Programmer的負擔,必須寫額外的程式碼防止Race Condition的發生

Message Passing

定義:Process雙方要溝通必須遵循下列Steps

  1. 建立Communication Link
  2. 訊息可雙向傳輸
  3. 傳輸完畢,必須Release

分析:

  1. 適用於少量Data(message)傳輸之情況

  2. 傳輸速度較慢(因為需要kernel支持)

  3. 適合用於Distribute System

  4. Kernel必須提供額外的支援

    例:send/recevice system call, Communication Link管理,Message lost之偵測、例外狀況之處理

  5. Programmer沒有什麼負擔,只要會用send/receive的System Call就好

Race Condition problem

in shared memory Communication

定義:In shared memory Communication, 若未對共享變數存取提供任何互斥存取控制之Synchronization機制,則會造成"共享變數的最終結果值會因為Process之間的執行順序不同而有不同的結果值",此種Data inconsistency情況,稱之為Race Condition

例子:C是共享變數,初值=5,此時有2個Process

PiPj
C=C+1C=C-1

Pi,Pj各執行一次,則C的最終值可能是5 or 4 or 6 ,這種稱之為Race Condition

  • 結果為5,執行順序可能為

    T1= Pi = C =C+1

    T2= Pj = C =C -1

    or

    T1 = Pj = C = C - 1

    T2 = Pi = C = C + 1

  • 結果為4,執行順序可能為

    T1:Pi執行C+1,得到6,但尚未Assign給C,只是先放在一個佔存器

    T2:Pj執行C-1,得到4,尚未Assign回C

    T3:Pi 6 assign回C

    T4:Pj 4 assign回C

    C的結果為4

  • 結果為6,執行順序可能為

    T1:Pi執行C+1,得到6,但尚未Assign給C,只是先放在一個佔存器

    T2:Pj執行C-1,得到4,尚未Assign回C

    T3:Pj 4 assign回C

    T4:Pi 6 assign回C

    結果為6

範例1

x, y 是共享變數,初值x=5, y=7

PiPj
x= x+yy=x*y

Pi,Pj各作一次,求(x,y)之可能值

Ans.

(x,y) = (12,84)

(x,y) = (40,35)

(x,y) = (12,35)

範例2

x=0是共享變數,i 是區域變數

PiPj
for(i=1;i<=3;i++)x=x+1for(i=1;i<=3;i++)x=x+1

Pi,Pj各作一次,求(x)之可能值

提示

PiPj
第一次x=x+1x=x+1
第二次x=x+1x=x+1
第三次x=x+1x=x+1

Ans.(3,4,5,6)

範例3

x=0是共享變數,i 是區域變數

PiPj
for(i=1;i<=3;i++)x=x+1for(i=1;i<=3;i++)x=x-1

Pi,Pj各作一次,求(x)之可能值

(-3,-2,-1,0,1,2,3)

解決Race Condition之兩大策略

Disable Interrupt

對CPU下手

定義:Process在對共享變數存取之前,先Disable Interrupt,等到完成共享變數的存取後再才Enable Interrupt。如此一來可以保證Process在存取共享變數的期間CPU不會被Preempted,即此一存取是Atomically Executed

PiPj
…Disable interrupt… Disable Interrupt
C=C+1C=C-1
Enable Interrupt …Enable Interrupt …

優點:

  1. Simple, Easy implementation
  2. 適用於Uniprocessor System(單一CPU)

缺點:

  1. 不適合用於Multiprocessor的系統當中,只Disable 單一CPU的Interrupt,是無法防止Race Condition(因為其他CPUs上執行的Process仍可存取共享變數),必須要Disable掉全部的CPU’s Interrupt才可防止Race Condition,但這樣會大幅降低Performance(因為無法平行執行)
  2. 風險很高,因為必須信任user process在Disable interrupt後,在很短的時間可以在Enable Interrupt,否則CPU never come back to kernel。注意,通常Disable Interrupt做法是不會開放給user Process的,它通常只存在於kernel的製作中(只有OS Developers可以用,因為開發者也要避免kernel內部的Race Condition)

Critical section(臨界區間) Design

對共享Data下手

恐龍誤用Spinlock, Busy-waiting

是一個概念

定義:對共享變數之存取進行管制,當Pi取得共享變數存取權利,在它尚未完成的期間,即使別的Process取得CPU,任何其他Process也無法存取共享變數。

  • Critiacal Section:Process中對共享變數進行存、取的敘述之集合

  • Remainder Section(RS):Process中除了Critical Section以外的區間,統稱為Remainder Section

  • Process內容:

    image-20230123191840993

    每個CS的前後,Programmer須設計/加入額外的控制碼,叫Entity Section,即Exit Section

  • CS Design不是在設計臨界區間,因為臨界區間是個概念,CS Design是在設計Entry Sec及Exit Sec的Code

  • 一個process可以擁有不只一個CS 只是範例都是只畫一個而已,要注意,進入C=C+1後,CPU可以被Pj搶走,但Pj想要對C操作時,Pj的Enrty Section就會把它擋下來。image-20230123193312033

  • C.S Design 與 Disable Interrupt相比(spinlock, Busy waiting)

    優點:適用於Multiprocessors system

    缺點:

    1. 設計較為複雜
    2. 較不適合用在uniprocessor

Busy-Waiting Skill(or Spinlock)

  • 定義:透過使用looping相關敘述(eg. for, while, repeat … util),達到讓process暫時等待之效果

例:

1
2
3
while(條件式){
    //不做事,只是讓它跑
}

當條件式為True時,process就被卡在while中,無法離開while,如此達到Process暫停的效果,直到條件式變為False,process才會離開while,往下執行。

Note:

  1. image-20230125012255548
  2. [恐]誤用:因為在C.S Design Entry section中經常是使用Busy waiting的技巧(或叫Spinlock),因此恐龍會把spinlock & busy waiting 視作C.S Design,來去跟Disable Interrupt比較
  • 分析:

    缺點:等待中的Process,會跟其他的Processes競爭CPU,將搶到的CPU time浪費掉,用於做無實質進展的迴圈測試上。因此,若此Process要等很長的時間才能exit迴圈,則此舉非常浪費CPU time

    優點:若Process卡在Loop的時間很短(i.e 小於Context Switcing time),則Spinlock十分有利,因為Loop的時間很短,浪費的時間也不會太短。

  • 另一種Non-Busy-waiting Skill

    定義:當Process因為同步事件被卡住,且如要卡很久的時間,則可以使用Block(p)的System call,將p暫停,即讓p進入Blocked的狀態,如此一來,P就不會與其他Processes競爭CPU,直到同步事件發生了,才wakeup(p) system call,將P從blocked變成ready state。

    image-20230125020111751

    優點:等待當中的Process不會與別人競爭CPU,不會浪費CPU Time

    缺點:額外付出Context Switch的事件幹 這真的算缺點嗎

C.S Design應該滿足的3個性質

  1. Mutual exclusion
  2. Progress
  3. Bounded waiting

分述如下

Mutual exclusion(相互排斥)

定義:最重要的一點,如果沒這點的話談個屁的C.S Design,Race Condition都處理不了了。在任何時間點,最多只允許一個Process進入它自己的CS,不可有多個Process分別進入"各自"的CS

image-20230125023324542

Progress(進展)

  • 定義:須滿足以下兩點才算Progress
    1. 不想進入C.S的Process(亦即在Ramaid Section活動),不可以阻礙其他Process進入C.S(或不參與進入C.S之決策)不想進去的process不會阻礙別人進入
    2. 從那些想進入C.S的Processes中,決定誰可以進入C.S的決策時間是有限的(不可以無窮,也就是No Deadlock likes waitgin forever 大家都無法進入CS)

Bounded waiting(有限的等待)

  • 定義:以個別process的角度來看,自某progress提出申請到核准進入C.S的等待時間是有限的,即若有n個Process想進入CS,則任一Process至多等(n-1)次後,即可進入CS,即No Startvation須公平對待

C.S Design的方法(架構圖)重要

關注的焦點補充
高階Monitor定義、應用、種類、製作方式同步問題之解決(應用)
中階Semaphore(號誌)定義、應用、種類、製作方式C.S Degign正確與否,同步問題之解決
基礎Software solutions, Hardware Insturctions supportC.S Degign正確與否同位階的還有Disable Interrupt

Software Solutions

  • 特色

    1. 2個Processes(Pi,Pj)(P0,P1)

      Algo1 x

      Algo2 x

      Algo3 o = Peterson’s solution

    2. n個Processes

      Peterson’s Solution(n個Processes)[不太會考了,因為真的很爛]

      Bankery’s Algo[麵包店取號碼牌的演算法,恐龍移掉了,但真的很重要,要學]

2個Processes之C.S Design(Pi,Pj,i≠j)

Algo1

  1. 共享變數宣告如下

    1
    2
    
    turn: int 值為i或為j
    意義:權杖,turn值為i,就是只能讓Pi進入(只有Pi有資格進入),反之亦然
    
  2. 程式

image-20230125222327372

CS Design要滿足的條件滿足與否解析
Mutual ExclusionO因為turn值不會同時為i且為j,只會為i或j的其中一個,因此只有Pi或Pj其中一個可以進入CS,不會兩個同時進入C.S
ProgressX假設目前Pi在RS(Pi不想進入CS),且Turn值為i,若此時Pj想進入CS卻無法進入,被Pi阻礙,因為唯有仰賴Pi才能將Turn的值改為j,Pj才能進入CS,但此時Pi並不會去做此設定
Bounded WaitingO假設目前turn為i,且Pi已先於Pj進入CS,而Pj等待中,當Pi離開CS後,又立刻想再進入CS,但因Pi會在離開CS後,將turn的值設為j,使得Pi無法先於Pj進入CS,所以Pj至多等一次後即可進入CS

Algo2

  1. 共享變數宣告如下

    1
    2
    3
    4
    5
    6
    
    flag[i..j] of boolean;
    初值皆為False
    意義:flag[i] ={
    True:Pi有意進C.S
    False:Pi無意進C.S
    }
    
  2. 程式:

    image-20230126182421298

  3. 分析

CS Design要滿足的條件滿足與否解析
Mutual ExclusionO兩個人確實都不會同時進去,但有可能會兩個都想進去,卡住彼此,參照下面
ProgressX第二點不符合,會形成Deadlock,Pi,Pj可能接無法進入C.S解析在下面
Bounded WaitingO兩個都進不去,是deadlock,不是stravation

解析:image-20230126183442922

Algo3

Peterson's solution

混合Algo1,Algo2做撒尿牛丸

algo1只考慮誰有資格,沒考慮意願。algo2只考量意願,但會造成死結。因此結合百家之長,不只考量資格也考量意願

  1. 共享變數宣告如下

    1. Flag[i…j] of Boolean初值皆為False 表意願
    2. Turn:值為i或j only 表資格
  2. 程式

    image-20230126220525905

  3. 分析

    CS Design要滿足的條件滿足與否解析
    Mutual ExclusionO相互排斥,不會有兩個process同時進入C.S:若Pi,Pj皆想進入C.S,代表flag[i]跟flag[j]結為True, 當雙方皆做到while測試的時候(也就是交錯),表示雙方已分別執行過Turn=i, Trun=j之設定,差別只是先後順序不同而已。若Pi執行比較快,把Turn改成J,接著Pj因為執行比較慢,又把Turn改成i,所以Turn的值只會為i(或j其中一個),不會同時為兩者,所以只有Pi或Pj一個Process得以進入CS,因此符合Mutual Exclustion
    ProgressO因為progress有兩個情況,因此分別討論之。
    1.不想進去的process不會阻礙別人進入: 假設turn值為i,且Pi不想進入C.S,代表Flag[i]為False,若此時Pj想進去則Pj必可離開while(因為Flag[i]==False),而進入CS,因為Pi不會阻礙Pj進CS
    2.不產生Deadlock:若Pi,Pj皆想進入C.S,則在有限的時間內必可決定出Turn值為i或為j,讓Pi or Pj進入,兩者不會waiting forever
    Bounded WaitingO先進去的process出來後,不會立刻再進去,亦即不會有Starvation的情形:假設turn為i,Pi已先於Pj進入CS,而Pj等待進入中,Flag[i]==[j]==True,若Pi離開CS之後,又立刻想進入CS,則Pi必定會做一件事情,就是**~~把Flag[i]自己設為False~~,把Turn設成=j**,一定是Pj進入CS,因為Pj至多等一次後即可進入CS。

N個Processes C.S Design

Bankery’s Algo(麵包店取號碼牌)

解決Race Condition

  • 觀念:

    1. 客人(Process)要先取得號碼牌,才可入店內(CS)
    2. 店內(CS)一次只容一人(Process)進入
    3. 號碼最小的客人或同為最小號碼之多個客人中ID最小的(PID),得以優先進入店(CS)
  • 共享變數宣告如下:

    1. Choosing[0…n-1] of Boolean 初值皆為False。

      意義:choosing[i]=

      • True:Pi正在取得號碼牌,尚未確定號碼
      • False:
        • Pi取得號碼牌
        • 初值
    2. Number [0…n-1] of int 代表號碼牌

      意義:代表P0~Pn-1,n個Process之號碼牌值,初值皆為0。

      number[i]:

      • 0:表Pi無意願進入CS
      • .>0:表Pi有意願進入CS
    3. 數學函數used

      1. MAX(…):取最大值(用來決定號碼牌的值)
      2. (a,b)<(c,d)若要成立,則必須滿足下列兩個條件之其中一個
        1. a<c
        2. a==c and b<d
    4. Pi之程式如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    repeat 
    chosing[i]= True; //表明正在取得號碼牌
    Number[i] = MAX(Number[0]...[n-1])+1; //決定號碼牌是幾號
    choosing[i]= False; //表示已取得號碼牌
      
    for(j=0;j<n;j++){ // 此for-loop去檢測所有process
      while (choosing[j]){do noting} //若別人pj正在取號碼牌中,則稍等一下,若都沒有被卡住,可以順利跑完,則進入CS
      while(number[j]>0 and (number[j],j)<(number[i],i)){do noting}  //i代表自己,j代表別人。Pj有意願進入CS,並取Pj號碼小於我或跟我同好,Pj Id j <Pi ID i,則我等待。
    }
    C.S
    Number[i]=0;
    R.S
    untill False
    

經典問題

為何會有很多個Processes取得相同的Number值?

Ans. 假設MAX(Number [0]~[n-1]值為k,Pi,Pj(i≠j) 2個Processes之交錯執行順序如下:

image-20230211150854314

正確性證明?

Ans.

  • Mutual Exclusion:OK

    Case1. 假設Number值皆不同(>0),則具有最小的Number值之Process,得以優先進入CS,其餘Process wait而最小值必唯一

    Case2. 有多個Processes具最小Number值,則以Processes之PID最小者得以進入CS,而ProcessID具備Unique性質,因為最小值必定唯一。

    藉由Case1, Case2知道唯一性確定,互斥確保

  • Progress:OK

    Case1. 假設Pj不想進入CS,代表Number[j]為0,若此時Pi想進入CS則Pi檢查到Pj,Pi必定不會被Pj所阻礙,可以exits for中第二個While(因為while(number[j]>0 ),這個條件判斷不成立)

    Case2. 若P0~Pn1-1,n個Processes皆想進入CS,則在有限的時間內,必有一個Proess(其Number最小或同號中ProcessID最小),可以順利跑完for loop進入CS,因為No Deadlock

  • Bouned waiting:OK

    Case1. 假設P0~Pn-1 n個Processes皆想進入CS,另Pi具有最大的,number值為=K(number[i]=K),因此Pi會是最後進去的,其他(n-1)個Processes:Pj(j≠i),必定皆先於Pi進入CS。若Pj離開C.S後,又立刻想再進入C.S,則Pj取得的號碼牌之值Number[j]必定大於K,所以Pj不會再度先於Pi進入CS,因此Pi頂多等(n-1)次後即可進入CS

設計問題
1
2
3
4
5
6
7
8
for(j=0;j<n;j++){
    while(choosing[j]){
       // do noting
    }
    while(number[i]>0 and number[j],j<(number[i],i)){ //問題,既然這邊都會把不符合的Process攔下來,娜何還需要上面的choosing[j]來卡住呢?是不是可以把choosing[j]刪掉,這樣的邏輯對嗎?會出現什麼問題嗎
        // do noting
    }
}

解釋:

違反了互斥

例:令 目前Number[0,n-1]都還沒領到號碼牌值皆為0,Pi,Pj2個Processes(i≠j)想進入CS,且假設ProcessID是i<j

image-20230211181602704

​ 就好比一個阿婆跟一個年輕妹妹一起去麵包店,年輕人先取完號碼牌,老太婆還沒取完。這時候妹妹領完後,老太婆還沒領,原本的設計下,妹妹會等阿婆領完才執行下一步,但這種情況下,即使阿婆還沒取,妹妹也會直接進入麵包店裡。接著阿婆取完號碼牌,發現跟妹妹同號(Race Condition),此時他也想進入CS,這時候阿婆的身分證號碼(UID)比妹妹小,所以阿婆也可以進入CS,這種情況下,有兩個Process同時進入CS裡,違反了互斥(Mutual Exclustion)

Hardware Solution - CPU Instructions Support

若CPU有提供下列指令之一

  1. Test-and-Set (Lock)
  2. SWAP(a,b)

則Programmer可以運用在CS Design

Test-and-Set(Lock) 指令

定義:此CPU Instruction之功能為,傳出Lock參數值Lock的資料型別為boolean且將Lock參數設為True(1),且CPU保證此指令是☆☆☆"Atomically Executed"☆☆☆

範例:以C語言說明此指令功能:

1
2
3
4
5
int Test-and-Set(int *Lock){
    int  temp = *Lock;
    *Lock = 1;
    return temp;
}

用在C.S Design上

[Algo1]:X不可以用

  1. 共享變數如下:

    Lock:boolean = False

  2. Pi程式如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    repeat{
        while(Test-and-Set(Lock)){
            // do nothing
        }
        C.S區塊;
        Lock = False;
        R.S;
        Utill False;
    }
    
  3. 分析:

    1. Mutual Exclustion:OK

      image-20230211192216510

    2. Progress:OK

      1. 不想進去的人就待在RS裡面,不會去搶
      2. 避免死結,總有一個人會搶到Test-and-Set(Lock)
    3. Bounded Waiting:違反

      假設Pi已先於Pj進入CS,且Pj等待中,當Pi離開CS後,若想在立刻進去CS,則Pi是有機會在優先進去搶到Test-and-set之執行,因此Pj 有可能Starvation

[Algo2] :穩的,可以用

  1. 共享變數如下:

    1. Lock:boolean = False; Test and Set會用到的變數
    2. waiting[0 ..n-1] of boolean初值皆為False,若為True則代表有意進入區間,若為False則代表初值,或準備進入C.S

    意義:

    waiting[i]有兩種,若為

    True:表Pi有意進入CS,且正在等待中

    False:代表初值,或是表示Pi不需要再等了,可以進入CS

  2. Pi之程式如下: [034 17 02 CH6 P 6 71時24分02秒 17:57]

    區域變數

    • Key:boolean;

    • j: int

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    repeat
        waiting[i] =True; //Pi有意,且等待中...
     key= True;
     while(waiting[i]&& key) {
            key = Test-and-set(Lock);
        }
    //--------------------分隔線--------------
    //在還沒離開while前,waiting[i]的值不可能為False,Process i 個人而言不可能把waiting[i]值改成False進入CS。因此只剩Key可以動了
    // 又因TestAndSet(Lock)方法會返回Lock的Boolean值,並將Lock設為True,也因此,惟有第一個搶到CPU的Process,才會有False的Key值
    waiting[i]= False; //☆☆☆☆☆表明Pi不用等了,可以進入CS了☆☆☆☆☆
     C.S;  
        j= (i+1) % n; //n是陣列長度, j 是指i的下一個element of array
     while(ji && not waiting[j]){ //若j=i,則表示已經繞了一圈。waiting表意願,True代表想,False代表不想
            j=(j+1)%n; //找出下一個想進入C.S之Pj
        }
     if(j==i) { //搭配下面的case2,代表都沒人想進入CS,並且因為 Test-and-Set(Lock)會將Lock設為True(可參照上面)
            Lock =False; //因為都沒人想進去,因此就把鎖打開
        } else{
             waiting[j]= False; //Pj不用等了,換你進CS 
            }
     R.S;
     utill False;
           
    

    Case1.

    S__16056339

    S__16056339

    Case2:當Pi執行完後,發現外面都沒任何人想進來,只好再把Lock設回False,一切重新ReSet

    image-20230214225719635

    image-20230214232435547

Q1:證明正確性

Ans.

[1] Mutual Exclusion:OK

pf: Pi可進入C.S之條件有兩種可能

case1. Key值為False

代表Pi是第一個搶到Test-and-Set(Lock)執行者,如此才能將Key改為False,==因此唯一性確立==

case2. waiting[i]為False

代表Pi在離開while之前,是不會將waiting[i]改為False,==只會將它設為True,只有在CS的Proces當它離開CS後,才能改變其他processes中之一個process的waiting值變False,在CS中的Process只有一個,出來CS後也只改變一個Process之waiting值為False,因此唯一性也確立。換言之,一個process不會自己把自己的waitiing值設成False,一定都是別的process來設的,因此唯一性確立==

因此由case1及2得知,互斥成立

[2] Progress:OK

pf:==若Pi不想進入C.S,其waiting[i]為False,而且Pi不會跟其他Process競爭Test-and-Set(Lock)的執行,且從CS離開之Process,也不會改變Pi之waiting值,因此Pi不會參與進行CS之決策。==

若n個Process都想進入CS,則在有限的時間內必定會決定出第一個搶到Tetst-and-Set()執行,並進入CS。它從CS離開後,也會在有限的時間內讓下一個想進入CS之Process進入CS或Lock設False。

==不會有Deadlock==

[3]Bounded Waiting:OK

pf:假設P0~Pn-1等n個Processes皆想進入C.S表示waiting[0]~[n-1]皆為True

image-20230216003256885

令Pi是第一個搶到Test-and-Set執行之Process,率先進入CS當Pi離開CS後,會將P(n+1)%n之waiting值改為False,讓P(n+1)%n進入cs,依此類推,Process會依Pi,P(i+1)%n,P(i+2)%n…P(i-1)%nFIFO 順序依據進入CS,故不會有Starvation

SWAP(a,b)指令

  • 定義:此CPU指令是將a,b兩值互換,且CPU保證它是==Atomically executed==

若以C語言描述,功能如下:

1
2
3
4
5
void swap(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
  • 用在C.S design上

[algo1]:X

共享變數如下

Lock:boolean=False;

區域變數如下:

key:boolean

1
2
3
4
5
6
7
8
9
repeat;
	key=True;
	{repeat;
		swap(Lock,key);
    utill(key==False)} ; //成立才離開 
    C.S
    Lock=False;
    R.S
until False;

image-20230216233043091

分析:

[Algo1]同Test-and-Set

Mutual Exclustion= ok

progress= ok

Bounded waiting= No,只有設成Fales而已,還是無法避免無限等待

[Algo2] 正確的

將Test-and-set的[algo2]中

1
2
3
4
5
6
7
8
...
while(...){
  // key=test-and-set(Lock);
  swap(Lock,key); //改成這樣即可

}
...

綜合練習

在Test-and-set[Algo2]中

1
2
3
4
5
while(waiting[i] and key){
	key = Test-and-Set(Lock);
}
waiting[i] = False; //Pi不用等了,可進入CS
CS

若把waiting[i] = False; 這行刪掉,此行removed是否正確?explain in details

image-20230217001954998

Ans.

違反Progress,不想進入的progress參與決策,並且會發生死結,兩件事情都會發生

image-20230217005154344

Semaphore(號誌)

製作Semaphore的目的就是為了確保 ,號誌的值不會Race Condition

學習地圖

定義

應用

CS Design (臨界區間設計)

synchronization problem solution(解決同步問題)

種類

Binary semaphore vs counting semaphore

spinlock semaphore vs non-busy waiting semaphore

  • 定義:令S為Semaphore type變數,架構在integer type針對S,提供兩個Atomica operations

    1. wait(S)或P(S) 因為是荷蘭人,所以用荷蘭命名
    2. signal(S)或V(S) 因為是荷蘭人,所以用荷蘭命名

    定義如下

wait(S):

==若S為0則卡住,若S不為0則通過==

1
2
3
while(S≦0){do no-op;} //若semaphore的值為0,則卡在這邊

S=S-1; //退出後semaphore值-1

signal(S):

1
S=S+1;

note:因為Atomical, 所以S不會有race condition

  • 應用:主要用在CS Design,及同步問題之解決

CS Design使用如下

  1. 共享變數宣告如下

    mutex常見的變數名稱,代表mutual exclustion的意思:semaphore= 1; //初值為1

  2. Pi程式如下:

    1
    2
    3
    4
    5
    6
    
    repeat :
     wait(mutex);
     C.S
     signal(mutex);
     RS
    untill False;
    
    PiPj
    T1:wait(mutex);
    因為mutex = 1
    所以Pi可以離開while,then,mutex值在減1變0,then Pi進入CS
    T2:wait(mutex),因為此時mutex=0,這時候Pj會卡住。符合Mutual exclustion
    Progress也符合
    Bounded waiting也符合

解決簡單的Synchronization problem

​ 何謂Synchronization? Process因為某些事件發生(or未發生)而被迫等待,無法往下執行,直到其他Processes do something才得以往下

範例1:

PiPj
A;B;

規定:A必須在B之前執行,試用Semaphore達到此需求

Ans. 宣告一共享變數

S= Semaphore=0; image-20230218153218428

PiPj
A;
signal(S);
wait(S);
B;

==Note:semaphore的初值是具有某些意義的,並且初值不一定要是0或1,其實都可以,只是都用0跟1做舉例==

  • 初值為1:用作互斥控制
  • 初值為0:用作強迫等待

例2:

S1:Semaphore= 0;

S2:Semaphore= 0;

規定執行順序為A -> C -> B 該如何完成?

Ans:

PiPjPk
wait(s2)wait(s1)
AB;C;
signal(s1)signal(s2)

Ex2:希望達成 A,B,C,A,B,C,A,B,C repeatly execuction

承上性質,S1,S2 semaphore=0;S3 semaphore=1

PiPjPk
wait(s3)wait(s1)wait(s2)
A;B;C;
signal(s1)signal(s2)signal(s3)

Ex3:C是共享變數,初值為3,請寫出最後C的值為多少

  • 第一小題
PiPj
C=C*2C=C+1

7或8或4或6

  • 第二小題

s= semaphore=1

PiPj
wait(s)wait(s)
c=c*2c=c+1
signal(s)singal(s)

7或8

  • 第三小題

s= semaphore = 0

PiPj
wait(s)
c=c*2c=c+1
signal(s)

7

EX4

S1:Semaphore = 1;

S2:Semaphore = 0;

求ABC可能執行順序

PiPjPk
wait(s1)wait(s2)wait(s1)
A;B;C;
signal(s2)signal(s1)signal(s1)

Ans:把不可能的刪除就好

ABC,

ACB,

BAC,

BCA,

CAB,

CBA

semaphore之誤用所造成之問題

違反互斥、形成死結

例1

s= Semaphore=1

Pi
singal(s)
CS
Wait(s)

—> 違反mutual exclusion

例2

s= semaphore = 2

Pi
wait(s)
cs
wait(s)
rs

—> 形成死結

例3

S1,S2 = Semaphore = 1;

PiPj
T1:wait(s1)T2:wait(s2)
T3:wait(s2)T4:wait(s1)
signal(s1)signal(s2)
signal(s2)signal(s1)

可能形成deadlock,如果Pi,Pj依照T1~T4之順序交錯執行

著名的Synchronization Problem之解決

想看看何時會停下來

Producer-Consumer Problem(生產者消費者問題)

Producer:此process專門產生資訊供別人使用

Consumer:此process專門消耗別人產生的成果

在sharrd memory溝通方式底下,會準備一個buffer

image-20230219133538935

細分為兩個類型的問題

  1. Bounded Buffer Producer-Consumer(Buffer有限)

    有兩個情況會被迫等待

    1. 當Buffer滿了,Producer被迫等待
    2. 當Buffer空了,Consumer被迫等待
  2. Unbounded Buffer Producer-Consumer(Buffer無限)

algo1

共享變數宣告如下

  1. Buffer: [0..n-1] of items;

  2. in,out: int = 0;

Producer 程式:

1
2
3
4
5
6
repeat:
	produce an item in nextp;
	while((in+1)%n==out) {do noting}; //當buffer滿的話,就卡在while中
	Buffer[in] =nextp;
	in = (in+1)%n;
until false;

Consumer程式:

1
2
3
4
5
6
7
repeat
	while(in == out ){ do nothing} //buffer為空
	nextc= Buffer[out];
	out=(out+1) % n;
	...
	consumes  the item in nextc;
until false;

image-20230219174042582

此時producer 無法在加item,因為(in+1)%n == out, 即buffer已經滿了,因此最多利用(n-1)格

algo2

共享變數宣告如下

  1. Buffer: [0..n-1] of items;

  2. in,out: int = 0;

  3. ==count:int =0==

這個count值有可能導致race condition,因此不完全正確

Producer 程式:

1
2
3
4
5
6
7
repeat:
	produce an item in nextp;
	while(count==n) {do noting}; //當buffer滿的話,就卡在while中
	Buffer[in] =nextp;
	in = (in+1)%n;
	count = count +1;
until false;

Consumer程式:

1
2
3
4
5
6
7
8
repeat
	while(count ==0 ){ do nothing} //buffer為空
	nextc= Buffer[out];
	out=(out+1) % n;
	count = count -1;
	...
	consumes  the item in nextc;
until false;

用semaphore解producer-consumer problem

共享變數宣告如下:

  1. empty : semaphore = n . 代表buffer內空格數,若空格數變為0,代表滿了
  2. full : semaphore=0. 代表buffer區中,填入item之格數,若為0,表buffer為空
  3. mutex:semaphore=1; 對buffer, in , out , count做互斥控制,防止race condition

semaphore的設計哲學

  1. 滿足同步條件之號誌變數empty, full
  2. 互斥控制防止race condition之號誌 mutex
  3. 先測同步在測互斥,不然會造成死結
  4. ==共享變數取存之前都需要經過互斥的處理==

producer

1
2
3
4
5
6
7
repeat
	produce on item in nextp;
	wait(empty) ; //若無空格則P被迫等待
	wait(mutex); 
	add nextp into Bufffer;  //濃縮很多程式在這行裡面喔
	signal(mutex);
	signal(full); //填入item之格數加1,maybe拯救Consumer

consumer

1
2
3
4
5
6
repeat
	wait(full);
	wait(mutex);
	remove item from Buffer in nextc
	signal(mutex);
	singal(empty)

Read/write Problem

image-20230222215707149

基本的同步條件

  1. Reader write要互斥
  2. writer,writer也要互斥

此外,這問題再細分成兩類

  1. First read/writer problem

    -> 對Reader有利,對writer不利,因此writer可能starvation

  2. Second read/writer problem

    -> 對writer有利,對reader不利,因此reader可能startvation

First Reader/Writer Problem

何謂「對Reader有利,Writer不利」?

只要有源源不絕的Reader,則W1可能Starvation

image-20230222223611353

共享變數宣告如下:

  1. wrt:semaphore =1

    提供R/W 及 W/W互斥控制,並兼差對Writer不利的控制

  2. readcnt:int = 0;

    統計Reader個數,直到沒有Reader,才可以放writer進去

    Reader到->Readcnt +1

    Reader走 ->Readcnt -1

  3. mutex:semaphore=1

    由於readcnt是一共享變數,會有Race Condition之問題,故需額外宣告一變數Mutex做互斥控制

程式:

writerreader

wait(wrt)
執行寫入作業
signal(wrt)

wait(mutex) ;
readcnt = readcnt +1
if(readcnt==1)代表你是第一個Reader then wait(wrt)要去偵測是否有writer存在。若有則卡住,若無則通過,也順便卡住writer
signal(mutex);
執行reading工作
wait(mutex);
readcnt = readcnt -1 //reader走,reader-1
if(readcnt=.=0) then signal(wrt) //No reader,放writer進去
singal(mutex)

練習:

若目前W1已在寫入中

  1. R1到,則R1會卡在wrt 裡,此時readcnt=1
  2. R2又到,則R2會卡在mutex,此時readcnt=1
  3. R3到,則R3會卡在mutex,此時readcnt=1

Second Reader/ writer problem

何謂對Writer 有利,對Reader不利

image-20230306001249076

T6:w1離開,優先放W2近來(並非R1)

T7:w2離開,優先放W2近來(並非R1)

…(以此類推)

只要Writer離開,發現尚有waiting writer在,那就會優先放writer近來,所以R1有可能Startvation

共享變數之宣告

  1. readcnt:int=0 :統計reader個數

  2. wrtcnd:int=0:統計writer個數

  3. x:semaphore:1 //用來對readcnt做互斥控制,防止race condition

  4. y:semaphore:1 //用來對wrtcnd做互斥控制,防止race condition

  5. z:semaphore:1 //有的版本會有,有的版本不會有。作為對reader之入口控制(讓它卡多一些關卡,讓reader slower)

  6. rsem:semaphore=1 //作為對reader不利之控制

  7. wsem:semephore=1 //提供R/W及W/W互斥控制

程式

writerreaeder(以First reader程式為主,再加入控制)
wait(y)
wrtcnt = wrtcnt+1;
if(wrtcnt==1) then(wait(rsem)) //第一個writer ,要負責築起對reader不利之控制
signal(y);
wait(wsem) //
執行writing工作

wait(y)
wrtcnt = wrtcnt-1
if(wrtcnt==0) then signal(resm) //解除對reader不利之控制
signal(wsem) //解除 R/W W/W互斥
signal(y)
wait(z)
wait(rsem) //通過對reader不利之控制?
wait(x)
readcnt = readcnt +1;
if(readcnt ==1) then wait(wsem) //R/W互斥
signal(x)
signal(rsem)
signal(z)
(執行reading工作)

wait(x);
readcnt = readcnt -1
if(readcnt ==0) then signal(wsem) //解除R/W互斥
signal(x)

The Sleeping Barbers Problem

描述:有一個barber,一張BarberChair,n張waitingChair。並且有客人。

客人的行為如下

waiting chairs 坐滿(n個等待客人):不入店

waiting chairs 尚未坐滿:入店內,坐在waitingChair,通知(喚醒)barber

客人睡覺(wait) if barber is busy now… 直到Barber叫他起床剪髮,剪完髮Exit

理髮師的行為如下

睡覺 if no 客人

直到有客人喚醒(通知)他

叫醒客人剪髮

剪完髮後如果還有客人,則叫醒客人剪髮

剪完髮後如果沒有客人,則繼續睡,繼續水時間

共享變數宣告: ==共享變數取存之前都需要經過互斥的處理==

  1. Customer:semaphore=0 :用來卡住理髮師 if no 客人
  2. Barber:semaphore=0:用來卡住客人的 if Barber is busy
  3. waiting:int=0 // 坐在等待椅上的客人數目。何時+1?何時-1?客人入店,坐上椅子。Barber叫客人起來剪髮,會有race condition的問題
  4. mutex:semaphore=1 //防止waiting值race condition

程式:

BarberCustomer
repeat
wait((Customer))
wait(mutex)
waiting = waiting -1;
signal(Barber)
signal(mutex)
剪客人頭髮();
until False
wait(mutex);
if(waitng<n){waiting=waiting+1;
signal(Customer) //叫醒、通知barber
signal(mutex);
wait(barber);
被理髮()
}else{ signal(mutex)}
客人是沒有repear … until false

The Dining-Philosophers Problems

描述

image-20230306233039022

注意:1. 吃中餐:奇數、偶數哲學家皆可

2. 吃西餐:偶數位才可以(刀叉一副

共享變數之宣告

chopstick:[0,1,2,3,4] of semaphore;初值皆為1,對5根筷子做互斥控制。

i號哲學家(i=0~4)哲學家Pi之狀況(這程式是有問題的)

1
2
3
4
5
6
7
8
repeat...
hugry now;
wait(chopstick[i]);
wait(chopstick[(i+1)%5])
eating now;
signal(chopstick[i]);
signal(chopstick[(i+1)%5]);
think now;

此Solution有問題,可能會形成Deadlock!!

若每位哲學家都拿起自己左邊的筷子,則每位哲學家都卡住,皆無法取得右筷,形成circular waiting

解法一

一次最多讓4位哲學家上桌

m=5根,Maxi=2

  1. 1≦Maxi≦m成立

  2. $$ \sum_{i=1}^nMaxi < n+m,因此2n<n+5, n<5。最多4位 $$

保證DeadLock Free-> 可額外加入另一個號誌 No:semaphore=4,做入口控制

1
2
3
4
5
6
7
8
9
repeat...
wait(No);
hugry now;
wait(chopstick[i]);
wait(chopstick[(i+1)%5])
eating now;
signal(chopstick[i]);
signal(chopstick[(i+1)%5]);
think now;

解法二

除非哲學家可同時取得左右兩邊筷子,才准許持有筷子,否則不得持有任何筷子。否則不得持有任何筷子

破除Hold&wait 條件

解法三

相鄰哲學家之取筷順序不同,創造Asymmetric mode,例如:

奇數號偶數號
先取左,再取右先取右,再取左

破除Circular waiting條件

image-20230307231842002

Note:等同於西餐,大家規定:先取刀再取叉

cigarette smokers problem

很少考,從50年前就沒考過了。Pass

Semaphore之種類

分類一:號誌值域做區分

Binary(二元) Semaphore Vs Counting(計數) semaphore

  1. Binary Semaphore

定義:Semaphore之值只有0,與1兩種(C.S Design正常使用下)不可為負值,無法統計有多少個Process卡在wait中

S:Binary-Semaphore=1;

1
2
3
4
Wait(S)
    While)(S0)
   {do no-op}
    S=S-1
1
2
3
Signal(S){
    S=S+1;
}
  1. Counting Semaphore

定義:Semaphore值不限於0,1 可以為負值,且若值為-N,可知道(統計出)有N個processes卡在wait中

範例1.

請用Binary Semaphore定義出Counting Semaphore。

共享變數宣告如下

  1. C:int //代表 Counting Semaphore號誌值
  2. S1:Binary-Semaphore=1 對C作互斥控制,防止C值race Condition
  3. S2:Binary-Semaphore=0 ,當C值<0,強迫Process暫停之用

程式:

1
2
3
4
5
6
7
8
wait(C)
    wait(S1);
	C=C-1;
	if(c<0) then {
        signal(S1);
        wait(S2); //process自己卡住
    }else
        signal(S1)
1
2
3
4
5
Signal(C)
    wait(S1);
	C=C+1;
	if(c0) then Singal(S2);  //救process
	signal(s1)

Demo如下

1
2
3
4
5
CCounting semaphore= 1
wait(C);
C.S // 臨界區間
Singal(C)
R.S

分類二:是否採用Busy-waiting(Spinlock)技巧來定義Semaphore

Spinlock Vs Non-Busy-waiting Semaphore

Spinlock

定義:令S為Semaphore變數,而

  • wait(S):

    定義:

    1
    2
    
    while(S0){do no-op} //採用Busy-waiting Skill
    S=S-1
    
  • Signal(S):

    定義:

    1
    
    =S+1;
    

優缺點:參閱前述Busy-waiting內容

Non-Busy waiting semaphore

定義:Semaphore type定義如下

1
2
3
4
Struct semaphore{
    int value; //號誌值
    Queue Q ; // FIFO Queue
}

令S為Semaphore變數,則

1
2
3
4
5
6
Wait(S)
    S.value = S.value-1;
	if(S.value <0 ) then{
        add process P into S.Q;
        Block(P); // P之狀態改為block state
    }
1
2
3
4
5
6
Signal(S)
    S.value = S.value+1;
	if(S.value ≦0)then{
        remove a process form S.Q
         wakeup(P) //將P改為ready state
    }

Note:此號誌也是一個Counting Semaphore

製作Semaphore

using

  1. Disable interrupt
  2. Software solution or Hardware instructions support

何謂製作Semaphore?

即是如何保證Semaphore值不會Race Condition(or 如何確保wait與singal是Atomic operation?)

製作Semaphore的目的就是為了確保 ,號誌的值不會Race Condition

製作方式|號誌定義Non-Busy waiting SemaphoreSpinlock Semaphore
Disable Interrupt[Algo1][Algo3]
C.S Design(基礎)
software Solution
硬體指令
[Algo2][Algo4]

Algo1

1
2
3
4
5
6
7
8
9
wait(s)
    Disable interrupt;
	S.value =  S.value -1;
	if(S.value<0) then{
       	Enable Interrupt(); //在這邊打開中斷,而不是在if之外,避免Block(p)之後,因為Disable Interrupt而無法釋放CPU
        add process P into S.Q;
        block(p);
    }

Algo2

將[Algo1]中的Disable Interrupt 換成 Enter Section,Enable Interrupt改成Exit Section。

Enter Section與Exit Section之控制碼找個地方寫出來。取決於題目教你用Software Solution(Bakery’Algo) or Hardware Instrution(Test-and-set or Swap的Algo[2]或Algo[1]時間不夠就寫這個,但這好像不符合什麼Bound wait還是什麼鬼的)

Algo3

1
2
3
4
5
6
wait(s)while(S){
    Enable Interrupt;
    no-op;
    Disble Interrupt
}
	S=S-1
1
Signal(S)S=S+1 

Algo4

將[Algo3]中的Disable Interrupt 換成 Enter Section,Enable Interrupt改成Exit Section。

Enter Section與Exit Section之控制碼找個地方寫出來。取決於題目教你用Software Solution(Bakery’Algo) or Hardware Instrution(Test-and-set or Swap的Algo[2]或Algo[1]時間不夠就寫這個,但這好像不符合什麼Bound wait還是什麼鬼的)

Busy-waiting是否可以完全避免之(avoid altogether)

Ans. No, 無法完全避免,以Semaphore為例

Monitor

定義、組成

特性(優點)

Condition 變數使用

解同步問題

Conditional Monitor

種類(3種)

用semaphore Monitor

定義:Monitor是一個用來解決同步問題的高階結構class,是一種ADT(abstract data type),Monitor之定義,主要有3個

組成:

  1. 共享變數宣告區
  2. 一組local function(or procedures)
  3. Initialization area(初始區)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public Class MonitorName{
    //共享變數宣告
    
   procedure entry function1(參數){
       begin
           Body;
       end 
	}
    procedure entry functionX(參數){
        begin;
        Body;
        end;
    }
    
    begin;
    初始區
    end;
    
   
}

特性(優點):

Monitor本身已保證互斥(Mutual excluesive)即任何時間點最多只允許,1個Process在Monitor內活動(Active),也就是說:在任何時間點,最多只允許一個1個Process呼叫(calling)monitor的某個function(或procedure)執行中,不可以有多個processes同時呼叫monitor的functions

image-20230313232606063

此一互斥性質帶來何種好處?

因為共享變數區之共享變數只能被monitor的local function直接存取,外界不能直接存取,外界(process)只能透過呼叫Monitor的Local Function來存取共享變數,而Monitor保障互斥,因此保障了共享變數不會發生Race Condition,所以Programmer毋須煩惱Race Condition problem (不用撰寫額外的Code,或是使用Mutex semaphore),只需專心處理同步問題即可。此點優於Semaphore

Question:Semaphore 比 Monitor容易使用 when solving synchronization problem

Ans:False,參照如上。並且semaphore一多,容易產生Deadloc

Condition Type

定義:Condition 型別是用Monitor中,提供給Programmer解決同步問題之用,令x是Condition Type變數,在X上提供兩個operations:

x.wait 及 x.signal

  1. x.wait:執行此運作的process會被Blocked且置入Monitor內x所屬的waiting queue中(預設是FIFO)
  2. x.signal:如果先前有Processes卡在x的waiting queue中,則此運作會自此waiting queue中移走一個process且恢復(resume)其執行,否則無任何作用

使用Monitor解決 The dining-philosophers Problem

先定義所需的Monitor ADT Type

Dining-philosophers = Monitor

Var

  1. State[0..4] of {thinking, hungry, eating}
  2. self[0..4] of condition;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure entry pickup(i : 0...4){ //拿起筷子
    begin:
    	state[i] = hungry;
    	test(i);
    	if(state[i]eating) then self[i].wait; // Pi自己卡住
}

procedure test(k:0...4){ //測試
    begin:
    	if(state[(k+4)%5]eating and state[k]==hungry and state[(k+1)%5]eating)
            then{
            state[k]= eating;
            self[k].signal
        }
}

procedure entry putdown(i: 0..4){ // 吃飽了放下筷子
    begin
        state[i]= thinking;
    	test((i+4)%5);
        test((i+1)%5);
    end
    begin
        for(i=0;i 4 ; i++){
            state[i]= thinking;
        }
    end
}
  • 使用方式

共享變數宣告:

1
dp`變數名稱`:Dining-ph`Monitor type`

Pi (i號哲學家)

1
2
3
4
5
6
7
repeat
    hungry now; 
	dp.pickup(i); //在Monitor中
	eating;  //不在Mnitor中
	dp.putdown(i); //在Monitor中
	thinking;
untill False;

Conditional Monitor

  1. 緣由:condition變數,eg. X所附屬的waiting Queue, 一般皆是FIFO Queue (甚至Monitor的Entry Quene 也是FIFO,In general),可是我們有時需要Priority Queue,優先移除高優先權的Process,恢復執行或讓已進入Monitor內active,此種monitor稱之

  2. 語法改變:

    1
    2
    
    x.wait(c); // c代表此process的priority info
       
    

使用Conditional Monitor解決問題

  • 範例一

使用Monitor解決互斥資源的配置問題

規定:process最小者,優先權高,優先取得資源

解決問題之哲學

「非」優先權之需求->寫入Monitor之定義

優先權之需求->只要告知老師說你用的是Priority Queue的Monitor即可

Ans.

  1. 先定義Monitor
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
type ResourceAllocator = Monitor

var Busy : Boolean //代表資源配置出去與否

var XCondition; //代表資源到底可用不可用

procdure entry Apply(processId:int)
    begin
    	if(Busy) then  x.wait(pid); 
		Busy = True;

procedure entry Release()
    begin
    Busy= False;
	X.signal;
	end;

Begin;
	Busy= False;
end;    

使用方式:

共享變數宣告如下:

​ RA:Resource Allocator;

​ Pi(i代表processId):

程式如下:

RA.Apply(i);

使用資源;

RA.Release();

此Monitor的X Condition變數之waiting Queue及Monior的entry Queue是Priority Queue且processId小者,優先權高,優先移出

  • 範例二 ==(最常考)==

有一個File可被多個Processes使用,每一個Process有Unique priority No,並且存取File須滿足以下限制

  1. 所有正在存取file的process之priority No之加總須<n,超過就無法存取
  2. process priority No小的,優先度高

試設計Monitor

Ans.

eg n =10

image-20230317013644199

  1. 先定義Monitor

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    type FileAccess = Monitor;
    var sum:int;
    var x:condition;
       
    procedure entry Access(i:priority No){
        begin;
        while((sum+i)n){
            do x.wait(i)
        }
        sum = sum + i ;
        end ;
    }
    procedure entry Leave(i:priorityNo){
        begin;
        sum = sum -i;
        x.signal;
        end;
           
        begin;
         sum=0;
        end;
    }
       
    
  2. 使用方式:

    共享變數宣告:

    • FA:FileAccess;

    • Pi(i:process Priority No)程式:

      FA.Access(i);

      ​ 使用File;

      FA.Leave(i);

  • 範例三

有3部printer 被processes使用(三個互斥資源),且規定Process Id 小,優先權高。

Ans.

先定義Monitor

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var p [0..2] of Boolean;
x:condition;
int Acquire (i:processId){
    if(p[0] and p[1] and p[2]){
        x.wait(i)
    }
    if(not p[0]){
       y=0;
    }
    else if (not p[1]){
        y =1;
    }
    else{
        y=2;
    }
    p[x]= true;
    return y;
}

void Release(y: printerNo){
    p[y] = False;
    x.signal
}

使用方式:

  • 共享變數宣告:

    PA: Allocator

  • Pi(i=processId)

程式如下

1
2
3
4
5
6
7
pNo: printerNo;
pNo=PA.Acquire(i);
//使用pno號之列表機

PA.Realse(pno);


範例四 使用Monitor定義Semaphore

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
type semaphore = Monitor;
var value : int; //號誌值
var x : condition;

procedure entry wait(){
    begin
        value = value -1;
        if (value <0) then x.wait;
    end
}

procedure entry Signal(){
	 begin
	 	value = value+1;
	 	x.signal;
	 end 
}

Monitor的種類(3種)

  1. 區分角度(緣由)

    假設Process A目前卡在 x condition 變數之 waiting Queue(因為 Q 先前執行了 X.wait目前,**Process P is active in the **)

幹他媽的,這邊也拖太久了,我受不了,我想先去看記憶體管理 2023/3/23

Chapter 7 Memory Management

本章的考試重點是圖,有圖的都很重要

Binding 及其時機點

Dynamic Binding

Dynamic Loading, Dynamic Linking

Contiguous Memory Allocation(Firstt/Best/Worst Fit)☆☆

External Fragmentation, Internal Fragmentation☆☆☆☆☆

解決外部碎裂方法

Compaction☆☆

Page

Page Memory Management☆☆☆☆☆

Schema

Page Table 製作(3個)

相關計算

Page Table Size 太大之解決(3個)

Segment Memory Management☆☆

Paged Segment Memory Management [恐龍本已移除]

Binding

定義:決定程式/process執行的起始位址,此一動作稱之為Binding

時機點:

  1. Compiling Time:由Compiler作Binding

  2. Loading Time 或 Linking Loading Time:由Linking Loader 或 Linkage Editor作

    «以上兩者都叫Static Binding»

  3. Execution Time:由OS動態決定,也叫Dynamic Binding

image-20230322223226871

  1. Compiler作Binding

    • 產生之Object Code叫做Absolute object code(絕對式目的碼)

      eg:

      image-20230322224154158

    • 後面的Loader叫作Absolute Loader主要是作Allocation與Loading only

    • 缺點:Process若要改變起始位址,則必須re-compiling非常不便

    • Note:通常用於.COM(命令檔)

  2. Loading Time由 Linking Loader 作Binding

    • Compiler所產生出的Object Code叫作Relocatable Object Code(可重定位之目的碼)

    • image-20230323000356425

    • 何謂Relocation修正?

      當成是執行起始位址改變,某些Object code內容必須隨之修正,將來才能正確執行。

      例:採用直接定址(Direct Addressing Mode)指令,假設今天起始位址為0000,變數儲存於2000的位址。今起始位址改為1000後,變數儲存的位址需要有相應的改動,這個改動值就是寫在Relocation修正資訊

      image-20230323015129289

    • 何謂Linking修正?

    解決External Symbol reference(外部符號參考)之修正

    例:外部符號:副程式名稱

    外部變數(extern)、Library, etc

    image-20230323020626593

    image-20230324002149684

    Linking Loader主要4個工作

    1. Allocation:依照目的碼之大小,向OS要求分配起始位址
    2. Loading:obj code 載入到Memory
    3. Linking:依Compiler所交辦之Linking修正資訊,執行Linking修正,將Jump ????改為 Jump 8000
    4. Relocation:作重定位修正

    優點:程式起始位址若要改變,則只需重新Relocation, Linking即可,無須re-compiling

    缺點:

    1. 程式重新執行,若Modules數多,則re-linking(外部符號參考修正)很花時間。

    2. Process執行期間,不可更改起始位址

      Note:凡是Static Binding皆無法更改

    Linkage Editor的主要工作

    image-20230324004823565

Dynamic Binding

定義:決定Process起始位址之工作,推遲至執行時期(Execution Time)才動態執行,即Process在執行期間,可任意變更起始位址,且Process仍能正確執行。

需要Hardware額外支持

image-20230326195032169

  1. Logical Address:generated by CPU logical代表以使用者觀點來看

  2. Physical Address:實際去physical memory(ie. RAM存取之位址)physical代表以硬體觀點來看

  3. logical address = physical address = > static binding

    logical address ≠ Physical address = > Dynamic binding, Page, segment, Paged segment。會有「logical address轉成physical address之運作」,且此運作交由Hardware負責

優點:

  1. Process之起始位址可於execution time 任意更動且能正確執行,有助於OS Memory Management之彈性度。eg. Compaction實施、process swapout後再swap in,不一定要相同起始位址\

缺點:

  1. 需要Hardware額外支持
  2. Process執行時間較久、效益較差

Dynamic Loading

定義:也叫Load-on-Call,在execution time,若module真正被呼叫到且不在memory中,此時loader才將它載入到memory中。當一個程序只有當它真正被呼叫時才載入到記憶體之中。

目的:節省Memory space

優點:不須要OS之額外支持

缺點:Process執行時間較久

Note:早期使用overlay的技巧,是programmer的責任,OS沒啥責任。近代則是OS提供Virtual Memory來處理

Dynamic Linking

定義:在Execution Time,若Module被呼叫到,才將之載入,並且與其他Modules進行Linking修正(外部符號參考之解決),適用在Library Linking eg Dynamic Linking Library(DLL)

目的:節省不必要之Linking Time,需要OS額外支持

Contiguous (連續性) Memory Allocation

也叫Dynamic Variable Partitions Memoy Management 動態變動分區記憶體管理。

OS必須配置Process一個連續的Free Memory Space

Partition:Process所占用的Memory Space

Partition數目=Process數目=Multiprogramming Degree,由於不同時期,系統內Process數目不固定

因此Parition數目不固定(Dynamic)

由於各Process Size不盡相同,因此各Partition大小也就不一定相同(Variable)

Memory中會有一些Free Memory Space(or Block),叫做Hole,通常OS會用LinkedList的概念,來管理這些Holes,叫做AV-List(Available List 可用空間串列)

image-20230326222005833

配置方法

  1. First-Fit
  2. Best-Fit
  3. Worst-Fit
  1. First-Fit

定義:從AV-List頭開始找起,直到找到第一個Hole,其hole size ≧ process size為止,即可配置或找完整條串列,或找完整條串列,無依夠大符合為止

  1. Best-Fit

定義:必須檢查AV-List中所有Holes找出一個hole,其hole size≧process size,且hole size減去process size後差值最的hole,予以配置

  1. Best-Fit

定義:必須檢查AV-List中所有Holes找出一個hole,其hole size≧process size,且hole size減去process size後差值最的hole,予以配置

例題一

image-20230326223538608

若Process大小=90K

  1. First-Fit會配置"A"Block之90K給Process,剩下"210"K之Hole
  2. Best-Fit會配置"B"Block之90K給Process,剩下"10"K之Hole
  3. Worst-Fit會配置"C"Block之90K給Process,剩下410K之Hole

例題二

image-20230327002539199

First, Best,Worst Fit,哪個最好 in memory Utilization?

First-Fit

最後會剩420K的無法配置

image-20230326225935843

Best-Fit

皆可配置

image-20230326230449292

比較表

時間效率空間利用度
First-Fit(勝)最佳
Best-Fit最佳
Worst-Fit

上述Contiguous Memory Allocation方法均遭遇一個共通問題"External Fragmentation"

External Fragmentation

定義:在Contiguous Allocation要求,目前AV-List中任何一個hole Size均小於process size,但這些holes size 加總卻≧process size,然而,因為這些holes 並不連續,因此仍無法配置給此process,造成空間閒置不用,memory utilization低之問題

範例:

若Process大小為220K,而這些hole size加總=250K>220K,但這些hole不連續,仍無法配置,[恐]一般而言,每配置N大小,平均會有0.5N的外碎,所以外碎的比例為=1/3,是個嚴重的問題

image-20230327002915437

另一個名詞Internal Fragmentation(內部碎裂)

定義:配置給Process之space超過process size,兩者之差值空間,此process使用不到且其他processes亦無法使用,此一浪費空間,稱之為內部碎裂

image-20230327004138907

解決External Fragmentation

方法一:使用**Compaction(聚集)**技術

作法:移動執行中的process,使得原本非連續的holes,得以聚集形成一個夠大的連續的Free Memory Space

例子: 

image-20230327232414541

困難處:

  1. 不易制定最佳的Compaction策略

  2. Processes必須是Dynamic Binding才可於execution time移動

方法二:使用Page Memory Management

方法三:Multiple Base/Limit Register方法

這個方法其實不行解決,只能降低。將Process拆成Code Section與Data Section兩部分,分開配置連續的hole,以降低外部碎裂發生的機率。因此,每個Process需要2套 Base/Limit Registers,分別記Code Sec及Data Sec 的起始位址及大小

Page(分頁) memory Management

  • Physical Memory (i,e RAM)視為一組Frame(頁框)之集合,且各Frame Size相同,Note:Frame Size是HW決定,OS只是配合,Paging是採Physical ViewPoint。

  • Logical Memory (即User Process大小)視為一組Page(頁面)之集合,且Page Size=Frame Size

RAM=400KB=40個Frames

Frames=10KB

配置方式:OS採非連續性配置原則,即若Process大小=n個Pages,則OS只需在Physical memory 找出n個Free Frames(不一定要連續),即可配給此process

OS會替每個Process建立一個Page Table(分頁表),紀錄各個Page置於哪個Frame 之Frame No

Note:Page Table is stoted in PCB

若Process大小=n個Pages,則它的Page Table就有n個entry(格子)

圖示:

image-20230328205131031

Logical Address 轉 Physical Address 過程By MMU(Hardware)

Steps [例:假設Page size=10]

  1. LogicalAddress初始是單一量,自動拆解成:image-20230328210819830

​ 其中p代表PageNo,d代表Page offset(偏移量)

$$ 單一量位址 \div PageSize = 商數(p)…餘數(d) $$

image-20230328213544244

  1. 依P查詢Page Table, 取得該Page的FrameNo(頁框號碼),令為f

  2. f與d合成image-20230328213723596即為Physical Address

    或 f * PageSize + d = Physical Address

    eg.

    pd
    32

    依P=3查表,它的Frame No= F7, 因此

    fd
    72

    =Physical Address

    =7*10+2=72

image-20230328215606192

優缺點比較

優點:

  1. 沒有外部碎裂
  2. 可支援Memory Sharing及Memory Protection之實施
  3. 可支持Dynamic Loading, Dynamic Linking及Virtual Memory之實現

Memory Sharing(共享)

若多個Processes彼此具有共通的Read-only Code/Data Pages,則我們可以藉由process各自的Page Table,將共通Pages映射到同一個頁框,如此可以節省memory space

image-20230328230158676

Memory Protection(保護)

在Page Table中多加一個欄位:

Protection Bit 值為

R:表此Page只能Read-Only

W:表此Page Read/write都可以

image-20230328231459427

缺點:

  1. 有Internal Fragmentation,因為Process大小不見得是PageSize之整數倍數。eg. PageSize=10KB,Process大小=32KB,因此需配置4個Frames,因此內碎=4*10-32=8KB

    Note:若PageSize愈大,則內碎越嚴重

  2. 需要額外Hardware支援,例:Page Table之製作、Logical Address轉physical address By MMU

  3. effective memory access time 較長因為有Logical Address轉physical address 的時間,這邊的較長是相對於Contiguous來看

Page Table之製作(保存)

[方法一] 使用Register保存,Page Table中每個Entry內容(frame No)

優點:存取page table 時,無須memory access,因為速度最快

缺點:Register數量有限,不適用大型的Page Table(或大型Process)

[方法二] 使用Memory保存分頁表,且用一個Register:PTBR(Page Table Base Register)紀錄它在memory中之位址,及PTLR(Page Table Length Register)紀錄Table大小

優點:適用於大型Page Table

缺點:須額外多一次Memory Access來存取Page Table,因此速度很慢

[方法三] 最普遍的方法使用TLB(Translation-Lookaside Buffer) Register(或叫Associative Registers)保存Page Table中經常被存取之Page No及FrameNo,且完整的age Table存於memory中

image-20230329002106932

使用TLB之effective Memory Access Time =

$$ effective Memory Access Time=P \times (TLB time+ Memory Access Time)+ (1-P) * (TLB Time +2*Memory Access Time) \
where P is TLB Hit Ration $$

Translation Lookaside Buffer (TLB) 是一種硬體快取,用於加速虛擬記憶體的地址轉換過程。當程式存取一個虛擬記憶體頁面時,處理器需要將虛擬地址轉換成實體地址,才能夠從記憶體中取得資料。這個轉換過程需要查詢一個由作業系統維護的稱為頁表的資料結構,以獲取虛擬地址和實體地址的對應關係。但是,這個查詢過程需要訪問主記憶體,因此非常耗時。為了加速這個過程,處理器使用 TLB 快取了最近的地址轉換資料,以便在下一次存取相同虛擬頁面時可以直接從快取中取得資料,而不必再次查詢頁表。

TLB 是一種關鍵的虛擬記憶體子系統,因為地址轉換是虛擬記憶體系統中最常見、最複雜和最耗時的操作之一。TLB 的效能直接影響了系統的整體效能,因此設計高效的 TLB 是非常重要的。

範例:

Register access Time : 0 ns(ignored)

Memory Access Time:200ns

TLB Time:100ns

TLB Hit Ration:90%

求Effective Memory Access Time if Page Table is Stored using

  1. Register
  2. Memory
  3. TLB

Ans.

  1. 200ns(只訪問一次記憶體)
  2. 2*200 =400 ns
  3. 0.9 * (100+200) + 0.1 * (100+2*200) = 100+200+0.1*200=320ns

Paging相關計算

[型一] 使用TLB之effective Memory Access Time

[型二] Logical Address 與 Physical Address Bit 數目計算

例一:

  • pageSize=1kb;

  • Process最大有8個Pages

  • Physical Memory 有32個Frames

  1. Logical Address length
  2. physical Address length

Ans.

  1. Logical address

    pd
    1310

    因為pageSize=1kb= 2 10Bytes ,所以d佔10bits。又因為process最多8個process最多8(23>)個Pages。所以P佔3bits,因此3+10 = 13bits

  2. physical address

    fd
    15bits

    因為physical memory有32(25)個Frames,所以f佔5bits,所以5+10= 15bits

[型三] PageTable size相關計算

1bit = 0 or 1

1 KB = 1024 bytes

1 byte= 8 bits

1MB = 1024 KB

例一

  • Page size=8KB
  • Process 大小 = 2MB
  • Page Table entry 佔4bytes

求此process的pageTable size?

ans

process大小= 2MB/8KB = 221/213=28個Pages,這麼大

因此 Page Table 有2 8 entry,因此size = 28*4bytes = 1KB

例二

  • logical address = 32 bits
  • page size = 16kb
  • page table entry 佔 4 bytes

求MAX page table size?

ans

image-20230329231152261

因為Page size = 16kb = 2 14 bytes,所以d佔14bites,所以p佔32-14= 18bits

process 最大可以有218Pages,所以MAX. page Table size = 2 18 個entry * 4bytes= 1MB

Ex. 承上 若Logical Adress = 48 bits呢?

Ans:

p 佔 48-14 = 34 bits

因此MAX page table size = 234 * 4 bytes = 64GB

Note:page table size 太大是個議題!!

例三

  • Page Size = 16 KB
  • Page Table entry 佔 4 bytes
  • MAX Page Table Size 恰為one Page 求 Logical Address length

因為Page size = 16KB = 2 14 bytes,所以d佔14 bits,因為MAX Page Table Size = One Page = 16KB。因為MAX Page Table = 16KB/ 4 bytes = 212entry,因此P佔12bits,因此12+14= 26 bits

[型四] Page Table Size 太大之解法的相關計算 (考試必考)

Page Table Size 太大 之解決方案

  1. ☆☆☆☆☆MultiLevel Paging(Hierarchical Paging)(Paging the Page Table)(Forward Mapping)

  2. Hashing Page Table

  3. ☆☆☆☆☆Inverted Page Table

Multilevels Paging

考的頻率較高

定義:並不是把分頁表縮小,而是縮減抓進來的分頁表的內容,只抓有需要的區間,不需要將整個Page Table 載入進memory中,而是載入部分需要的內容就好,因此提出多層次的Paging的做法,例:以2-level paging 為例,當然你想要分3, 4 ,5 層都可以,你爽就好

image-20230330003135347

  • Level 1 Page Table :有2x個entry,每個entry 紀錄某個Level-2 Page Table
  • Level 2 Page Table :有2y個entry,每個entry紀錄Frame No.

image-20230330003742535

  • Process在執行時只須1個Level 1- Page Table以及某1個 Level 2 - Page Table在memory中即可,因此可大幅降低Pable Table占用之Memory Space

缺點:effective Memory Access Time更久,因為須多次Memory Access存取Page Table

例如

Two-Level Paging -> 整個過程須三次MA

Three-Level Paging - > 整個過程須四次MA

相關計算:

例一:

  • TLB Time:100ns
  • TLB Hit Ratio:80%
  • Memory Access(MA) Time :200ns
  • Two-Level Paging 採用

求有效Memory Access Time

Ans.

0.8 * (100ns + 200ms) +0.2 * (100ns+3*200ns)

例二:

  • Logical Address= 32 bits
  • Page Size = 4KB
  • Page Table Entry 佔 4 bytes

在以下幾種情下,求Max. Page Table Size

  1. Single-level-paging
  2. Two-level paging 且Level-1 Paging與Level 2 Paging Bit數相等

Ans.

  1. image-20230331005008885

  2. image-20230331005534600

    因為Level-1及Level-2 Paging 各佔 20/2 = 10bits,所以

    1個level-1 Page Table MAX Size = 210*4bytes = 4 KB,

    1個Level-2 Page Table MAX Size = 210*4bytes=4KB

    因此頂多4KB+4KB= 8KB in the memory

例三:

  • Logical Address = 65 bits
  • Page Size = 16kb
  • Page Table entry 佔 4 bytes;
  • 任一 Level Paging之MAX Page Table Size頂多為One Page

則至少分幾層 ?-level Paging

Ans.

image-20230331011238059

因為任一level之MAX Page table Size = One Page = 16KB,

所以任一Level之Page Table 最多有 16KB / 4 bytes =span 212個Entry

所以任意Level Paging Bits數 ≦ 12bits

50 / 12 = 5 Level

image-20230331011244762

Hashing Page Table

考的機會較少

定義:利用Hashing 技巧,將Page Table 視為Hash Table,具有相同的Hasing Address的Page No及他的Frame No資訊,會置入於同一個Entry(Bucket)中,且已Link List(Chain)串接,圖示如下:

image-20230402145915308

缺點:使用Linear Search 在Link List中找符合的Page No,較為耗時

例題:

  • H(x)= X % 53
  • Page Table Entry 佔 4 bytes
  • 求Hashing Page Table Size

Ans:有53個entry ,所以53 * 4 = 212 bytes

Inverted Page Table

反轉分頁表,考的頻率較高

定義:大部分的解決方案都是以Process為對象,這個方法改為以記憶體為對象。是以Physical Memory為記錄對象,並非以Process為對象,即若有N個Frames,則此表就有n個entry,每個entry紀錄 <Process Id, Page No>,配對資訊,代表此Frame存放的是哪個Process的哪個Page,如此一來,整個系統只有一份表格

圖示:

image-20230402153519417

缺點:

  1. 必須使用<Process Id, Page No> 資訊,一一比對查詢,此舉甚為耗時

  2. 喪失了Memory Sharaing之好處,即無法支持其實現,因為Process Id不一樣

例題:

  • Page Size = 8 KB
  • Physical Memory = 16 GB
  • Page Table entry 佔 4 bytes
  • 求Inverted Page Table 之 size?

Ans.

physical memory 有 16 GB/ 8 KB= 234 / 213 = 2 21個frames,所以Inverted page table 有221個entry,所以size = 221 4 bytes= 8MB*

Segment Memory Management

  1. Physical Memory 視為一個夠大的連續可用空間

  2. Logical memory(process)視為一組Segment(段)之集合,且各段大小不一定相同,段的觀點是採用Logical viewpoint,與user對memory之看法一致

    例:code segment, Data segment, stack segment etc…

  3. 配置原則:

    1. 段與段之間可以是非連續性配置

    2. 但對每一個段而言,必須占用連續的(Sapce)空間

  4. Os會替每個Process建立Segment Table分段表,紀錄每個段的Limit(大小)即Base(起始位址)

  5. 圖示:

    image-20230402163145272

  6. Logical Address轉physical Address

    1. Logical Address initially是兩個量,[ s | d ]其中s是段編號,d是段的offset

    2. 依S查分段表,取得它的limit及Base

    3. **Check d < limit ?**若成立,代表合法,所以physical address = Base + d,若不成立,則代表非法存取

      image-20230402164329222

例題:

分段表如下,求下列Logical Addresss,d 之physical Address?

LimitBase
01004200
150080
28307300
39401000
  1. (0,90)
  2. (1,380)
  3. (2,900)
  4. (3,940)

Ans.

  1. 因為90<100,所以合法。4200+90 = 4290

  2. 因為380< 500,所以合法。80+380 = 460

  3. 因為900 > 830,不合法。非法存取

  4. 因為940 不小於940,不合法。非法存取

  5. 優點

    1. 沒有內部碎裂

    2. 可支持Memory Sharing及Memory protection,且比Page容易實施(因為段是採用Logical viewpoint)

      eg. 以Protection為例

      image-20230402171913562

    3. 可支持Dynamic Loading , Linking 及 Vitual Memory 實施

  6. 缺點

    1. 有外部碎裂
    2. 必須要有額外硬體支持,例如分段表的保存、logical address轉physical address
    3. Effective memory access time 更久

Page與Segment比較表

PageSegment
各Page Size相同各段大小不一定相同
用physical viewpointlogical viewpoint
無外部碎裂有外部碎裂
有內部碎裂無內部碎裂
Memory protection及Sharing較難實施較容易實施
無須Check page offset < page size須 check 段 offset < 段大小
Logical address initially 單一量兩個量<s,d>
Page Table紀錄Frame No分段表紀錄段的Limit 及Base

Paged Segment Memory Management

[恐]現已移除,當作補充

觀念:process —> 段組成 —> Page 組成。段在分頁(Process由一堆段構成,段再由頁面構成)

動機:希望保有分段採logical viewpoint的好處,且又要解決外部碎裂,所以段再分頁

圖示:

image-20230403162821988

小結

四大記憶體管理方式,

Contiguous AllocationPage(主角,考最多)SegmentPaged Segment
外部碎裂
內部碎裂

047

Chapter 8 Virtula Memory (虛擬記憶體)

[基本]主要目的(優點)以及附帶好處

[基本]Demand Paging技術

☆☆☆Page fault 即其處理步驟

☆☆☆☆☆Effective Memory Access time計算 in virtual memory

影響Page fault ration之因素

☆☆☆☆☆Page replacement 及其法則、計算題、及相關名詞(Modification Bit, Belady Anomaly, stack property)

☆Frame數分配多寡之影響

☆☆☆☆☆Thrashing現象及其解法

☆☆Page Size 大小之影響

☆☆☆Program structure 之影響

☆☆☆☆Copy-on-write之技術 (3種Fork())

☆TLB Reach

主要目的(優點)以及附帶好處

優點:允許Process size 在超過physical memory 可用空間大小情況下,process仍能進行,是OS的責任(負擔),programmerr沒什麼負擔

附帶好處:

  1. Memory Utilization較高
  2. 盡可能地的提升Multiprogramming Degree,增高CPU Utilization,Note:Thrasing除外
  3. I/O Transfer(傳輸) Time較小 Note:I/O次數、Total Time增加
  4. programmer只須專心寫好程式即可,毋須煩惱程式過大無法執行之問題,這是OS的責任,所以Programmer也不須要,過時的overlay技術

實現Virtual Memory的技術之一 Demand Paging(需求分頁)

是架構在Page Memory Management 基礎上。差別在於採用Lazy Swapper觀念,即Process在執行之初,毋須事先載入全部的Page,而是指載入部分的Pages(甚至不載入任何Page,Pure demand paging),Process即可執行。

  • 若Process執行時,它所需要的Pages皆在Memory中,則Process本身一切無誤地執行
  • 若Process執行時,企圖存取不在memory中的Pages,則稱為發生Page Fault,OS必須處理,將Process所需的lost Page(missed page)載入到Memory 中 from disk,process才可執行

在Page Table中須引進一個欄位:Valid/ Invalid Bit ,用以區分此page是否在memory當中

V:表在memory

I:表不在memory

Note:此Bit是由OS set and modify。MMU reference

圖示:

image-20230403222803230

Page fault 之處理 Steps

  1. MMU會發出一個Address error interrupt 通知OS
  2. OS收到中斷後,必須要暫停目前Process之執行且保存其Status info
  3. OS檢查Process之存取位址是否合法。
    1. 若非法,則終止此Process
    2. 若合法,則SO判定是由Page Fault所引起
  4. OS先去Memory中檢查有無Free的Frame
    1. 若沒有,則OS必須執行Page Replacement工作,以空出一個Free Frame
    2. 有的話就把頁面抓近來
  5. OS再到Disk中找出Lost Page所在位置,啟動I/O運作,將Lost Page 載入到Free Frame中
  6. 然後,OS修改Page Table紀錄此Page的Frame No,以及將Invailaid 值改為Valid值
  7. OS 恢復中斷之前Process的執行

No.

  1. p8-5簡單一點
  2. p8-7 更多一些stpes

Effective Memory Access Time計算 in Virtual Memory

公式:

$$ (1-p) \times \begin{matrix}\text{memory} \ \text{Access} \\text{Time}\end{matrix} + P \times \begin{matrix}\text{Page Fault} \ \text{Process Time} \\end{matrix} $$

Process Fault Process Time的時間超級久!

where P is Page Fault Ration

範例1.

  • Memory Access Time: 200ns
  • Page Fault process time: 5ms
  1. 若Page Fault ration = 10 %,求effective memory access time

ans. (1-0.1) * 200ns + 0.1 *5ms = 180ns + 0.1 * 5 % 10 6ns = 500180ns

mmilli10-3
umicro10-6
nnano10-9

範例2. `

若希望effective memory access time不超過2 ms,則Page fault ration應為?

Ans.

(1-p) * 200ms + p * 5ms ≦ 2ms 

= p ≒ 2/5

小結

欲降低effective memory Access Time提升VM效益,關鍵做法在於降低Page Fault Ration

[049]

影響Page Fault ration因素

  1. Page Replacement 法則之選擇
  2. Frame 數目分配多寡之影響
  3. Page Size 影響
  4. Program Structure 之影響

Page Replacement(頁面替換)

定義:當Page Fault發生Memory中無Free frame時,OS必須執行此工作,即選一個Victim Page (or the replaced page)將它Swap out到Disk保存,以空出一個Free Frame

圖示:

image-20230404114127009

會額外多出一個Disk I/O運作,所以Page falut process time更久

如何降低Swap out此一額外I/O次數?

作法:在Page Table 再引進一個欄位,Modification Bit 或 Dirty Bit,用以表示Page上次載入後,到現在,內容是否被修改過

0:沒有

1:有

引進這件事情後,OS可檢查Victim page的modification Bit值,若為0,則無需Swap it out,因此可降低I/O次數,反之,則需Swap it out 

Note:此Bit由MMU set(0—>1),OS Reference 及 Reset (1 —> 0)

例題:

  • Page Fault process time:8ms

​ if 有可用頁框,或 the replaced page is not modified

  • Page fault process tiem if victim page is modified : 20ms
  • memory access time:100ns
  • victim page is modified 之機率 :70%

求Page fault ration ≦ ? if effective memory access time ≦ 200ns

Ans.

(1-p) * 100ns + p * page fault process time(0.3 * 8ms + 0.7 * 20ms)=16.4ms

= (1-p * 100ns + p * 16.4 ms ≦ 200ns )

= 100 - 100p + P* 16.4 * 10 6 ≦ 200 p  ≦ 1/ 163999

例題:

  • 1次 I/O time :10 ms

  • page Fault Ration:10 %

  • Victim page modified ration:60%

  • memory access time:200ns

求Effective memory access time

Ans .

0.9 * 200ns + 0.1 *(page fault process time)(0.4 * 10 ms + 0.6 * 10ms *2 兩次I/O)

replacement policy 有兩種

  1. Local replacement policy
  2. Global replacement policy
  • Local:OS只能從發生Page Fault 的process 之Pages中,去挑victim page ,不可以從其他processes之pages(in memory)挑victim page

    缺點:

    • Memory utilization較差

    優點:

    • 可限縮Thrashing 的範圍
  • Global:OS可從其他processes挑victim page(目前都是採此方案) 缺點:

    • 不能限縮Thrasing的範圍

    優點:

    • Memory Utilization較佳

Page replacement法則介紹

  1. FIFO
  2. OPT
  3. LRU
  4. LRUU近似
    1. Additional Reference Bitws Usage
    2. Second chance
    3. Enhanced Second Chance
  5. LFU與MFU
  6. Page Buffering algo (偏向機制)

FIFO 法則

定義:最早載入(Loading Time最小)的Page,作為Victim page

[049 00:45:00]

範例:給予3個Frames, Initially, they are all empty(或 pure demand paging)有下列的Page Reference String ,求Page Fault次數

頁面編號:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

或 Page Size = 100,下列存取位址:731, 008, 117, 258, 039 , 331, 047 …

或 Logical address= 12 bits, Page No佔3 bits,存取位址如下:7AF, 8BD, 259, 047, EAF, D72

Ans.

image-20230404143314093

分析:

  1. Simple , easy, implementation

  2. 效能不是很好,Page Fault ration相當高

    Note:Page replacement法則中,只有最佳,沒有最差

  3. 可能有Belady Anormaly(異常現象)

Belady Anormaly

定義:process 分配到的頁框數增加,其Page Fault ration卻不降反升之異常現象

例子:

頁面編號:1,2,3,4,1,2,5,1,2,3,4,5

  1. 3個頁框

image-20230404145501311

  1. 4個頁框

    image-20230404145029156

Stack Property

定義::n個Frames所包含的Page Set保證是(n+1)個Frames … 之子集合(subset),此性質稱之

性質:若具有 stack property,保證不會有Belady Anormaly,只有OPTLRU法則,具有stack property,所以他們不會發生belady anomaly

image-20230404150301566

OPT (Optional 最佳)法則

定義:選擇將來(未來)長期不會用到的Page為Victim Page

範例:

image-20230404170523441

分析:

  1. Page Fault ration最低,因此最佳

  2. 不會有Belady AnomalyS

  3. 無法被實作(因為 needs the future knowledge),通常做為理論上研究比較對象之用

LRU(Least Recently Used)法則

定義:選擇過去不常使用的Page作為Victim Page,即相當於是OPT reverse (依歷史info 做決定的OPT)即挑選the last reference time 最小的page

image-20230404180556546

分析:

  1. Page fault ration可以接受
  2. 不會發生Belady Anomaly
  3. LRU的製作,須要大量Hardware支持,因此Cost很高,因此才有LRU近

LRU的製作方法

方法一:Counter法

步驟

  1. 每發生memory Acess,Counter值++
  2. Copy Counter值到Access Page的"the last reference time"欄位,將來OS要選LRU Page時,就挑the last reference time最小的Page

方法二:Stack 法 

此為Stack property之由來

定義:

  • 最後一次存取之Page 必置於Stack Top端
  • Stack 之 Botton(底端),即為LRU Page
  • Stack大小=Frame數目

釋例:

image-20230404183208550

LRU近似法則

主要是以Reference Bit(參考位元)為基礎,此作法較為簡單

0:此Page不曾被參考過

1:此Page曾被參考過

[050]

Additional Reference Bits usage

作法:每個Page 有一個欄位(or Register) ,例如:8 bits

當發生Memory Access,該被Access Page之Ref Bit 會 Set為1

系統每隔一段時間會將各page的register值右移一位(空出最高位元,最右位元捨去)並將各Page之Ref Bit值Copy到Register之最高位元,且Reset 各Page 之ref bit 為0,將來要排victim page時,就挑Register最小之Page,若多個Page具相同值,則以FIFO為準

圖示:

未命名的作品

犧牲頁面會挑Page2,因為暫存器的值最小

image-20230406010708144

Second Chance

二次機會法則

定義:以FIFO為基礎,搭配Reference Bit使用,挑victim page之Steps如下

  1. 先以FIFO order 挑出一個Page

  2. 檢查此page的Reference Bit值

    Case 1:若為0,則它即Victim Page

    Case 2:若為1,則給它機會,不讓它當犧牲頁面。但Reset its Reference Bit值為0。並將它的Loading Time(載入時間)更改為現在,因此FIFO指針往下指。接回Step1

例:

image-20230407230307064

挑犧牲頁面

image-20230407230516510

例:3個Frames

頁面參考:1,2,3,4,2,5,2,6,1,2,求Second Change

未命名的作品

Note:當所有Pages之Reference Bit皆相同,則退化成FIFO。也叫Clock Algorithm

Enhanced Second Chance

加強型二次機會

定義:以<Reference Bit, Modification Bit>配對值,作為挑選Victim Page之依據,值最小之Page,作為Victim。若有多個Pages具相同值,則以FIFO為準

<R bit, M bit>
第一小<0,0>
第二小<0,1>
第三小<1,0>
第四小<1,1>

LFU與MFU法則

定義:以Page的累積參考總次數作為挑Victim Page之依據,分為兩種:

  1. LFU(Least Frequently Used)

    次數最小的Page為Victim

  2. MFU(Most Frequently Used)

    次數最大的page 為Vimtim

若多個Pages具相同值,也是FIFO為準

分析:計算題FIFO,OPT,LRU最常考。

  1. Page Fault Ration相當高 
  2. 有Belady Anomoaly
  3. 製作需大量Hardware支持,因此Cost很高

例:

PageLoading TImeThe Last reference TimeR bitM Bit參考次數
Page149380000410
Page217270011235
Page333343001147
Page458462110875
Page525656401432

在下列情況中,victim page為

  1. FIFO:Page2

  2. LRU:Page3

  3. Second Chance:Page5

  4. Enhanced Second Chance:Page1

  5. LFU:Page3

  6. MFU:Page4

Page Buffering機制

緣由:當挑出Victim Page之後,且它被Modified過,步驟如下

1. 則把Victim PageSwap Out 到 Disk

2. 載入Lost Page

3. Process resume execution

–> IO太多,Process恢復執行的時間點拖太久,想要改善

方法一

OS 會 Keeps一個 Free Frames Pool(OS的私房錢,不是配置給Process的)

圖示:

image-20230408011210426

流程:

OS挑完犧牲頁面(Modified)

步驟更改如下

1. OS從Free Frame pool中,取出一個Free Frame,供Lost Page使用,讓它先載入

2. 載入完後,Process恢復執行

3. Process Resume execution

OS可稍後將Victim Page 寫回Disk,空出Frame再還給OS,加入Free Frame Pool中

image-20230408012305710

方法二

OS會Keep一條Modification List,記錄所有被Modified過的Page info(即Modification Bit值=1之Pages),OS會等Paging I/O Device有空時,將此List中某些Pages寫回Disk,同時自此List中,移走這些Pages,Reset their Modification Bit值為0。如此可增加Victim pages是unmodified 之機率,這樣直接把Lost Page抓進來就好,這樣Process有較高機會快速resume exec

[051 00:00:00 ~00:40:00]

方法三

希望連一次I/O都不要有。是以方法一為基礎,差別在於針對Free Frames Pool(私房錢)中的每個Frame,紀錄放的是哪個Process的哪個Page(<process ID, Page No>),這些Page內容必定是最新的

流程:

  1. OS選完Victim Page(modified)
  2. OS去Free Frames Pool中尋找有無Lost Page存在。若存在,代表其內容為最新的,則將此Free Frame加入Resident Frames Pool中,Process即可Resume exec,連一次I/O都不用!,OS寫回Victim Page後,再加入(還給)Free Frames Pool,若不存在,則依方法一步驟處理

. .

.

這邊看不太懂,先Pass

.

.

.

Frame 數目分配多寡之影響

  1. 一般而言Process分配到的頁框數增加,其Page Fault Ration理應下降
  2. OS在分配Process頁框數時,必須滿足最少及最多數目之限制,這兩個限制均由Hardware決定的,非OS

最多數目限制即是Physical Memory Size(頁框總數)

最少數目限制即是CPU完成機器指令執行過程中,最多的可能Memory存取次數,否則機器指令可能永遠無法完成

例:

[051] 01:10:00 看不太懂,需要計組知識

image-20230408163437049

  • 假設指令不跨頁面
  • 運算元(memory變數)是採用Direct Addressing 

則最多可能需要3次Memory Access(M.A.),因此os至少要分給process ≧3個Frames

Thrashing現象 ☆☆☆☆☆

Thrashing meaning 徒勞無功

定義:若Process分配到的頁框數不足時,則此Process會經常Page Fault,且OS要做Page Replacement,若OS採用Global replacement policy,所以OS可能挑其他Process之Page,而這也會造成其他Process Page Fault,它們也會去搶奪別的Process之Frame來用,如此一來,幾乎所有的Processes皆Page Fault,大家皆在等待Paging I/O Device 之I/O 運作(swap  out/in)完成,CPU Utilization下降,系統會企圖調高Multiprogramming degree,引入更多Process進入執行,但是Memory本來就不夠,Process也立刻Page Fault,系統調高Multiprogramming Degree,如此循環下去,此時系統呈現

  1. CPU Utilization急速下降
  2. Paging I/O Device 異常忙碌
  3. Processes花在Page Fault Processing Time(就是閒置時間啦)遠大於正常執行時間,此一現象稱為Thrashing

解決/預防 Thrashing

方法一

減少 Multiprogramming Degree 

例如挑選一些lower-priority 或完成度低 Process swap-out

方法二

利用Page Fault Frequency Control 機制,來防止/預防Thrashimg發生

作法:OS會去制定process Page Fault Ration之合理的上限與下限值

image-20230408173939031

image-20230408173954495

OS若發現Process的Page Fault ration

  1. 高於上限,則OS應增加額外Frame數目給此Process,降低其Ratio,回到合理區間
  2. 低於下限,則OS自此Process取走多餘的Frame,分給其他有需要之Processes

若OS能夠控制所有processes之Page Fault ratio 在合理區間,則理當不會有Thrashing

方法三

運用Working Set Model技術預估Process在不同執行時期所需之頁框數,並依此分配各Process足夠的Frame數目,以防止Thrashing

Working Set Model 技術

是架在"Locality Mode"之理論基礎上

定義:Process執行時,對於所存取的Memory Area,並非是均勻的,而是具有某種局部/集中區域存取之特性,一般分為兩種Locality

  1. Temporal時間 Locality
  2. Spatial空間 Locality

Temporal Locality

目前所存取的區域,過不久又會再度被存取(或此區域經常被存取)

例:For Loop (while, for , repeat …), Subroutine副程式(function, pure code), Counter, Stack

Spatial Locality

定義:目前所存取之區域,其鄰近的區域,也即有可能被存取

例:Array, Sequential Code Execution, Common Data area, Linear Search, Vector operat

[052]

只要Program中用到的指令, Data Structures, algo 符合 Locality Model 則為Good(所以 Page Fault Ratio 度會下降) 若違反,則為Bad

例:BAD Samples

Ans:Hashing(分散在各個記憶體頁面,不符空間局部性), Binary Search(跳來跳去), LinkedList(散落在不同頁面), goto Jump指令(跳來跳去), Indirect Addressing mode(間接定址模式)

Working Set Model相關術語解析:

  1. Working Set window:記為表示以△次 Pages reference 作為統計Working Set之依據
  2. Working Set:  在△次Page參考中,所參考到的不同Pages之集合
  3. Working Set Size(WSS):working Set之 元素(Page)個數,代表Process 此時所需之頁框數

[052] 00:13:00

例題:到時候再來補

Page Size 之影響

若Page Size越小,則

  1. Page Fault ratio:上升
  2. Page Table Size :變數
  3. I/O次數(total Time):增加
  4. 內部碎裂:輕微
  5. I/O Transfer Time:變小
  6. Locality:越佳

趨勢:朝Page size大的更新,因為我們只關心Page Fault ration

Program Structures 之影響

  • 若Profram中使用的指令Data Structure, Algo 符合 “Locality Model”,則為GOOD(有助於降低Page Fault Ratio),反之,若違反,則為BAD

  • 程式中對於Arrray元素的處理順序最好與Array元素在Memory中的儲存方式(Row-Major或Column-mahor)對應,有助於降低Page Fault  ratio

    例:A:Array[1..128,1..128] of int;

    每個int 佔 1 bytes

    A以Row-major(第一列放完再放第二列在放第三列...)方式存於Memory

    Page Size= 128 byte

    給3個Frames,且程式已在Memory中

    採FIFO Replacemenrt policy

    求下列Code之Page Fault次數

    1
    2
    3
    
    for i = 1 to 128 do
      for j = 1 to 128 do
          A[i,j]=0
    
    1
    2
    3
    
    for j=1 to 128 do
      for i to 128 do
          A[i,j] = 0
    
    1. Row-Major 的排列方式image-20230409122905579
    2. Column-Majorimage-20230409123224894

    例2:A:Array[1..100,1..100] of int;

    每個int 佔 1 bytes

    A以Row-major(第一列放完再放第二列在放第三列...)方式存於Memory

    Page Size= 200 byte

    給3個Frames,且程式已在Memory中

    LRU Replacemenrt policy

    求下列Code之Page Fault次數

    1
    2
    3
    
    for i = 1 to 100 do
      for j = 1 to 100 do
          A[i,j]=0
    
    1
    2
    3
    
    for j=1 to 100 do
      for i to 100 do
          A[i,j] = 0
    
    1. image-20230409124706967
    2. image-20230409124835188

Copy-On-Write技術

(此處主要是討論3種Fork())

  1. 傳統的Fork() ch4

    (fork () without “copy-on-write”)

    定義:Parent process fork() 建立出Child process,OS會配置New Frames給Child Process(即Child 與 Parent 占用不同的Memory Space),同時OS也要複製(Copy)Parent Process內容(code Sec 及 Data Sec)給Child Process initially

    此舉會導致兩個缺失

    1. Memory(Frames)需求量大增
    2. Slower Child Process Creation

    而且上述做法在Child 生出後,立刻執行execlp()作其他Task時,更加顯得無用 unnecessary(不適合,因為沒有共通的東西,卻要Copy不用的東西給child)

  2. Fork() with copy-on-write

    定義:當Parent Process 生出child process 之初,OS會讓child共享parent process之memory(frames)空間,如此,無須配置給Child process New Frames 且也不用Copy Parent 內容給Child,因此可降低頁框需求量及加速Speed Up process Creation

    image-20230409161126347

    但是,任何一方改變了某Page內容,則另一方會受到影響(此為risk),所以引入Copy-on-write技術,即eg. 若Child Process 想要更改某Page內容(eg. Stack內容),則OS會配置一個New Frame給Child,且Copy Page內容到new Frame中,且修改Child的page Table 指向 New Frame,供Child 使用/修改,如此,則不會影響Parent

    image-20230409161809333

    因此那些有Modified可能的Pages,須標示Copy-on-write,而有些不會Modified 的Page(eg: read-only code/data)則不須標示,則可共享

  3. Vfork() (virtual memory fork())

    定義:Parent 生出Child 之初,也是讓Child共享parent相同的frames,但是,它並未提供Copy-on-weite技術,所以,任何一方改變了某Page內容,則另一方會受到影響,故務必小心使用。這個東西特別適合用在:當生出Child 後,Child立刻執行execlp()去作其他task時,Vfork()非常有效率。例如:Command Interpreter製作(eg:Unix shell)

TLB Reach

定義:經由TLB Mapping 所能存取到的Memory Area大小,即TLB Reach  = TLB Entry數目 * Page Size

eg. TLB有8個Entry,且Page Szie= 16 KB,所以TLB reach = 8 * 16kb = 128 kb

Note:希望 TLB Reach 越大越好

Q:如何加大TLB Reach?

方法一

提高TLB Entry數目

優點:

  1. TLB Reach 變大
  2. 連帶TLB Hit Ratio也較高

TLB (Translation Lookaside Buffer) Hit Ratio 是計算虛擬記憶體管理中 TLB 命中率的一個指標。TLB 是處理器中一種硬體快取,用於加速虛擬記憶體的地址轉換過程。當程式存取一個虛擬記憶體頁面時,處理器會先在 TLB 中查找是否已經有該頁面的轉換資料。如果有,就可以直接進行地址轉換,稱為 TLB 命中。如果沒有,則需要從主記憶體中讀取轉換資料,並且更新 TLB 中的內容,稱為 TLB 錯誤。

TLB Hit Ratio 就是 TLB 命中率,即在虛擬記憶體管理中,TLB 命中的次數與總存取次數之比。這個指標反映了 TLB 的效率,也可以用來評估虛擬記憶體子系統的效能。一般來說,高的 TLB Hit Ratio 表示處理器能夠更快速地完成地址轉換,因為有更多的轉換資料被快取在 TLB 中。

缺點:

  1. 成本貴(高)
  2. 有時TLB Entry數仍不足以涵蓋Process

方法二

加大Page Size

優點:

  1. 加大TLB Reach Cost可接受

缺點:

  1. 內部碎裂會很嚴重

    • 解決方法:現代很多硬體均提供一些不同大小的Page(Multiple Page Size)

    • eg . 提供乙組Page Size (4 KB, 2 MB)

    • 因此TLB 紀錄項目多增加一個Page(Frame) Size

    • Page NoFrame NoPage(Frame) Size
    • 此外,TLB管理以前是Hardware管理,現在委由OS管理,這樣帶來的好處遠大於效能下降的壞處

[053 1:29:23]

Chapter 9 Disk Management

Disk System 組成即大小計算 ☆☆

Disk Access Time 組成 計算 ☆☆☆☆

Disk Free Space Management(4種) 很少考

File Allocatation Method(3種) ☆☆☆☆☆

Disk Scheduling Algo (6種) ☆☆☆☆☆

其他名詞 考個一兩次吧

Formatting ☆

Raw-I/O x

Bootstrap loader, Boot Disk ☆☆

Bad Sectors 處理方法(3種) ☆☆☆

Swap Space Mangement (2方法) ☆

RAID 介紹 ☆☆☆☆

Disk System組成

定義:Disk System 由多片Disks組成,

  • 每片Disk通常雙面(Double-side),可存Data
  • 每一面(surface)劃分為多個同心圓軌道,叫做磁軌(Track)
  • 每條Track由多個Sector(磁區)所組成
  • 不同面之相同Track No組成之Track 集合,叫做Cylinder(磁柱)

圖示:

image-20230409175639147

例:Disk System有10片Disk

  • 每片皆雙面可存
  • 每面有2048條Tracks
  • 每條Track有4096個Sectors
  • 每個Sector可存16KB Data

求Disk System Size?

Ans.

10 * 2 * 2048 * 4096 * 16KB = 20 * 211 * 2 12 * 2 14 Bytes

= 10 * 238 bytes = 2.5 * 2 40 bytes = 2.5 TB

Disk Access Time

定義:Disk Access Time 由下列3個時間加總而得

  1. Seek Time
  2. Latency Time (or Rotation旋轉 Time)
  3. Transfer Time

分述如下:

  1. Seek Time:將Head(磁頭)移到欲存取之Track上方所花的時間
  2. Latency Time:將欲存取之Sector 轉到Head 下方所花的時間
  3. Transfer Time: Data在Disk 與 Memory 之間的傳輸時間,與傳輸量成正比

image-20230409225106416

此外上述3者通常以 Seek time 佔比較大

計算:

例1:

Disk 轉速 7200 rpm,求Avg Latency (rotation) Time?

Ans.

7200 rpm = 一分鐘轉7200次 = 一秒鐘120次 = 轉一圈1/120 秒

平均Rotation Time = 1/2 * 1/120 = 1/240 秒

例2:

Disk System 有3片Disks,雙面可存

  • 每面有1024條Tracks
  • 每條Track有40%個Sectors
  • 每個Sector可存32KB
  • 轉速6000 rpm

求Transfer Rate(即每秒可傳輸多大量Data)

Ans.

6000 Rpm = 1秒可轉 6000/60 = 100圈

每轉一圈可傳輸一個Cylinder容量(多面時)

因為一條Track容量 = 4096 * 32 Kb

一條Cylinder容量 = 6條Track * 4096 * 32KB

= 6 * 128 MB

Transfer Rate = 100 * 6 * 128 MB/sec 

= 600 * 128 Mb/Sec

例3:

承上,若Disk平均Seek Time = 10 ms,今有一個File大小=2MB,欲read this file,要花多少I/O TIme?

Ans.

SeekTime + Latency time + Transfer Time = 10 ms +(1/2 * 1/100)秒 + 2MB / 500 * 128MB

= 10 ms + ms + 10 / 3*128 ms

Disk Free Space Management

有四種方法

  1. Bit Vector(或Bit Map)
  2. Link List
  3. Grouping
  4. Counting

Bit Vector(Bit Map)

(位元向量/地圖)

定義:每一個Block皆用一個Bit表示Free與否

0:表Free

1:表Allocated

Disk有n個Block,則Bit Vector大小= n Bit

image-20230411000727084

0123456789101112131415
0010000101100010

優點:

  • 簡單易實施
  • 容易找到連續的Free Block(即連續的0)

缺點:

  • 小型Disk適用,但大型Disk不適用,因為Block數目龐大,造成Block Vector Size很大,很佔Memory Space甚至被迫置於Disk

定義:OS直接在Disk上,將這些Free Blocks以Linking方式串接,進行管理

image-20230411004147771

優點:

1. 大型Disk適用

2. 插入/刪除 Free Block方便

缺點:

1. 不夠迅速去找大量的可用區塊,因為Disk上讀取Link Info耗時(I/O)

Note:用Grouping法改善

2. 不容易找到連續的Free Blocks

Note:用Counting法改善

Grouping

定義:是Link List法之變形,在Free Block內除了紀錄 Link Info之外,另額外紀錄其他Free Block之No(Address)

例:(Assume one Block 可記5個欄位)

image-20230411005506514

優點:可迅速找到大量的Free Blocks

Counting

定義:利用連續性配置及連續性歸還之特性,稍加改變Link List記錄方式,Free Block 內除了紀錄Linking info以外,另外紀錄在此Free Block之後的連續Free Block之個數

例:

image-20230411013244700

優點:

適用於連續性配置,方便找到連續性的Free Block,且若連續的Free Block很多,Link List長度也可大幅縮短

[054]

File Allocation Methods ☆☆☆☆☆

主要有三大方法

  1. Contiguous Allocation(連續性)
  2. Linked Allocation(鏈結式)
    • 有一個變形叫做 FAT metohd
  3. Index Allocation(索引式)
    • 例:UNIX的I-Node Structure

Contiguous Allocation

定義:若File大小=n個Blocks,則OS必須在Disk中找到n個連續性的Free Blocks才能配置給它,此外OS在Physical Directory,會記錄下列資訊

File NameStrat Block NoSize(區塊數)

例:

image-20230411230013638

若File1大小=3個Blocks,則OS配置6,7,8號Block給它,且Physical Directory紀錄如下

File NameState NoSize
File163

優點

  1. 平均SeekTime較小(因為Blocks大都落在同一條Track或鄰近Track上)
  2. 可支持Ramdom(Direct) Access及Sequential Access
  3. 可靠度較高(than Linked Allocation)
  4. 循序存取速度較快(than LinkedList)

缺點:

  1. 會有External Fragmentation(外部碎裂)(Note:Disk用Repack(磁碟重組)方式解決,類似Memory的Compaction)(Note:所有File配置方法皆有內部碎裂)
  • eg. Block Size = 10KB, File大小=44 KB, 配5個Blocks,內碎=5*16-44 = 6KB
  1. File大小不易動態擴充
  2. 建檔之前須要事先宣告大小

Linked Allocation

定義:若File大小=n個 Blocks,則OS只須在Disk中找到n個Free Blocks(不須連續),即可配置且Allocated Blocks之間以Link方式串連,另OS在Physical Directory紀錄下列Info

File NameStart Block NoEnd Block No
File234

例:

image-20230411234232077

優缺點與Contiguous相反

優點

  1. 沒有外部碎裂
  2. File大小容易動態擴充
  3. 建File前無需事先宣告大小

缺點:

  1. Seek Time較長(因為不連續的block可能散落在許多不同的Track上)
  2. 不支援Random Access
  3. 可靠度較差(因為萬一Link斷裂,Data Lost)
  4. 循序存取速度慢(因為要在Disk上讀取Link資訊,才知下一個Block為何)

若File2大小=3個Blocks,則OS可配置 3, 1, 4 號

[055]

FAT(File Allocation Table)

定義:是LinkedAllocation之變形,主要差異如下

Allocated Block之間的Linked Info存於OS Memory Area中的一個表格,叫FAT,而非存於Disk中

例:

image-20230412000447471

File Directory

File NameFAT Entry
File 23

優點:

  1. 想要加速Random Access In the Linked Allocation(因為可以在memory中的FAT找到第i個區塊的號碼,相比於在Disk中找更快。找完後再去Disk Access i th Block),不用在Disk 中Traverse LinkedList

Index Allocation

定義:若File大小=n個Blocks,則OS除了配置n個Blocks(無須連續)存放Data之外,另須額外配置Index Block,儲存所有Data Block 之No(address) ,且OS在Physical Directory

紀錄:

File NameIndex Block No

例:File3大小=3個Blocks,則OS可配置11,0,14號Block給它存放Data,另外配置15號Block作為Index Block 而Index Block內容為

File NameIndex Block No
File315

image-20230412214600748

想要融合連續性配置與鏈結式配置部分的好處

優點:

  1. 不會有外部碎裂
  2. 支援Ramdom Access及Sequential Access
  3. File大小容易動態擴充
  4. 建File之前無須事先宣告大小,

缺點:

  1. Index Block 占用額外空間
  2. Linking Space浪費(OverHead)比Linked Allocation
  3. 若File很大,則單一個Index Block可能無法容納(保存)File的所有Data Block No,此問題須被解決

解決單一Index Block 不夠存放所有Data Block No之問題

方法一

使用多個Index Blocks,且彼此以Link方式串連

例:

Assume一個index Block可存5個No

image-20230412224917945

缺點:

Random Access of i th Block之平均I/O次數大幅增長(線性成長)

方法二

使用階層式Index Structure 

例:

Two-Level Index Structure

image-20230412230302769

優點:

  1. Random  Access of i th Block之I/O次數是固定值 eg 2層-> 3次I/O
  2. 適合大型檔案

缺點:

  1. 對小型檔案極不合適,因為Index Blocks太佔空間,甚至多於Data Block 數目(目錄20頁,內文2頁)

方法三☆☆☆☆☆

混合法,即UNIX的I-Node結構,一定要會,狠狠地記下來

例:I-Node有15格(entry)

image-20230412232955337

第1~第12格:直接用來記錄Data Block No

第13格:pointer to Single-Level Index

第14格:pointer To Two-Level Index

第15格:pointer To Three-Level Index

… 以此類推

MAX.FILE size = (12+n2+n3+… ) 個Data Blocks

優點:

小型、大型File皆適合

[055 1:20:00]

例題1:

I-Node之定義同上所述(15個Entry)

  • Block-Size = 16Kb
  • Block No(Address) 佔4Bytes

求MAX File Size多大?

Ans

一個Index Block可以存 16KB/4Byte = 212Data Block No

因此MAX File SIZE

=12+212+(212)2+(212)3

=(12+212+224+36) * 16kb

= 250 byte

≒ 1PB

例題2:

承上,若File大小 = 8000個Blocks,假設I-Node已在Memory中,則要存取此File的第6000個Data Block,需要?次I/O

Ans.

前12個:6000-12 = 5988

第13個:5988-4096= 1892

第14個:大概就在這

共3次的I/O

例題3:

循序存取前面6000個Data Blocks,則要?次I/O

Ans.

6000+3= 6003次 I/O

[055 1:39:00]

Disk Scheduling Algo

目的在於降低軌道移動總數

  1. FCFS
  2. SSTF
  3. SCAN
  4. C-SCAN (C:Cirular)
  5. Look
  6. C-Look

FCFS(First-Come-First-Service)

定義:最早到達的Track request,優先服務

例子:

Disk有200軌,編號0~199,Head目前停在第53軌,剛剛服務完第40軌,現在Disk Queue中有下列Track request依序為

98, 183, 37, 122, 14, 124, 65, 67

求Track移動總數

Ans

(183-53)+(183-37)+(122-37)+(122-14)+(124-14)+(124-65)+(67-65) = 640軌

分析:

  1. 排班效果並不是很好,Track移動數較多,Seek Time  較長

Note:Disk Scheduling法則,既無最佳,也無最差

  1. 公平,No Starvation

SSTF(Shortest Seek-Time Track First)

定義:距離Head目前位置最近的Track request,優先服務

例:

98, 183, 37, 122, 14, 124, 65, 67

ans

53->65->67->37->14->98->122->124->183

= 236軌

分析:

  1. 排班效果不錯,Track移動數較少,Seek Time小,但並非是Optimal
  2. 不公平,有可能Starvation

SCAN法則

SCAN is Suck Do not Use

定義:Head來回雙向移動掃描,遇有Track request,即行服務,Head遇到Track開端或盡頭時,才會折返提供服務

示意圖:

image-20230415025348792

分析:

  1. 排班效能可接受適用於大量負載之情況(因為在Track Request有較均勻一致之等待時間)

Note:Look也是

  1. 在某些時刻對某些Track Request,似乎不盡公平

image-20230415030344217

​ Note:用C-SCAN解

  1. Head需要遇到Track 開端或盡頭才折返,此舉耗費不必要的Seek Time

​ Note:用Look解決

[056]

C-SCAN

定義:C Stand for circuler,是SCAN變形

差別:只提供單項服務,折返回程不提供服務

示意:

image-20230415032118760

爭議在計算上,折返的Track移動數要列入還是不列入計算?

Look

定義:是SCAN之變形

差別:Head服務完該方向最後一個Track Request後,即可折返提供回程服務

示意圖:

image-20230415032803987

C-LOOK

定義:Look之變形

差別:只提供單向服務,折返的Track列入計算

image-20230415033339377

補充

[恐][Modern]其他版
SCANx
C-SCANx
LookSCAN
C-LookC-SCAN

image-20230415033647324

其他名詞項

Formatting (格式化)

分為兩種

  1. Physical format

    又稱low-level format

    1. 工廠生產Disk System時執行

    2. 主要是劃分出Disk Controller可以存取的Sector

      image-20230415122707706

    3. 偵測有無不良Sector

  2. Logical formatting

    1. user在使用Disk之前,必須做兩件事情
      1. Partition:切割分區,即Logical drive,ec: C,D,E磁碟機
      2. Logical Format:OS製作(寫入) File Management System 所需之資料結構
        1. Free Space管理(eg. Bit Vector)
        2. FAT, I-Node (配置方法)
        3. 空的Physical Directory

Row原始的-I/O (基本上沒考過)

定義:將Disk視為大型Array在使用,一個Sector好比是Array的一格,無File System之資源,這樣的優點是檔案存取速度快速,缺點是User不易使用,通常在DBMS底層使用

[057]

Bootstrap Loader ☆☆☆☆☆

主要目的:開機時,用以從Disk載入 OS Object Code 到Memory(RAM) 的特殊Loader

早期的作法

image-20230415130102305

缺點:

  1. Bootstrap Loader無法任意變更

  2. ROM Size有限,BootStrap Loader 無法很大

現代的做法

image-20230415133110047

BAD Sectors 之處理方法

Sector會壞的原因

  1. 工廠生產時已Bad
  2. 正常使用一段時間後,Bad

處理方法:

[方法一]

Mark(標示) Bad Sectors,以後不用

例:IDE Disk Controller

[方法二]

Spare(備品) Sectors方法

例:SCSI Disk Controller採用

作法:

image-20230415150125529

一旦有BAD Sector(eg 87號 Sector BAD),則Disk Controller 會從 Spare Sectors選擇一個Spare Sector (eg. 333號 Sector) 來替代BAD Sector。將來OS在存取87號Sector時,SCSI Controller會將它轉向成對333號之存取(但OS不知道這件事情)

缺點:

此一Sector轉向存取之動作,可能會破壞掉OS Disk Scheduling之最適效益,破壞磁碟排班效能

例:

image-20230415153156232

改善作法:

將Spare Sectors 分散到每條Track (or cylinder)上,不要集中存放

若Sector BAD,則用相同軌道或鄰近的Track 上的Spare Sector作替代

舉例來說:維修中心如果都在台東,那運送時間會拖很長,要讓時間降低的做法就是讓全省各地都有維修中心,降低運送時間

[方法三]

Sector Sliping 法

例:

image-20230415155647865

Swap Space Management

[交大成大有考過一次,至此之後滅跡]

在Virtual Memory, Medium-term Scheduler,會將Disk作為Swap out的page或process image之暫存處

Swap Space空間大小,宜超估,比較安全

如果留太小的示意圖:

image-20230415235501768

Swap Space Management方式

(用什麼方式保存Swap out page/process image?)

方法一

用File Sy(stem,仍然以File型式保存(.temp)

優點:

  1. Easy implementation

缺點:

  1. 有外部碎裂(因為大都採Contiguous Allocatation)
  2. 效能比較差

方法二

使用一個獨立的Partition來保存(使用者看不到)

優點:

  1. 效能佳,因為採用Row-I/O,無File System 支持

缺點:

  1. 內部碎裂(但老實說,超估比低估安全)
  2. 若Partition一開始切不夠大,導致不夠用,則需要重新re-partition

提升Disk Data Access Performance(效能)之技術-Data(Disk) Striping(Interleaving) 技術

定義:把多部Physical Disks,組成單一的Logical Disk,運用平行存取技巧來提升效能,一班分為兩種

  1. Bit-Level Striping
  2. Block-Level Stirping

示意圖:  

image-20230416004324667

提升Disk Reliability(可靠度)之技術

當Block壞了,Data Lost,如何作Data Recovery?

兩種

  1. Mirror(或Shadow)技術
  2. Parity-check技術

Mirror

定義:每一部正常的Disk,均配備有對應的Mirror Disk,資料必須同時存入正常Disk及its Mirror Disk,將來,若正常Disk is Bad,則用its Mirror Disk替代

優點:

  1. 可靠度最高
  2. Data Recovery 速度最快

缺點:

  1. 成本高(貴)

Parity-Check 技術

定義:多準備一部Disk作為儲存Parity-Check Block之用,資料寫入時,需要額外算出Pariry-check Block內容

image-20230416012116833

將來,若某一個Block BAD,只要用其他Block及Pariry Block作偶同位,即可Recovery Data

優點:

  1. 成本比Mirror便宜許多

缺點:

  1. 可靠度低,因為如果同時有多個Block壞掉,則無法復原
  2. 資料恢復速度慢於Mirror
  3. 資料寫入速度也慢

RAID 規格

(Redundant Array Of Independent Disks)

磁碟冗餘陣列

  • RAID 0~6
  • RAID-0與RAID-1組合

範例:

皆以4部正常使用的Disk為例,

RAID-0

只提供Block-Level Striping(Interleaving)而已,未提供任何可靠度技術(eg. mirror, parity-Check,用在強調存取效能要求高,但可靠度不重要之場合

eg. VOD(Video Of Demand) Server

RAID-1

就是Mirror

RAID-2

採用Memory的ECC技術來改善可靠度,希望降低Mirror成本,但是成本降低有限(只比Mirror少一部Disk而以)

Disk數=2n-1

image-20230416014729591

此外,與RAID-3相比,可靠度一樣,但成本高於RAID-3,因此RAID-2無實際產品,跟RAID-6一樣,跟RAID-2一樣沒實際產品,口訣2266

RAID-3

採用Bit-Level Striping 及 Parity-Check技術

DisK數=n+1

image-20230416015642161

RAID-4

採用Block-Level及Pariry-Check技術

image-20230416015642161

RAID-5

採用Block-Level Striping及Parity-Check技術,與RAID-3,RAID-4之主要差別在,將parity Block分散存於不同Disk,並非集中在一部Disk

image-20230416020200561

RAID-6

不用Parity-Check技術,改用類似Reed-Solomon技術,可以做到2部Disk Block同時出錯,

還能Recovery,但Cost太高(≧ Mirror成本),因此也無實際產品

RAID-0 & RAID-1 之組合

用在高效能以及高可度要求之場合,雖然很高,但不計任何代價

組合方式有:

  1. RAID0+1
  2. RAID1+0[優秀]

這邊考畫圖

RAID0+1

先Striping,再整體Mirror

image-20230416021106242

一部Disk BAD,整組的Disk都要換成Mirror的,不可以只換一個Disk

RAID1+0

先Mirror,再Striping

image-20230416021307561

Chapter10 FileManagement

File Open & Close 動作

Consistency semantic

File Protection

[058]

File Open & Close動作

緣由: OS 對 File 進行任何運作之前,都必須要Disk之Physical Directory 找出File的配置資訊,此舉會導致2個Problems

  1. 搜尋的時間很長(因為File數目太龐大)
  2. Disk I/O Time(次數)很多,非常耗時

為了改善此問題,才有File Open及Close動作

File Open運作

定義:當File第一次被使用時,OS必須要Disk之Physical Directory找出File的配置資訊,Then,將此資訊Copy到OS Memory Area中的一個Table,叫做 「Open File Table」,將來對此File進行任何運作之前,OS只需到此,搜尋取得File的配置資訊即可,由於Open File Table中的File數目少(eg. 20個),搜尋時間可大幅降低,又此表格在Memory中,所以省下可觀的I/O Time(次數)

由於File可被多個Processes共用之故,每個Process讀取到的位置可能不一樣,有的可能在第八行,有個可能在第八百航,所以Open File Table可進一步分成兩種

  1. System-Open File Table:保存File的共通配置資訊(File名稱、配置區塊、大小),不因Process不同而有所不同。
  2. Process-open File Table:Process存取File時,會有不同的資訊要保存eg. File當前指標位置、File Access權利

File Close運作

定義:當File不再使用時,OS會將Open File Table中此File的配置資訊更新回Disk之Physical Directory,且自Table中刪除此File的配置資訊

Consistency Semantic

(一致性語言,翻成白話文就是。檔案可以被多個Process/user共享,而共享的模式(model)有哪幾種?)

分為三種

  1. UNIX Semantic例如:訂票系統的座次表
    • 需要互斥存取
    • 大家看到的File內容是一致的
    • 某個Process對File作的任何改變,其他Processes會知道
  2. Session Semantic例如:空白報名表File 供人下載填字
    • 不須互斥存取,大家都在各自的Copy上read/write存取不受限制
    • 大家看到的內容不一定一致
  3. Immutable Sematic例如:總經理公告文件第005號.pdf
    • Read-Only,不可更改內容
    • 檔名不得重複

File Protection

Physical Protection:防止因為Disk BAD所造成的File Data Lost,方法:Backup only

Logical Protection:防止非法使用者對FIle之不當存取

方法如下

  1. Name Protection

  2. Passwork Protection

  3. Access List

  4. Access Group☆☆☆

    以UNIX為例

    1. 將User 分為三類
      1. Owner
      2. Group(Member)
      3. Other(Universal)
    2. File存取權利
      1. R:Read
      2. W:Write
      3. X:eXecute

Licensed under CC BY-NC-SA 4.0