1. 操作系統文件系統中的的block
文件系統中的block 是文件系統最小的讀寫單元,在HDD的磁盤時代, 一般block的大小可能與磁盤的扇區大小一致為 512bytes
也因為這個原因MBR啟動的手 0磁道 0扇區的 512bytes 首先加載到內存, 先包含了 446byte的MBR啟動信息, 還包含 64bytes 的磁盤分區信息 所以MBR的磁盤格式只支持4個主分區 並且大小僅能夠擴展到2TB
后來使用GPT分區的模式可以擴充使用2TB大小以上的磁盤.
操作系統的文件簇大小 可以與扇區大小也可以是扇區大小的整數倍
比較常見的SSD 一般是4kB的扇區大小 所以就有一個SSD操作系統盤的 4k對齊問題(Win7 MBR的情況)
單個文件系統的block 僅能夠分給一個文件, 不能同時被兩個文件持有, 所以如果文件block較大的情況下會造成磁盤空間的大量浪費
但是如果文件系統的block太小的話 又會影響一定的IO性能.
2. 數據庫中的block
oracle與sqlserver針對最小的數據庫的讀寫單元的命名不一樣
oracle跟操作系統一般 將最小的讀寫單元寫為block sqlserver的叫做page
他們的大小與操作系統相關 一般為操作系統文件系統的block的整數倍
比如一般的windows系統的文件簇是4kB 的話 oracle與 sqlserver的基本的block的大小就是8kB
sqlserver的page中有page head 和 業內偏移量等信息內容, 單個page 是 8192bytes 一般可用來存數據的部分是 8060byte 其余的 132 byte 用來存儲頭和偏移量
Oracle的block 在dbca創建數據庫時可以指定, 也是操作系統的整數倍 11g 以上的版本一般默認都是 8kB 可以調整為更大的情況
數據庫的單次IO 會抓取一個block中的內容填充到SGA區域中(direct path read 應該是讀取到PGA區域中)
oracle數據庫 多個block 組成extent區域 oracle應該 以extent為最小的邏輯分配單元 給schema分配存儲區域
extent 在11g 最開始增加了延遲短創建的特性, 創建完沒有insert數據時 是不進行extent段的創建的
extent在首次創建時好像只包含8個block 也就是 64kB大小
當擴展到一定程度到達16個extent 時 也就是1MB 大小時 可能會默認每次分配1MB 的區域給這個用戶
Oracle為了提高extent的擴展性能這一塊做過很多優化處理
Oracle只是塊級別的並發 行級鎖 好像就是可以同時處理一個extent區域內的block記錄 提高並發響應性能.
3. 內存頁面.
現代操作系統處理的都是虛擬內存, 由硬件底層或者是其他方式進行虛擬內存與物理內存的映射處理.
在不啟用大頁的情況下x86的操作系統不管是windows還是linux很多現在常用的版本的單個內存頁面的大小都是4KB 大小了,
為了加快內存的訪問速度, CPU 訪問內存一般通過多級緩存來進行,
這里面可以有一個微觀的認識:
光速是30萬千米沒小時在一個3GHZ的CPU 的一個cycle內 光可以走10cm 感覺此處可能會限制CPU 做到特別大面積的可能.
CPU訪問寄存器 應該是在一個1cycle內來解決,時間是0.5ns以內
CPU 訪問內存的延遲要高一些,可能達到十幾個cycle 總體時間可能要12ns左右
CPU 完成獲取內存地址以及從內存中取數可能會耗時超過100ns
從硬盤中取數 加上磁盤尋道以及數據獲取大概要耗時10ms以上, 此時看到內存中的速度要比硬盤中快十萬倍 但是比CPU 寄存器取數也要慢100-200倍
CPU為了加快內存取數 內存尋址部分盡量沒有通過內存獲取 而是通過寄存器或者是一二三級緩存來實現
寄存器的名字是TLB TLB 里面應該是存儲了 64位地址長的部分 因為一個內存頁面是4KB 所以 需要有12內的頁內偏移量來一個位標識一個bytes內的內容 除了12位偏移量的部分 來標識頁的位置
現在應該是段頁式內存管理, 但是操作系統的課程沒學好, 這一段內容一致沒理解透徹.
因為TLB 的總體大小有限,所以TLB中進行虛擬地址到物理地址的轉換總是會出現TLB miss 所以可以增加page entry的方式來縮減 頁表項目 我理解為增加地址中頁內偏移量的大小來減少內存中的頁數,保證TLB的hits命中率來提高性能
Linux里面大頁的處理 應該/proc/meminfo 信息中包含hugepage的字段 即可視為支持大頁.
我對windows的段頁式內存管理 一直沒有理解好(其實深入的內容都不理解...!-_-!).
一個IO操作可能涉及的點是非常多的. 以上只是自己簡單的理解 非常不全面.