5虛擬內(nèi)存,頁面置換算法

8.1虛擬存儲的需求

虛擬內(nèi)存是非連續(xù)內(nèi)存分配的一個延續(xù),非連續(xù)內(nèi)存分配在存儲空間內(nèi)可以連續(xù)也可以不連續(xù)。虛擬內(nèi)存是在非連續(xù)內(nèi)存分配基礎(chǔ)上,可以把一部分內(nèi)容放到外存中去,讓應(yīng)用程序有更大的空間使用。

需求背景:增長迅速的存儲需求,程序規(guī)模的增長速度遠(yuǎn)遠(yuǎn)大于存儲器容量的增長速度。

理想中的存儲器:容量更大、速度更快、價格更便宜的非易失性存儲器。

實(shí)際中的存儲器:


操作系統(tǒng)的存儲抽象:


虛擬存儲需求:

原因:計算機(jī)系統(tǒng)時常出現(xiàn)內(nèi)存空間不夠用

解決辦法:

覆蓋(overlay):應(yīng)用程序手動把需要的指令和數(shù)據(jù)保存在內(nèi)存中

交換(swapping):操作系統(tǒng)自動把暫時不能執(zhí)行的程序保存到外存中

虛擬存儲:在有限容量的內(nèi)存中,以頁為單位自動裝入更多更大的程序

8.2覆蓋和交換技術(shù)

8.2.1覆蓋技術(shù)

■ 目標(biāo):在較小的可用內(nèi)存中運(yùn)行較大的程序

■ 方法:依據(jù)程序邏輯結(jié)構(gòu),將程序劃分為若干功能相對獨(dú)立

的模塊;將不會同時執(zhí)行的模塊共享同一塊內(nèi)存區(qū)域

? (1)必要部分(常用功能)的代碼和數(shù)據(jù)常駐內(nèi)存

? (2)可選部分(不常用功能)放在其他程序模塊中,只在需要用到時裝入內(nèi)存

? (3)不存在調(diào)用關(guān)系的模塊可相互覆蓋,共用同一塊內(nèi)存區(qū)域

注:不存在相互調(diào)用關(guān)系可以分成一個覆蓋區(qū)


不足:

(1)增加編程困難

? ? ? ? ? ? 1)需程序員劃分功能模塊,并確定模塊間的覆蓋關(guān)系

? ? ? ? ? 2)增加了編程的復(fù)雜度;

(2)增加執(zhí)行時間

? ? ? ? ? 1)從外存裝入覆蓋模塊

? ? ? ? ? 2)時間換空間

8.2.2交換技術(shù)

目標(biāo):增加正在運(yùn)行或需要運(yùn)行的程序的內(nèi)存

實(shí)現(xiàn)方法:

可將暫時不能運(yùn)行的程序放到外存;

換入換出的基本單位(整個進(jìn)程的地址空間);

換出(swap out):把一個進(jìn)程的整個地址空間保存到外存;

換入(swap in):將外存中某進(jìn)程的地址空間讀入到內(nèi)存;


交換技術(shù)面臨的問題

■ 交換時機(jī):何時需要發(fā)生交換?

? ? ? ? ? 只當(dāng)內(nèi)存空間不夠或有不夠的可能時換出

■ 交換區(qū)大小

? ? ? ? ?存放所有用戶進(jìn)程的所有內(nèi)存映像的拷貝

■ 程序換入時的重定位:換出后再換入時要放 在原處嗎?

? ? ? ? ?采用動態(tài)地址映射的方法

覆蓋與交換的比較

■ 覆蓋

只能發(fā)生在沒有調(diào)用關(guān)系的模塊間

程序員須給出模塊間的邏輯覆蓋結(jié)構(gòu)

發(fā)生在運(yùn)行程序的內(nèi)部模塊間

■ 交換

以進(jìn)程為單位

不需要模塊間的邏輯覆蓋結(jié)構(gòu)

發(fā)生在內(nèi)存進(jìn)程間

8.3局部性原理

8.3.1虛擬存儲技術(shù)的目標(biāo):


■ 只把部分程序放到內(nèi)存中,從而運(yùn)行比物理內(nèi)存大的程序

