精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

每個程序員都應該了解的“虛擬內存”知識

開發 后端 開發工具
編輯注:本文是Ulrich Drepper的“每個程序員應該了解的內存方面的知識”文章的第三部分;這一部分談論了虛擬內存,特別是TLB性能。沒有閱讀第1部分和第2部分的人可能現在就想讀一讀了。和往常一樣,請將排字錯誤報告之類發送到lwn@lwn.net,而不要發送到這里的評論。

編輯注:本文是Ulrich Drepper的“每個程序員應該了解的內存方面的知識”文章的第三部分;這一部分談論了虛擬內存,特別是TLB性能。沒有閱讀第1部分第2部分的人可能現在就想讀一讀了。和往常一樣,請將排字錯誤報告之類發送到lwn@lwn.net,而不要發送到這里的評論。

4 虛擬內存

處理器的虛擬內存子系統為每個進程實現了虛擬地址空間。這讓每個進程認為它在系統中是獨立的。虛擬內存的優點列表別的地方描述的非常詳細,所以這里就不重復了。本節集中在虛擬內存的實際的實現細節,和相關的成本。

虛擬地址空間是由CPU的內存管理單元(MMU)實現的。OS必須填充頁表數據結構,但大多數CPU自己做了剩下的工作。這事實上是一個相當復雜的機制;***的理解它的方法是引入數據結構來描述虛擬地址空間。

由MMU進行地址翻譯的輸入地址是虛擬地址。通常對它的值很少有限制 — 假設還有一點的話。 虛擬地址在32位系統中是32位的數值,在64位系統中是64位的數值。在一些系統,例如x86和x86-64,使用的地址實際上包含了另一個層次的間接尋址:這些結構使用分段,這些分段只是簡單的給每個邏輯地址加上位移。我們可以忽略這一部分的地址產生,它不重要,不是程序員非常關心的內存處理性能方面的東西。{x86的分段限制是與性能相關的,但那是另一回事了}

4.1 最簡單的地址轉換

有趣的地方在于由虛擬地址到物理地址的轉換。MMU可以在逐頁的基礎上重新映射地址。就像地址緩存排列的時候,虛擬地址被分割為不同的部分。這些部分被用來做多個表的索引,而這些表是被用來創建最終物理地址用的。最簡單的模型是只有一級表。

每個程序員都應該了解的“虛擬內存”知識
Figure 4.1: 1-Level Address Translation

圖 4.1 顯示了虛擬地址的不同部分是如何使用的。高字節部分是用來選擇一個頁目錄的條目;那個目錄中的每個地址可以被OS分別設置。頁目錄條目決定了物理內存頁的地址;頁面中可以有不止一個條目指向同樣的物理地址。完整的內存物理地址是由頁目錄獲得的頁地址和虛擬地址低字節部分合并起來決定的。頁目錄條目還包含一些附加的頁面信息,如訪問權限。

頁目錄的數據結構存儲在內存中。OS必須分配連續的物理內存,并將這個地址范圍的基地址存入一個特殊的寄存器。然后虛擬地址的適當的位被用來作為頁目錄的索引,這個頁目錄事實上是目錄條目的列表。

作為一個具體的例子,這是 x86機器4MB分頁設計。虛擬地址的位移部分是22位大小,足以定位一個4M頁內的每一個字節。虛擬地址中剩下的10位指定頁目錄中1024個條目的一個。每個條目包括一個10位的4M頁內的基地址,它與位移結合起來形成了一個完整的32位地址。

4.2 多級頁表

4MB的頁不是規范,它們會浪費很多內存,因為OS需要執行的許多操作需要內存頁的隊列。對于4kB的頁(32位機器的規范,甚至通常是64位機器的規范),虛擬地址的位移部分只有12位大小。這留下了20位作為頁目錄的指針。具有220個條目的表是不實際的。即使每個條目只要4比特,這個表也要4MB大小。由于每個進程可能具有其唯一的頁目錄,因為這些頁目錄許多系統中物理內存被綁定起來。

解決辦法是用多級頁表。然后這些就能表示一個稀疏的大的頁目錄,目錄中一些實際不用的區域不需要分配內存。因此這種表示更緊湊,使它可能為內存中的很多進程使用頁表而并不太影響性能。.

今天最復雜的頁表結構由四級構成。圖4.2顯示了這樣一個實現的原理圖。

每個程序員都應該了解的“虛擬內存”知識
Figure 4.2: 4-Level Address Translation

在這個例子中,虛擬地址被至少分為五個部分。其中四個部分是不同的目錄的索引。被引用的第4級目錄使用CPU中一個特殊目的的寄存器。第4級到第2 級目錄的內容是對次低一級目錄的引用。如果一個目錄條目標識為空,顯然就是不需要指向任何低一級的目錄。這樣頁表樹就能稀疏和緊湊。正如圖4.1,第1級目錄的條目是一部分物理地址,加上像訪問權限的輔助數據。

