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

Go語言開發(fā)者的Apache Arrow使用指南:內(nèi)存管理

開發(fā) 前端
本文介紹了Go arrow實現(xiàn)的主要結(jié)構(gòu)以及實現(xiàn)模式:builder模式,并結(jié)合Go arrow官方資料說明了采用引用計數(shù)進行內(nèi)存管理的原因與使用方法,最后介紹了Arrow實現(xiàn)ZeroCopy的內(nèi)存數(shù)據(jù)共享的原理。這些將為后續(xù)繼續(xù)深入學習Arrow高級數(shù)據(jù)類型/結(jié)構(gòu)奠定良好的基礎(chǔ)。

如果你看了上一篇《Go語言開發(fā)者的Apache Arrow使用指南:數(shù)據(jù)類型》[1]中的諸多Go操作arrow的代碼示例,你很可能會被代碼中大量使用的Retain和Release方法搞暈。不光大家有這樣的感覺,我也有同樣的feeling:**Go是GC語言[2],為什么還要借助另外一套Retain和Release來進行內(nèi)存管理呢**?

在這一篇文章中,我們就來探索一下這個問題的答案,并看看如何使用Retain和Release,順便再了解一下Apache Arrow的Go實現(xiàn)原理。

注:本文的內(nèi)容基于Apache Arrow Go v13版本(go.mod中g(shù)o version為v13)的代碼。

1. Go Arrow實現(xiàn)中的builder模式

看過第一篇文章中的代碼的童鞋可能發(fā)現(xiàn)了,無論是Primitive array type還是嵌套類型的諸如List array type,其array的創(chuàng)建套路都是這樣的:

  • 首先創(chuàng)建對應類型的Builder,比如array.Int32Builder;
  • 然后,向Builder實例中append值;
  • 最后,通過Builder的NewArray方法獲得目標Array的實例,比如array.Int32。

據(jù)說這個builder模式是參考了Arrow的C++實現(xiàn)。這里將Go的builder模式中各個類型之間的關(guān)系以下面這幅示意圖的形式呈現(xiàn)一下:

圖片圖片

當然這幅圖也大概可以作為Go Arrow實現(xiàn)的原理圖。

從圖中,我們可以看到:

  • Arrow go提供了Builder、Array、ArrayData接口作為抽象,在這些接口中都包含了用作內(nèi)存引用計數(shù)管理的Retain和Release方法;
  • array包提供了Builder接口的一個默認實現(xiàn)builder類型,所有的XXXBuilder都組(內(nèi))合(嵌)了這個類型,這個類型實現(xiàn)了Retain方法,Release方法需要XXXBuilder自行實現(xiàn)。
  • array包提供了Array接口的一個默認實現(xiàn)array類型,所有的array type(比如array.Int32)都組(內(nèi))合(嵌)了這個array類型。該類型實現(xiàn)了Retain和Release方法。
// github.com/apache/arrow/go/arrow/array/array.go
type array struct {
    refCount        int64
    data            *Data
    nullBitmapBytes []byte
}

// Retain increases the reference count by 1.
// Retain may be called simultaneously from multiple goroutines.
func (a *array) Retain() {
    atomic.AddInt64(&a.refCount, 1)
}

// Release decreases the reference count by 1.
// Release may be called simultaneously from multiple goroutines.
// When the reference count goes to zero, the memory is freed.
func (a *array) Release() {
    debug.Assert(atomic.LoadInt64(&a.refCount) > 0, "too many releases")

    if atomic.AddInt64(&a.refCount, -1) == 0 {
        a.data.Release()
        a.data, a.nullBitmapBytes = nil, nil
    }
}

下面以Int64 array type為例:

// github.com/apache/arrow/go/arrow/array/numeric.gen.go 