由操作系統(tǒng)自動完成,無需程序員的干涉

■ 實(shí)現(xiàn)進(jìn)程在內(nèi)存與外存之間的交換,從而獲得更多的空閑內(nèi)存空間

在內(nèi)存和外存之間只交換進(jìn)程的部分內(nèi)容

8.3.2局部性原理(principle of locality)

■ 程序在執(zhí)行過程中的一個較短時期,所執(zhí)行的指令地址和指令的操作數(shù)地址,分別局限于一定區(qū)域

·時間局部性

一條指令的一次執(zhí)行和下次執(zhí)行,一個數(shù)據(jù)的一次訪問和下次訪問都集中在一個較短時期內(nèi)

·空間局部性

當(dāng)前指令和鄰近的幾條指令,當(dāng)前訪問的數(shù)據(jù)和鄰近的幾個數(shù)據(jù)都集中在一個較小區(qū)域內(nèi)

·分支局部性

一條跳轉(zhuǎn)指令的兩次執(zhí)行,很可能跳到相同的內(nèi)存位置

■ 局部性原理的意義

從理論上來說,虛擬存儲技術(shù)是能夠?qū)崿F(xiàn)的,而且可取得滿意的效果

8.4虛擬存儲概念

基本概念:

■思路

將不常用的部分內(nèi)存塊暫存到外存

原理:

裝載程序時

只將當(dāng)前指令執(zhí)行需要的部分頁面或段裝入內(nèi)存

指令執(zhí)行中需要的指令或數(shù)據(jù)不在內(nèi)存(稱為缺頁或缺段)時

處理器通知操作系統(tǒng)將相應(yīng)的頁面或段調(diào)入內(nèi)存

操作系統(tǒng)將內(nèi)存中暫時不用的頁面或段保存到外存

■ 實(shí)現(xiàn)方式

虛擬頁式存儲

虛擬段式存儲

基本特征


■ 不連續(xù)性:

物理內(nèi)存分配非連續(xù)

虛擬地址空間使用非連續(xù)

■ 大用戶空間

提供給用戶的虛擬內(nèi)存可大于實(shí)際的物理內(nèi)存

■ 部分交換

虛擬存儲只對部分虛擬地址空間進(jìn)行調(diào)入和調(diào)出

支持技術(shù)

■ 硬件: 頁式或短時存儲中的地址轉(zhuǎn)換機(jī)制

■ 操作系統(tǒng): 管理內(nèi)存和外存間頁面或段的換入和換出

8.5虛擬頁存儲

■ 在頁式存儲管理的基礎(chǔ)上,增加請求調(diào)頁和頁面置換

■ 思路

1當(dāng)用戶程序要裝載到內(nèi)存運(yùn)行時,只裝入部分頁面,就啟動程序運(yùn)行;

2進(jìn)程在運(yùn)行中發(fā)現(xiàn)有需要的代碼或數(shù)據(jù)不在內(nèi)存時,則向系統(tǒng)發(fā)出缺頁異常請求;

3操作系統(tǒng)在處理缺頁異常時,將外存中相應(yīng)的頁面調(diào)入內(nèi)存,使得進(jìn)程能繼續(xù)運(yùn)行;

8.5.1虛擬頁式存儲中的地址轉(zhuǎn)換

執(zhí)行到相應(yīng)頁表,標(biāo)志位表示缺頁異常,操作系統(tǒng)來接管異常,操作系統(tǒng)要做的事情呢是找頁把它寫好,然后把這個位變成有效


8.5.2虛擬頁式存儲中的頁表項(xiàng)結(jié)構(gòu)


駐留位:表示該頁是否在內(nèi)存

1表示該頁位于內(nèi)存中,該頁表項(xiàng)是有效的,可以使用

0表示該頁當(dāng)前在外存中,訪問該頁表項(xiàng)將導(dǎo)致缺頁異常

修改位:表示在內(nèi)存中的該頁是否被修改過

回收該物理頁面時,據(jù)此判斷是否要把它的內(nèi)容寫回外存

訪問位:表示該頁面是否被訪問過(讀或?qū)懀?/p>

用于頁面置換算法

保護(hù)位:表示該頁的允許訪問方式

只讀、可讀寫、可執(zhí)行等