為了決定相對于虛擬地址的物理地址,處理器先決定***級目錄的地址。這個地址一般保存在一個寄存器。然后CPU取出虛擬地址中相對于這個目錄的索引部分,并用那個索引選擇合適的條目。這個條目是下一級目錄的地址,它由虛擬地址的下一部分索引。處理器繼續直到它到達第1級目錄,那里那個目錄條目的值就是物理地址的高字節部分。物理地址在加上虛擬地址中的頁面位移之后就完整了。這個過程稱為頁面樹遍歷。一些處理器(像x86和x86-64)在硬件中執行這個操作,其他的需要OS的協助。

系統中運行的每個進程可能需要自己的頁表樹。有部分共享樹的可能,但是這相當例外。因此如果頁表樹需要的內存盡可能小的話將對性能與可擴展性有利。理想的情況是將使用的內存緊靠著放在虛擬地址空間;但實際使用的物理地址不影響。一個小程序可能只需要第2,3,4級的一個目錄和少許第1級目錄就能應付過去。在一個采用4kB頁面和每個目錄512條目的x86-64機器上,這允許用4級目錄對2MB定位(每一級一個)。1GB連續的內存可以被第2到第4 級的一個目錄和第1級的512個目錄定位。

但是,假設所有內存可以被連續分配是太簡單了。由于復雜的原因,大多數情況下,一個進程的棧與堆的區域是被分配在地址空間中非常相反的兩端。這樣使得任一個區域可以根據需要盡可能的增長。這意味著最有可能需要兩個第2級目錄和相應的更多的低一級的目錄。

但即使這也不常常匹配現在的實際。由于安全的原因,一個可運行的(代碼,數據,堆,棧,動態共享對象,aka共享庫)不同的部分被映射到隨機的地址 [未選中的]。隨機化延伸到不同部分的相對位置;那意味著一個進程使用的不同的內存范圍,遍布于虛擬地址空間。通過對隨機的地址位數采用一些限定,范圍可以被限制,但在大多數情況下,這當然不會讓一個進程只用一到兩個第2和第3級目錄運行。

如果性能真的遠比安全重要,隨機化可以被關閉。OS然后通常是在虛擬內存中至少連續的裝載所有的動態共享對象(DSO)。

4.3 優化頁表訪問

頁表的所有數據結構都保存在主存中;在那里OS建造和更新這些表。當一個進程創建或者一個頁表變化,CPU將被通知。頁表被用來解決每個虛擬地址到物理地址的轉換,用上面描述的頁表遍歷方式。更多有關于此:至少每一級有一個目錄被用于處理虛擬地址的過程。這需要至多四次內存訪問(對一個運行中的進程的單次訪問來說),這很慢。有可能像普通數據一樣處理這些目錄表條目,并將他們緩存在L1d,L2等等,但這仍然非常慢。

從虛擬內存的早期階段開始,CPU的設計者采用了一種不同的優化。簡單的計算顯示,只有將目錄表條目保存在L1d和更高級的緩存,才會導致可怕的性能問題。每個絕對地址的計算,都需要相對于頁表深度的大量的L1d訪問。這些訪問不能并行,因為它們依賴于前面查詢的結果。在一個四級頁表的機器上,這種單線性將 至少至少需要12次循環。再加上L1d的非命中的可能性,結果是指令流水線沒有什么能隱藏的。額外的L1d訪問也消耗了珍貴的緩存帶寬。

所以,替代于只是緩存目錄表條目,物理頁地址的完整的計算結果被緩存了。因為同樣的原因,代碼和數據緩存也工作起來,這樣的地址計算結果的緩存是高效的。由于虛擬地址的頁面位移部分在物理頁地址的計算中不起任何作用,只有虛擬地址的剩余部分被用作緩存的標簽。根據頁面大小這意味著成百上千的指令或數據對象共享同一個標簽,因此也共享同一個物理地址前綴。

保存計算數值的緩存叫做旁路轉換緩存(TLB)。因為它必須非常的快,通常這是一個小的緩存。現代CPU像其它緩存一樣,提供了多級TLB緩存;越高級的緩存越大越慢。小號的L1級TLB通常被用來做全相聯映像緩存,采用LRU回收策略。最近這種緩存大小變大了,而且在處理器中變得集相聯。其結果之一就是,當一個新的條目必須被添加的時候,可能不是最久的條目被回收于替換了。

