iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 24
2
自我挑戰組

OS作業系統學習系列 第 24

第二十四天 Virtual Memory(虛擬記憶體)--(四)

第二十四天 Virtual Memory(虛擬記憶體)--(四)

Trashing現象會發生在page分配到的frame不夠多時,會很頻繁的發生page fault,會使CPU的使用效率突然急速下降。

Trashing產生:

  1. Frame不夠,發生page fault
  2. Page replacement發生
  3. 很快的frame又不夠用,又需要Page replacement (2 3之間會產生很多page fault)
  4. 導致CPU使用效率低,因為process都在忙著swap in/out,CPU就空閒下來,這時CPU就會想提高程度,抓更多process進來工作。
    以下是thrashing的圖表:
    https://ithelp.ithome.com.tw/upload/images/20181108/20112132tWqyWBGXaA.png
    而解決thrashing的策略有working-set model跟page fault frequency。
  • Working-set model:
    預估process在不同時間內所需要的frame數量,並提供足夠的frame防止thrashing。他將∆定義working-set window,如果∆太小,會無法包含整個locality; 如果∆太大,就會重複很多locality,在∆等於無限大時,就等於整個program。而將D代表process對frame的總需求量,如果D>可用量時,就會發生thrashing,以下有例圖:
    https://ithelp.ithome.com.tw/upload/images/20181108/20112132twd93UQQlM.png
  • Page fault frequency:
    解決thrashing更直接的策略,如果錯誤率太高,就增加frame給process; 如果錯誤率太低,就會收回一些frame。

Memory-mapped files(記憶體映射檔):

Memory-mapped file會讓一段虛擬記憶體對應於一個檔案,將檔案I/O視為經常性記憶體,不同於open()等標準系統存取。藉由memory-mapped file相關程式,直接從virtual memory讀取檔案內容,加速I/O效能。

特性:

  • 高速檔案存取(主要目的):傳統讀取檔案需要system call和disk存取
  • 將大檔案載入記憶體
  • 可讓多個程式共享記憶體

以下是例圖:
https://ithelp.ithome.com.tw/upload/images/20181108/20112132FYPg4DMSjI.png
在Windows API內shared memory步驟:

  1. 產生一個file mapping
  2. Producer用CreateFile()開啟被對應檔,歸HANDLE
  3. 用CreateFileMapping()產生named shared-memory object
  4. consumer以MapViewFile()在virtual address space建立mapped file的view

以下是例圖:
https://ithelp.ithome.com.tw/upload/images/20181108/201121321J73UwiY2o.png
Allocating kernel memory(核心記憶體分配):
不同於user memory,多用free-memory pool分配,因為kernel需要的memory會因架構而不同,像是I/O裝置就需要連續的記憶體。

  • Buddy system(夥伴系統):
    可以讓固定大小的區段組成更大的連續page,他的分配大小通常為2的次方。他的優點是可以快速合併成更大的chunk,但他也容易造成fragmentation,像是33KB的就只能使用64KB的page,浪費了31KB的空間。

  • Slab allocator(平板分配):
    他是個替代策略,slab是由一或多個physically contiguous page組成,而cache由一或多個slab組成,object會去使用cache。這個方法就沒有fragmentation的問題,以下有例圖:
    https://ithelp.ithome.com.tw/upload/images/20181108/20112132HEUoE6qL3g.png
    其他的考慮因素有:

  • Prepaging(預先分頁):
    在pure demand paging剛開始執行時,一定會發生很多page fault,會影響CPU的效能,所以Prepaging就是要減少這種大量page fault的process startup。

  • Page size:
    有些OS designer可以選擇page size,而要產生一個最佳大小的page需要考慮:fragmentation、page table size、resolution、I/O overhead、page fault數量、locality、TLB size。平均來說,page size大一點比較好。

  • TLB Reach:
    TLB(translation look-aside buffer),TLB Reach代表TLB可存取的記憶體大小,他的大小由TLB size x page size決定。理想中,process的working set存放在TLB中。如果不是,那可能要花很多精力處理page fault。

  • Program Structure

  • I/O interlock:
    有些page需要被鎖在記憶體內,像是用來處理I/O的page。

到這裡我們就說完虛擬記憶體啦!寫的不是很好,請多包涵~~
/images/emoticon/emoticon13.gif


上一篇
第二十三天 Virtual Memory(虛擬記憶體)--(三)
下一篇
第二十五天 File System(檔案系統)--上
系列文
OS作業系統學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
leo19790301
iT邦新手 5 級 ‧ 2024-03-25 04:23:23

想問應用程式最大可使用記憶體量是多少?
是 Virtual Memory 最大量 - OS kernel 已經佔去的記憶體,
還是 user mode 也能限制應用程式的記憶體使用量,
或 max (Virtual Memory 最大量 - OS kernel 已經佔去的記憶體, user space) ?

我要留言

立即登入留言