8.6缺頁異常

8.6.1缺頁異常(缺頁中斷)的處理流程


(1)在內(nèi)存中有空閑物理頁面時,分配一物理頁幀f,轉(zhuǎn)第E步;

(2)依據(jù)頁面置換算法選擇將被替換的物理頁幀f,對應(yīng)邏輯頁q;

(3)如q被修改過,則把它寫回外存;

(4)修改q的頁表項(xiàng)中駐留位置為0;

(5)將需要訪問的頁p裝入到物理頁面f;

(6)修改p的頁表項(xiàng)駐留位為1,物理頁幀號為f;

(7)重新執(zhí)行產(chǎn)生缺頁的指令

8.6.2虛擬頁式存儲中的外存管理

在何處保存未被映射的頁?

1應(yīng)能方便地找到在外存中的頁面內(nèi)容

2交換空間(磁盤或者文件)

采用特殊格式存儲未被映射的頁面

注:可以用一個文件來存這些未被映射的頁

虛擬頁式存儲中的外存選擇

1代碼段:可執(zhí)行二進(jìn)制文件(代碼指向相應(yīng)的可執(zhí)行文件)

2動態(tài)加載的共享庫程序段:動態(tài)調(diào)用的庫文件(共享庫也有相應(yīng)的目標(biāo)文件,所以上兩項(xiàng)不改)

3其它段:交換空間(數(shù)據(jù)段,堆棧)

虛擬頁式存儲管理的性能

有效存儲訪問時間(effective memory access time EAT)

EAT =訪存時間* (1-p) +缺頁異常處理時間*缺頁率p


9.1頁面置換算法的概念

9.1.1置換算法的功能和目標(biāo)

功能:當(dāng)出現(xiàn)缺頁異常,需調(diào)入新頁面而內(nèi)存已滿時,置換算法選擇被置換的物理頁面;

設(shè)計目標(biāo):1盡可能減少頁面的調(diào)入調(diào)出次數(shù);2把未來不再訪問或短期內(nèi)不訪問的頁面調(diào)出

頁面鎖定(frame locking)(有些頁面必須在內(nèi)存里面)

1描述必須常駐內(nèi)存的邏輯頁面

2操作系統(tǒng)的關(guān)鍵部分

3要求響應(yīng)速度的代碼和數(shù)據(jù)

4頁表中的鎖定標(biāo)志位(lock bit)

9.1.2置換算法的評價方法


9.1.3頁面置換算法分類

■ 局部頁面置換算法

置換頁面的選擇范圍僅限于當(dāng)前進(jìn)程占用的物理頁面內(nèi)

最優(yōu)算法、先進(jìn)先出算法、最近最久未使用算法

時鐘算法、最不常用算法

■ 全局頁面置換算法

置換頁面的選擇范圍是所有可換出的物理頁面

工作集算法、缺頁率算法

9.2頁面置換算法總結(jié)

9.2.1最優(yōu)頁面置換算法(OPT, optimal)

基本思路:置換在未來最長時間不訪問的頁面

算法實(shí)現(xiàn):

1缺頁時,計算內(nèi)存中每個邏輯頁面的下一次訪問時間

2選擇未來最長時間不訪問的頁面

算法特征

1缺頁最少,是理想情況

2實(shí)際系統(tǒng)中無法實(shí)現(xiàn)

3無法預(yù)知每個頁面在下次訪問前的等待時間

4這個算法可以作為置換算法的性能評價依據(jù)

(實(shí)際使用:在模擬器上運(yùn)行某個程序,并記錄每一次的頁面訪問情況,第二遍運(yùn)行時使用最優(yōu)算法)


9.2.2先進(jìn)先出算法(First-In First-Out, FIFO)

基本思路:選擇在內(nèi)存駐留時間最長的頁面進(jìn)行置換

算法實(shí)現(xiàn):

1維護(hù)一個記錄所有位于內(nèi)存中的邏輯頁面鏈表

2鏈表元素按駐留內(nèi)存的時間排序,鏈?zhǔn)鬃铋L,鏈尾最短

3出現(xiàn)缺頁時,選擇鏈?zhǔn)醉撁孢M(jìn)行置換,新頁面加到鏈尾

