程式設計師的自我修養〈介紹〉
程式設計師的自我修養心得筆記
Hello World
電腦架構 : CPU / Memory / IO 設備
目前 CPU 最高頻率為 4GHz,已經達到實體限制
API = Application Programming Interface
Linux API : Glibs -> POSIX
Window API : Win32
磁碟讀取
8000 byte file
0 - 4096 byte -> 1000 - 1007 sector (every sector 512 byte ; 8*512 = 4096 byte )
4097 - 8000 byte -> 2000 - 2007 sector (every sector 512 byte ; 8*512 = 4096 byte )
ext3 -> 1000 - 1007 -> 2000 - 2007 用鏈結串列當作檔案儲存裝置
IDE0 的 I/O = 0x1F0 - 0X1F7 & 0x376 - 0x377
如果要讀取 1000 的 LBA 開始的 8 個 sector
1 | 0x1F3 - 0X1F6 的 4 byte 為 LBA 位址 |
記憶體位址
virtual address 解決了位址隔離問題
位址隔離就是說,不同 process 有各自的記憶體空間
也就是 process 會有自己的 virtual address 範圍
HW 會去判斷不同 process 是否存取到自己的區段
如果存取超出範圍就拒絕存取
所以 virtual address 可以解決個別 process 隔離問題
分頁
virtual address 不能解決 ram 使用率問題
因為傳統上程式需要整個搬到 ram 執行
而 Page 分頁的作法就是為了解決 ram 的使用效率
概念是程式在執行時,並不是每一段都需要用到
那只要將需要用到的部分放入 ram 即可,其他程式區段放在硬碟中
Paging 將位址空間分成固定大小的頁面
1 | 1.頁面大小由硬體決定 |
例如 Pentium CPU 支援 4KB 或 4MB 的分頁大小,目前都使用 4KB 為主
假設 PC 是 32位元,可以定址範圍是 4GB,分頁為 4KB,總共就有 104_8576 頁
所以 CPU 會送出 virtual address 給 MMU,MMU 會轉換為 phycial address
MMU 通常整合在 CPU 內部了
Thread
Process 執行有 3 個區塊 global、stack、heap
1 | Global: |
Process 由一個或多個 Thread 組成
Thread 有各自的 ID、PC、register、stack
但是彼此 Thread 共用 Process 的程式碼、資料區段(全域變數)、空間、資源(開檔、信號)
Thread 好處在於需要等待的狀態
例如一個 T 處理網路下載,但需要等待,這時另一個 T 還是可以處理使用者互動
不會因為要等網路而當掉
Thread 存取權限
T 可以存取 process 中在記憶體的所有資料,以及其他 T 的 stack
T 自己擁有:
1 | stack (雖然還是可以存取其他 T 的 stack,但一般來說不會) |