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

.NET內(nèi)存映射文件原理、創(chuàng)建及進(jìn)程通訊

開(kāi)發(fā) 后端
本文介紹了.NET內(nèi)存映射文件的原理、創(chuàng)建以及實(shí)現(xiàn)進(jìn)程通訊的方法。NET 4.0新增加了一個(gè)System.IO. MemoryMappedFiles命名空間,其中添加了幾個(gè)類(lèi)和相應(yīng)的枚舉類(lèi)型,從而使我們可以很方便地創(chuàng)建內(nèi)存映射文件。

操作系統(tǒng)很早就開(kāi)始使用內(nèi)存映射文件(Memory Mapped File)來(lái)作為進(jìn)程間的共享存儲(chǔ)區(qū),這是一種非常高效的進(jìn)程通訊手段。Win32 API中也包含有創(chuàng)建內(nèi)存映射文件的函數(shù),然而,這些函數(shù)都運(yùn)行于非托管環(huán)境下,在.NET中只能通過(guò)平臺(tái)調(diào)用機(jī)制來(lái)使用它們,用起來(lái)很不方便。幸運(yùn)的是,.NET 4.0新增加了一個(gè)System.IO. MemoryMappedFiles命名空間,其中添加了幾個(gè)類(lèi)和相應(yīng)的枚舉類(lèi)型,從而使我們可以很方便地創(chuàng)建內(nèi)存映射文件。

1 內(nèi)存映射文件原理

所謂內(nèi)存映射文件,其實(shí)就是在內(nèi)存中開(kāi)辟出一塊存放數(shù)據(jù)的專(zhuān)用區(qū)域,這區(qū)域往往與硬盤(pán)上特定的文件相對(duì)應(yīng)。進(jìn)程將這塊內(nèi)存區(qū)域映射到自己的地址空間中,訪問(wèn)它就象是訪問(wèn)普通的內(nèi)存一樣。

內(nèi)存映射文件原理圖 

圖 1 .NET內(nèi)存映射文件原理圖

在.NET中,使用MemoryMappedFile對(duì)象表示一個(gè)內(nèi)存映射文件,通過(guò)它的CreateFromFile()方法根據(jù)磁盤(pán)現(xiàn)有文件創(chuàng)建內(nèi)存映射文件,調(diào)用這一方法需要提供一個(gè)與磁盤(pán)現(xiàn)有文件相對(duì)應(yīng)的FileStream對(duì)象。

以下示例代碼動(dòng)態(tài)創(chuàng)建一個(gè)MyFile.dat文件,然后將其映射到系統(tǒng)內(nèi)存中,設(shè)定容量為1M:

  1. FileStream fs = new FileStream("MyFile.dat", FileMode.Create,  
  2. FileAccess.ReadWrite);  
  3. MemoryMappedFile memoryFile = MemoryMappedFile.CreateFromFile(fs, "MyFile", 1024*1024); 

注意用于創(chuàng)建內(nèi)存映射文件的文件流必須是可讀寫(xiě)的。

擴(kuò)充閱讀:

關(guān)于內(nèi)存映射文件的容量

默認(rèn)情況下,在調(diào)用MemoryMappedFile.CreateFromFile()方法時(shí)如果不指定文件容量,那么,創(chuàng)建的內(nèi)存映射文件的容量等同于文件的大小。

在上面的示例代碼中,由于磁盤(pán)文件是臨時(shí)生成的,其長(zhǎng)度為0,所以,必須在創(chuàng)建內(nèi)存映射文件時(shí)同時(shí)指定其容量。

在設(shè)定內(nèi)存映射文件的容量時(shí),其值不能小于磁盤(pán)文件的現(xiàn)有長(zhǎng)度,但可以比它大。但要注意這將導(dǎo)致一個(gè)戲劇化的結(jié)果:磁盤(pán)文件自動(dòng)增長(zhǎng)到聲明的容量大小!

可以多次調(diào)用MemoryMappedFile.CreateFromFile(),每次傳給它一個(gè)更大的容量數(shù)值以不斷擴(kuò)充磁盤(pán)文件的大小。

