快轉到主要內容
  1. 文章/

OSTEP 第二章:作業系統簡介 重點整理

·204 字·1 分鐘

本章重點:作業系統這麼好用是因為他幫我們處理了以下幾個問題。

  1. 虛擬化 CPU, 記憶體資源
  2. 處理 Concurrency 情況
  3. 儲存資料

Heptabase 筆記

第一章節為對話錄,跳過。

作業系統 #

作業系統透過虛擬化資源讓電腦變得很容易使用又很有效率。

目的 #

提高資源的使用效率且提高資源的可用性。並在此前提下,降低作業系統對資源的利用。並且確保作業系統與應用程式間不會互相干擾。

歷史進展 #

最一開始作業系統是個像有很多工具的工具間,提供許多好用的工具,有時候你還能放一些自己覺得有趣的東西在裡面(e.g., 把文件寫入檔案內)。

隨著時間的進展,我們有許多人會共用這個工具間,我們不想要其他人碰到我們的東西。

於是我們發展出了 System call 。你可以把它想像成工具間的管理員,以後你要進入工具間放東西或拿東西都要透過它。他會確保每個人只能拿到自己的東西。

再隨著時間的進展,作業系統又發展出了(Multiprogramming),這個工具間可以多人同時使用了。

三大主題 #

虛擬化 #

CPU #

Q. 如何讓一個 CPU 被多個程式(Program) 使用?
A. 透過把 CPU 虛擬化同時給多個程式使用。

這樣會帶來另一個問題

Q. 如果有兩個程式同時間要使用 CPU ,哪一個會先被執行呢?
A. 這就要依據作業系統的 Policy 去決定了。

記憶體 #

Q. 如何讓記憶體能夠使多個程式同時存取?
A. 透過虛擬化記憶體讓多個程式可以共享記憶體。

這樣會帶來一個問題,如果兩個程式存取到同一個記憶體位置該怎麼辦?

舉例來說,我們透過虛擬化記憶體,讓兩個不同的執行中的程式(Running Program) 都有他自己的 virtual address space ,每個執行中的程式都會以為他們有一個獨立的記憶體。

但兩個程式有可能存取到相同記憶體位置的資料。

Concurrency #

什麼是 Concurrency 的問題?

#include <stdio.h>
#include <stdlib.h>
#include "common_threads.h"

volatile int counter = 0; 
int loops;

void *worker(void *arg) {
    int i;
    for (i = 0; i < loops; i++) {
	    counter++;
    }
    return NULL;
}

int main(int argc, char *argv[]) {
    if (argc != 2) { 
	fprintf(stderr, "usage: threads <loops>\n"); 
	exit(1); 
    } 
    loops = atoi(argv[1]);
    pthread_t p1, p2;
    printf("Initial value : %d\n", counter);
    Pthread_create(&p1, NULL, worker, NULL); 
    Pthread_create(&p2, NULL, worker, NULL);
    Pthread_join(p1, NULL);
    Pthread_join(p2, NULL);
    printf("Final value   : %d\n", counter);
    return 0;
}
prompt> ./thread 100000
Initial value : 0
Final value : 143012 // huh??
prompt> ./thread 100000
Initial value : 0
Final value : 137298 // what the??

上面的 code 我們會預期 Final value 應該要會是 200000 但實際情況卻幾乎都不是 200000 。

主要的原因就是,counter++ 這個操作並不是原子性(atomic)的,意思就是這個操作並不是一次做完的。

他至少會經過從記憶體中讀取數值 -> 修改數值 -> 寫回記憶體

造成 Concurrency 的關鍵因素 #

  1. 多執行緒
  2. 共享的記憶體

永久儲存 #

Q. 長時間的儲存資訊為什麼重要?

A. 因為電腦記憶體是所謂的 Random access memory ,是一種短期的儲存單位但好處是能夠快速的存取,隨著電力的喪失資料就會消失。
因此,把重要的資訊轉換到長期儲存單位是件很重要的事。