算法特征

1實(shí)現(xiàn)簡單

2性能較差,調(diào)出的頁面可能是經(jīng)常訪問的

3進(jìn)程分配物理頁面數(shù)增加時,缺頁并不一定減少(Belady現(xiàn)象)

4很少單獨(dú)使用


9.2.3最近最久未使用算法(Least Recently Used, LRU)

基本思路:

1選擇最長時間沒有被引用的頁面進(jìn)行置換

2如某些頁面長時間未被訪問,則它們在將來還可能會長時間不會訪問

算法實(shí)現(xiàn):

1缺頁時,計算內(nèi)存中每個邏輯頁面的上一次訪問時間

2選擇上一次使用到當(dāng)前時間最長的頁面

算法特征

最優(yōu)置換算法的一種近似


LRU算法的可能實(shí)現(xiàn)方法

頁面鏈表

·系統(tǒng)維護(hù)一個按最近一次訪問時間排序的頁面鏈表

鏈表首節(jié)點(diǎn)是最近剛剛使用過的頁面

鏈表尾節(jié)點(diǎn)是最久未使用的頁面

·訪問內(nèi)存時,找到相應(yīng)頁面,并把它移到鏈表之首

·缺頁時,置換鏈表尾節(jié)點(diǎn)的頁面

活動頁面棧

·訪問頁面時,將此頁號壓入棧頂,并棧內(nèi)相同的頁號抽出

·缺頁時,置換棧底的頁面

特征

·開銷比較大


9.2.4時鐘置換算法(Clock)

基本思路:

僅對頁面的訪問情況進(jìn)行大致統(tǒng)計

數(shù)據(jù)結(jié)構(gòu):

1在頁表項(xiàng)中增加訪問位,描述頁面在過去一段時間的內(nèi)訪問情況

2各頁面組織成環(huán)形鏈表

3指針指向最先調(diào)入的頁面

算法實(shí)現(xiàn):

1訪問頁面時,在頁表項(xiàng)記錄頁面訪問情況

2缺頁時,從指針處開始順序查找未被訪問的頁面進(jìn)行置換

算法特征:

時鐘算法是LRU和FIFO的折中

時鐘置換算法的實(shí)現(xiàn):

■ 頁面裝入內(nèi)存時,訪問位初始化為0

■ 訪問頁面(讀/寫)時,訪問位置1

■ 缺頁時,從指針當(dāng)前位置順序檢查環(huán)形鏈表

·訪問位為0,則置換該頁

·訪問位為1,則訪問位置0,并指針移動到下一個頁面,直到找到可置換的頁面


9.2.5改進(jìn)的Clock算法

基本思路:

減少修改頁的缺頁處理開銷

算法實(shí)現(xiàn):

1在頁面中增加修改位,并在訪問時進(jìn)行相應(yīng)修改

2缺頁時,修改頁面標(biāo)志位,以跳過有修改的頁面



9.2.6最不常用算法(Least Frequently Used, LFU)

基本思路:

缺頁時,置換訪問次數(shù)最少的頁面

算法實(shí)現(xiàn):

1每個頁面設(shè)置一個訪問計數(shù)(多位計數(shù))

2訪問頁面時,訪問計數(shù)加1

3缺頁時,置換計數(shù)最小的頁面

算法特征:

1算法開銷大

2開始時頻繁使用,但以后不使用的頁面很難置換

解決方法:計數(shù)定期右移、衰減

LRU和LFU的區(qū)別

·LRU關(guān)注多久未訪問,時間越短越好

·LFU關(guān)注訪問次數(shù),次數(shù)越多越好


9.2.7Belady現(xiàn)象

現(xiàn)象:采用FIFO等算法時,可能出現(xiàn)分配的物理頁面數(shù)增加,缺頁次數(shù)反而升高的異常現(xiàn)象

原因:

1FIFO算法的置換特征與進(jìn)程訪問內(nèi)存的動態(tài)特征矛盾

2被它置換出去的頁面并不一定是進(jìn)程近期不會訪問的

哪些置換算法沒有Belady現(xiàn)象?

時鐘(CLOCK)置換算法,最近最久未使用(LRU)算法,最佳置換算法(OPT)