當(dāng)不再使用一個(gè)MemoryMappedFile對(duì)象時(shí),注意應(yīng)該及時(shí)地調(diào)用其Dispose()方法釋放它所占有的系統(tǒng)資源。因?yàn)镸emoryMappedFile實(shí)際上對(duì)應(yīng)著運(yùn)行操作系統(tǒng)核心的核心對(duì)象,如果不及時(shí)關(guān)閉,會(huì)造成操作系統(tǒng)核心資源(比如句柄)的浪費(fèi),要等到MemoryMappedFile對(duì)象被CLR垃圾回收,或者整個(gè)進(jìn)程中止時(shí),這些資源才會(huì)被操作系統(tǒng)回收再利用。

另外,內(nèi)存映射文件的容量其實(shí)是指***允許分配給內(nèi)存映射文件的內(nèi)存存儲(chǔ)區(qū)字節(jié)數(shù),并不意味著系統(tǒng)會(huì)馬上分配指定容量的內(nèi)存。進(jìn)程中訪問(wèn)這塊映射到磁盤(pán)文件中的存儲(chǔ)區(qū)時(shí),操作系統(tǒng)如果發(fā)現(xiàn)其內(nèi)容還未裝入內(nèi)存,就會(huì)從磁盤(pán)文件中裝入相應(yīng)內(nèi)容到內(nèi)存中。因此,不用擔(dān)心聲明一個(gè)大的內(nèi)存映射文件容量會(huì)導(dǎo)致內(nèi)存的浪費(fèi)。

當(dāng)MemoryMappedFile對(duì)象創(chuàng)建之后,我們并不能直接對(duì)其進(jìn)行讀寫(xiě),必須通過(guò)一個(gè)MemoryMappedViewAccessor對(duì)象來(lái)訪問(wèn)這個(gè)內(nèi)存映射文件。

MemoryMappedFile. CreateViewAccessor()方法可以創(chuàng)建MemoryMappedViewAccessor對(duì)象,而此對(duì)象提供了一系列讀寫(xiě)的方法,用于向內(nèi)存映射文件中讀取和寫(xiě)入數(shù)據(jù)。

以下示例代碼創(chuàng)建了一個(gè)內(nèi)存映射文件訪問(wèn)對(duì)象并使用它寫(xiě)入數(shù)據(jù):

  1. FileStream fs =…;  //創(chuàng)建FileStream對(duì)象  
  2. MemoryMappedFile memoryFile=…;  //創(chuàng)建內(nèi)存映射文件  
  3. //創(chuàng)建內(nèi)存映射文件訪問(wèn)對(duì)象  
  4. MemoryMappedViewAccessor accessor=  
  5. memoryFile.CreateViewAccessor(0, 1024);  
  6. for (int i = 0; i < 1024; i+=2)  
  7. accessor.Write(i, ‘c’);  

上述代碼中要注意,在創(chuàng)建內(nèi)存映射文件訪問(wèn)對(duì)象需要指定它所能訪問(wèn)的內(nèi)存映射文件的內(nèi)容范圍,這個(gè)“范圍”稱(chēng)為“內(nèi)存映射視圖(Memory Mapped View)”。可以將它與“放大鏡”類(lèi)比,當(dāng)使用一個(gè)放大鏡閱讀書(shū)籍時(shí),一次只能放大指定部分的文字。類(lèi)似地,我們只能在內(nèi)存映射視圖所規(guī)定的范圍內(nèi)存取內(nèi)存映射文件。

在上述代碼中,我們看到內(nèi)存映射視圖對(duì)象accessor只提取了內(nèi)存映射文件開(kāi)頭1024個(gè)字節(jié)的內(nèi)容,然后,向其中寫(xiě)入了512個(gè)“c”字符。

當(dāng)調(diào)用內(nèi)存映射視圖對(duì)象的Write()方法時(shí),需要指明從哪個(gè)位置(即方法的***個(gè)參數(shù))開(kāi)始寫(xiě)入數(shù)據(jù),并且需要計(jì)算清楚要寫(xiě)入的數(shù)據(jù)占幾個(gè)字節(jié),這樣,當(dāng)寫(xiě)入下一個(gè)數(shù)據(jù)時(shí),就知道應(yīng)該從哪個(gè)位置開(kāi)始。