正如上面提到的,用來訪問TLB的標簽是虛擬地址的一個部分。如果標簽在緩存中有匹配,最終的物理地址將被計算出來,通過將來自虛擬地址的頁面位移地址加到緩存值的方式。這是一個非常快的過程;也必須這樣,因為每條使用絕對地址的指令都需要物理地址,還有在一些情況下,因為使用物理地址作為關鍵字的 L2查找。如果TLB查詢未命中,處理器就必須執行一次頁表遍歷;這可能代價非常大。

通過軟件或硬件預取代碼或數據,會在地址位于另一頁面時,暗中預取TLB的條目。硬件預取不可能允許這樣,因為硬件會初始化非法的頁面表遍歷。因此程序員不能依賴硬件預取機制來預取TLB條目。它必須使用預取指令明確的完成。就像數據和指令緩存,TLB可以表現為多個等級。正如數據緩存,TLB通常表現為兩種形式:指令TLB(ITLB)和數據TLB(DTLB)。高級的TLB像L2TLB通常是統一的,就像其他的緩存情形一樣。

#p#

4.3.1 使用TLB的注意事項

TLB是以處理器為核心的全局資源。所有運行于處理器的線程與進程使用同一個TLB。由于虛擬到物理地址的轉換依賴于安裝的是哪一種頁表樹,如果頁表變化了,CPU不能盲目的重復使用緩存的條目。每個進程有一個不同的頁表樹(不算在同一個進程中的線程),內核與內存管理器VMM(管理程序)也一樣,如果存在的話。也有可能一個進程的地址空間布局發生變化。有兩種解決這個問題的辦法:

  • 當頁表樹變化時TLB刷新。
  • TLB條目的標簽附加擴展并唯一標識其涉及的頁表樹

***種情況,只要執行一個上下文切換TLB就被刷新。因為大多數OS中,從一個線程/進程到另一個的切換需要執行一些核心代碼,TLB刷新被限制進入或離開核心地址空間。在虛擬化的系統中,當內核必須調用內存管理器VMM和返回的時候,這也會發生。如果內核和/或內存管理器沒有使用虛擬地址,或者當進程或內核調用系統/內存管理器時,能重復使用同一個虛擬地址,TLB必須被刷新。當離開內核或內存管理器時,處理器繼續執行一個不同的進程或內核。

刷新TLB高效但昂貴。例如,當執行一個系統調用,觸及的內核代碼可能僅限于幾千條指令,或許少許新頁面(或一個大的頁面,像某些結構的Linux 的就是這樣)。這個工作將替換觸及頁面的所有TLB條目。對Intel帶128ITLB和256DTLB條目的Core2架構,完全的刷新意味著多于 100和200條目(分別的)將被不必要的刷新。當系統調用返回同一個進程,所有那些被刷新的TLB條目可能被再次用到,但它們沒有了。內核或內存管理器常用的代碼也一樣。每條進入內核的條目上,TLB必須擦去再裝,即使內核與內存管理器的頁表通常不會改變。因此理論上說,TLB條目可以被保持一個很長時間。這也解釋了為什么現在處理器中的TLB緩存都不大:程序很有可能不會執行時間長到裝滿所有這些條目。

當然事實逃脫不了CPU的結構。對緩存刷新優化的一個可能的方法是單獨的使TLB條目失效。例如,如果內核代碼與數據落于一個特定的地址范圍,只有落入這個地址范圍的頁面必須被清除出TLB。這只需要比較標簽,因此不是很昂貴。在部分地址空間改變的場合,例如對去除內存頁的一次調用,這個方法也是有用的,

更好的解決方法是為TLB訪問擴展標簽。如果除了虛擬地址的一部分之外,一個唯一的對應每個頁表樹的標識(如一個進程的地址空間)被添加,TLB將根本不需要完全刷新。內核,內存管理程序,和獨立的進程都可以有唯一的標識。這種場景唯一的問題在于,TLB標簽可以獲得的位數異常有限,但是地址空間的位數卻不是。這意味著一些標識的再利用是有必要的。這種情況發生時TLB必須部分刷新(如果可能的話)。所有帶有再利用標識的條目必須被刷新,但是希望這是一個非常小的集合。

當多個進程運行在系統中時,這種擴展的TLB標簽具有一般優勢。如果每個可運行進程對內存的使用(因此TLB條目的使用)做限制,進程最近使用的TLB條目,當其再次列入計劃時,有很大機會仍然在TLB。但還有兩個額外的優勢:

  1. 特殊的地址空間,像內核和內存管理器使用的那些,經常僅僅進入一小段時間;之后控制經常返回初始化此次調用的地址空間。沒有標簽,就有兩次TLB 刷新操作。有標簽,調用地址空間緩存的轉換地址將被保存,而且由于內核與內存管理器地址空間根本不會經常改變TLB條目,系統調用之前的地址轉換等等可以仍然使用。
  2. 當同一個進程的兩個線程之間切換時,TLB刷新根本就不需要。雖然沒有擴展TLB標簽時,進入內核的條目會破壞***個線程的TLB的條目。