時鐘/改進(jìn)的時鐘頁面置換是否有Belady現(xiàn)象?

沒有

為什么LRU頁面置換算法沒有Belady現(xiàn)象?

對于每一時刻,下一步訪問的頁面我們也是已知的。當(dāng)N=n+1時,如果下一步會產(chǎn)生缺頁,說明下一步會訪問的頁面不在這n+1個頁面中。假設(shè)這n+1個頁面的集合為W,則當(dāng)N=n時,內(nèi)存中的頁面是W的一個子集。如果一個元素都不在W中,那么也肯定不存在于W的子集中。反之如果一個元素不存在于W的子集合中,不一定不存在W中。

所以N=n+1時會出現(xiàn)缺頁的情況,在N=n時一定缺頁。N=n缺頁時,N=n+1不一定缺頁。所以S一定時,f關(guān)于N單調(diào)遞減。

LRU一般都有棧的特性,一個N+1大小的cache很自然的就包含了大小為N的cache的內(nèi)容。所以隨著cache大小增加,hit rate要么不變,要么提高。

9.2.8LRU、FIFO和Clock的比較

■LRU算法和FIFO本質(zhì)上都是先進(jìn)先出的思路

LRU依據(jù)頁面的最近訪問時間排序

LRU需要動態(tài)地調(diào)整順序

FIFO依據(jù)頁面進(jìn)入內(nèi)存的時間排序

FIFO依據(jù)頁面進(jìn)入內(nèi)存的時間排序

■LRU可退化成FIFO

如頁面進(jìn)入內(nèi)存后沒有被訪問,最近訪問時間與進(jìn)入內(nèi)存的時間相同

例如:給進(jìn)程分配3個物理頁面,邏輯頁面的訪問順序?yàn)?、2、3、4、5、6、1、2、3…

■LRU算法性能較好,但系統(tǒng)開銷較大

■FIFO算法系統(tǒng)開銷較小,會發(fā)生Belady現(xiàn)象

■Clock算法是它們的折衷

頁面訪問時,不動態(tài)調(diào)整頁面在鏈表中的順序,僅做標(biāo)記

缺頁時,再把它移動到鏈表末尾

■對于未被訪問的頁面,Clock和LRU算法的表現(xiàn)一樣好

(注:和fifo也一樣了,沒有之前參考的信息)

■對于被訪問過的頁面,Clock算法不能記錄準(zhǔn)確訪問順序,而LRU算法可以

9.3全局頁面置換算法

■ 思路:全局置換算法為進(jìn)程分配可變數(shù)目的物理頁面

■ 全局置換算法要解決的問題

1進(jìn)程在不同階段的內(nèi)存需求是變化的

2分配給進(jìn)程的內(nèi)存也需要在不同階段有所變化

3全局置換算法需要確定分配給進(jìn)程的物理頁面數(shù)

CPU利用率與并發(fā)進(jìn)程數(shù)的關(guān)系


■CPU利用率與并發(fā)進(jìn)程數(shù)存在相互促進(jìn)和制約的關(guān)系

進(jìn)程數(shù)少時,提高并發(fā)進(jìn)程數(shù),可提高CPU利用率

并發(fā)進(jìn)程導(dǎo)致內(nèi)存訪問增加

并發(fā)進(jìn)程的內(nèi)存訪問會降低了訪存的局部性特征

局部性特征的下降會導(dǎo)致缺頁率上升和CPU利用率下降

9.3.1工作集

一個進(jìn)程當(dāng)前正在使用的邏輯頁面集合,可表示為二元函數(shù)W(t,D)

·t是當(dāng)前的執(zhí)行時刻

D 稱為工作集窗口(working-set window),即一個定長的頁面訪問時間窗口


W(t,D)是指在當(dāng)前時刻t前的 D時間窗口中的所有訪問頁面所組成的集合

| W(t,D) |指工作集的大小,即頁面數(shù)目

W(t,D)={時間窗內(nèi)所以頁面的集合}

工作集的變化


進(jìn)程開始執(zhí)行后,隨著訪問新頁面逐步建立較穩(wěn)定的工作集