注意,Write()方法中的位置是相對(duì)視圖對(duì)象而非內(nèi)存映射文件本身,因此,此位置數(shù)值再加上視圖距內(nèi)存映射文件開(kāi)頭的位置數(shù)據(jù)才是寫(xiě)入的數(shù)據(jù)在文件中的真實(shí)位置。

Write()方法有多個(gè)重載形式,可以向內(nèi)存映射文件中寫(xiě)入多種類(lèi)型的數(shù)據(jù),但要注意計(jì)算清楚其寫(xiě)入的位置,避免造成數(shù)據(jù)覆蓋問(wèn)題。

類(lèi)似地,內(nèi)存映射視圖對(duì)象提供了多個(gè)重載的Read()方法,可以從內(nèi)存映射文件中讀取數(shù)據(jù)。

比較有趣的是,在同一個(gè)進(jìn)程中可以針對(duì)同一個(gè)內(nèi)存映射文件創(chuàng)建多個(gè)視圖對(duì)象,從而允許我們同時(shí)修改同一個(gè)文件的不同部分,在關(guān)閉視圖對(duì)象時(shí)由操作系統(tǒng)保證將所有修改都寫(xiě)回到原始文件中。

下面我們來(lái)看一個(gè)示例。

2 在同一進(jìn)程內(nèi)同時(shí)讀寫(xiě)同一內(nèi)存映射文件

示例項(xiàng)目UseMMFInProcess運(yùn)行時(shí)會(huì)在程序的當(dāng)前目錄下創(chuàng)建一個(gè)“MyFile.dat”文件,然后,創(chuàng)建了兩個(gè)內(nèi)存映射視圖對(duì)象,分別向文件的前半部分和后半部分寫(xiě)入不同的數(shù)據(jù),然后再?gòu)闹凶x出來(lái)(圖 2)。

示例項(xiàng)目UseMMFInProcess 

圖 2 .NET內(nèi)存映射文件示例項(xiàng)目UseMMFInProcess

這個(gè)示例展示的技術(shù)很基礎(chǔ),請(qǐng)讀者自行查看源碼。

3 使用內(nèi)存映射文件在進(jìn)程間傳送值類(lèi)型數(shù)據(jù)

在前面的例子中,內(nèi)存映射文件直接與某個(gè)特定的磁盤(pán)文件相對(duì)應(yīng),事實(shí)上,我們也可以不用創(chuàng)建磁盤(pán)文件而直接使用Windows的分頁(yè)文件。這種方式是實(shí)現(xiàn)進(jìn)程間互傳數(shù)據(jù)的典型方式。

調(diào)用MemoryMappedFile.CreateNew()或MemoryMappedFile.CreateOrOpen()方法可以在系統(tǒng)內(nèi)存(System Memory)中直接創(chuàng)建一個(gè)內(nèi)存映射文件,這個(gè)內(nèi)存映射文件所對(duì)應(yīng)的“物理文件”是Windows的系統(tǒng)分頁(yè)文件。兩個(gè)方法都需要給映射文件指定一個(gè)唯一的名稱(chēng)。不同之處在于CreateOrOpen ()方法在指定名稱(chēng)的映射文件存在時(shí)就直接將其返回給進(jìn)程,而CreateNew()方法始終是新創(chuàng)建一個(gè)內(nèi)存映射文件。

擴(kuò)充閱讀:

Windows的系統(tǒng)分頁(yè)文件和休眠文件

默認(rèn)情況下,在安裝Windows的分區(qū)根目錄下,會(huì)找到兩個(gè)具有“隱藏”屬性的pagefile.sys和hiberfil.sys文件,前者(pagefile.sys)就是Windows的分頁(yè)文件,用于保存從物理內(nèi)存中換出的內(nèi)存頁(yè),我們可以用它的一部分來(lái)創(chuàng)建內(nèi)存映射文件。后者(hiberfil.sys)則是“系統(tǒng)休眠”文件,當(dāng)Windows啟用了休眠功能時(shí),就會(huì)在硬盤(pán)上找到這個(gè)文件,它的內(nèi)容是系統(tǒng)休眠時(shí)物理內(nèi)存中的數(shù)據(jù),當(dāng)計(jì)算機(jī)從休眠中“醒”過(guò)來(lái)時(shí),通過(guò)從此文件中加載信息以恢復(fù)上次工作的狀態(tài)。