有些處理器在一些時候實現了這些擴展標簽。AMD給帕西菲卡(Pacifica)虛擬化擴展引入了一個1位的擴展標簽。在虛擬化的上下文中,這個1 位的地址空間ID(ASID)被用來從客戶域區別出內存管理程序的地址空間。這使得OS能夠避免在每次進入內存管理程序的時候(例如為了處理一個頁面錯誤)刷新客戶的TLB條目,或者當控制回到客戶時刷新內存管理程序的TLB條目。這個架構未來會允許使用更多的位。其它主流處理器很可能會隨之適應并支持這個功能。

4.3.2 影響TLB性能

有一些因素會影響TLB性能。***個是頁面的大小。顯然頁面越大,裝進去的指令或數據對象就越多。所以較大的頁面大小減少了所需的地址轉換總次數,即需要更少的TLB緩存條目。大多數架構允許使用多個不同的頁面尺寸;一些尺寸可以并存使用。例如,x86/x86-64處理器有一個普通的4kB的頁面尺寸,但它們也可以分別用4MB和2MB頁面。IA-64 和 PowerPC允許如64kB的尺寸作為基本的頁面尺寸。

然而,大頁面尺寸的使用也隨之帶來了一些問題。用作大頁面的內存范圍必須是在物理內存中連續的。如果物理內存管理的單元大小升至虛擬內存頁面的大小,浪費的內存數量將會增長。各種內存操作(如加載可執行文件)需要頁面邊界對齊。這意味著平均每次映射浪費了物理內存中頁面大小的一半。這種浪費很容易累加;因此它給物理內存分配的合理單元大小劃定了一個上限。

在x86-64結構中增加單元大小到2MB來適應大頁面當然是不實際的。這是一個太大的尺寸。但這轉而意味著每個大頁面必須由許多小一些的頁面組成。這些小頁面必須在物理內存中連續。以4kB單元頁面大小分配2MB連續的物理內存具有挑戰性。它需要找到有512個連續頁面的空閑區域。在系統運行一段時間并且物理內存開始碎片化以后,這可能極為困難(或者不可能)

因此在Linux中有必要在系統啟動的時候,用特別的Huge TLBfs文件系統,預分配這些大頁面。一個固定數目的物理頁面被保留,以單獨用作大的虛擬頁面。這使可能不會經常用到的資源捆綁留下來。它也是一個有限的池;增大它一般意味著要重啟系統。盡管如此,大頁面是進入某些局面的方法,在這些局面中性能具有保險性,資源豐富,而且麻煩的安裝不會成為大的妨礙。數據庫服務器就是一個例子。

增大最小的虛擬頁面大小(正如選擇大頁面的相反面)也有它的問題。內存映射操作(例如加載應用)必須確認這些頁面大小。不可能有更小的映射。對大多數架構來說,一個可執行程序的各個部分位置有一個固定的關系。如果頁面大小增加到超過了可執行程序或DSO(Dynamic Shared Object)創建時考慮的大小,加載操作將無法執行。腦海里記得這個限制很重要。圖4.3顯示了一個ELF二進制的對齊需求是如何決定的。它編碼在 ELF程序頭部。

  1. $ eu-readelf -l /bin/ls  
  2. Program Headers:  
  3.   Type   Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align  
  4. ...  
  5.   LOAD   0x000000 0x0000000000400000 0x0000000000400000 0x0132ac 0x0132ac R E 0x200000  
  6.   LOAD   0x0132b0 0x00000000006132b0 0x00000000006132b0 0x001a71 0x001a71 RW  0x200000  
  7. ... 

Figure 4.3: ELF 程序頭表明了對齊需求

在這個例子中,一個x86-64二進制,它的值為0×200000 = 2,097,152 = 2MB,符合處理器支持的***頁面尺寸。

使用較大內存尺寸有第二個影響:頁表樹的級數減少了。由于虛擬地址相對于頁面位移的部分增加了,需要用來在頁目錄中使用的位,就沒有剩下許多了。這意味著當一個TLB未命中時,需要做的工作數量減少了。

超出使用大頁面大小,它有可能減少移動數據時需要同時使用的TLB條目數目,減少到數頁。這與一些上面我們談論的緩存使用的優化機制類似。只有現在對齊需求是巨大的。考慮到TLB條目數目如此小,這可能是一個重要的優化。

4.4 虛擬化的影響

OS映像的虛擬化將變得越來越流行;這意味著另一個層次的內存處理被加入了想象。進程(基本的隔間)或者OS容器的虛擬化,因為只涉及一個OS而沒有落入此分類。類似Xen或KVM的技術使OS映像能夠獨立運行 — 有或者沒有處理器的協助。這些情形下,有一個單獨的軟件直接控制物理內存的訪問。