// A type which represents an immutable sequence of int64 values.
type Int64 struct {
    array // “繼承”了array的Retain和Release方法。
    values []int64
}
  • 通過XXXBuilder類型的NewArray方法可以獲得該Builder對應的Array type實例,比如:調(diào)用Int32Builder的NewArray可獲得一個Int32 array type的實例。一個array type實例對應的數(shù)據(jù)是邏輯上immutable的,一旦創(chuàng)建便不能改變。
  • 通過Array接口的Data方法可以得到該array type的底層數(shù)據(jù)layout實現(xiàn)(arrow.ArrayData接口的實現(xiàn)),包括child data。
  • arrow包定義了所有的數(shù)據(jù)類型對應的ID值和string串,這個與arrow.DataType接口放在了一個源文件中。
  • 另外要注意,XXXBuilder的實例是“一次性”的,一旦調(diào)用NewArray方法返回一個array type實例,該XXXBuilder就會被reset。如果再次調(diào)用其NewArray方法,只能得到一個空的array type實例。你可以重用該Builder,只需向該Builder實例重新append值即可(見下面示例):
// reuse_string_builder.go

func main() {
    bldr := array.NewStringBuilder(memory.DefaultAllocator)
    defer bldr.Release()
    bldr.AppendValues([]string{"hello", "apache arrow"}, nil)
    arr := bldr.NewArray()
    defer arr.Release()
    bitmaps := arr.NullBitmapBytes()
    fmt.Println(hex.Dump(bitmaps))
    bufs := arr.Data().Buffers()
    for _, buf := range bufs {
        fmt.Println(hex.Dump(buf.Buf()))
    }
    fmt.Println(arr)

    // reuse the builder
    bldr.AppendValues([]string{"happy birthday", "leo messi"}, nil)
    arr1 := bldr.NewArray()
    defer arr1.Release()
    bitmaps1 := arr1.NullBitmapBytes()
    fmt.Println(hex.Dump(bitmaps1))
    bufs1 := arr1.Data().Buffers()
    for _, buf := range bufs1 {
        if buf != nil {
            fmt.Println(hex.Dump(buf.Buf()))
        }
    }
    fmt.Println(arr1)
}

輸出上面示例運行結(jié)果:

$go run reuse_string_builder.go
00000000  03                                                |.|

00000000  03 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

00000000  00 00 00 00 05 00 00 00  11 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

00000000  68 65 6c 6c 6f 61 70 61  63 68 65 20 61 72 72 6f  |helloapache arro|
00000010  77 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |w...............|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

["hello" "apache arrow"]
00000000  03                                                |.|

00000000  03 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

00000000  00 00 00 00 0e 00 00 00  17 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

00000000  68 61 70 70 79 20 62 69  72 74 68 64 61 79 6c 65  |happy birthdayle|
00000010  6f 20 6d 65 73 73 69 00  00 00 00 00 00 00 00 00  |o messi.........|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

["happy birthday" "leo messi"]

想必到這里,大家對Arrow的Go實現(xiàn)原理有了一個大概的認知了。接下來,我們再來看Go arrow實現(xiàn)的內(nèi)存引用計數(shù)管理。

2. Go Arrow實現(xiàn)的內(nèi)存引用計數(shù)管理

在上面圖中,我們看到Go Arrow實現(xiàn)的幾個主要接口Builder、Array、ArrayData都包含了Release和Retain方法,也就是說實現(xiàn)了這些接口的類型都支持采用引用計數(shù)方法(Reference Counting)進行內(nèi)存的跟蹤和管理。Retain方法的語義是引用計數(shù)加1,而Release方法則是引用計數(shù)減1。由于采用了原子操作對引用計數(shù)進行加減,因此這兩個方法是并發(fā)安全的。當引用計數(shù)減到0時,該引用計數(shù)對應的內(nèi)存塊就可以被釋放掉了。

Go Arrow實現(xiàn)的主頁[3]上對引用計數(shù)的使用場景和規(guī)則做了如下說明:

  • 如果你被傳遞了一個對象并希望獲得它的所有權(quán)(ownership),你必須調(diào)用Retain方法。當你不再需要該對象時,你必須調(diào)用對應的Release方法。"獲得所有權(quán)"意味著你希望在當前函數(shù)調(diào)用的范圍之外訪問該對象。
  • 你通過名稱以New或Copy開頭的函數(shù)創(chuàng)建的任何對象,或者在通過channel接收對象時,你都將擁有所有權(quán)。因此,一旦你不再需要這個對象,你必須調(diào)用Release。
  • 如果你通過一個channel發(fā)送一個對象,你必須在發(fā)送之前調(diào)用Retain,因為接收者將擁有該對象。接收者有義務(wù)在以后不再需要該對象時調(diào)用Release。

