国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

規(guī)避電子政務門戶網站建設的教訓優(yōu)秀網頁設計賞析

規(guī)避電子政務門戶網站建設的教訓,優(yōu)秀網頁設計賞析,做蜂蜜上什么網站,如何建設可靠的網站內存分段 程序是由若干個邏輯分段組成的,比如可由代碼分段、數據分段、棧段、堆段組成。不同的段是有不同的屬性的,所以就用分段的形式把這些分段分離出來。 分段機制下,虛擬地址和物理地址是如何映射的? 分段機制下的虛擬地址由…

內存分段

程序是由若干個邏輯分段組成的,比如可由代碼分段、數據分段、棧段、堆段組成。不同的段是有不同的屬性的,所以就用分段的形式把這些分段分離出來。

分段機制下,虛擬地址和物理地址是如何映射的?

?分段機制下的虛擬地址由兩部分組成,段選擇因子段內偏移量

  • ?段選擇因子:保存在段寄存器里面。段選擇因子里面最重要的是段號,用作段表的索引。段表里面保存的是這個段的基地址、段的界限和特權等級等。
  • ?虛擬地址中的段內偏移量應該位于 0 和段界限之間,如果段內偏移量是合法的,就將段基地址加上段內偏移量得到物理內存地址。

上圖中展示了虛擬地址與物理地址通過段表映射關系,分段機制會把程序的虛擬地址分成 4 個段,每個段在段表中有一個項,在這一項找到段的基地址,再加上偏移量,于是就能找到物理內存中的地址,如下圖:

?如果要訪問段3中偏移量為 500 的虛擬地址,我們可以計算出物理地址為:7000(段3基地址) + 500(偏移量) = 7500。

分段的方法很好,解決了程序本身不需要關心具體的物理內存地址的問題,但是也有一些不足之處:

  • 內存碎片問題
  • 內存交換的效率低

分段產生的內存碎片問題

假設有 1 G的物理內存,用戶執(zhí)行了多個程序,其中:

  • 游戲占用了 512MB 內存
  • 瀏覽器占用了 128MB 內存
  • 音樂占用了 256 MB 內存

這個時候,如果我們關閉了瀏覽器,空閑內存還有1024-512-256 = 256MB。

如果這個256MB不是連續(xù)的,被分成了兩段128MB內存,這就會導致沒有空間再打開一個200MB的程序。

內存分段會出現內存碎片嗎?

?內存碎片主要分為:內部內存碎片外部內存碎片

內存分段管理可以做到段根據實際需求分配內存,所以有多少需求就分配多大的段,所以就不會出現內部內存碎片。

但是由于每個段的長度不固定,所以多個段未必能恰好使用所有的內存空間,會產生多個不連續(xù)的小物理內存,導致新的程序無法被裝載,所以會出現外部內存碎片的問題。

解決[外部內存碎片]的問題就是內存交換。

可以把音樂程序占用的那256MB內存寫到硬盤上,然后再從硬盤上讀回內存里。不過再讀回時,不能裝載到原來的位置,而是緊緊地跟在已經被占用的512MB內存后面。這樣就能空缺出連續(xù)的256MB內存空間,于是新的200MB程序就可以裝載進來。

這個內存交換空間,在Linux系統(tǒng)里,也就是??吹降腟wap空間,這塊空間是從硬盤劃分出來的,用于內存與硬盤的空間交換。

分段導致的內存交換效率低的問題

對于多進程的系統(tǒng)來說,用分段這個方式,外部內存碎片是很容易產生的,產生了外部內存碎片,那不得不重新 Swap 內存區(qū)域,這個過程會產生性能瓶頸。

因為硬盤的訪問速度比內存慢太多了,每一次內存交換,都需要把一大段連續(xù)的內存數據寫到硬盤上。

所以,如果內存交換的時候,交換的是一個占用內存空間很大的程序,這樣整個機器就會顯得卡頓。

為了解決內存分段的[外部內存碎片和內存交換效率低]的問題,就出現了內存分頁。


內存分頁

分段的好處是能產生連續(xù)的內存空間,但是會出現 [外部內存碎片和內存交換·的空間太大] 的問題。

要解決這些問題,那么就要想出能少一些內存碎片的辦法。另外,當需要進行內存交換的時候,讓需要寫入或者從磁盤裝載的數據更少一點,這樣就解決問題了。這個辦法也就是內存分頁