內(nèi)存映射文件創(chuàng)建好以后,可以如同前面介紹的方法一樣創(chuàng)建視圖對(duì)象,然后使用Read和Write系列方法存取。

只要指定同一個(gè)名字,那么,多個(gè)進(jìn)程就可以使用同一個(gè)內(nèi)存映射文件交換數(shù)據(jù)。示例UseMMFBetweenProcess展示了在兩個(gè)進(jìn)程間相互交換一個(gè)結(jié)構(gòu)體變量的情況:

示例項(xiàng)目UseMMFBetweenProcess 

圖 3 .NET內(nèi)存映射文件示例項(xiàng)目UseMMFBetweenProcess

兩個(gè)進(jìn)程要交換的數(shù)據(jù)格式如下:

  1. public struct MyStructure  
  2. {  
  3.  public int IntValue  
  4.  {  get;  set;   }  
  5.  public float FloatValue  
  6.  {  get;  set;   }  
  7. }  

啟動(dòng)UseMMFBetweenProcess程序的兩個(gè)實(shí)例,在其中一個(gè)窗體上輸入兩個(gè)數(shù)字之后,點(diǎn)擊“保存”按鈕,然后在另一個(gè)進(jìn)程的窗體上點(diǎn)擊“提取”,可以看到另一個(gè)進(jìn)程寫(xiě)入的信息出現(xiàn)在本進(jìn)程的文本框中。

示例程序采用MemoryMappedFile.CreateOrOpen()方法創(chuàng)建或打開(kāi)一個(gè)內(nèi)存映射文件,然后調(diào)用MemoryMappedViewAccessor類(lèi)的泛型方法Write<T>()和Read<T>()向內(nèi)存映射文件中寫(xiě)入和讀取數(shù)據(jù)。

注意,泛型方法Write<T>()和Read<T>()中的泛型參數(shù)T必須是值類(lèi)型(比如整型int和結(jié)構(gòu)體struct),特別地,對(duì)于用戶(hù)自定義的結(jié)構(gòu)體,要求其成員也必須是值類(lèi)型。

例如,以下結(jié)構(gòu)體將無(wú)法寫(xiě)入到內(nèi)存映射文件中,因?yàn)槠涑蓡TInfo是string類(lèi)型的,這是一個(gè)引用類(lèi)型。

  1. public struct ErrorStruct  
  2. {  
  3.  public string Info;  

之所以要求泛型參數(shù)不能是引用類(lèi)型,其道理非常簡(jiǎn)單,如果結(jié)構(gòu)體中的某個(gè)成員是引用類(lèi)型,那么在程序運(yùn)行時(shí),計(jì)算機(jī)無(wú)法知道應(yīng)該向內(nèi)存映射文件中寫(xiě)入多少個(gè)字節(jié),因?yàn)橐妙?lèi)型的變量所引用的對(duì)象位于托管堆中,其占用存儲(chǔ)空間的大小不經(jīng)過(guò)計(jì)算是難以確定的,而完成這個(gè)計(jì)算工作將花費(fèi)不少的系統(tǒng)資源(想想一個(gè)對(duì)象可能又會(huì)引用到另一個(gè)對(duì)象就明白了),這會(huì)嚴(yán)重影響內(nèi)存映射文件讀寫(xiě)操作效率。

兩個(gè)進(jìn)程不能交換引用類(lèi)型的數(shù)據(jù),這個(gè)限制似乎還不小,但事實(shí)上,我們完成可以通過(guò)對(duì)象序列化技術(shù)來(lái)突破這個(gè)限制,在兩個(gè)進(jìn)程間交換任意大小的對(duì)象(只要內(nèi)存映射文件有足夠的容量)。請(qǐng)看下一小節(jié)的示例UseMMFBetweenProcess2。

4 利用序列化技術(shù)通過(guò)內(nèi)存映射文件實(shí)現(xiàn)進(jìn)程通訊