有了這個說明后,我們對于Retain和Release的使用場景基本做到心里有譜了。但還有一個問題亟待解決,那就是:Go是GC語言,為何還要在GC之上加上一套引用計數(shù)呢?

這個問題我在這個issue[4]中找到了答案。一個Go arrow實現(xiàn)的commiter在回答issue時提到:“理論上,如果你知道你使用的是默認的Go分配器,你實際上不必在你的消費者(指的是Arrow Go包 API的使用者)代碼中調(diào)用Retain/Release,可以直接讓Go垃圾回收器管理一切。我們只需要確保我們在庫內(nèi)調(diào)用Retain/Release,這樣如果消費者使用非Go GC分配器,我們就可以確保他們不會出現(xiàn)內(nèi)存泄漏”。

下面是默認的Go分配器的實現(xiàn)代碼:

package memory

// DefaultAllocator is a default implementation of Allocator and can be used anywhere
// an Allocator is required.
//
// DefaultAllocator is safe to use from multiple goroutines.
var DefaultAllocator Allocator = NewGoAllocator()

type GoAllocator struct{}

func NewGoAllocator() *GoAllocator { return &GoAllocator{} }

func (a *GoAllocator) Allocate(size int) []byte {
    buf := make([]byte, size+alignment) // padding for 64-byte alignment
    addr := int(addressOf(buf))
    next := roundUpToMultipleOf64(addr)
    if addr != next {
        shift := next - addr
        return buf[shift : size+shift : size+shift]
    }
    return buf[:size:size]
}

func (a *GoAllocator) Reallocate(size int, b []byte) []byte {
    if size == len(b) {
        return b
    }

    newBuf := a.Allocate(size)
    copy(newBuf, b)
    return newBuf
}

func (a *GoAllocator) Free(b []byte) {}

我們看到默認的Allocator只是分配一個原生切片,并且切片的底層內(nèi)存塊要保證64-byte對齊。

但為什么Retain和Release依然存在且需要調(diào)用呢?這位commiter給出了他理解的幾點原因:

  • 允許用戶控制buffer和內(nèi)部數(shù)據(jù)何時被設(shè)置為nil,以便在可能的情況下提前標記為可被垃圾收集;
  • 如果用戶愿意,允許正確使用不依賴Go垃圾收集器的分配器(比如mallocator實現(xiàn),它使用malloc/free來管理C內(nèi)存而不是使用Go垃圾收集來管理);
  • 雖然用戶可以通過SetFinalizer來使用Finalizer進行內(nèi)存釋放,但一般來說,我們建議最好有一個顯式的釋放動作,而不是依賴finalizer,因為沒有實際保證finalizer會運行。此外,finalizer只在GC期間運行,這意味著如果你的分配器正在分配C內(nèi)存或其他東西,而Go內(nèi)存一直很低,那么你有可能在任何finalizer運行以實際調(diào)用Free之前,就被分配了大量的C內(nèi)存,從而耗盡了你的內(nèi)存。

基于這些原因,Go Arrow實現(xiàn)保留了Retain和Release,雖然有上門的一些場景使用方法,但這兩個方法的加入一定程度上增加了Go Arrow API使用的門檻。并且在重度使用Go Arrow實現(xiàn)的程序中,大家務(wù)必對程序做穩(wěn)定性長測試驗證,以確保memory沒有l(wèi)eak。

3. 如何實現(xiàn)ZeroCopy的內(nèi)存數(shù)據(jù)共享

《In-Memory Analytics with Apache Arrow》[5]一書在第二章中提到了采用Arrow實現(xiàn)zerocopy的內(nèi)存數(shù)據(jù)共享的原理,這里將其稱為“切片(slice)原理”,用書中的例子簡單描述就是這樣的:假設(shè)你想對一個有數(shù)十億行的非常大的數(shù)據(jù)集進行一些分析操作。提高這種操作性能的一個常見方法是對行的子集進行并行操作,即僅通過對數(shù)組和數(shù)據(jù)緩沖區(qū)進行切分,而不需要復制底層數(shù)據(jù)。這樣你操作的每個批次都不是一個副本--它只是數(shù)據(jù)的一個視圖。書中還給出了如下示意圖:

圖片圖片

右側(cè)切片列中的每個切片的虛線表示它們只是各自列中的數(shù)據(jù)子集的視圖,每個切片都可以安全地進行并行操作。

array type是邏輯上immutable的,底層data buffer一旦建立后,便可以通過切片的方式來以zerocopy方式做內(nèi)存數(shù)據(jù)共享,極大提高了數(shù)據(jù)操作的性能。

4. 小結(jié)

本文介紹了Go arrow實現(xiàn)的主要結(jié)構(gòu)以及實現(xiàn)模式:builder模式,并結(jié)合Go arrow官方資料說明了采用引用計數(shù)進行內(nèi)存管理的原因與使用方法,最后介紹了Arrow實現(xiàn)ZeroCopy的內(nèi)存數(shù)據(jù)共享的原理。這些將為后續(xù)繼續(xù)深入學習Arrow高級數(shù)據(jù)類型/結(jié)構(gòu)奠定良好的基礎(chǔ)。

注:本文涉及的源代碼在這里[6]可以下載。

Gopher Daily(Gopher每日新聞)歸檔倉庫 - https://github.com/bigwhite/gopherdaily

我的聯(lián)系方式:

  • 微博(暫不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite

參考資料

[1] 《Go語言開發(fā)者的Apache Arrow使用指南:數(shù)據(jù)類型》: https://tonybai.com/2023/06/25/a-guide-of-using-apache-arrow-for-gopher-part1

[2] Go是GC語言: https://tonybai.com/2023/06/13/understand-go-gc-overhead-behind-the-convenience

[3] Go Arrow實現(xiàn)的主頁: https://github.com/apache/arrow/tree/main/go

[4] 這個issue: https://github.com/apache/arrow/issues/35232

[5] 《In-Memory Analytics with Apache Arrow》: https://book.douban.com/subject/35954154/

[6] 這里: https://github.com/bigwhite/experiments/blob/master/arrow/memory-management

[7] “Gopher部落”知識星球: https://wx.zsxq.com/dweb2/index/group/51284458844544

[8] 鏈接地址: https://m.do.co/c/bff6eed92687

本文轉(zhuǎn)載自微信公眾號「TonyBai」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系TonyBai公眾號。

責任編輯:武曉燕 來源: TonyBai
相關(guān)推薦

2023-07-14 08:23:07

arrayRecordArray

2013-08-30 09:41:46

JavaApache CameApache

2010-07-29 10:16:17

Linux內(nèi)核Linux內(nèi)存

2024-02-01 09:37:42

Kubernetes服務(wù)網(wǎng)格? 命令

2024-05-07 08:45:16

OpenAILlamaIndex大語言模型

2011-04-02 13:44:08

2018-03-27 23:25:40

Paddle

2021-12-16 20:12:37

后端開發(fā)Sentry

2010-02-06 16:30:25

C++內(nèi)存對齊

2019-08-16 10:55:37

開發(fā)者技能AI

2024-02-04 09:18:00

Python內(nèi)存管理垃圾回收

2025-07-31 06:00:00

Go后端開發(fā)

2024-07-11 08:50:05

Go語言errors

2022-09-29 09:07:08

DataGrip數(shù)據(jù)倉庫數(shù)據(jù)庫

2017-11-27 13:09:00

AndroidGradle代碼

2019-02-21 13:40:35

Javascript面試前端

2022-01-02 23:26:08

開發(fā)SDK Sentry

2012-06-13 01:23:30

開發(fā)者程序員

2022-01-18 23:26:45

開發(fā)

2011-04-13 11:31:06

PIM APIBlackBerry
點贊
收藏

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

亚洲精品mv在线观看| 欧美自拍资源在线| 欧美日韩国产精品综合| 风间由美性色一区二区三区四区| 亚洲国产综合色| 欧美精品久久| 国产乱码精品一区二区三区精东| 欧美视频在线观看| 亚洲欧美国产精品va在线观看| www.色偷偷.com| caoporn免费在线| av在线播放一区二区三区| 日本高清不卡的在线| 成年人二级毛片| 偷窥自拍亚洲色图精选| 欧美一区二区视频在线观看| 日韩在线一级片| 黄色网页在线观看| www国产亚洲精品久久麻豆| 91精品国产自产在线观看永久| 久久9999久久免费精品国产| 日本欧美视频| 日韩的一区二区| 精产国品一二三区| 欧美成a人片在线观看久| 一区二区三区不卡视频| 天堂精品一区二区三区| 神马午夜精品95| 久久99精品久久久久久久久久久久| 午夜精品视频网站| 日韩精品123区| 精品久久久亚洲| 日韩www在线| 伊人av在线播放| 国产精品伦一区二区| 亚洲超丰满肉感bbw| 亚洲第一综合网站| 成年人视频网站在线| 99久久婷婷国产综合精品电影| 成人黄色在线观看| 亚洲精品国产精品乱码视色| 亚洲一区二区网站| 久久久久久91香蕉国产| 日本中文在线视频| 成人在线免费视频观看| 亚洲欧美日韩国产中文| 男男做爰猛烈叫床爽爽小说 | 久久久伊人日本| 国产人与禽zoz0性伦| 国产99久久久国产精品成人免费 | 性色av浪潮av| 高清一区二区三区av| 欧美亚洲综合色| 国产精品无码av无码| 欧美aa在线观看| 亚洲成av人片在线| 免费观看国产精品视频| 黄色大片在线| 亚洲国产一区二区视频| 无码人妻少妇伦在线电影| a黄色片在线观看| 亚洲欧美区自拍先锋| 综合操久久久| 老司机在线视频二区| 自拍av一区二区三区| 一本久久a久久精品vr综合 | 久久精品亚洲国产| 亚洲欧美精品aaaaaa片| 一区二区三区在线| 欧美国产在线视频| 国产无遮无挡120秒| 亚洲在线成人| 国产成人精品免费久久久久| 最好看的日本字幕mv视频大全 | 在线观看岛国av| 成人污污www网站免费丝瓜| 欧美一区二区女人| 国产精品嫩草69影院| 成人性生交大片免费看96| 亚洲福利视频在线| 亚洲永久精品ww.7491进入| 日韩欧美美女在线观看| 国产一区二区日韩| 日韩成人短视频| 国内精品99| 奇米一区二区三区四区久久| 最近中文字幕免费观看| 韩国精品一区二区| 国产精成人品localhost| 深夜福利视频在线免费观看| 国产日产欧产精品推荐色 | 国产在线一二三区| 亚洲欧洲国产日本综合| 欧美极品少妇无套实战| 在线观看爽视频| 欧美色老头old∨ideo| 日韩精品xxx| 日韩美女毛片| xxx一区二区| 日本系列第一页| 日本91福利区| 国产精品jizz视频| 国产黄色片在线观看| 一区二区三区在线免费| 日本中文字幕片| 精品中文在线| 亚洲天堂久久av| 妺妺窝人体色www婷婷| 视频一区免费在线观看| 91传媒视频在线观看| 国产一区二区三区福利| 亚洲最大色网站| 九色91popny| 精品伊人久久久| 久久精品国产精品| 男人天堂av在线播放| 国产成人精品aa毛片| 日韩欧美一区二区在线观看| 超碰在线视屏| 欧美一级欧美三级| 怡红院一区二区三区| 亚洲天堂偷拍| 成人看片人aa| 黄色毛片在线看| 午夜亚洲国产au精品一区二区| 一起操在线视频| 欧美美乳视频| 97久久久免费福利网址| www.蜜臀av.com| 国产精品三级av在线播放| 日韩精品xxxx| 国产精品videossex| 久久精品在线播放| 亚洲在线视频播放| 国产拍欧美日韩视频二区| 你懂的av在线| 成人三级av在线| 欧美日本啪啪无遮挡网站| 国产又粗又黄又爽视频| 国产日韩高清在线| 麻豆传传媒久久久爱| 日韩精品福利一区二区三区| 国内偷自视频区视频综合| 性生活黄色大片| 亚洲精品自拍动漫在线| 特黄视频免费观看| 99九九热只有国产精品| 国产精品爽爽ⅴa在线观看| 狠狠色伊人亚洲综合网站l| 精品久久久久久电影| 亚洲av无码一区东京热久久| 欧美午夜不卡| wwwxx欧美| 丁香高清在线观看完整电影视频 | 午夜激情小视频| 国产一区在线观看免费| 美女免费视频一区二区| 亚洲国产欧美日韩| 美女久久久久久| zzjj国产精品一区二区| av网站在线观看免费| 亚洲欧美另类综合偷拍| 亚洲欧洲日韩综合| 亚洲高清网站| 农村寡妇一区二区三区| 美女日韩欧美| 中文在线不卡视频| 一起草av在线| 亚洲免费在线视频一区 二区| 国产裸体视频网站| 国内揄拍国内精品久久| 狠狠色综合网站久久久久久久| 日韩伦理精品| 伊是香蕉大人久久| 国产精品怡红院| 亚洲线精品一区二区三区| 亚洲图片欧美另类| 亚洲在线日韩| 日韩高清dvd| 国产日韩欧美中文在线| 欧美国产日韩视频| 午夜av免费观看| 日本道在线观看一区二区| 911国产在线| 成人综合在线观看| 色欲av无码一区二区人妻| 国模精品一区| 99热最新在线| 亚洲欧美电影| 久久天天躁狠狠躁夜夜躁| 日本黄色三级视频| 91久久国产最好的精华液| 一区二区三区四区五区| 97超碰欧美中文字幕| 国产一区二区在线免费播放| 欧美成人精品| 日本高清一区| 77成人影视| 国产精品吹潮在线观看| 暖暖在线中文免费日本| 国产一区二区三区三区在线观看 | 日本精品在线一区| 欧美乱大交xxxxx| 国产三级在线观看| 精品日产卡一卡二卡麻豆| 久久久久久久亚洲| 亚洲午夜国产一区99re久久| 先锋影音av在线| 岛国一区二区在线观看| 亚洲欧美自拍另类日韩| 夜久久久久久| 男人日女人的bb| 日韩av二区| 久久涩涩网站| av毛片精品| 成人免费看片视频| 国产精品极品美女在线观看| 欧美激情亚洲一区| 欧美jizzhd欧美| 亚洲欧美国产精品| 日本美女一级片| 欧美一区二区三区视频在线 | 国产亚洲精品自拍| 亚洲色图都市激情| 99精品一区| 亚洲v国产v| 国产一区二区三区探花| 精品日本一区二区三区在线观看| 成人国产精品久久| 国产精品日日做人人爱| 亚洲精品一区| 性亚洲最疯狂xxxx高清| 久久香蕉av| 欧美第一黄色网| av免费在线观看网址| 俺去啦;欧美日韩| 调教视频免费在线观看| 一区二区三区美女xx视频| 欧洲一级在线观看| 精品一区二区三区电影| 色婷婷av一区二区三区之e本道| 欧洲另类一二三四区| 蜜臀精品一区二区三区| 欧美特级www| 成人午夜视频在线播放| 午夜精品久久久久影视| 日韩大片免费在线观看| 亚洲中国最大av网站| 免费无遮挡无码永久在线观看视频| 国产精品久久久久9999吃药| 青青青视频在线播放| 国产农村妇女毛片精品久久麻豆 | 亚洲欧美日韩国产另类专区 | 四虎精品在永久在线观看| 亚洲国产小视频| 色播色播色播色播色播在线| 亚洲九九九在线观看| 九色在线视频蝌蚪| 亚洲人在线观看| 成人免费高清在线播放| 最新的欧美黄色| 免费在线看黄色| 九九九久久国产免费| 久久不射影院| 911国产网站尤物在线观看| 亚洲一区站长工具| 国产精品视频永久免费播放| 日韩在线激情| 不卡视频一区二区| 日韩伦理一区二区三区| 午夜精品亚洲一区二区三区嫩草| 欧美va久久久噜噜噜久久| 国产树林野战在线播放| 国产精品mv在线观看| 午夜精品久久久久久久无码| 爽好久久久欧美精品| 亚洲va综合va国产va中文| 国产成人av一区二区三区在线观看| 国产极品一区二区| 国产丝袜美腿一区二区三区| 疯狂撞击丝袜人妻| 亚洲大片精品永久免费| 日韩在线播放中文字幕| 在线播放欧美女士性生活| 好吊色一区二区| 亚洲图片欧美午夜| 成人免费在线| 欧美一区视频在线| 日本一区二区三区中文字幕| 成人情视频高清免费观看电影| 亚洲专区视频| 91国在线高清视频| 久久国产免费| 在线免费黄色小视频| 久久亚洲综合色一区二区三区| av黄色免费在线观看| 欧美日韩美女视频| 国产一区二区波多野结衣| 亚洲电影在线看| 日本亚洲精品| 777777777亚洲妇女| 电影91久久久| 欧美午夜欧美| 在线不卡视频| www.色就是色.com| 久久亚洲二区三区| 欧美日韩三级在线观看| 91福利在线播放| 成人午夜免费福利| 久久久精品视频成人| 美女福利一区二区三区| 国产嫩草一区二区三区在线观看| 人人狠狠综合久久亚洲婷| 欧美精品自拍视频| 国产一区二区毛片| 日本成人免费视频| 天天综合天天综合色| 99久久婷婷国产一区二区三区| 国产视频欧美视频| 欧美大片黄色| 成人欧美一区二区三区黑人孕妇| 国产精品日韩精品中文字幕| 欧美大黑帍在线播放| 久草中文综合在线| 1024手机在线观看你懂的| 欧美日韩午夜剧场| 少妇又色又爽又黄的视频| 欧美成人剧情片在线观看| 欧美成人黄色| 日韩精品av一区二区三区| 亚洲一区二区成人| 疯狂揉花蒂控制高潮h| 一片黄亚洲嫩模| 精品免费久久久| xx视频.9999.com| 日韩精品一级毛片在线播放| 日本精品一区二区| 久久综合导航| 亚洲综合色一区| 欧美日韩在线视频一区二区| 日本波多野结衣在线| 欧美激情一区二区三区在线视频观看| www.久久爱.com| 三级网在线观看| 韩国欧美国产1区| 国产精品夜夜夜爽阿娇| 欧美日韩在线三级| 91美女视频在线| 国产日韩中文字幕| 91欧美国产| 日韩av影视大全| 亚洲美女免费视频| 亚洲成人一二三区| 欧美激情图片区| 国产精品毛片av| 精品国产一二三四区| 97se亚洲国产综合自在线观| 啦啦啦免费高清视频在线观看| 亚洲欧美中文字幕| 国产私拍福利精品视频二区| 日韩欧美在线电影| 精品一区中文字幕| 欧美丰满熟妇bbbbbb| 日韩免费电影一区| 超免费在线视频| 欧美视频小说| 久久99热这里只有精品| 日韩黄色免费观看| 亚洲高清不卡av| 国产 日韩 欧美一区| 亚洲一区二区四区| 国产电影精品久久禁18| 国产无遮挡裸体免费视频| 亚洲欧洲美洲在线综合| 欧美风情在线视频| 青青青青在线视频| 久久一区二区视频| 一二区在线观看| 欧美高清视频在线| 免费看日本一区二区| 中文字幕第一页在线视频| 亚洲一区二区三区在线| 免费在线毛片| 亚洲精品日韩av| 久久国产精品亚洲77777| 国产aaaaaaaaa| 欧美哺乳videos| 欧美三级精品| 欧美日韩激情四射| 久久综合色8888| 国产xxxx孕妇| 日韩美女视频在线观看| 亚洲五月综合| 国产全是老熟女太爽了| 6080yy午夜一二三区久久| 欧美激情网站| 一区二区三区四区欧美| av一区二区三区| 国产精品系列视频| 日韩av大片在线|