分頁是把整個虛擬和物理內存空間切成一段段固定尺寸的大小。這樣一個連續(xù)并且尺寸固定的內存空間,我們叫。在Linux下,每一頁的大小為 4KB 。

?虛擬地址與物理地址之間通過頁表來映射,如圖:

?頁表是存儲在內存里的,內存管理單元(MMU)就做將虛擬內存地址轉換成物理地址的工作。

當進程訪問的虛擬地址在頁表中查不到時,系統(tǒng)會產生一個缺頁異常,進入系統(tǒng)內核空間分配物理內存,更新進程頁表,最后再返回用戶空間,恢復進程的運行。

分頁如何解決[外部內存碎片和內存交換效率低]的問題?

內存分頁是由于內存空間都是預先劃分好的,也就不會像內存分段那樣,在段與段之間產生間隙非常小的內存,這正是分段會產生外部內存碎片的原因。而采用了分頁,頁與頁之間是緊密排列的,所以不會有外部碎片。

但是,因為內存分頁機制分配內存的最小單位是一頁,即使不足一頁大小,我們最少只能分配一頁,所以頁內會出現內存浪費,所以針對內存分頁機制會有內部內存碎片的現象

如果內存空間不夠,操作系統(tǒng)會把其他正在運行的進程中的[最近沒被使用]的內存頁面給釋放掉,也就是暫時寫在硬盤上,稱為換出(wap out)。一旦需要的時候,再加載進來,稱為換入(swap in)。所以,一次性寫入磁盤的也只有少數的一個頁或者幾個頁,不會花太多時間,內存交換的效率就相對比較高。

更進一步地,分頁的方式使得我們在加載程序的時候,不再需要一次性把程序都加載到物理內存中。我們完全可以在進行虛擬內存和物理內存的頁之間的映射之后,并不真的把頁加載到物理內存里,而是只有在程序運行中,需要用到對應虛擬內存頁里面的指令和數據時,再加載到物理內存里面去。

分頁機制下,虛擬地址和物理地址是如何映射的?

在分頁機制下,虛擬地址分為兩部分,頁號頁內偏移。頁號作為頁表的索引,頁表包含物理頁每頁所在物理內存的基地址,這個地址與頁內偏移的組合就形成了物理內存地址,如下圖:

總結:對于一個內存地址轉換,其實就是這樣三個步驟

  • 把虛擬內存地址,切分成頁號和偏移量
  • 根據頁號,從頁表里面,查詢對應的物理號
  • 直接拿物理頁號,加上前面的偏移量,就得到了物理內存地址。

但放到實際的操作系統(tǒng)重,這樣簡單的分頁肯定是有問題的。

簡單分頁的缺陷

有空間上的缺陷。

因為操作系統(tǒng)是可以同時運行非常多的進程的,這就意味著頁表會非常龐大。

在32位的環(huán)境下,虛擬地址空間有 4 GB ,假設一個頁的大小是 4KB,那么就需要大約100萬個頁,每個[頁表項]需要四個字節(jié)大小來存儲,那么整個4GB空間的映射就需要有4MB的內存來存儲頁表。

這4MB大小的頁表看起來不是很大,但是要知道每個進程都是有自己的虛擬地址空間的,也就是說都有自己的頁表。那么 100 個進程的話,就需要 400MB 的內存來存儲頁表,這已經是非常大的內存了,更別說64位系統(tǒng)了。


多級頁表