當(dāng)內(nèi)存訪問的局部性區(qū)域的位置大致穩(wěn)定時,工作集大小也大致穩(wěn)定

局部性區(qū)域的位置改變時,工作集快速擴(kuò)張和收縮過渡到下一個穩(wěn)定值

常駐集

在當(dāng)前時刻,進(jìn)程實(shí)際駐留在內(nèi)存當(dāng)中的頁面集合

工作集與常駐集的關(guān)系

工作集是進(jìn)程在運(yùn)行過程中固有的性質(zhì)

常駐集取決于系統(tǒng)分配給進(jìn)程的物理頁面數(shù)目和頁面置換算法

缺頁率與常駐集的關(guān)系

常駐集包含工作集時,缺頁較少

工作集發(fā)生劇烈變動(過渡)時,缺頁較多

進(jìn)程常駐集大小達(dá)到一定數(shù)目后,缺頁率也不會明顯下降


9.3.2工作集置換算法

■思路:換出不在工作集中的頁面

■窗口大小τ:當(dāng)前時刻前τ個內(nèi)存訪問的頁引用是工作集,τ被稱為窗口大小

■實(shí)現(xiàn)方法(開銷也大)

·訪存鏈表:維護(hù)窗口內(nèi)的訪存頁面鏈表

·訪存時,換出不在工作集的頁面;更新訪存鏈表

·缺頁時,換入頁面;更新訪存鏈表


超過工作集窗口大小的頁面及調(diào)出,例如a,時間4的時候已經(jīng)過了窗口大小所以換出。

9.3.3缺頁率置換算法(PFF, Page-Fault-Frequency)

缺頁率(兩種表示方式)

1缺頁次數(shù)/內(nèi)存訪問次數(shù)

1缺頁平均時間間隔的倒數(shù)(一般使用這個)

影響缺頁率的因素

頁面置換算法(可控)

分配給進(jìn)程的物理頁面數(shù)目

頁面大小

程序的編寫方法(可控)

缺頁率置換算法(PFF, Page-Fault-Frequency)


通過調(diào)節(jié)常駐集大小,使每個進(jìn)程的缺頁率保持在一個合理的范圍內(nèi)

·若進(jìn)程缺頁率過高,則增加常駐集以分配更多的物理頁面

·若進(jìn)程缺頁率過低,則減少常駐集以減少它的物理頁面數(shù)

缺頁率置換算法的實(shí)現(xiàn)

■訪存時,設(shè)置引用位標(biāo)志

■缺頁時,計算從上次缺頁時間tlast到現(xiàn)在tcurrent的時間間隔

如果t_current–t_last>T,則置換所有在[tlast , ?tcurrent ]時間內(nèi)沒有被引用的頁(缺頁率比較低,把不用的置換出去)

如果t_current–t_last≤T,則增加缺失頁到工作集中


9.4抖動和負(fù)載控制

9.4.1抖動問題(thrashing)

■抖動

進(jìn)程物理頁面太少,不能包含工作集

造成大量缺頁,頻繁置換

進(jìn)程運(yùn)行速度變慢

■產(chǎn)生抖動的原因

隨著駐留內(nèi)存的進(jìn)程數(shù)目增加,分配給每個進(jìn)程的物理頁面數(shù)不斷減小,缺頁率不斷上升

■操作系統(tǒng)需在并發(fā)水平和缺頁率之間達(dá)到一個平衡

選擇一個適當(dāng)?shù)倪M(jìn)程數(shù)目和進(jìn)程需要的物理頁面數(shù)

9.4.2負(fù)載控制

通過調(diào)節(jié)并發(fā)進(jìn)程數(shù)(MPL)來進(jìn)行系統(tǒng)負(fù)載控制

平均缺頁間隔時間(MTBF) =缺頁異常處理時間(PFST):

實(shí)際上我們利用第二條豎線,缺頁之后,有一個缺頁出現(xiàn)的平均間隔和缺頁處理的時間,這兩個構(gòu)成一個比例,如果間隔大于處理時間,cpu是能夠處理的,就在Ni/o點(diǎn)之前,如果間隔小于處理時間,cpu基本上就滿負(fù)荷的去做處理還忙不過來了, 對于這種情況就已經(jīng)到了這條線的底下了


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容