示例:UseMMFBetweenProcess2 

圖4  .NET內(nèi)存映射文件示例:UseMMFBetweenProcess2

如圖 4所示,運(yùn)行示例程序的多個(gè)實(shí)例,加載圖片并輸入圖片說(shuō)明,點(diǎn)擊相應(yīng)按鈕后,可以在多個(gè)進(jìn)程間直接交換以下格式的信息:

  1. [Serializable]  
  2. class MyPic  
  3. {  
  4.  public Image pic;//圖片  
  5.  public string picInfo;  //圖片信息說(shuō)明  

請(qǐng)注意這是一個(gè)引用類(lèi)型的數(shù)據(jù)對(duì)象,并且它附加了可序列化“[Serializable]”的代碼屬性。

如果要向內(nèi)存映射文件中序列化對(duì)象,必須將內(nèi)存映射文件轉(zhuǎn)換為可順序讀取的流。幸運(yùn)的是,MemoryMappedFile類(lèi)的CreateViewStream()方法可以創(chuàng)建一個(gè)MemoryMappedViewStream對(duì)象,通過(guò)它即可序列化對(duì)象,其代碼框架如下:

  1. //創(chuàng)建或打開(kāi)內(nèi)存映射文件  
  2. MemoryMappedFile memoryFile = MemoryMappedFile.CreateOrOpen(...);  
  3. //創(chuàng)建內(nèi)存映射流  
  4. MemoryMappedViewStream stream = memoryFile.CreateViewStream();  
  5. //創(chuàng)建要在進(jìn)程間交換的信息對(duì)象  
  6. MyPic obj =...;  
  7. //向內(nèi)存映射流中序列化對(duì)象  
  8. IFormatter formatter = new BinaryFormatter();  
  9. stream.Seek(0, SeekOrigin.Begin);  
  10. formatter.Serialize(stream, obj); 

本文來(lái)自bitfan(數(shù)字世界一凡人)的專(zhuān)欄:《.NET 4.0中使用內(nèi)存映射文件實(shí)現(xiàn)進(jìn)程通訊》。

【編輯推薦】

  1. .NET內(nèi)存管理的***實(shí)踐
  2. .NET 4.0內(nèi)存映射文件詳解
  3. .NET真的不用管內(nèi)存嗎?從List﹤T﹥列表聊起
  4. 淺析C#編程中的內(nèi)存管理
  5. .NET 4.0 Beta 1新增STM特性概覽
責(zé)任編輯:yangsai 來(lái)源: bitfan的專(zhuān)欄
相關(guān)推薦

2009-07-24 10:00:38

.NET 4.0內(nèi)存映

2009-02-19 13:28:08

遠(yuǎn)程通訊技術(shù)及原理Java

2023-03-01 10:37:51

2012-06-20 14:16:36

Java內(nèi)存映射

2011-04-25 17:15:39

MongodbMMAP

2018-11-30 09:03:55

HTTP緩存Web

2014-06-13 11:22:18

Https

2011-06-13 09:15:18

AIXlinuxunix

2023-12-07 12:45:58

進(jìn)程共享數(shù)據(jù)

2021-04-27 13:56:49

內(nèi)存.映射地址

2010-03-03 09:16:17

2012-06-29 13:54:11

Java內(nèi)存原型

2019-09-02 14:53:53

JVM內(nèi)存布局GC

2023-08-03 07:30:01

JavaNIO庫(kù)

2025-05-12 09:12:59

2009-07-17 13:55:02

WinCE文件目錄

2011-06-16 10:27:55

.NET內(nèi)存泄漏

2024-03-20 10:48:09

Java 8內(nèi)存管理

2023-02-07 08:55:04

進(jìn)程棧內(nèi)存底層

2025-10-11 04:11:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久久久久国产精品美女| 日韩欧美一区二区三区久久| 91亚洲精品丁香在线观看| 久久久久久福利| 免费成人结看片| 在线成人av影院| 草草久久久无码国产专区| 91精品专区| 丁香亚洲综合激情啪啪综合| 国产精品v片在线观看不卡| 中文字幕人妻一区二| 日韩精品免费一区二区夜夜嗨 | 日本视频www| 欧美日韩有码| 日韩av有码在线| 涩多多在线观看| 国产免费不卡| 亚洲综合在线免费观看| 色综合影院在线观看| www.久久综合| 美女视频网站黄色亚洲| 欧美性受xxx| av黄色免费在线观看| 午夜先锋成人动漫在线| 精品少妇一区二区三区日产乱码 | 久久久国产精品成人免费| 99久久精品国产亚洲精品| 日韩国产精品视频| 美女扒开腿免费视频| 久久久国产精品网站| 欧美日韩人人澡狠狠躁视频| 国产肉体ⅹxxx137大胆| 国产一二区在线观看| 国产亚洲精品7777| 久久国产精品99久久久久久丝袜| 99久久国产热无码精品免费| 老司机午夜免费精品视频| 国内精品视频在线| 久久久久国产精品夜夜夜夜夜| 亚洲色图国产| 久久精品成人欧美大片| 久久久久亚洲AV成人无在| 免费成人网www| 日韩av在线免费| 国产成人精品无码片区在线| 91精品啪在线观看国产爱臀| 日韩午夜激情av| 日韩a一级欧美一级| 自拍偷拍亚洲图片| 欧美在线小视频| 美女黄色片视频| 日韩一级二级| 欧美三级电影网| 日韩精品你懂的| 欧美videos粗暴| 欧美另类变人与禽xxxxx| 污污网站在线观看视频| 亚洲精品一区av| 67194成人在线观看| 激情在线观看视频| 午夜精品在线| 亚洲第一级黄色片| 一出一进一爽一粗一大视频| 一区二区三区韩国免费中文网站| 亚洲女人天堂成人av在线| 午夜精产品一区二区在线观看的| 欧美色图激情小说| 不用播放器成人网| 少妇久久久久久被弄高潮| 国产一区日韩一区| 4p变态网欧美系列| 波多野结衣视频网址| 免费一级欧美片在线观看| 国产日韩欧美在线观看| 精品乱子伦一区二区| www.在线欧美| 色播亚洲婷婷| 成年人在线观看网站| 综合激情成人伊人| 成人免费观看cn| 美女福利一区二区| 777xxx欧美| 李丽珍裸体午夜理伦片| 精品视频99| 久久久精品国产亚洲| 日韩欧美国产亚洲| 青青草成人在线观看| 91久久偷偷做嫩草影院| 欧美色综合一区二区三区| 国产精品国产三级国产普通话99| 国产精品视频网站在线观看| 欧美日韩大片| 日韩一区二区电影| 中文幕无线码中文字蜜桃| 性欧美69xoxoxoxo| 国内自拍欧美激情| 亚洲 小说区 图片区| 国产成人h网站| 日韩欧美在线观看强乱免费| 影音先锋在线播放| 欧美亚洲国产一区二区三区 | 91福利免费视频| 不卡大黄网站免费看| 亚洲欧洲精品一区| 欧美一级鲁丝片| 91精品国产91久久综合桃花 | 亚洲欧美欧美一区二区三区| 自慰无码一区二区三区| 久久一级大片| 亚洲最新视频在线| 日本一级一片免费视频| 国产另类ts人妖一区二区| 视频三区二区一区| 青青青免费在线视频| 日韩精品在线网站| 肉色超薄丝袜脚交69xx图片| 亚洲综合二区| 国产三级精品在线不卡| 91三级在线| 欧美日韩免费一区二区三区视频| 亚洲综合自拍网| 黄色日韩精品| 亚洲一区二区三区四区在线播放| 成人高清网站| 91成人在线观看喷潮| 午夜不卡久久精品无码免费| 亚洲天天综合| 国产专区欧美专区| 四虎久久免费| 欧美午夜在线一二页| 国产全是老熟女太爽了| 99精品99| 精品久久久久亚洲| 福利在线免费视频| 亚洲精品ady| 国产一级一级片| 成人免费视频视频| 精品免费久久久久久久| 久久久久毛片免费观看| 伦伦影院午夜日韩欧美限制| 国产伦理吴梦梦伦理| 国产精品你懂的| 三级a三级三级三级a十八发禁止| 欧洲激情综合| 国产精品视频久久久| chinese偷拍一区二区三区| 欧美亚洲国产一区二区三区| 女人黄色一级片| 蓝色福利精品导航| 手机在线视频你懂的| 精品视频在线观看免费观看| 九九久久久久99精品| 午夜精品一区二区三| 天天av天天翘天天综合网色鬼国产| 亚洲综合自拍网| 久久午夜av| 亚洲最大免费| 日韩在线观看中文字幕| 97精品在线视频| 欧美女优在线观看| 欧美日韩大陆一区二区| 波多野结衣家庭教师| 国产.精品.日韩.另类.中文.在线.播放| 黄色网址在线免费看| 国产 日韩 欧美| 欧美国产日韩视频| 无码精品视频一区二区三区| 精品久久久久久国产91| 黄色国产在线观看| 日日摸夜夜添夜夜添国产精品 | 99视频在线观看免费| 亚洲欧美色一区| 粉色视频免费看| 99久久亚洲精品蜜臀| 91免费欧美精品| 欧美黑人猛交的在线视频| 精品国产伦一区二区三区观看方式| 久久视频免费在线观看| 91免费在线播放| 日本免费不卡一区二区| 久久社区一区| 国产精品成人观看视频免费| 涩涩视频在线播放| 日韩电影大片中文字幕| 91福利在线观看视频| 亚洲激情五月婷婷| 亚洲av无码一区二区三区网址| 羞羞答答国产精品www一本| 一区二区三区在线观看www| 欧美午夜在线播放| 97在线视频免费看| а天堂8中文最新版在线官网| 91激情五月电影| 国产免费一区二区三区四区| 成a人片亚洲日本久久| 欧美亚洲日本在线观看| 99热在线成人| 免费精品视频一区二区三区| 国产91亚洲精品久久久| 欧美另类在线观看| 蜜桃视频在线观看视频| 精品久久人人做人人爽| 波多野结衣视频网址| 一区二区三区欧美在线观看| 成人精品999| 成人av在线资源| 国内国产精品天干天干| 91久久在线| 欧美爱爱视频网站| 成人精品电影| 国模精品娜娜一二三区| 日韩欧国产精品一区综合无码| 久久久久久久一| 在线免费观看污| 中文字幕9999| 天天操天天操天天操| 91精品国产综合久久精品麻豆 | 菠萝菠萝蜜在线观看| 中文字幕日韩高清| 天天干,天天操,天天射| 91精品国产色综合久久不卡蜜臀| 国产超碰人人爽人人做人人爱| ●精品国产综合乱码久久久久| 中文字幕av观看| 国产麻豆精品一区二区| 9久久婷婷国产综合精品性色| 欧美日韩少妇| 777久久精品一区二区三区无码| 精品一二三区| 欧美精品二区三区四区免费看视频 | 欧美韩日一区| 日韩精品最新在线观看| 天天躁日日躁狠狠躁欧美巨大小说| 91在线免费视频| 久久久久久久性潮| 人九九综合九九宗合| av在线加勒比| 欧美人与物videos| 黄色国产网站在线播放| 在线视频日本亚洲性| 青青草娱乐在线| 亚洲国产天堂网精品网站| www.天堂在线| 精品欧美一区二区在线观看| av免费在线不卡| 91麻豆精品国产无毒不卡在线观看| 午夜视频网站在线观看| 欧美另类z0zxhd电影| 影音先锋国产在线| 欧美午夜不卡在线观看免费| 中文字幕在线播| 欧美最猛黑人xxxxx猛交| 日本中文字幕久久| 日韩欧美中文字幕在线播放| www.国产高清| 色综合天天综合在线视频| 99热国产在线观看| 韩曰欧美视频免费观看| 影音先锋亚洲天堂| 在线观看91精品国产入口| 草莓视频18免费观看| 色欧美88888久久久久久影院| 99超碰在线观看| 在线精品视频免费播放| 瑟瑟视频在线免费观看| 9191久久久久久久久久久| 国产精品永久久久久久久久久| 欧美年轻男男videosbes| 999久久久久| 日韩大陆毛片av| 成人免费一区二区三区视频网站| 最近2019年好看中文字幕视频 | 台湾天天综合人成在线| 国产成人久久久| 9999精品视频| 国产91一区二区三区| 美女网站色精品尤物极品姐弟| 国语精品免费视频| 久久97精品| 翔田千里亚洲一二三区| 国产精品精品| a级黄色小视频| 日本麻豆一区二区三区视频| 亚洲一区二区三区观看| 粉嫩av亚洲一区二区图片| 国产黄色大片免费看| 最新高清无码专区| 国产小视频在线观看免费| 色综合天天综合在线视频| 精品人妻伦一区二区三区久久 | 国产精品爽黄69| 欧美黄色一级| 美媛馆国产精品一区二区| 国产成人影院| 欧美久久久久久久久久久久久久| 最新日韩在线| 污污网站免费看| 高清av一区二区| 国产黄片一区二区三区| 亚洲视频一区二区在线| 日本熟妇毛茸茸丰满| 91精品啪在线观看国产60岁| 天天射,天天干| 丝袜情趣国产精品| 亚洲人成午夜免电影费观看| 国产日韩欧美自拍| 欧美绝顶高潮抽搐喷水合集| 欧美视频观看一区| 99这里有精品| 人人爽人人爽av| 久久伊人中文字幕| 日本三级片在线观看| 欧美日韩免费观看一区二区三区 | 狠狠干一区二区| 日韩不卡一区| 成人免费xxxxx在线视频| 成人综合婷婷国产精品久久| 日本不卡一区视频| 在线视频国内自拍亚洲视频| 狠狠综合久久av一区二区| 中文日韩电影网站| 91九色国产在线播放| 国产日韩欧美在线看| 真实原创一区二区影院| 亚洲一区三区| 欧美aaa在线| 亚洲精品午夜视频| 天天综合网 天天综合色| 国产成人无码www免费视频播放| 色老头一区二区三区| 欧美一级大片| 日本免费高清不卡| 99精品福利视频| 91免费视频黄| 蜜臀av一级做a爰片久久| 欧美夫妇交换xxx| 亚洲精品免费在线| 精品久久久久成人码免费动漫| 中文字幕九色91在线| 精品国产免费人成网站| 久久五月天婷婷| 99视频精品免费观看| 日本少妇xxxx软件| 最新久久zyz资源站| 在线观看免费观看在线| 国产一区二区三区在线免费观看| 美女18一级毛片一品久道久久综合| 欧美人与性禽动交精品| 欧美亚洲视频| www.久久av| 欧美午夜视频网站| 在线免费看黄| 国产精品一区二区三区免费视频 | 国产精品视频中文字幕| 国产精品久久久久久久久久久免费看 | 亚洲第一精品在线| 人妻丰满熟妇av无码区hd| 久久久久久久久亚洲| 欧美午夜寂寞| 黄色片久久久久| 欧美极品aⅴ影院| av网站在线免费看| 久久91精品国产| 高潮按摩久久久久久av免费| 女性女同性aⅴ免费观女性恋| 99国产一区二区三精品乱码| av大片免费在线观看| 中文字幕免费国产精品| 国产亚洲精彩久久| 中文有码久久| 国产一区二区在线影院| 久草视频在线资源站| 亚洲大尺度美女在线| 97在线视频免费观看完整版| 激情视频一区二区| 日本特黄久久久高潮| 人妻大战黑人白浆狂泄| 欧美精品精品一区| 国产第一页在线视频| 激情伦成人综合小说| 久久99热这里只有精品| 一区二区成人免费视频| 91精品综合久久久久久| 2021天堂中文幕一二区在线观| 免费日韩av电影| 噜噜噜久久亚洲精品国产品小说| 2014亚洲天堂| 精品国产91久久久久久久妲己 | 国产精品久久久久久久久久久久久| 久久在线播放| 免费观看一级一片| 欧美日韩大陆一区二区| 国产精品—色呦呦| 亚洲一区二区三区色| 成人av网站在线观看免费| 午夜精品免费观看| 97视频在线观看视频免费视频 | 日韩av一卡二卡| 亚洲欧洲二区| 少妇高潮喷水在线观看|