(音樂) 好 不好意思耽誤了大家一些時間 那還記得上一次我們這個 Chapter 0 從最早的電腦系統開始介紹起 那提到最早的電腦系統非常非常的單純 那它能夠去支援的計算的方式就叫做 batch 這個 batch 這個很希望大家可以記起來 因為其實這個是就算現在這個資訊的 我們這個做系統的處理的時候 也常會用這個字 batch 指的就是一次處理一個 job 那所以因為這樣子很單純 整個系統它一次處理只能處理一個 job 那所以說它的作業系統 基本上是不需要做什麼特別的事情 除了基本的把這個程式 load 到使用者的 memory 還有就得到的這些 instruction 讓 CPU 去執行 然後處理這個基本的 input 把卡片的資料讀進來 跟 output 寫到這個印出來 printer 基本上 這樣就結束了 所以這是很早的這個時候的作業系統 就是這麼的單純 那我們剛剛有提到很重要的 系統很明顯是不太實用的 尤其你想想現在的電腦系統來比較起來的話 最主要是第一個它一次只能處理一個 job 就是所謂的 batch 第二個沒有 interaction 所以說在處理這個執行的過程當中 沒有任何機會讓使用者去跟這個 program 做任何的任何的 interaction 這跟我們現今的電腦當然是差的 最遠的尤其你想想現在的手機等等 講求就是 interactive 你都在跟電腦互動 或是透過電腦跟電腦另外一端的使用者 或系統在互動 那最後最嚴重的部分就我們說的 這當時電腦是很昂貴的設備 但是它這樣子的處理系統來講 它的資源使用率非常低 尤其我們者就是 CPU 因為你的 I/O 很慢 我們說即使現在電腦你也感覺出來 大家都知道 CPU 遠快於 I/O 所以如果你一次只能處理一個工作的話 我們之後就會看見 任何 program 你一定都可以把它 breakdown 成兩個 phase 要嘛再做計算 要嘛再做 I/O 絕對沒有特例 就是只有這兩件事情 那一個 program 組成你一定是有計算跟 I/O 的 所以如果今天你一次只能放一個程式在這個電腦裡 那當你在做 I/O
的時候 CPU 當然是毫無選擇 只能 idle 對不對 因為只有一個人在做嘛 那他不要 CPU 當然, CPU 只能 idle 那就造成很明顯的一種浪費的結果 好 那所以這三個問題要怎麼去解決它咧 那這樣就是因為我們 OS 什麼都不做 當然才會造成這樣的一個結果 好 那我們就先來看下一代的這個 OS 第一個先解決的問題就是在於 怎麼樣讓我們的資源的使用率可以提升 或者更準確的講 更精準的講就是說 怎麼樣可以讓我們的 CPU 可以不斷的做事情 即使我們知道 program 他就是有做 I/O 的時候 但是我還是希望讓我們的 CPU 可以不斷的在做計算 那怎麼樣可以讓他不斷的在做計算咧 當然是很明顯你可以看見 就是希望讓我們的系統裡面可以放多個 program 對不對 因為如果一個 program 你是沒有辦法解決這個問題的 但是如果我今天可以放兩個 program 三個 或者甚至於現在一千個 program 對不對 那當一個 program 在做 I/O 的時候 我就可以讓別的這個 program 來去用 CPU 對不對 那所以大家就可以輪流去使用 CPU 自然我的 CPU 就不會 idle 了 所以這樣子的概念設計的這個最終系統 我們就稱為所謂的 multi-programming 的 system 雖然叫 programming 啦 大家想 program 就對了 意思就是說我們系統中我讓多個 program 那為什麼要這麼做咧 就是因為我希望讓多個 program 之間的 CPU 跟 I/O 的時間 我可以 overlap 對不對 我可以把它重疊 所以說今天第一個程式在做 I/O 的時候 我就做第二個程式的 CPU 嘛
那所以說我的這個 CPU 就輪流在做 第一個 program 第二個 program 甚至於我越來越多 program 我就可以保證 always 有人想要用我的 CPU 對不對 那我的 CPU 就不會 idle 了 所以就是用這樣的方式 我可以增加我的 CPU 的使用率 這就是第二代要解決的問題 那這個想法說得很容易啊 實際上你要真的要實現的時候 你就會發現第一個很重要的問題了 我到底要怎麼樣讓它 overlap 也就是說我們的電腦是有 I/O 的 device 沒錯 也有 CPU 可是它真的在執行的時候 我怎麼樣可以讓這兩個時間 這個 I/O 在做 device 在運作的時候 CPU 也可以同時在運作 其實這件事情並不是想要這麼的簡單的 因為 I/O device 它其實是很單純 它是很被動的 它通常都需要用 CPU 在那邊給它下指令 不斷的去下指令跟監測它的狀況 才能夠完成一個 I/O 的動作 那這樣的結果就有點像是 我們說你有一個主管 要下面屬下做事情 這屬下它只是寫一行字 它就問主管接下來我要幹什麼 那請問這個主管真的能做它的事嗎 不行嘛對不對 因為它不斷的不斷的就被下面的下屬 叫它去下指令 那結果就是這個主管就是 等於就在一天到晚在下指令 教它怎麼做而已 根本就沒有在成為多工 所以這個電腦的系統 要讓它能夠 I/O 跟 CPU 能夠多工的 第一個先決條件 就是要有這種 spooling 的概念 那所謂 spooling 的概念也就是說 要想辦法讓我們的 I/O 在做事情的過程中 I/O 很慢嘛 像我要搬一個 giga 的 files 從 disk 到 memory 這要花很久的時間大家都知道 那在這段時間內 我必須要讓我們的
CPU 完全不需要 involve 在裡面 就是不需要去下達任何指令 或者是去負責任何事情 這樣 CPU 才可以真的去做它的事情 所以就這邊可以看見的 所謂的 spooling 就是希望 讓我們在計算的過程中 我們的 CPU 仍然要能夠繼續的做事情 所以我們的 CPU 就必須要 是用一種 notify 的概念 所以就是你做完事情你再告訴我 搬一個 giga 的 files 可能要花好幾分鐘 那你就等你做完了 你再去 notify 我們的 CPU 叫我們的 CPU 回來去做剩下的事情 所以才能夠實現像這邊看見的 這樣的一個概念就是 disk 跟 CPU 可以是同時的在做運作的 那這樣的一個系統的概念 我們就稱為所謂的 spooling 那這個 spooling 要怎麼實現呢 就是這是一個概念 spooling 只是一個概念 那真的要能夠實現的話 就是我們等一下下一個章節 Chapter 1 我們會教 interrupt 這個東西 非常重要的一個東西就是整個 OS 的概念 就是 driven by interrupt 被打斷這樣的一個機制 那這個是我們 Chapter 1 的重點 那那邊的時候大家就會很清楚知道 怎麼樣去利用 interrupt 就可以實現 像 spooling 這樣概念的一個系統的運作 但這邊就大家先稍微知道就好 就是 multi-programming 的第一個先決條件 除了要把很多的 programming 能夠讓在系統之外 其實是要靠 spooling 這樣的一個機制 讓我們的 CPU 跟 I/O 的時間是可以重疊 就在做 I/O 的時候 CPU 是不需要 involve 進去
它只要被結束的時候被通知就可以了 好 那所以當你如果有放多個的時候 就會像這邊看見了對不對 所以我們的 memory 裡面除了 OS 之外 跟第一代的差別就是我們現在有 job 1, 2, 3, 4 或者是不同的 progress 那為什麼都要在 memory 咧 因為我們知道 CPU 要執行的話 它只能夠去讀 memory 所以你要讓它執行 就必須要先把東西 load 到 memory 裡面去 那我 load 這麼多的目的是什麼 當然就是希望大家可以輪流的使用 CPU 所以只要有一個人他說不要用這個 CPU 要去做 I/O 的時候 我就可以去挑另外一個 job 的程式來做 CPU 來使用 好 所以當這樣的時候你就會看見幾件事情了 那尤其是我們知道其實 program 一開始並不是在 memory 要 load 嘛 所以都是 load from disk 對不對 因為大家程式寫完 也就是大家寫完 compile 完的那個程式嘛 當然一開始其實在 disk 所以你的第一個問題就出現了 我要 load 哪一些 program 到 memory 然後讓在 memory 之後才可以開始執行 因為我們 memory 還是有限的嘛 對不對 尤其比較早期一點的話 那所以說你不可能把所有要執行的 program 全部都 load 到 memory 那當然現今事實上是如此這麼做啦 但比較早期一點 或者說你去想一些比較 embedded device 或者是一些比較特殊的裝置的話 這個還是不一定 always true 的 也就是說還是你會通常第一個決定 就是要 load
哪些 program 到 memory 那 load 到 memory 你當然要管理 所以你看有這麼多四五個啊 那所以到底每一個人、每一個 job、每一個 program 他可以得到多少的 memory 的空間 對不對 是評分嗎?還是動態? 我們知道現在很多程式都是動態 你可以去 allocate memory 對不對 所以又會把事情弄得更複雜 所以 memory management 那邊我們就會講很多 那到了 memory 之後要去做執行 要放到 CPU 那 CPU 的數量當然就更有限啦 對不對 就算是現今可能也就才 64 個 可以同時執行 64 個程式就很了不起了 那但是我 load memory 可能有幾百個 所以要挑哪一個 job 去讓在這些 CPU 的 core 上 這又是一個 decision 了 所以你可以看見這個 decision 呢 就是我們說的 CPU 的 scheduling 所以系統裡面有很多 scheduling 的問題 那你可以看見最後這一層放到 core 的 這 CPU 上的這個叫做 CPU 的 scheduling 也是各位的作業三 特別就會去知道一些基本的 algorithm 然後去 implement 它 那從 disk 到 memory 呢 我們通常稱之為 job scheduling 就是哪一個 job 它可以變成 active 然後可以去做執行的動作 這個叫 job scheduling 那 job
scheduling 現在當然比較沒有那麼的重要 因為一般 general 的 computer 的話 memory 是真的蠻大的 所以通常是可以全部 load 進來 好 不過你就可以看見 scheduling 的問題跑出來 memory management 的問題跑出來 然後還有怎麼樣可以讓就是實現 spooling 就要透過 interrupt 這個機制 實現 spooling 的問題也會跑出來了 那要結合這麼多的事情 你才有辦法實現我們說的 multi-programming 的作業系統 所以你可以看見 memory CPU 的 scheduling 就是我們後面的章節 就在講這些部分 然後還有就是 I/O 的部分 所以怎麼樣可以實現 spooling 怎麼樣通過 interrupt 怎麼樣透過不需要 CPU involved 的方式 可以做 I/O 甚至於大家可能多少知道一些 現在我們的電腦 它之所以效能這麼快 或是說你可以看到 CPU 真的可以使用率很高的原因是因為 我們的電腦裡不是只有 CPU 一個人會做計算 其實很多 I/O device 你買來 它上面就有小的一些 chip 對不對 然後那些 chip 就會幫忙 CPU 去做這些 I/O 所需要做的計算 所以可以讓我們的 CPU 就專心的在算這些 instruction 真正最複雜最耗時間的部分 那 I/O 這種很慢的 通常就是用其他的方式 甚至於其他的這些 co-processor 小的 processor 去幫忙去實現 所以在 I/O device 這邊就會幫大家介紹 現在使用的一些方式 好 好 所以剛剛是 multi-programming 這個希望大家記得很清楚 multi-programming 是什麼樣子的一種系統
然後它解決的問題是什麼 另外一個系統就是 有了這個 multi-programming 的作業系統之後 大家就發現 CPU 的使用率是提高了 但是我使用者用起來還是覺得 不是很好用 因為它的受限還是很大 因為最主要原因是什麼 它沒有 interactive 對不對 剛剛就算很多 program 同時執行 它只是說讓系統的使用率增加 可是就單一那個 program 而言 它的行為還是一模一樣 甚至於可能還變慢了一點 因為它還要禮讓 它要讓這些 resource 給其他的使用者 因為 CPU 有限 所以很多人同時在執行的時候 有人就會被 delay 對不對 所以以單一使用者的角度 這個系統並沒有真的變好 對不對 所以真的使用者他想要什麼 他想要是 interactive 就是說我可以隨時的 跟我這個 program 去做互動 也就是很頻繁的在 I/O 跟 CPU 之間做交換 然後我也希望有很多的使用者 可以同時的使用這台電腦 可是很重要的是 不能夠感覺到受別人的影響 所以就是很多人同時在使用這台電腦 可是卻以為它是唯一的使用者 那原來的做法 剛剛的 run 很多 program 沒有辦法實現的原因是因為 它仍然是 batch 一次一個 對不對 所以我今天要嘛就讓另外一個程式做 要嘛就讓我做 所以我跟這個 如果別人的程式在前面先執行的話 就會影響到我 我就會被 delay 到後面去 所以並沒有真的感覺到有 sharing 的感覺 那要解決這兩件事情 大家想出來的 solution 就是需要一個 time sharing 所以 multi-tasking 這個 term 比較混淆一點 大家直接自己 time sharing 會更清楚 意思就是說 我這個系統不是一次只執行一個 job 我是讓所有人一起執行 然後我用時間的觀念去切割 大家來使用的這個資源 這就叫所謂的 time
sharing 好 所以為什麼可以用 time sharing 的方式 就可以實現 interactive 呢 原因是因為所謂的 time sharing 就是 我咧這個 CPU 在做執行的時候 它可以非常的這個平凡的 你只要有一個 I/O 進來 什麼是 I/O 咧這邊指的就是 使用者的 activity 就是透過這些 I/O device 早期就是當然就是 keyboard 囉 那現在大家都知道手機嘛 都是 screen 了 無所謂這些就是 I/O device 就對了 那所以 time sharing 就是它可以很頻繁的 這個去交換 在 CPU 跟 device 之間去做交換 所以隨時可以去看說 這些 I/O device 是不是有 input 的進來 或者是有東西要 output 出去 那所以如果很頻繁的在這個中間交換的時候 使用者只要按下一個 keyboard 鍵 立刻如果我們的 CPU 或系統 communicator system 可以 detect 到 立刻去處理 這樣子你就有 interactive 的感覺了嘛 所以它必須要很頻繁的去 detect 這就是 time sharing 可以實現的 所以你可以一有 input 我就可以去 react 那你就會有 interactive 的感覺了 那第二個咧 更重要的就是這個 sharing 所謂 sharing 的意思就是 我每一個程式咧 並不是我一次就把你所有的 instruction 所有的計算全部做完 因為你全部做完你可能要花個五分鐘 對不對
那五分鐘其實也是一段很長的時間 大家大概有耐心可能就是十秒五秒而已 對不對 那可是電腦因為很快啊 所以它可以做的事情就是 time sharing 的意思就是在每一個 program 之間 我只執行幾個 ms 我就換到另外一隻程式去 所以你會覺得每一個程式 似乎是同時在執行的 因為每一個程式都輪流的 對不對 在執行它的指令 那雖然它會變慢 可是你會覺得整個就是 所有的人可以同時在用這台電腦的感覺 而且因為你有 interactive 的意思就是 你的程式可能在等使用者 input 的機會是很多的 對不對 所以其實你會有很多這些小的 I/O 在程式中間 所以只要一碰到這個的時候 我立刻去做切換的話 我就可以讓所有的使用者好像同時在使用 那可是又沒有感覺到它會變慢的感覺 所以這個 time sharing 就是可以實現 讓整個電腦系統是 sharing 的概念 然後可以增加 interactive 的 behavior 那所以跟前一個作業系統最大的差別 其實就在於這個部分 就是什麼時候它會去切換 job 咧 原來是做完才切換 對不對 有程式做完我才把 CPU 讓出來 可是 time sharing 就是我會把我整個 CPU 的執行 變成一個一個 time slot 每一個人就是幾個 ms 然後所有在這個系統裡的程式 我就輪流的去使用這些 time slot 所以它變成只要有一個很短的時間 每一個 time slot 到的時候 它就會去做一次 switch 就換另外一個程式來做 這就是後來的 time sharing system 也就是各位現在的電腦 所以現在電腦我們知道 同時 run 在上面 run 的程式 可能都有十個甚至幾百個 可是你會感覺他們好像同時在執行 為什麼 因為就是我們 CPU 的 scheduling 其實是 time sharing
的 就是固定每到一個時間它就會換一個人 然後讓大家都可以有一個進度 讓這樣可以共同的去使用這台電腦 好 那所以這個 time sharing system 就是以使用者的角度出發了 這樣的作業系統 它又必須要多出一些問題了 第一個 virtual memory 什麼叫 virtual memory 我們之後就會介紹 簡單講就是我把 disk 當作 memory 因為我們知道 memory 是有限的 再了不起 100GB 好了 那如果今天想要更多怎麼辦 我是不是就可以用 disk 假如 disk 都是幾個 terabyte 一千倍 所以如果今天 memory 不夠 我可以把這些資料存到 disk 就以為它存在 memory 一樣 那我的 memory 就會擴大了 這就是 virtual memory 也就是這些 memory 其實是假的 其實是用 disk 的空間來取代的 那為什麼要 virtual memory 擴得更大勒 因為我想要塞更多的程式到 memory 對不對 因為 interactive 是程式之間 頻繁的切換嘛對不對 所以說我很短時間 我就要換另外一個程式 所以如果想要讓 CPU 繼續在做事的話 我一定是希望更多的人 大家可以一起輪流的來使用 我並不只是要讓我的 CPU 或者我的 memory 塞滿而已 我希望能夠越多人來 sharing 越多人來共同的使用 而且還有 I/O 對不對 很多 interactive 的 I/O 在裡面 所以我會需要更多的計算量 從更多的程式的計算量裡面來做彌補 所以我就需要 load 更多 可能比以前是十倍或一百倍數量的 程式在我的 memory 我才有辦法確定我的
CPU 是不斷的在做執行 那所以就需要更大的 memory 這就是 virtual memory 那第二個部分勒 大家跟電腦的 interactive 現在最常來做什麼 你一定這個大家都一定有體會 就是讀檔案嘛 對不對 所以常常在那邊使用電腦的時候 尤其一個人的時候 不外乎就是在那邊開檔案 edit file 存進去 對不對 所以變成是一個使用去管理檔案的一個電腦了 跟以前只是純計算不一樣了 所以這些資料怎麼辦 對不對 當然就是存在 disk 然後透過 file system 大家都知道的檔案系統 然後來去使用 所以因為有很多的 interactive 大家的 interactive 的目的其實通常當時早期開始 現在很多都是就是想要操作 file 所以必須要 file system 這個系統出現 去幫使用者在電腦上直接的管理這些檔案 就跟現在電腦是一樣的道理 最後一個這些 process 不只有了 而且我同時會 run 很多個程式 對不對 所以我 run 很多的時候 人就會開始想一些比較複雜的程式出來 一些程式跟程式之間可以溝通運作的程式出來 所以現在很多程式我們知道 並不是靠一支程式就可以做完 很多這個 application 應用程式對不對 我其實是透過很多的程式 然後中間去做溝通協調 然後才完成實現的一個應用程式 所以就會造成有 synchronization 的問題 因為很多程式同時在運作的時候 他們可能同時可以去修改一個 memory 的 counter 所以有些有 sharing 的這些存在的時候 怎麼樣確保程式跟程式之間的運作仍然維持正常 這個是一個大問題 也就是我們說的第二部分的時候 synchronization 的章節要教的 你需要一些 protocol 大家要 follow 一些 rule 來去使用這些 share 的這些 尤其是 memory 的部分 才不會讓你的程式執行 跟你想像的行為有所出入 那當然這個為了 synchronization 你就會發現你會產生一些 locking 的機制
因為不能夠同時改 所以大家要輪流啊 你最簡單的方式就是去能夠用一些 lock 把它 lock 起來 一個程式在用 另外一個就可以不准它去用 可是如果用一堆 lock 咧 很有趣的是會產生 deadlock 也就是你擋到我 我擋到你 最後大家都不用做事了 這個是一個衍生出來的一個嚴重的問題 所以個別會是一個章節來介紹 好 也就是當你有 concurrent 的程式在執行 就是同時執行很多程式 而且他們之間有共用一些計算資源 或者需要溝通的時候 你就會產生這些很麻煩的問題 然後這會非常困難解決的原因是因為 因為 time sharing 咧 它是幾個 ms 意思是它只有在幾個 instruction 不是各位寫的程式碼的一行一行 statement 而是 CPU level 很 low level 的 instruction 所以當它這麼頻繁做切換的時候 其實會跟你寫 program 所看見的世界是不太一樣的 所以變得更難去處理 所以希望大家稍微知道了 就是 multi-programming 跟 time sharing 這兩個系統 最大的差別我們說 batch 就是一次就一個 job 而且是只有一個使用者獨佔整台電腦 multi-programming 我就是可以塞很多個 program 進去 但是是跟使用者是沒有關聯性的 那到了 time sharing 咧 就是把人的因素加進來 所以你要能夠跟你的 program 做互動 它會有很多的 I/O 在裡面 然後會希望很多人可以同時使用 但是又不會感覺受到影響 這個就是 time sharing 所以它的目的 這個就希望大家記得很清楚 batch 就算了 simple 當作沒看見 當 baseline multi-programming 指的就是它的目的 為什麼要 multi-program 就是為了要增加資源的使用率 是以系統的角度出發 那 time
sharing 也是指人 所以就剛才說的 它要 interactive 要互動 它要很短的 response time 也就是我每一次有一個 input 進去或 output 的時候 它可以立刻的做反應 那這邊也沒有列 大家可以加進去 就像 sharing 對不對 所以去共同使用這台電腦 很多使用者一起去使用 所以他們的目的其實是不同的 一個是從系統出發 一個從使用者的角度出發 那最後一個大家看一下就好 你就會發現 這些剛好就會 map 到我們這整個 OS 的 這個 Chapter 裡面這些很重要的 Chapter 所以我們剛才講的這些 大家的作業還有書裡面的重要章節 其實都會在上面 所以就是要實現這些事情 你才能夠達到一個 其實很基本的作業系統的雛形 那這些 concept 其實從來都沒有變過的 所以我們才說這個是核心的一些問題跟技術 (音樂)