每個程序員都應該了解的“虛擬內存”知識
圖 4.4: Xen 虛擬化模型

對Xen來說(見圖4.4),Xen VMM(Xen內存管理程序)就是那個軟件。但是,VMM沒有自己實現許多硬件的控制,不像其他早先的系統(包括Xen VMM的***個版本)的VMM,內存以外的硬件和處理器由享有特權的Dom0域控制。現在,這基本上與沒有特權的DomU內核一樣,就內存處理方面而言,它們沒有什么不同。這里重要的是,VMM自己分發物理內存給Dom0和DomU內核,然后就像他們是直接運行在一個處理器上一樣,實現通常的內存處理

為了實現完成虛擬化所需的各個域之間的分隔,Dom0和DomU內核中的內存處理不具有無限制的物理內存訪問權限。VMM不是通過分發獨立的物理頁并讓客戶OS處理地址的方式來分發內存;這不能提供對錯誤或欺詐客戶域的防范。替代的,VMM為每一個客戶域創建它自己的頁表樹,并且用這些數據結構分發內存。好處是對頁表樹管理信息的訪問能得到控制。如果代碼沒有合適的特權,它不能做任何事。 在虛擬化的Xen支持中,這種訪問控制已被開發,不管使用的是參數的或硬件的(又名全)虛擬化。客戶域以意圖上與參數的和硬件的虛擬化極為相似的方法,給每個進程創建它們的頁表樹。每當客戶OS修改了VMM調用的頁表,VMM就會用客戶域中更新的信息去更新自己的影子頁表。這些是實際由硬件使用的頁表。顯然這個過程非常昂貴:每次對頁表樹的修改都需要VMM的一次調用。而沒有虛擬化時內存映射的改變也不便宜,它們現在變得甚至更昂貴。 考慮到從客戶OS的變化到VMM以及返回,其本身已經相當昂貴,額外的代價可能真的很大。這就是為什么處理器開始具有避免創建影子頁表的額外功能。這樣很好不僅是因為速度的問題,而且它減少了VMM消耗的內存。Intel有擴展頁表(EPTs),AMD稱之為嵌套頁表(NPTs)。基本上兩種技術都具有客戶OS的頁表,來產生虛擬的物理地址。然后通過每個域一個EPT/NPT樹的方式,這些地址會被進一步轉換為真實的物理地址。這使得可以用幾乎非虛擬化情境的速度進行內存處理,因為大多數用來內存處理的VMM條目被移走了。它也減少了VMM使用的內存,因為現在一個域(相對于進程)只有一個頁表樹需要維護。 額外的地址轉換步驟的結果也存儲于TLB。那意味著TLB不存儲虛擬物理地址,而替代以完整的查詢結果。已經解釋過AMD的帕西菲卡擴展為了避免TLB刷新而給每個條目引入ASID。ASID的位數在最初版本的處理器擴展中是一位;這正好足夠區分VMM和客戶OS。Intel有服務同一個目的的虛擬處理器 ID(VPIDs),它們只有更多位。但對每個客戶域VPID是固定的,因此它不能標記單獨的進程,也不能避免TLB在那個級別刷新。

對虛擬OS,每個地址空間的修改需要的工作量是一個問題。但是還有另一個內在的基于VMM虛擬化的問題:沒有什么辦法處理兩層的內存。但內存處理很難(特別是考慮到像NUMA一樣的復雜性,見第5部分)。Xen方法使用一個單獨的VMM,這使***的(或***的)處理變得困難,因為所有內存管理實現的復雜性,包括像發現內存范圍之類“瑣碎的”事情,必須被復制于VMM。OS有完全成熟的與***的實現;人們確實想避免復制它們。

每個程序員都應該了解的“虛擬內存”知識
圖 4.5: KVM 虛擬化模型

這就是為什么對VMM/Dom0模型的分析是這么有吸引力的一個選擇。圖4.5顯示了KVM的Linux內核擴展如何嘗試解決這個問題的。并沒有直接運行在硬件之上且管理所有客戶的單獨的VMM,替代的,一個普通的Linux內核接管了這個功能。這意味著Linux內核中完整且復雜的內存管理功能,被用來管理系統的內存。客戶域運行于普通的用戶級進程,創建者稱其為“客戶模式”。虛擬化的功能,參數的或全虛擬化的,被另一個用戶級進程KVM VMM控制。這也就是另一個進程用特別的內核實現的KVM設備,去恰巧控制一個客戶域。

這個模型相較Xen獨立的VMM模型好處在于,即使客戶OS使用時,仍然有兩個內存處理程序在工作,只需要在Linux內核里有一個實現。不需要像 Xen VMM那樣從另一段代碼復制同樣的功能。這帶來更少的工作,更少的bug,或許還有更少的兩個內存處理程序接觸產生的摩擦,因為一個Linux客戶的內存處理程序與運行于裸硬件之上的Linux內核的外部內存處理程序,做出了相同的假設。

