黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

UNIX 共享內存應用中的問題及解決方法

瀏覽:28日期:2024-06-14 08:04:26

簡介

共享內存是一種非常重要且常用的進程間通信方式,相對于其它IPC機制,因其速度最快、效率最高,被廣泛應用于各類軟件產品及應用開發中。System V IPC 為Unix平臺上的共享內存應用制定了統一的API標準,從而為在UNIX/Linux平臺上進行跨平臺開發提供了極大的便利;開發人員基于一套基本相同的源代碼,便可開發出同時支持AIX、Solaris、HP-UX、Linux等平臺的產品。

然而,各個平臺對System V 標準的API在實現上各有差異,由此對相關應用開發帶來影響,甚至引入難以調試的問題。本文將結合作者在Tivoli產品開發中的實際經驗,對這些平臺相關的問題,以及具有共性的問題,逐一進行分析,并提出解決方法。

1. System V共享內存概述

System V 進程間通信(IPC)包括3種機制:消息隊列、信號量、共享內存。消息隊列和信號量均是內核空間的系統對象,經由它們的數據需要在內核和用戶空間進行額外的數據拷貝;而共享內存和訪問它的所有應用程序均同處于用戶空間,應用進程可以通過地址映射的方式直接讀寫內存,從而獲得非常高的通信效率。

System V 為共享內存定義了下列API接口函數:

# include <sys/types.h># include <sys/ipc.h># include <sys/shm.h>key_t ftok(const char *pathname, int proj_id);int shmget(key_t key, int size, int shmflg);void* shmat(int shmid, const void *shmaddr, int shmflg);int shmdt(void *shmaddr);int shmctl(int shmid, int cmd, struct shmid_ds *buf);

ftok函數用于生成一個鍵值:key_t key,該鍵值將作為共享內存對象的唯一性標識符,并提供給為shmget函數作為其輸入參數;ftok 函數的輸入參數包括一個文件(或目錄)路徑名:pathname,以及一個額外的數字:proj_id,其中pathname所指定的文件(或目錄)要求必須已經存在,且proj_id不可為0;shmget函數用于創建(或者獲取)一個由key鍵值指定的共享內存對象,返回該對象的系統標識符:shmid;shmat函數用于建立調用進程與由標識符shmid指定的共享內存對象之間的連接;shmdt函數用于斷開調用進程與共享內存對象之間的連接;shmctl函數用于對已創建的共享內存對象進行查詢、設值、刪除等操作;

2. ftok的陷阱

根據pathname指定的文件(或目錄)名稱,以及proj_id參數指定的數字,ftok函數為IPC對象生成一個唯一性的鍵值。在實際應用中,很容易產生的一個理解是,在proj_id相同的情況下,只要文件(或目錄)名稱不變,就可以確保ftok返回始終一致的鍵值。然而,這個理解并非完全正確,有可能給應用開發埋下很隱晦的陷阱。因為ftok的實現存在這樣的風險,即在訪問同一共享內存的多個進程先后調用ftok函數的時間段中,如果pathname指定的文件(或目錄)被刪除且重新創建,則文件系統會賦予這個同名文件(或目錄)新的i節點信息,于是這些進程所調用的ftok雖然都能正常返回,但得到的鍵值卻并不能保證相同。由此可能造成的后果是,原本這些進程意圖訪問一個相同的共享內存對象,然而由于它們各自得到的鍵值不同,實際上進程指向的共享內存不再一致;如果這些共享內存都得到創建,則在整個應用運行的過程中表面上不會報出任何錯誤,然而通過一個共享內存對象進行數據傳輸的目的將無法實現。

AIX、Solaris、HP-UX均明確指出,key文件被刪除并重建后,不保證通過ftok得到的鍵值不變,比如AIX上ftok的man幫助信息即聲明:

Attention: If the Path parameter of the ftok subroutine names a file that has been removed while keys still refer to it, the ftok subroutine returns an error. If that file is then re-created, the ftok subroutine will probably return a key different from the original one.

Linux沒有提供類似的明確聲明,但我們可以通過下面的簡單例程test01.c,得到相同的印證:

#include <stdio.h>#include <sys/ipc.h>void main(int argc, char* argv[]){if (argc !=2 ) {printf("Usage: %s KeyFilen e.g. %s /tmp/mykeyfilen", argv[0], argv[0]);return;}printf("Key generated by ftok: 0x%xn", ftok(argv[1], 1));}

將上述例程在Red Hat Enterprise Linux AS release 4平臺上編程成可執行程序test01,并且通過touch命令在 /tmp目錄下創建一個新文件mykeyfile,然后為該文件生成鍵值:

# touch /tmp/mykeyfile# ./test01 /tmp/mykeyfileKey generated by ftok: 0x101000b

然后,將/tmp/mykeyfile刪除,并且通過vi命令重新創建該文件,再次生成鍵值:

# ./test01 /tmp/mykeyfileKey generated by ftok: 0x1010017

我們可以看到,雖然文件名稱都是 /tmp/mykeyfile,并未改變,但由于中間發生了文件刪除并重新創建的操作,前后兩次所得到的鍵值已經不再相同。

避免此類問題最根本的方法,就是采取措施保證pathname所指定的文件(或目錄)在共享內存的使用期間不被刪除,不要使用有可能被刪除的文件;或者干脆直接指定鍵值,而不借助ftok來獲取鍵值。

3. AIX中shmat的問題

AIX系統中,System V各類進程間通信機制在使用中均存在限制。區別于其它UNIX操作系統對IPC機制的資源配置方式,AIX使用了不同的方法;在AIX中定義了 IPC 機制的上限, 且是不可配置的。就共享內存機制而言,在4.2.1及以上版本的AIX系統上,存在下列限制:

對于64位進程,同一進程可連接最多268435456個共享內存段;

對于32位進程,同一進程可連接最多11個共享內存段,除非使用擴展的shmat;

上述限制對于64位應用不會帶來麻煩,因為可供連接的數量已經足夠大了;但對于32位應用,卻很容易帶來意外的問題,因為最大的連接數量只有11個。在某些事件觸發的多線程應用中,新的線程不斷地為進行事件處理而被創建,這些線程如果都需要去連接特定的共享內存,則極有可能造成該進程連接的共享內存數量超過11個,事實上同時擁有幾十個甚至上百個處理線程的應用并不少見。一旦超個這個限制值,則所有后續的處理線程都將無法正常工作,從而導致應用運行失敗。

下面的例程test02.c演示了這個問題,為了精簡代碼,它反復連接的是同一個共享內存對象;實際上,無論所連接的共享內存對象是否相同,該限制制約的是連接次數:

#include <stdio.h>#include <errno.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define MAX_ATTACH_NUM 15void main(int argc, char* argv[]){key_t  mem_key;longmem_id;void*  mem_addr[MAX_ATTACH_NUM];int i;if ( ( mem_key = ftok("/tmp/mykeyfile", 1) ) == (key_t)(-1) ) {printf("Failed to generate shared memory access key, ERRNO=%dn",errno);goto MOD_EXIT;}if ( ( mem_id = shmget(mem_key, 256, IPC_CREAT) ) == (-1) ) {printf("Failed to obtain shared memory ID, ERRNO=%dn", errno);goto MOD_EXIT;}for ( i=1; i<=MAX_ATTACH_NUM; i++ ) {if ( ( mem_addr[i] = (void *)shmat(mem_id, 0, 0) ) == (void *)(-1) )printf("Failed to attach shared memory, times [%02d], errno:%dn", i,errno);elseprintf("Successfully attached shared memory, times [%02d]n", i);}MOD_EXIT:shmctl(mem_id, IPC_RMID, NULL);}

在AIX系統上,我們將其編譯為test02,并運行,可以看到如下輸出:

Successfully attached shared memory, times [01]Successfully attached shared memory, times [02]Successfully attached shared memory, times [03]Successfully attached shared memory, times [04]Successfully attached shared memory, times [05]Successfully attached shared memory, times [06]Successfully attached shared memory, times [07]Successfully attached shared memory, times [08]Successfully attached shared memory, times [09]Successfully attached shared memory, times [10]Successfully attached shared memory, times [11]Failed to attach shared memory, times [12], errno:24Failed to attach shared memory, times [13], errno:24Failed to attach shared memory, times [14], errno:24Failed to attach shared memory, times [15], errno:24

說明超出11個連接之后,所有后續的共享內存連接都將無法建立。錯誤碼24的定義是EMFILE,AIX給予的解釋是:

The number of shared memory segments attached to the calling process exceeds the system-imposed limit。

解決這個問題的方法是,使用擴展的shmat;具體而言就是,在運行相關應用之前(確切地說,是在共享內存被創建之前),首先在shell中設置EXTSHM環境變量,通過它擴展shmat,對于源代碼本身無需作任何修改:

export EXTSHM=ON

值得注意的是,雖然設置環境變量,在程序中也可通過setenv函數來做到,比如在程序的開始,加入下列代碼:

setenv("EXTSHM", "ON", 1);

但實踐證明這樣的方法在解決這個問題上是無效的;也就是說唯一可行的辦法,就是在shell中設置EXTSHM環境變量,而非在程序中。

在AIX上配置32位DB2實例時,也要求確保將環境變量 EXTSHM 設為 ON,這是運行 Warehouse Manager 和 Query Patroller 之前必需的操作:

export EXTSHM=ONdb2set DB2ENVLIST=EXTSHMdb2start

其原因即來自我們剛剛介紹的AIX中32位應用連接共享內存時,存在最大連接數限制。這個問題同樣普遍存在于AIX平臺上Oracle等軟件產品中。

4. HP-UX中shmget和shmat的問題

4.1 32位和64位應用兼容問題

在HP-UX平臺上,如果同時運行32位應用和64位應用,而且它們訪問的是一個相同的共享內存區,則會遇到兼容性問題。

在HP-UX中,應用程序設置IPC_CREAT標志調用shmget,所創建的共享內存區,只可被同類型的應用所訪問;即32位應用程序所創建的共享內存區只可被其它的32位應用程序訪問,同樣地,64位應用程序所創建的共享內存區只可被其它的64位應用程序訪問。

如果,32位應用企圖訪問一個由64位應用創建的共享內存區,則會在調用shmget時失敗,得到EINVAL錯誤碼,其解釋是:

A shared memory identifIEr exists for key but is in 64-bit address space and the process performing the request has been compiled as a 32-bit executable.

解決這一問題的方法是,當64位應用創建共享內存時,合并IPC_CREAT標志,同時給定IPC_SHARE32標志:

shmget(mem_key, size, 0666 | IPC_CREAT | IPC_SHARE32)

對于32位應用,沒有設定IPC_SHARE32標志的要求,但設置該標志并不會帶來任何問題,也就是說無論應用程序將被編譯為32位還是64位模式,都可采用如上相同的代碼;并且由此解決32位應用和64位應用在共享內存訪問上的兼容性問題。

4.2 對同一共享內存的連接數限制

在HP-UX上,應用進程對同一個共享內存區的連接次數被限制為最多1次;區別于上面第3節所介紹的AIX上的連接數限制,HP-UX并未對指向不同共享內存區的連接數設置上限,也就是說,運行在HP-UX上的應用進程可以同時連接很多個不同的共享內存區,但對于同一個共享內存區,最多只允許連接1次;否則,shmat調用將失敗,返回錯誤碼EINVAL,在shmat的man幫助中,對該錯誤碼有下列解釋:

shmid is not a valid shared memory identifier, (possibly because the shared memory segment was already removed using shmctl(2) with IPC_RMID), or the calling process is already attached to shmid.

這個限制會對多線程應用帶來無法避免的問題,只要一個應用進程中有超過1個以上的線程企圖連接同一個共享內存區,則都將以失敗而告終。

解決這個問題,需要修改應用程序設計,使應用進程具備對同一共享內存的多線程訪問能力。相對于前述問題的解決方法,解決這個問題的方法要復雜一些。

作為可供參考的方法之一,以下介紹的邏輯可以很好地解決這個問題:

基本思路是,對于每一個共享內存區,應用進程首次連接上之后,將其鍵值(ftok的返回值)、系統標識符(shmid,shmget調用的返回值)和訪問地址(即shmat調用的返回值)保存下來,以這個進程的全局數組或者鏈表的形式留下記錄。在任何對共享內存的連接操作之前,程序都將先行檢索這個記錄列表,根據鍵值和標志符去匹配希望訪問的共享內存,如果找到匹配記錄,則從記錄中直接讀取訪問地址,而無需再次調用shmat函數,從而解決這一問題;如果沒有找到匹配目標,則調用shmat建立連接,并且為新連接上來的共享內存添加一個新記錄。

記錄條目的數據結構,可定義為如下形式:

typedef struct _Shared_Memory_Record{key_tmem_key;// key generated by ftok()intmem_id;// id returned by shmget()void*mem_addr;// access address returned by shmat()intnattach;// times of attachment} Shared_Memory_Record;

其中,nattach成員的作用是,記錄當前對該共享內存區的連接數目;每一次打開共享內存的操作都將對其進行遞增,而每一次關閉共享內存的操作將其遞減,直到nattach的數值降到0,則對該共享內存區調用shmdt進行真正的斷開連接。

打開共享內存的邏輯流程可參考如下圖一:

圖一

關閉共享內存的邏輯流程可參考如下圖二:

圖二

5. Solaris中的shmdt函數原型問題

Solaris系統中的shmdt調用,在原型上與System V標準有所不同,

Default int shmdt(char *shmaddr);

即形參shmaddr的數據類型在Solaris上是char *,而System V定義的是void * 類型;實際上Solaris上shmdt調用遵循的函數原型規范是SVID-v4之前的標準;以Linux系統為例,libc4和libc5 采用的是char * 類型的形參,而遵循SVID-v4及后續標準的glibc2及其更新版本,均改為采用void * 類型的形參。

如果仍在代碼中采用System V的標準原型,就會在Solaris上編譯代碼時造成編譯錯誤;比如:

Error: Formal argument 1 of type char* in call to shmdt(char*)is being passed void*.

解決方法是,引入一個條件編譯宏,在編譯平臺是Solaris時,采用char * 類型的形參,而對其它平臺,均仍采用System V標準的void * 類型形參,比如:

#ifdef _SOLARIS_SHARED_MEMORYshmdt((char *)mem_addr);#else shmdt((void *)mem_addr);#endif

6. 通過shmctl刪除共享內存的風險

當進程斷開與共享內存區的連接后,一般通過如下代碼刪除該共享內存:

shmctl(mem_id, IPC_RMID, NULL);

從HP-UX上shmctl函數的man幫助,我們可以看到對IPC_RMID操作的說明:

IPC_RMID Remove the shared memory identifier specified by shmid from the system and destroy the shared memory segment and data structure associated with it. If the segment is attached to one or more processes, then the segment key is changed to IPC_PRIVATE and the segment is marked removed. The segment disappears when the last attached process detaches it.

其它UNIX平臺也有類似的說明。關于shmctl的IPC_RMID操作,其使用特點可簡述如下:

如果共享內存已經與所有訪問它的進程斷開了連接,則調用IPC_RMID子命令后,系統將立即刪除共享內存的標識符,并刪除該共享內存區,以及所有相關的數據結構;

如果仍有別的進程與該共享內存保持連接,則調用IPC_RMID子命令后,該共享內存并不會被立即從系統中刪除,而是被設置為IPC_PRIVATE狀態,并被標記為"已被刪除";直到已有連接全部斷開,該共享內存才會最終從系統中消失。

于是,存在這樣的一種狀態:

N個進程(進程1至進程N)已經與某共享內存區連接;

進程1已完成對此共享內存的操作,斷開連接后,調用shmctl的IPC_RMID子命令,企圖刪除該共享內存;

由于進程2至進程N仍保持與該共享內存的連接,因此在它們全部斷開連接之前,這個共享內存區毫無疑問地會依然存在。

此時,如果有其它的進程(比如第N+1號進程)想建立對這個共享內存的連接,是否能夠成功呢?

類似的狀態,在Windows上同樣存在,只是程序借助的API有所不同,比如通過CreateFileMapping函數創建共享內存,通過MapViewOfFile函數建立連接,通過UnmapViewOfFile函數斷開連接,通過CloseHandle函數刪除共享內存等。在Windows上,對此問題的回答是肯定的;也就是說,只要共享內存依然存在,則進程總是可以建立對它的連接,而無論之前是否有進程對其執行過刪除操作。

然而,對于包括AIX、Solaris、HP-UX等在內的UNIX平臺,答案卻是否定的!這也正是本節所討論的使用shmctl中的風險所在;通過以下test03.P1.c和test03.P2.c兩個例程,我們可以很直觀地得到答案:

test03.P1.c: 創建共享內存,并建立連接,保持10秒后(在此期間,test03.P2將反復連接、并刪除該共享內存),斷開連接,并最后再次嘗試連接以驗證該共享內存是否已被真正刪除;

test03.P2.c: 反復連接由test03.P1創建的共享內存,并在期間通過shmctl的IPC_RMID 子命令刪除該共享內存,以觀察共享內存被執行刪除操作之后,在被徹底銷毀之前是否還能接受連接;

/******* test03.P1.c ********/#include <stdio.h>#include <unistd.h>#include <errno.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>int main(int argc, char* argv[]){key_t  mem_key;long mem_id;void* mem_addr;intisAttached = 0;mem_key = ftok("/tmp/mykeyfile", 1);mem_id = shmget(mem_key, 256, IPC_CREAT);if ( ( mem_addr = (void *)shmat(mem_id, 0, 0) ) == (void *)(-1) ) printf("%s, Failed to attach shared memory, errno:%dn", argv[0], errno);else {isAttached = 1;printf("%s, +.Successfully attached shared memoryn", argv[0]);  }/* sleep 10 seconds, to wait test03.P2 to run */sleep(10);if (isAttached) {// Attention: the following line should be "shmdt((char *)mem_addr);" ifon Solarisshmdt((void *)mem_addr);printf("%s, -.Successfully detached shared memoryn", argv[0]);}/* try to attach the shared memory which has been removed! */if ( ( mem_addr = (void *)shmat(mem_id, 0, 0) ) == (void *)(-1) )printf("%s, Failed to attach the removed shared memory, errno:%dn",argv[0], errno); return 0;}/******* test03.P2.c ********/#include <stdio.h>#include <errno.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>int main(int argc, char* argv[]){key_t mem_key;  long  mem_id;void*  mem_addr;inti, isAttached;mem_key = ftok("/tmp/mykeyfile", 1);mem_id = shmget(mem_key, 0, 0);// repeated attaching & detachingfor (i=1; i<10; i++) {isAttached = 0;if ( ( mem_addr = (void *)shmat(mem_id, 0, 0) ) == (void *)(-1) )printf("%s, Failed to attach shared memory, times [%02d],errno:%dn", argv[0], i, errno);  else {  isAttached = 1; printf("%s, +.Successfully attached shared memory, times[%02d]n",argv[0], i);}  if (isAttached) { // Attention: the following line should be "shmdt((char*)mem_addr);", if on Solarisshmdt((void *)mem_addr);  printf("%s, -.Successfully detached, times [%02d]n", argv[0], i);  }// purposely remove the shared memory at times [5]if (i==5) {shmctl(mem_id, IPC_RMID, NULL);printf("%s, *.Remove executed, times [%02d], errno=%dn",argv[0], i, errno);}}return 0;}

上述程序均可在AIX、HP-UX、Linux平臺上編譯通過;在Solaris平臺上只需按注釋提示的要求,將shmdt的參數強制為char *類型也可編譯通過(第5節中已介紹過)。

將test03.P1.c、test03.P2.c各自編譯為可執行程序test03.P1、test03.P2,并通過下面的shell腳本:runtest,運行它們:

#!/bin/sh./test03.P1&sleep 2./test03.P2

在Linux平臺(Red Hat 8.0)上的運行結果如下:

[root@localhost tmp]# ./runtest./test03.P1, +.Successfully attached shared memory./test03.P2, +.Successfully attached shared memory, times [01]./test03.P2, -.Successfully detached, times [01]./test03.P2, +.Successfully attached shared memory, times [02]./test03.P2, -.Successfully detached, times [02]./test03.P2, +.Successfully attached shared memory, times [03]./test03.P2, -.Successfully detached, times [03]./test03.P2, +.Successfully attached shared memory, times [04]./test03.P2, -.Successfully detached, times [04]./test03.P2, +.Successfully attached shared memory, times [05]./test03.P2, -.Successfully detached, times [05]./test03.P2, *.Remove executed, times [05], errno=0./test03.P2, +.Successfully attached shared memory, times [06]./test03.P2, -.Successfully detached, times [06]./test03.P2, +.Successfully attached shared memory, times [07]./test03.P2, -.Successfully detached, times [07]./test03.P2, +.Successfully attached shared memory, times [08]./test03.P2, -.Successfully detached, times [08]./test03.P2, +.Successfully attached shared memory, times [09]./test03.P2, -.Successfully detached, times [09][root@localhost tmp]# ./test03.P1, -.Successfully detached shared memory./test03.P1, Failed to attach the removed shared memory, errno:22

根據運行結果,我們可以看到,在Linux平臺上,即便對共享內存執行了刪除操作(在第5次連接之后,test03.P2進程調用了shmctl的IPC_RMID刪除操作),只要該共享內存依然存在(test03.P1進程保持著連接,因此共享內存不會被立即刪除),則它仍然是可連接的(test03.P2進程的第6到第9次連接均是成功的)。

然而,在AIX、HP-UX、Solaris平臺上的運行結果卻不同于Linux:

# ./runtest./test03.P1, +.Successfully attached shared memory./test03.P2, +.Successfully attached shared memory, times [01]./test03.P2, -.Successfully detached, times [01]./test03.P2, +.Successfully attached shared memory, times [02]./test03.P2, -.Successfully detached, times [02]./test03.P2, +.Successfully attached shared memory, times [03]./test03.P2, -.Successfully detached, times [03]./test03.P2, +.Successfully attached shared memory, times [04]./test03.P2, -.Successfully detached, times [04]./test03.P2, +.Successfully attached shared memory, times [05]./test03.P2, -.Successfully detached, times [05]./test03.P2, *.Remove executed, times [05], errno=0./test03.P2, Failed to attach shared memory, times [06], errno:22./test03.P2, Failed to attach shared memory, times [07], errno:22./test03.P2, Failed to attach shared memory, times [08], errno:22./test03.P2, Failed to attach shared memory, times [09], errno:22# ./test03.P1, -.Successfully detached shared memory./test03.P1, Failed to attach the removed shared memory, errno:22

根據結果,可以發現,test03.P2進程的第6到第9次連接都是失敗的,也就說明,在AIX、HP-UX、Solaris平臺上一旦通過shmctl對共享內存進行了刪除操作,則該共享內存將不能再接受任何新的連接,即使它依然存在于系統中!

而且,上面的運行結果,也證明了,對共享內存進行了刪除操作之后,當已有的連接全部斷開,該共享內存將被系統自動銷毀(運行結果的最后一行,說明該共享內存已經不存在了)。

本節的目的在于說明,在AIX、HP-UX、Solaris平臺上調用shmctl的IPC_RMID刪除操作,是存在潛在風險的,需要足夠的謹慎。

如果,可以確知,在刪除之后不可能再有新的連接,則執行刪除操作是安全的;

否則,在刪除操作之后如仍有新的連接發生,則這些連接都將失敗!

7. 結論

對共享內存的操作,往往是產品或者應用中數據傳輸的基礎,對其可靠性和性能至關重要;而且作為底層的IPC機制,相關代碼具有不易調試的特點,由其造成的問題往往關鍵卻不容易解決。

本文從應用實現的角度上,對在UNIX/Linux平臺上使用共享內存可能會遇到的問題,進行了全面的介紹和分析,并給出了解決方法或建議,可供相關的應用開發人員參考。

標簽: Unix系統
主站蜘蛛池模板: 中文字幕一区二区三区四区不卡 | 国产成人毛毛毛片 | 亚洲国产大片 | 妖精视频一区二区 | 国产激情视频一区 | 国产又黄又爽又色的视频 | 中国女人裸体乱淫 | 亚洲精品一品区二品区三品区 | 亚洲天堂av网站 | 免费av大片| 精品久久久久一区二区国产 | 一卡二卡三卡在线观看 | 国产伦精品一区二区三区四区视频_ | 亚洲午夜天堂 | 久久精品人妻少妇一区二区三区 | 欧美日韩喷水 | 国产婷婷色一区二区三区 | 日韩av一区在线 | 久久久久女人精品毛片九一 | 毛片网站在线免费观看 | 成人做受黄大片 | 国产午夜大地久久 | 中文字幕精品一二三四五六七八 | 久久国产36精品色熟妇 | 一区二区三区视频免费看 | av无码国产精品色午夜 | 成人男女做爰免费视频网老司机 | www一区二区www免费 | 国产偷抇久久精品a片69 | 中文字字幕在线中文 | 成人国产一区二区 | 国产粉嫩高中无套进入 | 激情四射网 | 国产97色在线 | 免 | 国产福利视频 | 伊人影音 | 波多野结衣电车 | 色综合中文 | 久久99国产精品成人 | 柳岩高潮三级a观看 | 成人免费在线视频观看 | 日本色一区 | 日韩婷婷 | 日本美女一区 | 精品国产aⅴ一区二区三区 精品国产va久久久久久久 | 久久久久国产一区二区三区 | 91日本视频 | 一级片在线 | 麻豆精品视频 | 伊人国产在线视频 | 四十如虎的丰满熟妇啪啪 | 久久久久se色偷偷亚洲精品av | cao我| 日韩无码电影 | 欧美一区二区三区在线 | 91在线超碰| 欧洲女人牲交性开放视频 | 免费成人深夜夜行网站视频 | 秋霞福利视频 | 亚洲高清免费 | 亚洲春色综合另类网 | 色呦呦网站在线观看 | 99av成人精品国语自产拍 | 99久久久国产精品免费蜜臀 | 人妻丰满熟妇aⅴ无码 | 精品乱 | 欧美激情视频一区二区三区 | 日本肉体xxxx裸体784大胆 | 欧洲黄色录像 | 日本高清成本人视频一区 | 欧美激情黑白配 | 狠狠躁天天躁无码中文字幕 | 天堂在线www | 亚洲激情一区二区 | 欧美国产日韩在线观看 | 毛片a久久99亚洲欧美毛片 | 激情射精爽到偷偷c视频无码 | 色天天干 | 日韩中文字幕在线看 | 青草伊人久久 | 成长快手短视频在线观看 | 久久久96 | 亚洲资源av| 久久网站免费 | 日韩av片在线 | 国产视频第二页 | 五月婷婷俺也去 | 久久精品中文字幕有码 | 国产91成人| 国产99久久精品一区二区 | 91久久久久久久一区二区 | 东京av男人的天堂 | 99国产欧美久久久精品蜜芽 | 女人与拘做受全过程免费视频 | 天天夜夜骑 | 国内精品国产成人国产三级粉色 | 中文乱码人妻系列一区二区 | 少妇的激情| 东京热加勒比无码少妇 | 日本熟妇乱子伦xxxx | 一级在线免费视频 | www夜夜骑com | 久久香蕉精品视频 | 亚洲乱码一区av春药高潮 | 亚洲男人的天堂在线观看 | 色综合久久综合 | 欧美日韩亚洲视频 | 国产欧美激情日韩成人三区 | 美女视频一二三区 | 成人国产精品免费观看 | 国产 一二三四五六 | 国产情侣激情在线对白 | 黄色网免费 | 人人妻人人妻人人人人妻 | av毛片网站 | 北条麻妃一区二区三区中文字幕 | 五月丁香综合激情六月久久 | 五月婷婷国产 | 婷婷久久亚洲 | 久久99精品国产99久久6尤物 | xxxx在线观看视频 | 久久99精品久久久久久牛牛影视 | 国产婷婷色一区二区三区四区 | 夜夜躁狠狠躁日日躁视频 | 日韩中文字幕一区二区 | 粉嫩av国产一区二区三区 | 亚洲欧美在线视频观看 | 加勒比综合在线888 夹得我好紧好爽日出了水视频 | 国产亚洲精品久久久456 | 性猛进少妇xxxx富婆的 | 亚洲午夜网站 | 国精产品一二三三区入口 | 国产福利短视频 | 91丝袜超薄交口足 | 欧美 亚洲 中文 国产 综合 | 全部免费毛片在线播放高潮 | 成人午夜又粗又硬又大 | 一级做性色α爱片久久毛片色 | 欧美色欧美亚洲高清在线视频 | 成人免费黄色av | www色91| 婷婷综合另类小说色区 | 新婚少妇在线观看一区 | 美女av在线播放 | 视频丨9l丨白浆 | 图片区亚洲 | 日韩av网址大全 | 丰满少妇高潮惨叫久久久 | 美女自卫网站 | 四虎在线免费播放 | 四虎精品 | 国产日韩亚洲欧美 | 日本肉感丰满bbw | 欧美xxxxxx片免费播放软件 | 九七影院在线观看免费观看电视 | 无码任你躁久久久久久 | 99精品久久久久久 | 久久精品国内一区二区三区 | 狠狠色噜噜狠狠狠狠 | 成人美女黄网站色大免费的88 | 岛国精品一区 | wwwcom毛片| 夜夜爽天天干 | 国产在线精品一区二区中文 | 在线免费成人网 | 国精产品一区二区 | 337p日本欧洲亚大胆精80 | 挺进美女教师的蜜桃肥臀视频 | 国产精品国产三级国产aⅴ原创 | 99在线视频免费观看 | 欧美精品极品 | 黄色一级二级 | 永井玛利亚 精品 国产 一区 | 九一自拍中文字幕 | 国产精品视频久久久久 | 国产97色在线 | 免 | 欧美成人自拍视频 | 成人污网站| 免费一级做a爰片久久毛片潮 | 99久久婷婷国产综合精品青草免费 | 日韩深夜视频 | 国产精品美女久久久久av超清 | 男人用嘴添女人下身免费视频 | 成人羞羞国产免费网站 | 成人免费福利视频 | 性欧美丰满熟妇xxxx性 | 国产视频一区二区 | 青青草伊人网 | 婷婷久久亚洲 | 亚洲精品视频在线观看免费视频 | 免费看无码毛视频成片 | 激情欧美在线 | 亚洲天堂视频网 | 中国凸偷窥xxxx自由视频妇科 | 国产专区av | 国产人澡人澡澡澡人碰视 | 香蕉a视频 | 国产免费a | 永久免费观看美女裸体的网站 | 美女拉屎视频pooping | ass大乳尤物肉体pics | 四川骚妇无套内射舔了更爽 | 国产极品一区 | 中国女人做爰视频 | 荫蒂被男人添的好舒服爽免费视频 | 四虎影视库 | 久久伊人99| 国产毛片毛片精品天天看软件 | 老熟女高潮喷水了 | 天天综合入口 | 国产亚洲系列 | 日本欧美一区二区三区在线播放 | 国产美女特级嫩嫩嫩bbb片 | 亚洲小视频 | 可以免费观看av | 成人免费一区 | 777一区二区| 色综合欧美在线视频区 | 国产精品一二三四五 | 日本一区二区三区日本免费 | 91av久久| 欧美伦理片网站 | 一边吃奶一边摸下边激情说说 | 精品熟人妻一区二区三区四区不卡 | 大尺度无遮挡激烈床震网站 | 国产精品久久久久久亚洲徐婉婉 | 亚洲国产成人久久精品大牛影视 | 国产精品视频不卡 | 大尺度做爰啪啪床戏 | 农村老女人av | 伦hdwww日本bbw另类 | 四虎884aa成人精品最新 | 法国极品成人h版 | 妺妺窝人体色www在线下载 | 狠狠色噜狠狠狠狠 | 秋霞久久精品 | 懂色av一区二区三区免费看 | 成人国产在线观看 | 东京天堂网天堂网 | 香蕉视频在线精品视频 | 欧美成人手机在线视频 | 久久精品国产精品亚洲精品 | 在线观看免费视频黄 | 一级性毛片 | 中国少妇裸体aaa | 95av成人女人啪啪 | 在线涩涩 | 99久久99| 国产综合视频在线观看 | 不卡视频一区二区 | 国产精品久久久久久久免费 | 老汉老妇姓交视频 | 精品欧美一区免费观看α√ | 丁香久久| 国产高清一区二区三区 | 欧美另类变人与禽xxxxx | 亚洲午夜网站 | 一级片aaa| 国产日韩欧美综合 | 精品国产乱码久久久久乱码 | 男女啪啪免费 | 丁香伊人网 | 久久国产激情视频 | 国产精品免费久久久久影院 | 黑人粗长大战亚洲女 | 国产成人精品免费视频大全 | 亚洲精品一区二区三区香 | 日韩成人在线观看视频 | 131美女爱做视频 | 在线免费日本 | 男女下面一进一出无遮挡 | 日日摸夜夜添夜夜躁好吊 | 亚洲欧美综合网 | 日韩精品在线观看一区 | 永久免费的啪啪网站免费观看 | 成人午夜小视频 | 97超碰人人爱 | 丁香婷婷色| 国产欧美日韩三区 | 久久天堂国产香蕉三区 | 在线观看91精品国产网站 | 99久久精品午夜一区二区 | 中国黄色网址 | 国产免费一区二区 | 久久香蕉国产线看观看精品yw | 一区二区三区视频免费在线观看 | va在线| 狠狠躁日日躁夜夜躁2022麻豆 | 日本sm极度另类视频 | 全部孕妇毛片 | 日韩视频一区二区三区在线观看 | eeuss国产一区二区三区 | 亚洲女同一区二区 | jizz另类| 亚洲欧美另类中文字幕 | 欧美成人黑人xx视频免费观看 | 久久99热只有频精品8 | 国产a级全部精品 | 日本大乳免费观看久久99 | 日韩人妻熟女毛片在线看 | 亚洲一页| 久久久精品国产 | 六姐妹在线观看免费 | 久青草国产在视频在线观看 | 亚洲人交配视频 | 国产一区二区福利 | 亚洲第一视频在线观看 | 九九久久免费视频 | 99久久精品免费看国产四区 | 国产99久久久国产精品免费看 | 成人免费观看男女羞羞视频 | 欧美日韩高清免费 | 182tv成人福利视频免费看 | 青娱乐最新网站 | 国产乱对白刺激视频 | 亚洲一级伦理 | 久久国产伊人 | 久久嫩草精品久久久久 | 6080毛片 | 欧美成人第一页 | 亚洲欧美色图视频 | 国产精品久久久久久久久潘金莲 | 大陆极品少妇内射aaaaaa | 岛国av在线免费观看 | 亚洲网友自拍 | 西川结衣在线观看 | 国产精品亚洲天堂 | www污网站 | 成人国产一区二区三区 | 精品久久久久久无码中文字幕一区 | 爱情岛aqdlt国产论坛 | 国产在线无码视频一区二区三区 | 国产精品视频免费播放 | 国产女人高潮抽搐喷水免费视频 | 精品久久久久久18免费网站 | 色小姐综合 | www,日韩| 国产精品178页 | 男女下面一进一出无遮挡 | 久久精品久久99 | www久久爱白液流出h | 无人码一区二区三区视频 | 男人的天堂无码动漫av | 亚洲国产婷婷综合在线精品 | 国产偷伦在线 | 成人综合婷婷国产精品久久 | 久久久久久久久久99精品 | 久久久久久久久女人体 | 成人午夜一区 | 肉色丝袜足j视频国产 | 人妻 日韩精品 中文字幕 | 日本69熟 | 色久av| 大尺度网站在线观看 | 欧美性猛交ⅹxxx乱大交妖精 | 国产天堂在线观看 | 久久九九久久九九 | 欧美爱爱网址 | 亚洲最大的熟女水蜜桃av网站 | 狠狠色丁香婷婷久久综合五月 | 国产综合久久久久久鬼色 | 国产尤物网站 | 91看片网 | 国产丝袜视频在线 | 欧美一二三四成人免费视频 | 中国字幕一色哟哟 | 色婷婷在线观看视频 | 欧美精品久久久久久久久久白贞 | 婷婷成人丁香五月综合激情 | 97国产在线观看 | 性一交一乱一伦a片 | 手机看片国产一区 | 亚洲综合色一区 | 九九热最新网址 | 国产午夜精品久久久久久免费视 | 嫩草嫩草嫩草嫩草嫩草嫩草 | 日韩视频不卡 | 亚洲免费黄网 | 岛国精品资源网站 | 青青草公开视频 | 成人免费观看网站 | 鲁大师影院在线观看 | 天堂8资源8地址8 | 无尺码精品产品视频 | 东京一木一道一二三区 | 日本五十路岳乱在线观看 | 亚洲自拍偷拍欧美 | 色小姐综合网 | 91久久偷偷做嫩草影院 | 久久99精品久久久久久水蜜桃 | 狠狠综合久久久久综合网 | 欧美有码在线观看 | 欧美巨大双龙性猛交乱大 | 亚洲成年 | 很黄很色60分钟在线观看 | 永久免费无码av网站在线观看 | 日韩毛片网站 | 久久国产精品大桥未久av | aⅴ在线视频男人的天堂 | 中文字幕无码热在线视频 | 天天干妹子 | 成人av自拍| 吃奶呻吟打开双腿 | 黄色免费网站在线看 | 欧美高清性xxxxhdvideos | 欧美三级又粗又硬 | 九色丨蝌蚪丨成人 | 国产精品国产三级国产 | 丰满人妻熟妇乱又伦精品 | 欧美精品播放 | 无码中文av有码中文av | 欧美一二区视频 | 国产乱人伦真实精品视频 | 日韩黄色毛片 | av在线首页| ,国产精品国产三级国产 | 精品久久久久久无码专区 | 亚洲不卡免费视频 | 国产乱人乱精一区二视频国产精品 | 超碰一区二区三区 | 德国艳星videos极品hd | 丁香激情综合久久伊人久久 | 国产曰肥老太婆无遮挡 | 天堂av在线免费观看 | 亚洲视频在线观看免费视频 | 另类老妇奶性生bbwbbw | 成人看黄色s一级大片 | 久久婷婷五月综合色丁香 | 中文字幕欧美日韩va免费视频 | 国产精品女优 | 一区二区亚洲视频 | 午夜免费视频 | 亚洲天堂婷婷 | 亚洲猛少妇又大又xxxxx | 无码137片内射在线影院 | 中文字幕精品久久 | 荡女乱翁床第高h | 天堂久久久久久久 | 岛国精品资源网站 | 免费久久视频 | 国产成人综合网 | 91免费看片 | 日本不卡一区在线观看 | 亚洲深深色噜噜狠狠爱网站 | 七七婷婷婷婷精品国产 | 91香蕉国产 | 久热这里只有精品视频6 | 日韩女优在线播放 | 日日嗨av一区二区三区四区 | 久久中文在线 | 91久久国语露脸精品国产高跟 | 精品国模一区二区三区 | gogogo日本免费观看电视动漫 | 亚洲欧美中文日韩在线 | 99爱视频在线观看 | 亚洲拍拍| 狠狠躁18三区二区一区 | 日本欧美在线 | 日本动漫做毛片一区二区 | 久久96国产精品久久 | 久久久久久成人 | 国产特级黄色片 | 国产成人精品三级麻豆 | 99视频在线观看视频 | 麻豆精品国产入口 | 日韩欧美中文字幕一区二区三区 | 国产精品黄在线观看免费软件 | 午夜影院免费体验区 | 黄色激情视频在线观看 | 国产va | 香蕉久久夜色精品国产使用方法 | 中字幕视频在线永久在线观看免费 | 81精品国产乱码久久久久久 | 色爱综合网 | aaaa黄色片| 人人爽人人爽人人爽人人爽 | 亚洲精品视频网址 | 欧美一区免费观看 | 国产一区欧美一区 | 国产69精品久久久久久久久久 | 人妻少妇精品中文字幕av | av在线天堂网 | 国产极品视频 | 日韩黄色影视 | 美女免费av | 黑人粗长大战亚洲女 | 国产精品丝袜黑色高跟 | 国产在线拍揄自揄拍视频 | 好大好硬好爽免费视频 | 日本55丰满熟妇厨房伦 | 狠狠操2019 | 青青青草视频在线 | 欧美亚洲视频一区二区 | 在线麻豆视频 | 91精品国产综合久久久久影院不卡 | 无码国产精品成人 | 91免费福利 | 国产激情图片 | 国产精品对白交换绿帽视频 | 天天舔天天摸 | 黑人ⅴvideo暴力亚洲娇小 | 国产免费内射又粗又爽密桃视频 | 午夜福利伦伦电影理论片在线观看 | 十二月综合缴缴情小说 | 婷婷色综合 | 男女羞羞羞视频午夜视频 | 亚洲偷自拍另类图片二区 | 亚洲毛片一区二区 | 国产麻豆91欧美一区二区 | 男女下面一进一出无遮挡 | 亚洲精品久久久久国产 | av网站观看 | 男女日批在线观看 | 欧美一级免费视频 | 久久偷看各类wc女厕嘘嘘偷窃 | 爱av在线 | 福利免费在线观看 | 国产欧美一区二区三区视频 | 成人午夜sm精品久久久久久久 | 精品一区二区三区在线播放 | 成人国产精品色哟哟 | 久久久久亚洲精品成人网小说 | a级毛片,黄,免费观看 m | 国产真实夫妇交换视频 | 一本色道av立川理惠 | 永久免费看mv网站入口亚洲 | 亚洲a∨精品一区二区三区 gv天堂gv无码男同在线观看 | 国产极品视频在线观看 | 国产一级做a | 高清视频一区 | 成人国产精品一区二区 | 欧美黄色性生活 | 日本黄色aaa | 国产三级国产精品国产普男人 | 中文在线观看免费高清 | 国模冰莲大胆自慰难受 | 91黄在线看 | 性――交――性――乱视频 | 国产免费一区二区三区四在线播放 | 久久久精品久久日韩一区综合 | 亚洲熟妇av一区二区三区漫画 | 少妇愉情理仑片高潮日本 | 少妇毛茸茸bbw高清 少妇免费毛片久久久久久久久 | 久草在线香蕉 | 国产一级小视频 | 插插网站 | 成人免费视频观看视频 | 国模冰莲自慰肥美胞极品人体图 | 一级片在线免费观看 | 91视频免费观看网站 | 中文字幕观看视频 | 日本美女全裸 | 亚洲欧美精品伊人久久 | 国产三级按摩推拿按摩 | 国产一区二区三区成人欧美日韩在线观看 | 女人被狂躁到高潮视频免费软件 | 91精品国产综合久久精品图片 | 中文字幕av专区dvd | 91性视频| 国产黑丝在线视频 | 日本一区二区三区在线免费观看 | 亚洲中文字幕久久无码精品 | 亚洲风情av| 波多野结衣一本一道 | 中文字幕在线三区 | 韩国一区二区三区视频 | 人善交video另类hd侏儒 | 污网站在线观看免费 | 狠狠躁18三区二区一区传媒剧情 | 欧美黑人欧美精品刺激 | 国产美女无遮挡裸色视频 | 三八激情网| 超碰96在线 | 国产欧美三级 | 色偷偷偷在线视频播放 | 成码无人av片在线观看网站 | 女仆乖h调教跪趴1v1 | av软件网站| 中文字幕乱人伦高清视频 | 国产精品一二三四区 | 美女大量吞精在线观看456 | 亚洲福利视频网 | 少妇精品久久久一区二区三区 | 香蕉一区二区 | 免费av一区二区 | 又色又爽又黄又免费的照片 | 亚洲精品国产综合久久久久紧 | 99精品免费久久久久久久久日本 | 久久久精品二区 | 国产精品久久久久久中文字 | 中文字幕天天躁日日躁狠狠躁免费 | 国产主播一区二区 | 俺去俺来也在线www色官网 | av免费网| 亚洲专区在线播放 | 日韩免费一区二区 | 婷婷综合激情 | 国产精品性 | 午夜免费一区 | 日本一码二码三码在线 | 亚洲乱码日产精品bd在线看 | 中文字幕在线无码一区二区三区 | 久久久国产一区二区三区四区小说 | 国产午夜精品av一区二区 | 色啊色| 精品无码国产一区二区三区麻豆 | 亚洲色图欧美视频 | 久久久久久三区 | 四虎永久在线精品无码视频 | 亚洲欧美日韩综合一区 | 久久99精品久久久久久狂牛 | 免费99视频| 日日躁夜夜躁狠狠躁aⅴ蜜 日日躁夜夜躁狠狠躁超爽2001 | 国产亚洲精品综合一区91 | 欧美激情综合在线 |