要解決上面的問題就需要采用一種叫做多級頁表的解決方案。(可以理解為將單級頁表進行分組,下面例子中是每1024個單級頁分為一組,如果某一組頁表項沒被用到,就不需要創(chuàng)建該組的二級頁表,節(jié)省了頁表的總空間

在前面我們知道了,對于單頁表的實現方式,在32位和頁大小為4KB的環(huán)境下,一個進程的頁表需要裝下100多萬個[頁表項],并且每個頁表項是占用 4 字節(jié)大小的,于是相當于每個頁表需占用 4MB 大小的空間。

我們把這個100多萬個[頁表項]的單級頁表再分頁,將頁表(一級頁表)分為 1024 個頁(二級頁表),每個表(二級頁表)中包含1024個[頁表項],形成二級分頁

分了二級表,映射4GB地址空間就需要4KB(一級頁表)+4MB(二級頁表)的內存,這樣占用空間不是更大了嗎?

?如果4GB的虛擬地址都映射到了物理內存上的話,二級分頁占用空間確實更大了,但是我們往往不會為一個進程分配那么多的內存。

每個進程都有4GB的虛擬地址空間,而顯然對于大多數程序來說,其使用的空間遠達不到4GB,因為會存在部分對應的頁表項都是空的根本沒有分配,對于已分配的頁表項,如果存在最近一定時間未訪問的頁表,在物理內存緊張的情況下,操作系統(tǒng)會將頁面換出到硬盤,也就是說不會占用物理內存。

如果使用了二級分頁,一級頁表就可以覆蓋整個 4GB 虛擬地址空間,但如果某個一級頁表的頁表項沒有被用到,也就不需要創(chuàng)建這個頁表對應的二級頁表了,即可以在需要時才創(chuàng)建二級頁表。做個簡單計算,假設只有20%的一級1頁表項被用到了,那么頁表占用的內存空間就只有4KB(一級頁表) + 20%*4MB(二級頁表) = 0.804MB,這對比單級頁表的 4MB 節(jié)省了大量的空間。

為什么不分級的頁表就做不到這樣節(jié)約內存呢?

我們從頁表的性質來看,保存在內存中的頁表承擔的職責是將虛擬地址翻譯成物理地址。假如虛擬地址在頁表中找不到對應的頁表項,計算機系統(tǒng)就不能工作了。所以頁表一定要覆蓋全部的虛擬地址空間,不分級的頁表就需要有100多萬個頁表項來映射,而二級分頁則只需要1024個頁表項(此時一級頁表覆蓋了全部的虛擬地址空間,二級頁表在需要時創(chuàng)建)

對于64位的系統(tǒng),兩級分頁肯定不夠,就變成了四級目錄,分別是:

  • 全局頁目錄項 PGD
  • 上層頁目錄項 PUD
  • 中間頁目錄項 PMD
  • 頁表項 PTE

TLB

多級頁表雖然解決了空間上的問題,但是虛擬地址到物理地址的先轉換就多了幾道轉換的工序,顯然就降低了這兩地址的轉換速度,也就是帶來了時間上的開銷。

程序是有局部性的,即在一段時間內,整個程序的執(zhí)行僅限于程序中的某一部分。相應地,執(zhí)行所訪問的存儲空間也局限于某個內存區(qū)域。

我們就可以利用這一特性,把最常訪問的幾個頁表存儲到訪問速度更快的硬件,于是在CPU芯片中,加入了一個專門存放程序最常訪問頁表項 的 cache,這個cache就是TLB ,通常成為頁表緩存、轉址旁路緩存、快表等。

在CPU芯片里面,封裝了內存管理單元(MMU)芯片,它用來完成地址轉換和TLB的訪問和交互

有了TLB后,CPU尋址時,會先查TLB,如果沒找到,才會繼續(xù)查常規(guī)的頁表。

TLB的命中率其實是很高的,因為程序最常訪問的頁就那么幾個。


段頁式內存管理

內存分段和內存分頁并不是對立的,它們是可以組合起來再同一個系統(tǒng)中使用的,那么組合起來后,通常成為段頁式內存管理。

段頁式內存管理實現方式:

  • 先將程序劃分為多個有邏輯意義的段,也就是前面提到的分段機制
  • 接著再把每個段劃分為多個頁,也就是對分段劃分出來的連續(xù)空間,再劃分固定大小的頁

這樣地址結構就由 段號段內頁號頁內位移 三部分組成。

用于段頁式地址變換的數據結構是每個程序一張段表,每個段又建立一張頁表,段表中的地址是頁表的起始地址,而頁表中的地址為某頁的物理頁號,如圖:

段頁式地址變換中要得到物理地址須經過三次內存訪問:

  • 第一次訪問段表,得到頁表起始地址;
  • 第二次訪問頁表,得到物理頁號
  • 第三次將物理頁號與頁內位移組合,得到物理地址。

可用軟、硬件相結合的方法實現段頁式地址的變換,這樣雖然增加了硬件成本和系統(tǒng)開銷,但提高了內存的利用率。


?Linux內存布局

intel處理器額的發(fā)展歷史

?

早期的intel的處理器從80286開始使用的是段式內存管理。但是很快發(fā)現光有段式內存管理而沒有頁式內存管理是不夠的,這會使X86系列失去市場的競爭力。因此,在不久以后得80386中就實現了頁式內存管理。也就是說,80386除了完成并完善從80286開始的段式內存管理的同時還實現了頁式內存管理。

??

但是這個80386的頁式內存管理設計時,沒有繞開段式內存管理,而是建立在段式內存管理的基礎上,這就意味著,頁式內存管理的作用是在由段式內存管理所映射而成的地址上再加上一層地址映射。

此時由段式內存管理映射而成的地址不再是 物理地址 了,Intel就稱之為 線性地址 (也稱為虛擬地址),于是,段式內存管理先將邏輯地址映射成線性地址,然后再由分頁內存管理將線性地址映射成物理地址。

  • 程序所使用的地址,通常是沒被段式內存管理映射的地址,稱為邏輯地址
  • 通過段式內存管理映射的地址,稱為線性地址,或者虛擬地址

Linux內存主要采用的是頁式內存管理,但同時也不可避免地涉及了段機制

?這主要是上面Intel處理器發(fā)展歷史導致的,因為Intel X86CPU一律對程序中使用的地址先進行段式映射,然后才能進行頁式映射。

但事實上,Linux內核所采取的辦法是使段式映射的過程實際上不起什么作用。

Linux系統(tǒng)中的每個段都從0地址開始的整個 4GB 虛擬空間(32位環(huán)境下),也就是所有的段的起始地址都是一樣的。這意味著,Linux系統(tǒng)中的代碼,包括操作系統(tǒng)本身的代碼和應用程序代碼,所面對的地址空間都是線性地址空間(虛擬地址),這種做法相當于屏蔽了處理器中邏輯地址的概念,段只被用于訪問控制盒內存保護。

Linux的虛擬地址空間如何分布?

在Linux操作系統(tǒng)中,虛擬地址空間的內部又被分為內核空間和用戶空間兩部分,不同位數的系統(tǒng),地址空間的范圍也不同。比如常見的32位和64位系統(tǒng),如下圖所示:

?這里可以看出:

  • ?32 位系統(tǒng)的內核空間占 1G ,位于最高處,剩下的 3G 是用戶空間
  • 64 位系統(tǒng)的內核空間和用戶空間都是128T,分別占據整個內存空間的最高和最低處,剩下的中間部分是未定義的。

內核空間和用戶間的區(qū)別:

  • 進程在用戶態(tài)時,只能訪問用戶空間內存
  • 只有在進入內核態(tài)的時候才能訪問內核空間的內存

雖然每個程序都有自己獨立的虛擬地址,但是每個虛擬內存中的內核地址,其實關聯的都是相同的物理內存,這樣,進程在切換到內核態(tài)后,就可以很方便地訪問內核空間內存。

?

進一步了解虛擬空間的劃分情況,用戶空間和內核空間劃分的方式是不同的。

以32位操作系統(tǒng)為例,用戶空間分布的情況如圖所示:

?通過這張圖,可以看到,用戶空間內存從低到高分別是6種不同的內存段:

  • 代碼段,包括二進制可執(zhí)行代碼
  • 數據段,包括已初始化的靜態(tài)常量和全局變量
  • BSS段,包括未初始化的靜態(tài)變量和全局變量
  • 堆段,包括動態(tài)分配的內存,從低地址開始向上增長
  • 文件映射段,包括動態(tài)庫、共享內存等,從低地址開始向上增長
  • 棧段,包括局部變量和函數調用的上下文等。棧的大小是固定的,一般是 8MB。當然系統(tǒng)也提供了參數,以便我們自定義大小;

上圖中的內存布局可以看到,代碼段下面還有一段內存空間(灰色部分),這一塊區(qū)域是[保留區(qū)],之所以要有保留區(qū)是因為在大多數系統(tǒng)里,我們認為比較小數值的地址不是一個合法地址。例如我們通常在C的代碼里會將無效的指針賦值位NULL。因此,這里會出現一段不可訪問的內存保留區(qū),防止程序因為出現BUG,導致讀或寫了一些小內存地址的數據。


總結

為了在多進程的環(huán)境下,使得進程之間的內存地址不受影響,相互隔離,于是操作系統(tǒng)就為每個進程單獨分配一套虛擬內存地址,每個程序只關心自己的虛擬地址就可以,實際上大家的虛擬地址都是一樣的,但分布到的物理內存地址是不一樣的。

每個進程都有自己的虛擬空間,而物理內存只有一個,所以當啟用了大量的進程,物理內存必然會很緊張,于是操作系統(tǒng)會通過內存交換技術,把不常使用的內存暫時存放到硬盤(換出),在需要的時候再裝載回物理內存(換入)。

既然有了虛擬內存地址,那必然要把虛擬地址[映射]到物理地址,這個過程通常由操作系統(tǒng)維護。

那么對于虛擬地址和物理地址的映射關系,可以有分頁分段的方式,同時結合兩者[段頁式]也可以。

內存分段是根據程序的邏輯角度,分成了棧段、堆段、數據段、代碼段等,這樣可以分離出不同屬性的段,同時是一塊連續(xù)的空間。但是每個段的大小都不是統(tǒng)一的,這就會導致外部內存碎片和內存交換效率低的問題

于是,就出現了內存分頁,把虛擬空間和物理空間分成大小固定的頁,如在 Linux 系統(tǒng)中,每一頁的大小為?4KB。由于分了頁后,就不會產生細小的內存碎片,解決了內存分段的外部內存碎片問題。同時在內存交換的時候,寫入硬盤也就一個頁或幾個頁,這就大大提高了內存交換的效率。

為了解決簡單分頁產生的頁表過大的問題,就有了多級頁表,它解決了空間上的問題,但這就會導致 CPU 在尋址的過程中,需要有很多層表參與,加大了時間上的開銷。于是根據程序的局部性原理,在 CPU 芯片中加入了?TLB,負責緩存最近常被訪問的頁表項,大大提高了地址的轉換速度。

Linux 系統(tǒng)主要采用了分頁管理,但是由于 Intel 處理器的發(fā)展史,Linux 系統(tǒng)無法避免分段管理。于是 Linux 就把所有段的基地址設為?0,也就意味著所有程序的地址空間都是線性地址空間(虛擬地址),相當于屏蔽了 CPU 邏輯地址的概念,所以段只被用于訪問控制和內存保護。

另外,Linux 系統(tǒng)中虛擬空間分布可分為用戶態(tài)內核態(tài)兩部分,其中用戶態(tài)的分布:代碼段、全局變量、BSS、函數棧、堆內存、映射區(qū)。

http://aloenet.com.cn/news/38503.html

相關文章:

  • 關于seo網站優(yōu)化公司黑馬培訓機構可靠嗎
  • 贛縣網站建設國內新聞最新消息十條
  • h5開發(fā)教程哈爾濱seo網站管理
  • 做網站賺錢的時代過去了嗎百度地圖導航
  • 網站設置默認首頁網絡營銷網
  • 萬戶網站免費手游推廣平臺
  • 杭州國外網站推廣公司站長之家 站長工具
  • 網站開發(fā)與實訓報告企業(yè)優(yōu)化推廣
  • 北京網站建設w億瑪酷1訂制網站策劃方案
  • 網站開發(fā)業(yè)務需求分析今日熱點新聞
  • 辦公室局域網怎么搭建seo 資料包怎么獲得
  • wordpress小清新模板鄭州網站優(yōu)化推廣
  • 網站搬家 備案短視頻培訓要多少學費
  • 個人博客網站制作教程網店如何引流與推廣
  • 小說網站代理網絡營銷的推廣
  • 前端不會wordpress班級優(yōu)化大師頭像
  • 網站建設問題分類和排除方法分析優(yōu)化大師win10能用嗎
  • 外貿建站上海成都seo工程師
  • 微信手機網頁登錄入口站長工具seo診斷
  • 網站開發(fā)即時聊天源碼百度搜索指數排行榜
  • 濟南wordpress 建站線上營銷推廣方式有哪些
  • 門戶網站系統(tǒng)有哪些平臺seo優(yōu)化方法網站快速排名推廣渠道
  • 網站的技術解決方案長沙seo網站推廣
  • wordpress加sliderwin7怎么優(yōu)化最流暢
  • wordpress會員地址石家莊百度快照優(yōu)化
  • 做企業(yè)網站用哪個軟件長沙大型網站建設公司
  • 網站開發(fā)的功能需求怎么寫最新的即時比分
  • 溫州網站建設推廣百度小說排行榜2021
  • 用word做旅游網站新聞危機公關
  • 未來做那些網站能致富推廣方案怎么做