總的來說,程序員必須清醒認識到,采用虛擬化時,內存操作的代價比沒有虛擬化要高很多。任何減少這個工作的優化,將在虛擬化環境付出更多。隨著時間的過去,處理器的設計者將通過像EPT和NPT技術越來越減少這個差距,但它永遠都不會完全消失。

英文原文:Memory part 3: Virtual Memory

譯文鏈接:http://www.oschina.net/translate/what-every-programmer-should-know-about-virtual-memory-part3

責任編輯:林師授 來源: OSCHINA
相關推薦

2024-04-10 12:36:41

硬件代碼

2012-02-28 10:52:13

2018-03-07 12:57:53

2015-04-16 10:26:51

程序員 Python Ruby

2021-10-20 06:05:01

編程語言開發

2022-09-11 15:20:05

程序員命令開發

2021-10-18 10:21:28

程序員技能優化

2011-07-25 10:09:57

Python

2012-10-11 10:32:48

Linux命令程序員

2023-01-31 15:43:47

2014-12-26 10:19:14

程序員

2014-07-16 09:34:44

2020-03-22 11:12:25

加速函數Python程序員

2019-05-21 16:19:46

前端性能優化圖片

2024-04-24 14:52:26

JavaScriptWeb 開發

2011-06-16 08:58:57

軟考程序員

2023-12-27 09:00:00

Python魔術方法開發

2023-11-02 14:21:06

2017-04-07 10:40:48

程序員學習命令行

2015-07-02 11:20:17

程序員代碼
點贊
收藏

51CTO技術棧公眾號

老司机激情视频| 国产不卡在线观看| japanese在线观看| 麻豆视频在线看| 国产日韩精品一区二区浪潮av| 国产欧美一区二区三区在线| 久久国产精品二区| 精品日本12videosex| 日韩欧美资源站| 黄色动漫在线免费看| 51精品免费网站| 天堂√中文最新版在线| 国产mv日韩mv欧美| www.色综合| 又黄又色的网站| 成人国产精品| 亚洲国产成人va在线观看天堂| 日韩电影大全在线观看| 懂色av成人一区二区三区| 91精品亚洲| 日韩精品小视频| 亚洲一级片免费观看| 美女18一级毛片一品久道久久综合| 亚洲男人天堂av| 亚洲黄色一区二区三区| 天天干天天操av| 国产精品456| 国产精品男人的天堂| 亚洲永久精品在线观看| 激情欧美丁香| 亚洲成人黄色网| 日韩精品在线中文字幕| 色三级在线观看| 成人国产精品视频| 97在线资源站| 99精品在线视频观看| 蜜臂av日日欢夜夜爽一区| 欧美一区第一页| 好吊操这里只有精品| 九九精品在线| 亚洲精品久久久久中文字幕欢迎你| 北条麻妃亚洲一区| 国产欧美日韩电影| 欧美卡1卡2卡| 亚洲精品综合在线观看| 成人网ww555视频免费看| 精品久久久精品| 男女猛烈激情xx00免费视频| 日本乱理伦在线| 波多野结衣视频一区| 97在线中文字幕| 亚洲a视频在线| 成人午夜精品在线| 国产欧美韩日| 姝姝窝人体www聚色窝| 不卡高清视频专区| 看欧美日韩国产| 桃花色综合影院| 久久综合丝袜日本网| 欧美久久电影| 国产在线观看网站| 中文字幕中文字幕中文字幕亚洲无线| 亚洲高清视频一区| 男人和女人做事情在线视频网站免费观看| 国产精品天美传媒沈樵| 特级毛片在线免费观看| 在线免费观看a视频| 一区二区三区中文字幕精品精品| 人妻激情另类乱人伦人妻| 欧美草逼视频| 欧美午夜激情在线| 五月婷婷六月丁香激情| 免费一级欧美片在线观看网站| 欧美日韩亚洲一区二区三区| 日韩av黄色网址| 91tv亚洲精品香蕉国产一区| 欧美高清精品3d| 91精品国产高清91久久久久久 | 中文字幕 欧美 日韩| 亚洲一区二区三区日本久久九| 亚洲国语精品自产拍在线观看| ass精品国模裸体欣赏pics| 精品一区电影| 欧美日韩高清区| 亚洲欧美一二三区| 国产一区二区久久| 国产成人精品电影久久久| 影音先锋国产在线| 国产精品一区二区在线观看网站 | 免费观看黄色av| 91视频在线看| 在线不卡视频一区二区| 678在线观看视频| 欧美少妇一区二区| 亚洲国产精品狼友在线观看| 国产麻豆精品久久| 久久91超碰青草是什么| 中文字幕黄色片| 国产成人综合亚洲网站| 欧洲在线视频一区| 在线看一级片| 亚洲电影观看| 波多野结衣亚洲一区| 午夜精品亚洲一区二区三区嫩草 | 一区二区三区不卡视频在线观看| 欧美 国产 精品| 成人性生交大片免费观看网站| 欧美片在线播放| www.超碰97| 亚洲国产精品久久久天堂| 91成人性视频| 国产av无码专区亚洲av| 国产无人区一区二区三区| 800av在线免费观看| 日韩制服一区| 亚洲精品国产福利| 欧美黑人猛猛猛| 欧美a级理论片| 九色综合婷婷综合| 五月花成人网| 欧美视频一区二区在线观看| 朝桐光av一区二区三区| 欧美在线免费| 国产精品在线看| 免费黄网站在线观看| 亚洲国产日韩综合久久精品| caoporm在线视频| 精品日本12videosex| 日韩**中文字幕毛片| 欧美熟女一区二区| 亚洲宅男天堂在线观看无病毒| 凹凸日日摸日日碰夜夜爽1| xvideos.蜜桃一区二区| 欧美成人激情视频| 欧美性猛交xxxx乱大交hd| 成人免费高清视频| 91国在线高清视频| 国产一区二区三区视频在线| 色婷婷久久av| 中文字幕在线视频免费| 国产欧美日韩三区| 婷婷激情四射五月天| 亚洲性视频大全| 亚洲精品国产福利| 国产真实夫妇交换视频| 国产精品一区二区三区99| 自拍视频一区二区三区| 四虎精品在线观看| 色阁综合伊人av| 一级黄色大片免费| 国产精品亲子乱子伦xxxx裸| 亚洲污视频在线观看| 日韩国产综合| 欧美国产中文字幕| 国产 欧美 精品| 亚洲福利视频导航| 中文字幕影片免费在线观看| 99在线精品免费视频九九视 | 国内精品久久久久久久影视简单| 欧美一级电影久久| 国产在线观看免费网站| 欧美日韩一区三区| 婷婷久久综合网| 成人一区二区三区视频| 波多野结衣乳巨码无在线| 天堂俺去俺来也www久久婷婷| 日韩av黄色在线观看| 国产区av在线| 亚洲一区二区三区小说| 在线观看的毛片| 欧美mv日韩| 91传媒免费看| 黄色激情在线播放| 欧美一区永久视频免费观看| 日韩 中文字幕| 老司机午夜精品视频| 亚洲午夜在线观看| 不卡av播放| 自拍视频国产精品| 精品久久久久中文慕人妻| 亚洲高清免费在线| 欧美大波大乳巨大乳| 精品无人区卡一卡二卡三乱码免费卡 | 亚洲福利在线视频| av手机天堂网| 一区二区三区.www| 国产成人无码精品久久二区三| 免费在线观看精品| 18禁裸男晨勃露j毛免费观看| 五月激激激综合网色播| 成人免费网站在线| 男人av在线播放| 久久精品中文字幕一区| 偷拍自拍在线视频| 欧美一区二区三区在线电影| 久久久久久91亚洲精品中文字幕| 国产精品久久久久aaaa| 999精品免费视频| 九九视频精品免费| 台湾成人av| 一区二区三区高清在线观看| 日韩免费av片在线观看| 污污片在线免费视频| 一本一本久久a久久精品综合小说| 精品国自产拍在线观看| 91国偷自产一区二区三区成为亚洲经典| 极品魔鬼身材女神啪啪精品| 久久精子c满五个校花| 免费观看污网站| 精品一区二区成人精品| 青青视频在线播放| 国精品一区二区| 亚洲午夜精品国产| 色综合综合网| 久久99国产精品| 日韩精品一级| 成人国产精品日本在线| 天然素人一区二区视频| 欧美一级免费视频| xxx.xxx欧美| 美女性感视频久久久| 91女主播在线观看| 亚洲午夜未删减在线观看| 日韩一级片免费在线观看| 日韩色在线观看| 国产精品久久久久久久久久久久久久久久久久 | 久久久噜噜噜久久中文字幕色伊伊 | 丝袜足脚交91精品| 免费视频国产一区| 久久av免费一区| 黄色美女久久久| 亚洲aaaaaa| 青青在线精品| 91精品久久久久久久久青青| 狠狠久久综合| 国产精品美女在线| 日韩欧美看国产| 日韩av电影在线网| 成人在线网站| 国产精品麻豆va在线播放| 一呦二呦三呦精品国产| 国产精品高精视频免费| 精品国产第一福利网站| 国产成人精品久久亚洲高清不卡| 竹内纱里奈兽皇系列在线观看| 欧美一级电影久久| 六月婷婷综合| 国产精品一区二区三区毛片淫片 | 免费看91的网站| 久久久精品欧美丰满| 无码人妻精品一区二区中文| 久久久精品天堂| 欧美福利在线视频| 亚洲日本一区二区| 欧美精品入口蜜桃| 亚洲成人av电影在线| 五月天综合激情网| 欧美午夜不卡在线观看免费| 国产又黄又猛又爽| 日韩欧美成人一区二区| 老牛影视av牛牛影视av| 日韩精品久久久久| 成人免费视频| 成人97在线观看视频| 欧美家庭影院| 国产91精品久久久久| 免费观看成人性生生活片| 国产日产欧美精品| 亚洲午夜免费| 蜜桃臀一区二区三区| 操欧美老女人| yy111111少妇影院日韩夜片 | 久久精品国产精品亚洲精品| 亚洲一级片免费观看| 99久久er热在这里只有精品66| b站大片免费直播| 亚洲欧洲无码一区二区三区| 久青草视频在线观看| 欧美视频一区二区三区…| 一二三四区视频| 亚洲第一区在线观看| 国产一区二区三区福利| 久久中文精品视频| 国产伦理精品| 国产专区精品视频| 日本在线中文字幕一区| 伊人久久婷婷色综合98网| 亚洲先锋成人| 老熟妇仑乱视频一区二区| 国产精品一区久久久久| 中国毛片在线观看| 亚洲毛片av在线| 狠狠人妻久久久久久综合| 91精品国产一区二区三区| 手机福利在线| 欧美精品一级| 国产精品播放| 成人羞羞动漫| 妞干网在线视频观看| 蜜臀久久久久久久| 少妇饥渴放荡91麻豆| 亚洲男人都懂的| 国产精品国产精品国产| 精品乱人伦一区二区三区| 91社区在线| 热久久免费视频精品| 一区三区自拍| 青少年xxxxx性开放hg| 久久青草久久| 精品人妻伦一二三区久| 日韩一区在线看| 国产成人自拍偷拍| 日韩精品在线影院| 人人超在线公开视频| 国产在线播放91| 成人免费在线播放| 男女午夜激情视频| 在线亚洲国产精品网站| 午夜视频在线网站| 国产婷婷精品av在线| 久久青青草视频| 亚洲国产精品高清久久久| 永久免费网站在线| 成人黄色影片在线| 欧美黄色录像片| 日本成人中文字幕在线| 久久久久久久久久久久久久久99| 欧美一级高潮片| 日韩欧美在线一区二区三区| 黄视频在线观看网站| 国产精品日韩一区| 精品欧美久久| 久久久久久三级| 国产日韩欧美激情| 久久亚洲精品石原莉奈 | 人妻巨大乳一二三区| 亚洲欧洲日韩在线| 一级黄色免费片| 日韩中文字幕在线视频| 国产黄色精品| 永久免费精品视频网站| 久久电影网电视剧免费观看| 91成人精品一区二区| 欧美午夜寂寞影院| 91视频在线观看| 国产日韩欧美夫妻视频在线观看| 成久久久网站| 亚洲第一成肉网| bt7086福利一区国产| 久久在线视频精品| 欧美电视剧在线看免费| 主播国产精品| 国产高清一区二区三区| 亚洲精品欧洲| 亚洲av片不卡无码久久| 一本大道综合伊人精品热热 | 理论片日本一区| 在线视频这里只有精品| 在线成人高清不卡| dj大片免费在线观看| 操人视频欧美| 亚洲综合国产激情另类一区| 乐播av一区二区三区| 欧美日韩精品一区二区在线播放| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲电影在线一区二区三区| avtt中文字幕| 午夜欧美在线一二页| 欧美日韩伦理片| 国产精品小说在线| 欧美日本三区| 亚洲自拍偷拍一区二区| 欧美午夜电影网| 免费男女羞羞的视频网站在线观看| 国产精品一区二区免费| 欧美专区18| 久久中文免费视频| 亚洲国产精品美女| 亚洲a∨精品一区二区三区导航| 在线电影看在线一区二区三区| 成人综合婷婷国产精品久久蜜臀 | 欧美精品久久久| 久久97超碰国产精品超碰| 国语对白一区二区| 尤物yw午夜国产精品视频明星| www.久久久久爱免| 草草久久久无码国产专区| 国产精品欧美久久久久无广告| 性一交一乱一乱一视频| 国产精品av在线播放| 欧美日本中文| 国产91丝袜美女在线播放| 日韩免费看网站| 国产成人精选| 欧美一区二区中文字幕| 亚洲欧洲99久久| 男同在线观看| 国产精品久久7| 久久精品国产亚洲a| 日本一级淫片免费放|