日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Linux fork函數(shù)詳解:返回值、COW寫時復(fù)制與僵尸進程排查

Linux fork函數(shù)詳解:返回值、COW寫時復(fù)制與僵尸進程排查 第一次看到fork這個函數(shù)我盯著那句“調(diào)用一次返回兩次”琢磨了挺久——一個函數(shù)怎么可能有兩次返回后來在內(nèi)核源碼里把kernel_clone到copy_process這條路走了一遍才算真正把這件事想通。它難懂不是因為概念有多玄乎而是因為它一腳踩在用戶態(tài) API 和內(nèi)核調(diào)度器的交界處你在 C 代碼里看到的只是一行函數(shù)調(diào)用背后卻是整個進程地址空間的復(fù)制、頁表的重新登記、調(diào)度實體的插入。Linux 的 fork 函數(shù)幾乎是所有多進程程序的起點從 shell 執(zhí)行命令、Nginx 拉起 worker、到你自己寫的批量任務(wù)分發(fā)腳本底層都是同一套東西。這篇文章我想寫給兩類人一類是剛學(xué)完操作系統(tǒng)課本、知道“fork 會復(fù)制進程”但一寫代碼就蒙的同學(xué)另一類是在項目里被僵尸進程、緩沖區(qū)重復(fù)輸出、子進程不受控這些問題咬過、想把這套機制徹底捋順的開發(fā)者。我會從內(nèi)核實現(xiàn)路徑、返回值語義、代碼實操、參數(shù)取舍一路講到排查實錄代碼都能直接跑坑也都標(biāo)出來。1. fork 的本質(zhì)一次調(diào)用為何有兩次返回1.1 從用戶態(tài)看它只是三個整數(shù)之一從調(diào)用者角度看fork的接口簡單到幾乎沒有任何可配置項——沒有參數(shù)沒有任何 flag只返回一個pid_t。這個返回值分三種情況必須先記牢因為后面 90% 的 bug 都源于這里判斷錯了返回值出現(xiàn)在哪個進程含義 0父進程這個值是剛創(chuàng)建出來的子進程 PID 0子進程說明“我就是那個新進程”沒有別的信息 -1父進程創(chuàng)建失敗原因看errno有一點很容易被忽略子進程拿到的 0 不是“子進程的 PID 是 0”而是一個標(biāo)記位。子進程想知道自己的 PID 得調(diào)getpid()想知道爹是誰得調(diào)getppid()。我見過不少人寫成if (pid 0) { /* 子進程 */ }邏輯反了還不報錯程序在多核機器上跑出來的結(jié)果飄忽不定排查半天才發(fā)現(xiàn)是分支寫反。#include stdio.h #include unistd.h #include sys/types.h int main(void) { pid_t pid fork(); if (pid 0) { perror(fork); return 1; } else if (pid 0) { printf(child : pid%d ppid%d\n, getpid(), getppid()); } else { printf(parent: pid%d child%d\n, getpid(), pid); } return 0; }編譯就用gcc -Wall -O0 fork_demo.c -o fork_demo加-Wall是習(xí)慣編譯器對fork相關(guān)的返回值未檢查會給出提示能擋掉一批低級錯誤。1.2 內(nèi)核里那條路從系統(tǒng)調(diào)用到copy_process用戶態(tài)的一次fork()最終會落到內(nèi)核的sys_forkx86-64 上走_(dá)_x64_sys_fork再進到kernel_clone。這個名字在不同內(nèi)核版本里變過老版本叫_do_fork5.x 之后統(tǒng)一成kernel_clone。真正干重活的是copy_process它按順序做了這么幾件事dup_task_struct復(fù)制一份task_struct和內(nèi)核棧此時父子進程的描述符已經(jīng)存在但內(nèi)容還很“空”。一系列權(quán)限與配額檢查RLIMIT_NPROC限制、系統(tǒng)級線程數(shù)上限、用戶進程數(shù)上限任何一項超了就直接返回錯誤。sched_fork給新任務(wù)初始化調(diào)度實體把它掛到調(diào)度器上但此時還沒真正運行。copy_files、copy_fs、copy_sighand這幾項大多是增加引用計數(shù)而不是深拷貝。打開的文件表、信號處理函數(shù)表、工作目錄這些父子共享同一份內(nèi)核對象。copy_mm這是最重的一步復(fù)制內(nèi)存描述符、遍歷所有 VMA、復(fù)制頁表并把父子雙方的頁表項統(tǒng)統(tǒng)改成只讀。alloc_pid分配一個新的 PID。wake_up_new_task把子進程放進運行隊列等調(diào)度器挑中它。父進程在kernel_clone返回處拿到子進程 PID子進程不是“返回”到這個位置而是被調(diào)度到時從ret_from_fork這條棧幀直接跳回用戶態(tài)返回值寄存器被填成 0。所以“一次調(diào)用兩次返回”這個說法其實有點誤導(dǎo)——它不是同一個函數(shù)返了兩遍而是兩個獨立的執(zhí)行流各自從內(nèi)核態(tài)穿越回用戶態(tài)只是它們穿越前在同一段內(nèi)核代碼里待過。1.3 為什么不做全量拷貝COW 的取舍邏輯如果fork真的把父進程幾百 MB 內(nèi)存整塊復(fù)制一遍那創(chuàng)建一個進程的開銷會大到?jīng)]法用。早期的確是這個思路fork后緊跟execve的場景浪費極其嚴(yán)重——復(fù)制了一大堆馬上要被覆蓋的內(nèi)存。寫時復(fù)制Copy-On-Write簡稱 COW就是為了解決這個浪費copy_mm復(fù)制頁表時父子進程的頁表項指向同一批物理頁只是把這些頁的權(quán)限位從可寫改成只讀同時在task_struct里把頁標(biāo)記成 COW 頁。真正的復(fù)制推遲到有人寫的那一刻。任意一方寫入觸發(fā)缺頁異常內(nèi)核發(fā)現(xiàn)這是個 COW 頁才分配新物理頁、把原內(nèi)容拷過去、改回可寫然后重新執(zhí)行那條指令。這個設(shè)計的精妙之處在于只讀的父子進程幾乎零成本只有真正被修改過的頁才付出復(fù)制代價。但 COW 不是沒有成本。fork的耗時和進程當(dāng)前占用的虛擬內(nèi)存成正比因為頁表本身要復(fù)制。粗算一下x86-64 上普通頁是 4KB一個占 1GB 內(nèi)存的進程大約有 26 萬個頁表項每個 PTE 8 字節(jié)光頁表數(shù)據(jù)就是 2MB 左右再加上遍歷 VMA 的時間。所以你會發(fā)現(xiàn)一個現(xiàn)象——空進程fork微秒級就完了幾百 MB 的服務(wù)進程fork一次可能要好幾個毫秒。這個結(jié)論直接影響了后面的選型判斷。注意COW 讓父子共享物理頁但邏輯上是兩個獨立的地址空間。子進程里的malloc返回值在父進程里沒有任何意義別指望用這個地址跨進程傳數(shù)據(jù)那需要共享內(nèi)存或者管道。2. 執(zhí)行流、競爭與繼承那些課本上不講清楚的事2.1 父子誰先跑答案是“不知道”fork返回之后父進程和子進程誰先被 CPU 執(zhí)行完全由調(diào)度器決定沒有任何順序保證。在多核機器上兩個進程大概率是真并行在單核上時間片怎么分也看調(diào)度策略。這意味著任何依賴“父進程先執(zhí)行完再輪到子進程”的代碼都是錯的。我踩過的第一個坑就出在這里一個父進程里 fork 之后立刻往共享的文件描述符寫數(shù)據(jù)子進程也寫結(jié)果兩次實驗跑出來的內(nèi)容順序完全不一樣。當(dāng)時以為是文件系統(tǒng)的問題其實是執(zhí)行順序不確定。正確的處理方式是顯式同步——用waitpid等子進程結(jié)束用管道通信用信號量互斥而不是靠“大概會先跑我”。#include stdio.h #include unistd.h #include sys/wait.h int main(void) { pid_t pid fork(); if (pid 0) { printf(child working\n); _exit(0); } int status 0; waitpid(pid, status, 0); printf(child exited, status%d\n, WEXITSTATUS(status)); return 0; }子進程退出用_exit而不是exit這是個細(xì)節(jié)但很重要。exit會執(zhí)行atexit注冊的函數(shù)、刷新 stdio 緩沖區(qū)而這些緩沖區(qū)是從父進程繼承來的如果父進程 fork 前有沒刷新的內(nèi)容子進程exit時又刷一遍輸出就重復(fù)了。_exit直接走系統(tǒng)調(diào)用跳過所有這些用戶態(tài)清理干凈利落。2.2 文件描述符繼承共享的不只是“編號”fork之后子進程會得到父進程所有打開文件描述符的副本但這里有個特別容易誤解的地方復(fù)制的是描述符不是文件對象。父子雙方各自的 fd 編號可能不同但它們指向同一個struct file而struct file里存著文件偏移量。后果很直觀父進程讀了 100 字節(jié)子進程接著讀會從第 101 字節(jié)開始而不是從頭讀。寫文件同理兩邊交替寫會互相覆蓋偏移。我在做一個日志切分的小工具時就被這個咬過父子都往同一個日志文件追加結(jié)果日志里出現(xiàn)了大片空洞——因為兩邊都在用lseek挪同一個偏移量。想避免這個問題常規(guī)做法是父子需要獨立讀寫位置時子進程 fork 之后自己重新open一次文件或者應(yīng)用層用O_APPEND打開讓每次寫都由內(nèi)核原子地定位到文件末尾或者干脆別讓多個進程寫同一個文件改成各自寫各自的后續(xù)再合并。除了文件描述符子進程還會繼承當(dāng)前工作目錄、信號處理方式SIG_IGN和自定義處理函數(shù)都繼承但未處理的信號會重置為默認(rèn)、umask、環(huán)境變量、資源限制。這些在寫守護進程的時候會集中爆發(fā)問題。2.3 多線程進程里 fork 的隱藏雷區(qū)這是我認(rèn)為最需要單獨拎出來說的一條。fork只會復(fù)制調(diào)用它的那個線程其他線程在子進程里全都不存在。但問題來了那些線程持有的互斥鎖、條件變量、讀寫鎖狀態(tài)是被原樣復(fù)制過去的。如果 fork 的瞬間某個鎖正被另一個線程持有那么在子進程里這把鎖永遠(yuǎn)處于“被鎖住”的狀態(tài)而持有者已經(jīng)不存在了任何試圖加鎖的代碼都會永久阻塞。規(guī)避方式有三條路按推薦程度排fork 完立刻 execve。這是最安全的姿勢execve會把整個用戶態(tài)地址空間換掉鎖的狀態(tài)也一并消失。絕大多數(shù)“fork 后要干事”的場景其實都該走這條路。fork 之前保證沒有其他線程在跑比如在程序啟動早期就把需要 fork 的邏輯做完。用pthread_atfork注冊 prepare/parent/child 三個鉤子在 fork 前后手動加解鎖。這套機制能解決問題但很容易寫成死鎖尤其是涉及多把鎖的時候加鎖順序稍不注意就翻車。提示如果你的程序用了線程池同時又有 fork 子進程的需求請優(yōu)先考慮把子進程部分改成獨立進程或者獨立的服務(wù)不要在同一進程里混用?;煊脦淼恼{(diào)試成本遠(yuǎn)高于拆開的改造成本。3. 動手實操從最小 Demo 到可用的進程管理3.1 循環(huán) fork 的 2 的 n 次方陷阱先看一段看起來人畜無害的代碼for (int i 0; i 3; i) { fork(); printf(pid%d, i%d\n, getpid(), i); }很多人以為這會產(chǎn)生 3 個子進程加 1 個父進程。實際結(jié)果是 8 個進程。原因在于fork之后父進程繼續(xù)循環(huán)子進程也從 fork 的下一行繼續(xù)執(zhí)行于是它也進入下一輪循環(huán)并且再次 fork。每一輪都把當(dāng)前進程數(shù)翻倍3 輪就是 23 8。這個行為本身沒錯是很多人對“子進程從哪開始執(zhí)行”的理解有偏差。子進程不是從main重頭開始而是從fork返回點繼續(xù)。如果確實需要創(chuàng)建 N 個并列的工作進程比如預(yù)派生模型正確寫法是在子進程里立刻跳出循環(huán)#define WORKERS 4 for (int i 0; i WORKERS; i) { pid_t pid fork(); if (pid 0) { perror(fork); break; } if (pid 0) { worker_loop(i); /* 子進程干活不再進入下一輪 */ _exit(0); } } /* 父進程在這里統(tǒng)一 wait */關(guān)鍵就是if (pid 0)分支里干完活直接_exit絕不落回循環(huán)體。這個模式叫預(yù)派生pre-forkNginx 的 worker 模型、老式 Apache 的 prefork 都是這個思路。好處是每個 worker 獨立壞處是 worker 數(shù)在啟動時就固定了得配合平滑重啟來調(diào)整。3.2 用 fork execve 寫一個迷你 shell想真正理解 fork最好的練習(xí)是寫一個能跑命令的 shell。它的核心邏輯只有四步讀一行、切參數(shù)、fork、子進程 exec。#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/wait.h #define MAXLINE 1024 int main(void) { char line[MAXLINE]; while (fgets(line, sizeof(line), stdin) ! NULL) { line[strcspn(line, \n)] \0; if (line[0] \0) continue; if (strcmp(line, exit) 0) break; char *argv[64]; int argc 0; char *tok strtok(line, ); while (tok ! NULL argc 63) { argv[argc] tok; tok strtok(NULL, ); } argv[argc] NULL; pid_t pid fork(); if (pid 0) { perror(fork); continue; } if (pid 0) { execvp(argv[0], argv); perror(execvp); /* 只有 exec 失敗才會走到這里 */ _exit(127); } int status 0; waitpid(pid, status, 0); if (WIFEXITED(status)) { printf([exit %d]\n, WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf([killed by signal %d]\n, WTERMSIG(status)); } } return 0; }幾個值得說的點。execvp會自己去PATH里找可執(zhí)行文件所以直接敲ls就能跑。execvp成功的話永遠(yuǎn)不會返回返回值只在失敗時有用失敗后必須_exit(127)用 127 是 shell 界的慣例表示“命令沒找到”。waitpid拿到的status是個打包值不能直接當(dāng)退出碼用得用WIFEXITED、WEXITSTATUS、WIFSIGNALED這些宏去拆。我第一次寫的時候直接printf(%d, status)輸出 256 讓我困惑了很久——其實真實退出碼是 1因為退出碼存在高 8 位。這個 shell 還很粗糙不支持管道、重定向、后臺任務(wù)但骨架已經(jīng)對了。想支持管道就需要在 fork 之前先pipe()然后兩個子進程分別把dup2把讀端寫端接到標(biāo)準(zhǔn)輸入輸出上這是個很好的練手項目。3.3 并行任務(wù)分發(fā)怎么定并發(fā)數(shù)再給一個更貼近實際工作的例子——把一批耗時任務(wù)拆給多個子進程并行跑。這個模式在數(shù)據(jù)預(yù)處理、批量轉(zhuǎn)碼、壓測腳本里特別常見。#include stdio.h #include unistd.h #include sys/wait.h #define JOBS 4 static void do_work(int id) { sleep(1); /* 模擬耗時計算 */ printf(job %d done by pid %d\n, id, getpid()); } int main(void) { pid_t pids[JOBS]; for (int i 0; i JOBS; i) { pid_t pid fork(); if (pid 0) { perror(fork); pids[i] -1; continue; } if (pid 0) { do_work(i); _exit(0); } pids[i] pid; } for (int i 0; i JOBS; i) { if (pids[i] 0) { int status 0; waitpid(pids[i], status, 0); printf(child %d reaped, status%d\n, pids[i], WEXITSTATUS(status)); } } return 0; }并發(fā)數(shù)怎么定我的經(jīng)驗是別超過 CPU 邏輯核數(shù)。純計算型任務(wù)進程數(shù)等于核數(shù)時吞吐最高再多只會增加上下文切換和內(nèi)存壓力。可以用sysconf(_SC_NPROCESSORS_ONLN)拿到當(dāng)前可用核數(shù)再乘一個系數(shù)I/O 密集型任務(wù)等待磁盤、網(wǎng)絡(luò)系數(shù)取 2 到 4CPU 密集型任務(wù)系數(shù)取 1每個子進程內(nèi)存占用大比如幾百 MB還得反過來壓低數(shù)量防止觸發(fā) OOM。另外要注意waitpid的回收順序。上面這段代碼是按創(chuàng)建順序回收的如果第 0 個任務(wù)特別慢后面三個早就跑完了也得等著。想做到“誰先完誰先回收”用waitpid(-1, status, 0)循環(huán)回收任意子進程或者干脆用SIGCHLD信號處理。4. 資源、參數(shù)與選型什么時候該用 fork什么時候不該4.1 fork 失敗的兩種典型 errnofork返回 -1 時errno最常見的兩個值是EAGAIN和ENOMEM含義完全不同排查方向也不一樣。EAGAIN表示“資源暫時不夠”通常是進程數(shù)配額打滿了。要檢查幾個地方RLIMIT_NPROC用ulimit -u看、系統(tǒng)級kernel.pid_max、kernel.threads-max還有 cgroup 里的pids.max。在容器環(huán)境里跑最容易撞的是 cgroup 的 pids 限制從宿主機上看一切正常容器里怎么都 fork 不出來。我遇到過的一次就是容器 pids 上限設(shè)得太小業(yè)務(wù)里但凡有個 fork 都失敗日志里只留一行“Resource temporarily unavailable”查了半天才定位到配額。ENOMEM則是內(nèi)存不夠。注意這不一定是物理內(nèi)存耗盡也可能是因為 COW 機制下內(nèi)核需要為新進程分配task_struct和內(nèi)核棧同時在復(fù)制頁表時需要申請內(nèi)存。內(nèi)存緊張時一個本身不大的進程 fork 也可能失敗。這時候該看的是dmesg里有沒有 OOM 相關(guān)記錄以及/proc/meminfo的CommitLimit和Committed_AS。堆棧上還有一個坑內(nèi)核棧默認(rèn)不大歷史上是 8KB某些配置下更小fork本身不占用戶棧但如果你的代碼在fork前遞歸很深子進程復(fù)制的是整個地址空間的映射雖然 COW 不會立刻復(fù)制物理頁但虛擬地址空間的布局是完全一致的棧溢出風(fēng)險同樣被繼承過去。4.2 fork、vfork、clone、posix_spawn 怎么選這四個東西經(jīng)常被放在一起比較但它們的定位差別很大接口地址空間典型用途注意事項fork完全復(fù)制COW通用進程創(chuàng)建大內(nèi)存進程下耗時隨內(nèi)存增長vfork與父進程共享父進程阻塞fork 后立刻 exec 的老場景子進程不能 return只能_exit或 execclone可精細(xì)控制共享哪些資源實現(xiàn)線程、命名空間隔離參數(shù)復(fù)雜直接用的場景不多posix_spawn內(nèi)部實現(xiàn)可能用 vfork/clone單純想“起個程序”接口受限不適合 fork 后跑自定義邏輯選型上的判斷其實很簡單如果你 fork 之后馬上就要 execve那就用posix_spawn它在 glibc 里會走clone(CLONE_VM | CLONE_VFORK)省掉整個頁表復(fù)制的開銷在大內(nèi)存進程里差距非常明顯。我在一個占內(nèi)存接近 1GB 的服務(wù)里把fork exec換成posix_spawn創(chuàng)建子進程的耗時從毫秒級降到了幾十微秒級效果立竿見影。如果 fork 之后子進程要跑一段自己的 C 邏輯改環(huán)境、設(shè)權(quán)限、接著算那還是老老實實fork。vfork不要碰它的約束太苛刻稍微寫錯一點就是未定義行為而且現(xiàn)代 glibc 的fork已經(jīng)在很多場景下優(yōu)化得夠好了。如果你需要的是“共享地址空間的并發(fā)”那你其實想要的是線程應(yīng)該用pthread_create而不是clone。clone是給需要做命名空間隔離、實現(xiàn)容器運行時這類底層工具準(zhǔn)備的。4.3 內(nèi)存開銷的實測感受我自己做過一個粗略的對比測試在同一臺機器上讓一個進程分別占用 10MB、100MB、500MB 匿名內(nèi)存然后各 fork 1000 次記錄平均耗時。數(shù)量級上的結(jié)論是10MB 時 fork 大約在幾十微秒100MB 時漲到一兩百微秒500MB 時到了毫秒級。這個增長主要來自頁表復(fù)制和 VMA 遍歷跟寫入多少數(shù)據(jù)無關(guān)。這個結(jié)論有很實際的指導(dǎo)意義如果你的服務(wù)常駐內(nèi)存很大就不要在熱路徑上頻繁 fork。要么改成常駐的 worker 池啟動時一次性 fork 好之后靠任務(wù)隊列分發(fā)要么改用線程池要么在 fork 前盡量減少不必要的內(nèi)存映射。反之如果進程很小比如一個命令行小工具fork 的開銷基本可以忽略不用過度設(shè)計。5. 常見問題與排查實錄5.1 僵尸進程不是“沒死透”是“沒人收尸”子進程結(jié)束后內(nèi)核不會立刻把它的task_struct全部釋放因為父進程可能還需要讀取退出狀態(tài)。這個狀態(tài)叫僵尸態(tài)Z。只要父進程調(diào)用了wait或waitpid狀態(tài)被讀取資源才會真正回收。如果父進程一直不回收僵尸會越積越多。單個僵尸占的內(nèi)存不多主要是一個task_struct加內(nèi)核棧但 PID 是有限的數(shù)量堆上去之后新的 fork 就會返回EAGAIN。用ps aux | grep Z能一眼看到或者ps -eo stat,pid,ppid,comm | awk $1 ~ /^Z/。處理方式有幾種按場景選同步回收waitpid(pid, status, 0)適合明確知道要等哪個子進程的場合。異步回收注冊SIGCHLD處理函數(shù)在處理函數(shù)里循環(huán)waitpid(-1, NULL, WNOHANG)直到返回 0 或 -1。注意SIGCHLD可能合并所以必須用循環(huán) WNOHANG不能只 wait 一次。主動放棄如果確實不關(guān)心子進程結(jié)果可以顯式忽略signal(SIGCHLD, SIG_IGN)在某些系統(tǒng)上這會讓子進程退出時自動被回收不用父進程操心。但要注意這會影響到所有子進程其他需要waitpid的地方就拿不到狀態(tài)了。#include signal.h #include sys/wait.h #include unistd.h static void on_sigchld(int sig) { (void)sig; int saved_errno errno; while (waitpid(-1, NULL, WNOHANG) 0) { /* 循環(huán)回收所有已退出的子進程 */ } errno saved_errno; } int main(void) { struct sigaction sa; sa.sa_handler on_sigchld; sigemptyset(sa.sa_mask); sa.sa_flags SA_RESTART | SA_NOCLDSTOP; sigaction(SIGCHLD, sa, NULL); /* ... 業(yè)務(wù)邏輯 ... */ return 0; }信號處理函數(shù)里保存和恢復(fù)errno是個細(xì)節(jié)因為信號隨時可能打斷正在進行的系統(tǒng)調(diào)用處理函數(shù)里如果改了errno回到被打斷的地方邏輯就亂了。SA_RESTART的作用是讓被信號打斷的系統(tǒng)調(diào)用自動重啟減少EINTR的處理負(fù)擔(dān)。另一個容易被忽略的角色是孤兒進程。父進程先于子進程退出子進程就被“過繼”給initPID 1或者某些系統(tǒng)里的 subreaper由它負(fù)責(zé)回收。這本身不是問題但如果你的程序里子進程依賴父進程做清理工作父進程一死子進程就成了沒人管的野進程。做守護進程或者熱重啟的時候要特別小心這一點。5.2 緩沖區(qū)重復(fù)輸出一個經(jīng)典到不能再經(jīng)典的坑這段代碼把輸出重定向到文件你會看到兩行hello#include stdio.h #include unistd.h int main(void) { printf(hello); /* 沒有換行 */ fork(); return 0; }原因在于 stdio 的緩沖策略。輸出到終端時是行緩沖遇到\n才刷輸出到文件時是全緩沖緩沖區(qū)滿了才刷。printf(hello)沒有換行內(nèi)容就躺在用戶態(tài)緩沖區(qū)里沒發(fā)出去。fork復(fù)制地址空間時這份緩沖區(qū)內(nèi)容原樣復(fù)制到了子進程。父子進程各自正常退出exit觸發(fā)刷新于是同一個 hello 被寫了兩次。這個坑的隱蔽之處在于同樣的代碼在終端上跑是正常的一重定向到日志文件就出問題。所以排查時如果發(fā)現(xiàn)“日志里怎么有重復(fù)行”先看看是不是在fork前有沒刷新的輸出。規(guī)避手段很成熟fork之前調(diào)用fflush(NULL)把所有的輸出緩沖刷干凈或者子進程一律用_exit而不是exit或者在每個printf后面老實加\n。這三條里我推薦后兩條組合使用_exit應(yīng)該成為肌肉記憶。5.3 常見問題速查表把上面這些以及一些零散的問題匯總一下方便對著查現(xiàn)象最可能的原因排查/解決fork返回 -1EAGAIN進程數(shù)達(dá)到RLIMIT_NPROC或 cgroup pids 上限ulimit -u查容器 pids.maxfork返回 -1ENOMEM內(nèi)核內(nèi)存不足無法分配task_struct或頁表看dmesg、/proc/meminfo子進程跑完不退出ps顯示Z父進程未回收加waitpid或SIGCHLD處理日志出現(xiàn)重復(fù)行fork 前 stdio 緩沖區(qū)未刷新fork 前fflush(NULL)子進程用_exit循環(huán)里 fork 出 2^n 個進程子進程落回循環(huán)子進程分支結(jié)束后立刻_exit父子寫同一文件內(nèi)容錯亂共享文件偏移量用O_APPEND或各自 open或分文件子進程里加鎖永遠(yuǎn)阻塞多線程下 fork鎖被其他線程持有改成 fork 后立即 exec或用pthread_atfork子進程變成孤兒無人清理父進程先退出用 subreaper 或?qū)iT的 supervisor子進程繼承了不該有的 fdfd 默認(rèn)被繼承fork 后關(guān)閉無關(guān) fd或用O_CLOEXEC最后一條值得展開說一句。O_CLOEXEC這個標(biāo)志非常有用打開文件或套接字時帶上它這個 fd 會在 exec 時自動關(guān)閉避免子進程意外持有不該持有的連接。在長連接多的服務(wù)里如果 fork 出來的子進程繼承了所有 socket一方面浪費 fd另一方面連接關(guān)閉的時機變得難以判斷。從代碼層面統(tǒng)一給open、socket、pipe2加CLOEXEC是個好習(xí)慣成本幾乎為零。還有一個排查技巧不確定子進程到底繼承了哪些 fd可以在子進程里ls -l /proc/自進程PID/fd一眼看清楚。同理/proc/PID/status里的Threads、VmRSS/proc/PID/task/下的線程列表都是排查這類問題的一手信息。養(yǎng)成看/proc的習(xí)慣比裝一堆工具快得多。6. 我在實際項目里攢下的幾條經(jīng)驗寫到這里分享幾個文檔里不太會提、但確實節(jié)省過時間的做法。第一給每個 fork 出來的子進程起個可識別的名字。Linux 上可以調(diào)prctl(PR_SET_NAME, worker-xxx)這樣ps和top里就能看明白哪個進程在干什么而不是一堆同名進程排在那。出問題時省下來的定位時間遠(yuǎn)超當(dāng)初寫這幾行代碼的成本。第二在子進程的入口處打一行帶 PID 的日志并且立刻setpgid或調(diào)整會話。這能讓日志里的 PID 和進程樹對應(yīng)起來尤其是在子進程會再 fork 的場景下沒有這層標(biāo)記日志會亂成一鍋粥。做后臺任務(wù)的時候順手把子進程放到獨立的進程組后面想整組發(fā)信號終止也方便。第三不要吝嗇waitpid的循環(huán)寫法。我見過太多“只 wait 一次”的代碼在子進程密集退出的場景下漏回收慢慢積累成僵尸。統(tǒng)一寫成while (waitpid(-1, st, WNOHANG) 0)配合SA_RESTART這套模板可以直接抄。第四大內(nèi)存進程優(yōu)先考慮換掉模型。如果發(fā)現(xiàn)每次 fork 都有明顯卡頓先別急著調(diào)內(nèi)核參數(shù)問問自己“這個 fork 真的必要嗎”。預(yù)派生進程池、線程池、獨立的常駐服務(wù)這三種方案在絕大多數(shù)場景下都比“按需 fork”更穩(wěn)。fork這個接口看著古老但它承載的語義——地址空間復(fù)制、文件描述符繼承、執(zhí)行流分叉——至今沒有被替代。把它的返回值、COW、回收機制這三件事吃透后面再看clone、看容器運行時怎么隔離命名空間、看 shell 怎么執(zhí)行管道都會順很多。我現(xiàn)在寫涉及多進程的代碼開工前會先在紙上畫一遍父子關(guān)系標(biāo)清楚哪個 fd 誰負(fù)責(zé)關(guān)、哪條路誰負(fù)責(zé) wait畫完之后 bug 就少了一大半。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
激情小说亚洲| 女性91网站| 爱爱久久| 日韩亚洲97| 婷婷五月天激情四射| 亚卅熟女乱色| 丝袜 亚洲 偷拍| 久操大香蕉| 日本丝袜人妻内射| 1769一区二区| 91久久国产综合久久| 啊啊好多水| 理论久久婷婷网8| 国产免费内射视频| 波多野42部无码喷潮在线观看| 熟女熟妇一区二区三四区| 成人精品一区二区91毛片不卡| 久操凹凸视频| 国产女上位好爽在线| 日韩不卡码| 国产精品农村妇女| 人人操人人摸人人看人人干| 男人天堂一区二区| 97超碰亚洲| 94色色电影网| 乱伦a片视频| 久久婷婷国产一区二区色| 97国产精品久久久久| 午夜黄色免费在线观看| 青青草视频导航官网| 中国91AV| 熟女人妻av在线资源,黄色的资源| 偷拍在线观看视频| 国产二区三区免费视频| 精品乱子一区二区三区99| 揉揉揉夜夜| 综合色啪| 亚洲国产精品有声| 九九热视频这里只有精品| 正宗无毛一线天嫩逼| 人妻一区视频| 欧美亚洲高清晰| 免费黄色片子| 国产啊v在线免费播放| 都市激情人妻一区二区青青操视频| 91丝袜美女视频| 久久丁香五月天| 另类欧美综合| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 亚洲中文字幕av| 欧美高清91| 天天影视色香色欲| 亚洲色图欧美色18直播在线| 欧美 亚洲 制服 精品| www.黄色在线| AV天堂因数| 2011国产精品| www成人啪啪18秘 免费| 乳欲人妻办公室奶水| 91男同| 天天草天天干天天日| 99色热| 亚洲 欧美 第一页| 亚洲日韩东京热一区| 免费一级毛片在线视频观看| 美女91色黄18| 亚洲综合 欧美| 九九热超碰97亚洲最新香蕉| 色色99| 久久女女| 97在线欧洲| 午夜天堂精品久久久久91| AV污污污污| 久操电影| 老司机深夜18禁污污网站| 色97欧美| 四季av一区二区凹凸精品小说 | 色五月av| 伊香蕉综合久久久久久久噜噜噜| 在线人妻熟女一区二区三区四区五区| 懂色aV一区二区天美传媒| 97久久精品亚洲中六字幕| 亚洲国产激情国产av| 99热精品在线| 蜜乳AV免费观看| 91五十路| 欧美综合网站999| 亚洲综合九| 99热这里只有精品1| 天天摸,夜夜摸| 婷婷五月影院| 亚洲天堂资源在线| 日韩无码极品| 中文字幕日本久久| 在现视频女上位好爽| 久九干| 春色校园综合网| 中文字日本乱码| 97色涩| 日韩天天本| 欧美自拍网| 日韩三级在线观看网站| 亚洲第2页| 九九热精品| 麻豆亚洲Av成人无码一区精品| 久久久久久AⅤ无码免费肉站 | 人人妻人人爱人人玩| 思思热在线视频免费| 男女性感激情网站| 九九Av| 精品免费一区二区三区在线亚洲人成| 青青草影视蜜久久| 亚洲区小说| 日韩亚洲欧美中文字幕| 影音先锋中文字幕日本好一区二区| 性色av蜜臀av色欲aV| 狠狠干狠狠干| 九色 蝌蚪 熟女自 | 九九久久九九久久| 97超碰中文字幕| 亚洲欧洲日韩天堂av| 久久久久免费少妇| 欧美97免费| 伊人精品久久网站| 91中文精品日韩欧美在线| 欧美高清91| 成人午夜小视频手机在线看| 97日韩欧美亚洲| 日韩免费看黄片| 99操| 91在线无码精品秘 软件| 好屌色综合| 免费观看性欧美一级| 婷婷六月色| 九九九九一区| 强上我不卡卡| 日本免费人成视频播放120秒| 欧美综合第一| 国产精品一级特黄aaa大片在线观看| 97干色天堂| av最新免费中文字幕| 六月婷婷一区二区三区| 日韩一区二区高清在线观看的| 97精品国产手机| 操逼视频免费日韩无码| 欧洲综合色| 99999精品成人| 丰满人妻一区二区三区大胸懂色| 91日产桃蜜| 欧亚乱色熟一区二区三四区| 顶级丝袜熟女一区二区三区| 中文字幕精品免费一区二区| 久久宗合亚洲| 旡码电影特区| 26uuu国产免费观看| 国产精品欧美在线观看| 欧美色棕合| 性91| 无码二级三级| 啊操爽品善一区二区三区| 在线观看免费视频国产| 风韵犹存大大大大香蕉| 校园春色美腿丝袜| 深夜激情| 欧美成人精品一区二区男人蜜臀| 色婷婷丁香五月| αⅴ天堂| 午夜男人av| 午夜无遮挡男女啪啪视频| 野狼福利社区| 天天cao在线| 婷婷人妻激情| 情色大香蕉| 日韩人人精品| 欧美国产操逼| 在线天堂资源亚洲| 搞中出久久| 91丝袜人妻| 99草精| 日本大香蕉综合网| a片久久久久久久久久久久| 欧美91变态| 试看日韩黄片| 欧美AB在线| 超碰色老头| 日躁天天爽爽| 特级丰满少妇一级AAAA爱毛片| 无码不卡八戒| 九九aV| 亚洲综合小说另类图欧美视频激情小说色五月天 | 日逼逼免费看| 久操网视频| 亚洲中文日韩精品| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 激情综合网激情综合| 国产h小视频在线观看免费| 俺去啦俺来也久久综合| 色人久久| 99精品无码| 大JI巴好深好爽又大又粗视频| 在线97视频| 黄人人操人人操| 日韩亚洲中文有码视频| 午夜天堂精品久久久久91| 97色论| 67914在线兔费成人视频| 亚洲欧洲无码bt精品合集| 久久性爱大全| 私人尤物在线精品不卡| 丰满人妻无码一区二区三区| 日韩三级网址| 亚洲熟妇A V黑人| 综合伊人激情| 国产精品久久久视频| a啊啊啊啊啊啊啊啊一区二区| 97精品一区二区视频| 综合激情五月丁香| 2020中文字幕在线| 免费自拍三级综合| 嗯,啊。舔我逼| 天天摸夜夜添无码小视频| 久久国色天香香蕉| 精品人妻一区二区免费蜜桃视频| 天天色综合天天操| 果冻传媒A片麻豆熟妇人妻| 欧美熟女操屄| 天天色综合影视网| 可以免费观看的av| 91制服丝袜中文字幕| 国产黄a三级三级三级av在线看| 欧美线天码中字| 亚洲AV成人在线| 9Ⅰ超碰| 久久久久久久久久久久久久久性生活视频 | 国模不卡| 大香蕉92| 黄污污污污| 日本视频在线中文字幕| 少妇内射www在线观看视频| 牛牛操视频逼| 裸体美女久久久| 亚洲第一无码播放立川理惠| 九九热精品| 九九精品美女高溯喷水| 国产成人bd在线观看| 欧美性暴力| 日少妇亚洲版| 91久久久久久久| 午夜人人操| 天天日美女的B| 亚洲人妻AV| 淫荡少妇免费| 最新av网站在线观看| 91女优在线观看 | 97色操| 美女诱惑在线一区| 69人妻精品一区二区绯色| 人人人摸人人| 12一15性XXXX粉嫩国产| 精品69网| 后入国产| 可乐操亚洲蜜911| 欧美少妇性乱| 香港日本韩国人妇99www.wccm20| 久久激情网| 黄在线| 成人无码在线超碰网| 91精品国| 日韩99999| 亚洲 日本 不卡| 91中出视频| 亚洲,欧美,综合网| 91老妇女| 啊v视频在线观看| 麻豆2区1区天美| 亚洲色图大香| 91九久| 91人妻丝袜无码| 亚洲色图欧美视频| 一区操逼日比视频| 欧美系列在线一区二区| 色婷婷狠狠18禁| www.夜夜操| 国产成人精品日本亚洲语言| www色婷婷| 国产成人亚洲精品自产在线| 裸模AV女优| 麻豆AV96熟妇人妻| 久久久亚洲熟妇资源| 91亚.色| 偷拍导航视频网站| 欧美综合国产精品久久丁香| 高清无码 国产精品| 夜色AV无码手机在线影院| 国产精品自在自拍视频| 色性综合| 啊啊啊啊啊啊啊网址在线观看| 嫩草影院永久在线制服丝袜| 人人澡人人干| 亚一综合久久久久久久久久| 淮穴色AV| 中出20p| 黄片视频观看| 爆操无码| 玖玖蜜臀资源网| 精品人妻伦一区二区三区久久| 91天堂视频| 麻豆一区二区AV天美| 国产极品精品美女视频| 欧美黄色图片| 欧美日韩在线小说| 午夜男人一级A片7777| 99只有精品| 欧美啪啪色吧在线| 麻豆人妻精品一区二区| 亚洲欧美校园| 亚州国产成人精品女人久久| 美日韩成人| 色老汉色| 精品精品精品| 天天操夜夜嗨| 欧美综合自拍| 风间由美日韩欧美久久| 91性生活久久久| 在线天堂999| 青青草啪啪网| 婷婷99狠狠躁天天躁| 亚洲一卡二卡在线免费| 久久成人精品| 午夜美女诱惑电源网| 狠狠婷婷亚洲中文综合久久| 人人妻人人色一区二区三区| 亚洲最新中文字幕免费| 久久久久ab| 97超级色碰碰| 思思在线免费视频| 美日韩一二三区| 久久久亚洲熟妇熟女| 久久98| 婷婷精品国产欧美精品亚洲人人爽| 黑人精品欧美一区二区蜜桃| 五月激情综合网| 啊啊啊久久久视频| 免费视频a级毛片免费视频| 久久中文字幕女同性恋一区| 秋霞网—男女啪啪亚洲免费体验区 | 欧美性战999| 91日产欧美| 波多野42部无码喷潮在线观看| 女人高潮大叫一级毛片| 97网色| 欧美色图亚洲色图成人在在线| 超碰99在线观看| 九九碰九九爱97超| 国产久久日韩网站导航| 国产精品呦一区二区三区| 狠狠躁天天躁日日躁97| 激情丁香婷婷| 一本大道久| 亚州操操穴网| 天堂俺去俺来也www久久婷婷| 91 国产丝袜在线播放-百度| 天天肏美女| 中文字幕丰满人妻日本| 欧美日韩国产色五月综合在线| 欧美精品1区2区3区| 精品美女少妇一区二区| 激情终合网| 竹菊影视国产一区二区| www.99色| 深夜国产一区二区三区在线看| 国产suv精品一区二六| www.操| 婷婷丁香久久| 亚洲高清无码AAA久久久精品| 91久久国产精品| 夫妻四区五区六区| 亚洲国产一区二区三区在线| 亚洲图片欧美日韩| 欧美熟爽综合| 日韩中文字幕熟妇人妻| 蜜乳AV一区二区三区四| 中文字幕乱在线伦视频中文字幕乱码在线 | 欧美综合第一| 国产毛片精品一区二区色欲黄A片| 96精品久久久久久久久| 亚洲熟女av中文字幕| 国产青青美女玩逼视频| 天天天操天天天爱| 亚洲第一页色网| 成人精品视频| 老熟女综合网| 综合网亚洲| 男人天堂电影院| 91熟女丨老女人| 久久78| 狠狠操,使劲操| 中日亚韩免费视频| 人妻激情偷乱视频一区二区三区 | 国产成人亚洲精品无码古代早漏男| 欧美懂色综合网| 高清有码一区二区| 怡红院一区二区熟女人妻| 激情丁香五月| 91爱综合| 屁股久久久久久久久| 啊啊啊骚| 人人做人人妻人人夜视频| 国产福利影视| 人妻 制服 日韩 中文 在线| 好吊色青靑草| 91GD.COM| 亚洲狠狠入| 天天看夜夜看日日干| 强奸乱伦亚洲第一页| 亚洲中文字幕精品久久久久久直播| 久久五月天婷婷| 久久免费精品96| 97超碰精品| 日本天天人人狠狠在线日美女 | 伊人久操| 亚洲综合贴图91| 日本操逼视频免费| 天天色综合图片| 欧美自拍网| 84YTCOM性无码| 免费看一级a性色生活片久久无| 992这里有精品| 另类老少妇| 黄片aaaaa一区| 91性| 国产精品高清2021在线| 天天爽爽爽爽| 麻豆天美传媒毛片| 2000亚洲男人天堂| 浪人综合网| 97干综合网| 98人妻精品一区二区色欲| 婷婷五月天av| 欧美色网| 黄片免费看的| 超碰人人干天天射| 五月天婷婷成人网| 乱伦日本中文自拍| 亚洲骚男同com| 无码最新| 久操免费电影| 小草精彩毛片| 黄片直播三级黄片两女一男| 日欧操屄| 国产无码三级视频在线观看| 欧美性视频二区三区| 床上啊啊啊一区二区三区| 一级黄色性爱裸体视频| 亚洲玖玖爱| 国产丰满熟夫69mpp| 操操碰| 丝袜熟女一区二区三区| A V视频日本| 国产一级内射高清视频 | 久久国产逼| 91操熟女| 综合av社区| 久草加勒比一区在线| 亚洲精品久久一区二区三区蜜桃臀| 一区二区日韩欧美久久| 欧美99热| 98色网| 久久五月综合| 91xingse| 欧美日韩黄色片一区二区三区四区人与兽做爱| 九九九九久久久| 东京热男人的天堂网| 五月丁香综合网| 人人透人人操| 久久亚洲AV成人精品无码| xxxx网站亚洲精品| 盗摄女人妻在线| 久久久国产亚洲精品系列| 口爆吞精在线观看| 欧美性爱十八禁| 色婷婷影院| 欧美图片偷拍| 91在线丝袜视频| 亚洲情色在线| 国产在线激情| 99久久精品无码一区二区毛片免费| 日韩免费a级毛片无码a∨| 欧美亚洲| 无码精品人妻一区二区三区妖精 | 亚洲AV无码乱码| 国产一区自拍欧美日韩| 欧美十八禁在线看| 粉嫩国产精品久久久| 粉嫩久久久极品| 91天天| 97任你吞精| 亚洲色吧网| 自拍视频大全亚洲专媒视频/一区二区三区| 欧美色九九九| 精品午夜福利| 新版天堂中文资源8在线| 天天插天天操| 精品一二三区女同 | 欧美另类色图片| 久久日本熟女精品一区| 97超碰久久| 欧美日韩性爱视屏免费看了| 亚洲 另类 丝袜 自拍 动漫| a片久久久久久久久久久久 | 国产精品人妻熟女aⅴ| 久久久久久国产精品免费网站| 欧美激情综合色综合啪啪五月| 91成人在线| 色综合av综合久久| 丁香五月影院| 色妺妺AⅤ| 五月婷婷丁香| 97 国产精品| ss久久| 特色a在线上| 久久久久久午夜男人的天堂| 国产白丝AV| 亚洲图片偷拍视频区| 美女爽爽爽刺痛洞洞| xxx0国产在线播放| 蜜桃网熟妇| 黄色污污污污污污网站| 亲子敌伦对白在线播放| 德国一二三不卡| 操国产逼| 白嫩妹子国产骚| 婷婷丁香成人| 97超碰磁| 蜜臀va69| 久久有碼| 亚洲天堂中文字幕无码男同| 人妻一区二区三区视频| 中国的操老妇女| 天天日B夜夜干B时时操B| 五月开心久久AV官网| 成人综合久久精品色婷婷| 一区在线精品中文字幕| 欧美在线综合| 免费观看有码高清视频| 亚洲欧洲成人在线电影| 一本久久精品中文字| 婷婷五月天激情小说| 欧美日韩中文视频播放| 91高跟美女在线播放| 午夜福利成人免费视频| 熟女探花啪啪| 少妇高潮一区二区三区在线| 美女91在线观看| 日本网色| 无码高清国产AV| 友优传媒精品在线一区二区| 人人九九精| 色 婷97| 超碰亚洲欧美日韩无| 欧美激情 亚洲色图| 少妇无码999| 国产极品美女高潮无套在线观看| 蜜乳AV.COM| 伊人影院中文字幕| 玖玖草久草99蜜月一区二区三区| 亚洲日本韩国在线| 亚洲精品国产精品乱码不99| 国产视频一区二区免费| 欧美一区二区亚洲天堂| 亚洲色欲天天人妻无码系列专区| 另类小色呦| 日韩乱伦视频| www.99视频| 开心激情婷婷| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 欧美性爱精品一区二区| 日韩欧美中文| 美女被艹尤物视频| 久久美女福利是上海美女| 国产福利精品最新在线| 五月婷婷综合网| 亚洲情色五月天| 中文字幕日韩精品一区二区三区| 99re8超碰| 国产妇女精品视频青青草| 99re在线视频国产| 欧美最婬乱婬爆婬牲视频| 欧美性爱超碰97| 精品福利| 在线观看高清AV| 国产午夜无码片在线观看影视| 九月丁香综合网| 女人高潮抽搐喷水视频网站| 日韩偷拍色图| 亚洲综合性网址| 亚洲熟妇AV日韩熟妇在线| 天躁夜夜躁2021| 国产无码精品无码| 人妻人人做人人澡人人爽欧美一区| 久久性爱网站| 欧美综合骚| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 韩国三级三级BD在线| 青木玲在线不卡| 992视频一区| 亚洲日韩视频二区| 久久久中文| 偷拍超碰| 精品对白久久不卡| 亚洲精品乱码线路中文字幕| 色五月综合| 九九热超碰97亚洲最新香蕉 | 亚洲人久久久久日| 岛国网址国产| 日本一区二区电影网站| 青青草国产一区二区三区| 亚州综合色| 911粉嫩人妻| 啊啊啊不要啊啊受不了了视频在线 | 97在线视频免费看| 天美精品原创av片国产| 日本熟妇人妻中出视频| 精品网站9999| 鸥美中出| 亚洲av乱伦色图网站| AV老汉| 久久系列| 欧美人人AAA| 欧美婷婷久久| 91情色| 五月婷婷激情综合| 久久人妻一区二区三区高清| 八戒午夜福利理论片| 97超碰国产精品| 欧美图片校园春色| 久久亚洲AV成人精品无码| 亚洲综合小视频小说在线观看| 亚洲欧美国产精品久久久久久久| 欧美人与动性人交a| 九九色综合| 日韩av电影网站| 91亚洲色人| 欧美性区| 91一区二区三区蜜桃| 亚洲天天艹| 亚洲毛片久久| 蜜桃视频精品一区二区| 91n处女在线观看| 多乙久久久久久| 日韩中文字幕宗合在线| 亚洲人妻在线一区| 性交一区二区在线播放| 综合免费无码中文| 美熟女逼导航AV操逼| 欧美,日韩综合久久| 九九九九九用不成了| 无码免费在线观看黄色片| 日韩一级二级在线| 一级特黄aaa大片在线观看成人一级片在线观看 | 97任你吞精| 亚洲无限观看| 欧美精品久久久久久久久88| 加勒比无码毛片| 2024人人操人人摸| 日本欧美不卡| 国内91熟女人妻丝袜天天精品视频在线| 亚洲情色无码一区二区三区| av天堂5| 99精品综合久久久久五月天| 欧美操人| 日本久久女同性恋视频| 天堂日本亚洲欧美| 黄色激情电影在线观看| 天堂综合| 色噜噜婷婷| 91亚洲网| 91在线丝袜视频| 激情综合二| 国产一线二线三线av| 激情99| 久久日韩精品一区二区| 久操视频免费观看| 强奸乱亚洲| 国产熟妇 码视频户外直播| 国产AV天美| 爆操无码| 俄罗斯及免费在线看| 少妇与黑人高潮在线| 在线一道啪| 91精品人妻一区二区三区蜜臀| 91xingse| 欧美顶级黄色大片免费| 大香久久| 国产视频大全| 七久久久| AV污污污污| 天天综合97| 天天操天天7| 亚洲色图久久成人| 国产极品美女高潮无套在线观看| 啊啊啊啊免费视频| 久久久久久久久久久999| 久久一区二区三区入口| 亚洲男人天堂av| 黄日韩| 免费视频97| 亚洲另类色图片| 亚洲综合激情五月久久| 人人操我人人干| 91精品人妻一品二品三品| 天天做天天爱天天爽AV| 久久久久久久人妻| 国产熟女免费观看久久| 免费中文综合精品| 躁躁躁日日躁2020| 欧美女同在线| 老熟妇一区二区三区啪啪| 日韩内射视频| 嗯嗯嗯好爽| 欧美综合区| 黄色电影观看久久9| 国产精品乱码久久久| 美女骚尻视频| 中文一区在线日| 情色五月天久久久| 国产精品乱人伊人网| 99热这里都是精品| 色婷五月| 久热9| 国产日本久久免费精品| 再深点灬舒服灬太大了添视频| 97视频免费播放| 深喉吞精| 亚洲欧美洲综合| 日韩欧视频| 天天摸天天操视频| 蜜臀网址在线| 日本布卡一区二三区| 日韩干B| AV在线播放网址| 青草影院内射高潮| 欧美日韩青操| 久久精品视频一区三区小泽玛利亚| 欧美色图偷拍另类| 久久精品老司| 人妻 制服 日韩 中文 在线| 佐山爱中文字幕| 日本加靬比网站发布页| 综合网欧| 亚洲十八禁止| 美国三级日本三级久久99| 青青草久草AV| 99福利社| 大香蕉淫人| 国产精品日日摸夜夜添骚逼| 亚洲丝袜诱惑| 国产精品ww久久| 免费观看网黄| 岛国片国产成人亚洲播放| 加勒比久久综合网高清| 最近的最新的中文字幕视频| 国产AV久久久蜜爱影集| 九九热最新| oumeisetu综合| 天天综合欧美综合| 久久m| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 精品国产久热在线观看| 99精品视频在线观看免费| 太久视频| 久久婷五月天| 91偷拍欧美亚洲| 国桃视频产巨乳精品一区二区在线| 天天夜夜久久| 久久精品无码不卡| 玖玖久久久| 人人操,人人插| 欧美日韩国产中文精品字幕自在自线| 五月天婷婷在线看| 四虎影视永久在线免费| 综合久久中文字幕综合日韩精品| 9 9精品一区二区三区| 亚洲人在线成线成人| jk白丝没脱就开始啪啪| 亚洲一卡2卡3卡4卡乱码网站| 色综合网1| 一牛影视久久久一区二区三区| 色婷婷成人综合| 久久影视二区三区行押| 天天干电影| 精品高清一区二区三区三州| 五月婷视频| 韩国女主播青草在线| 人人妻人人色一区二区三区| 一中国女人毛片水真多| 国产精品自在线发布| 天天欧美色| 欧美激色| 自拍内地三级在线观看| 丰满的三级少妇欧美久久久| 91色黑人少妇| 欧美色网络| 色狠狠 - 百度| 久久久一热在线播放| 欧美一区二区三熟女剧情| 岛国在线国产| 999在线电影香蕉| 后入式999| 一本色道综合久久欧美| 五月婷丁香| 亚洲丰满很很操| 大香蕉免费3| 亚州精人品大香蕉| 91色人| 黄页网站免费高清在线观看| 青娱乐 成人娱乐在线| 亚洲人精品久久久| 再深点灬舒服灬太大了添视频| 久久麻豆一区二区| 久久久久久裸体| 26uuu性| 超碰性爱97| 曰韩中文人妻视频| 狠狠欧美| 91综合网站| 色婷婷香蕉| 日韩射图| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | www.色操逼| 在线观看视频91| 欧美福利视频啊啊啊啊| 熟女人妻av在线资源,黄色的资源| 91高跟美女在线播放| 人人性爱视频免费| 骚乳在线| 精品人妻中文字幕高清| 天天欧美色| 综合网 欧美| 久久久一级| 先锋女优在线观看视频| 欧美日韩91| 97这里有精品| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 亚洲丝袜二区| 欧洲亚洲少妇| 极品五月天噜噜| 日产操逼| 黄片www视频免费| 嗯啊不要在线| 91免费看一区二区三区| 嫩草 人人网精品| 亚洲av国产av综合av卡| 青青草男人天堂| 国产极品美女高潮无套在线观看| 国产丰满少妇久久久精品影院| 国产精品999aaa| 欧美亚洲丝袜美女电影| 九九视频黄色片| 欧美日韩国产人人| 亚洲天堂无码| 97视频免费播放| 成人日本精品九区| 手机在线中文字幕国产| 久久精品一区二区三区蜜桃臀| 影音先锋乱| 麻豆天美在线| 不卡人妻少妇精品毛片一区23区视频| 亚洲丝袜综合| 东北老女人的激情视频| 国内毛片婷婷六月色| 一本一道久久综合久久| 亚洲欧美精品一区天堂久久 | 小电影欧美91| 韩国女主播青草福利视频| 正在播放国产精品一区| 北野未奈加勒比av| 亚洲人妻一区二区三区| 肏逼福利网站| 九九热精品| 日韩人成网站在线播放| 岛国激情视频在线观看| 亚洲国产精品V?在线播放| aa片毛片| 激情综合网激情综合| 精…码一二三区| 任你爽视频| 少妇三p| 男人 天堂 日 亚洲| 中文字幕在线高清男人的天堂| 欧美亚州综合网图片| 亚洲男人的天堂一区二区| 大色综合网| 午夜美女福利视频| 老熟妇一区二区三区啪啪| 99性爱| 亚洲成人免费中文字幕| 亚洲天堂男人网| 东北操逼| 亚洲日产专区| 男人的天堂一区三区| 无码人妻一区二区三区色欲aⅴ| 2017大香蕉国产精品久久| 婷婷五月天成人| 双插性欧美一二三区| 欧色网址| 狠狠爱夜夜干| 啪啪一区| 精品国产人成在线| 乱伦熟女论坛| 好涩综合| 女同性恋中文字幕| 男人天堂电影院| 狠狠躁天天躁日日躁| 中文字幕诱惑制服人妻丝袜美丝袜美 | 国产亚洲精品无码三区| 欧美日韩亚洲天堂| ...日韩成人一区二区三区字幕| 中文一区二区婷婷视频| 久久久久人妻| 无码少妇精品一区二区60岁老人| 飘花国产午夜精品不卡| 秋霞怕怕片| 欧美伊人电影| 色香网| 美女骚尻视频| 久污| 久久AV色| 亚洲诱惑| 狠狠亚洲| 人妻人妻天天碰| yazhousetuoumei| 91亚洲青青草原精品1区| 欧美躁死她一区二区| 色五月婷婷色| 亚洲精品蜜桃久久久| 97碰碰日本乱偷人妻中文的| 用力操死我| 内射日韩大臀美女| 久久久亚洲精品电影免费看| 欧美极品少妇交| 亚洲无套久久嗯嗯| 东北女人av| 宅男91视频在线播放| 人妻精品4K4K4K4K4| 蜜桃精品一区二区三区ww| 爱爱动态120秒| 美腿色图| 女生自91网站| 欧美在线视频播放| 欧美性Fer办公室秘书| 97在线欧| 久热伊人| 欲香欲色| 亚洲性爱电影| 亚洲成人福利电影免费| 日本国产成人亚洲精品无码| 无套内射性感少妇视频| 97人人草| 日本熟妇熟色97一本在线观看| 九九精品美女高溯喷水 | 熟女人妻一区二区三区| 亚洲国产精品成人久久蜜臀| 极品国产内射| 岛国片在线播放| 亚洲情色中文字幕一区| 中文字幕在线高清男人的天堂| 国产亚洲99久久精品| 天天综合亚在线| 午夜精品久久久99| 四虎免费视频| 天天噜| 操www| 免费精品福利在线观看| 久操综合在线| 伊人久久久日韩一区| 日本免费一区二| 91欧美性| 一级毛片久久久久久久女人18| 吻戏激情性巴克| 国产免费久久精品99re韩国| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 亚洲久久天堂| av在线一区二区三区| 亚洲男人的天堂AV| 极品国产内射| 久久久草成人网站久久久草成人久久久草久久久 | 国产A v无码专区| www久| 中文字幕-区二区三区四区视频中国| 久久精品日韩专区免费观看| 欧美日韩在线小说 | 天堂麻豆天美| 青青草综合在线| 人人妻人人爽 97人人看碰人免费公开视频| 操逼网站视频漫画国产| 在现视频女上位好爽| 屁股久久久久久久久| 日本精品五区| 青青操轻轻| 人妻大相焦在线| 国产AV中文| 国产第25页在线观看| 亚洲另类久操网| 日日AAvv| 日韩国产欧美伦理在线| 97精品国产97久久久久久| 啊啊啊啊啊好舒服视频| 黄色无码高清黄色无码网站| 天天躁日日躁AAA片李宗瑞| 96AV久久久| 九久9精品| 中文字幕狠狠玩| 国产青视频| 91久久久亚洲| 色色丁香| 久久中文字幕女同性恋一区| 欧美高清18A片| av天天在线观看| 久久精品成人| 天堂中文日本在线观看| 日韩欧美福利视频看看| 中文字幕一区二区三区视频播放| 一牛一区二区三区久久| 97久久久| 亚州伊人色综台| 91国产丝袜白虎| 免费av大片| 成人欧美日超碰| 久久午夜鲁丝片| 亚洲成人一二三区| 激情色图| 中文字幕日韩国产传媒欧美精品| 黑人性暴力毛片| 深夜激情无码| 欧美天天综合站| 久久国产乱子伦精品免费女人| 欧美少妇一区二区三区| 风月影院十八禁| 精品丰满人妻一区二区三区免费观| 天天欧美97| 免费久久精品麻豆一区二区av| 久久久久久久六六 | 九七毛片九九毛片| 综合在线导航一区| 精品九九九九九九九九九| 韩国手机不卡无码三级视频| 久9久| 亚洲无码超碰免费| 久久骚少妇| 欧美精品成人在线播放| 亚洲天天影视综合网| 国产日韩精品人妻久久久久色欲网站| 人妻社区男人天堂| 国产美女销魂在线观看不卡| 1区2区3区中文字幕日韩| 欧美午夜视频免费观看| 欧美在线视频播放| 一起草精品人妻| 熟女少妇视频| 欧美超碰9798| 26uuu国产亚洲综合| 精品一久久久| 每日更新AV| 校园激情狠狠四射| 美女露胸露奶头| 国产强奸乱伦xd| 91欧美巨乳| 五月天婷婷欧美三区| 国产一区二区三区高清视频| 人人超碰在线观看黄| 亚洲无码?第一页| 熟妇一区二区| 午夜精品久久久99| 国产理论视频在线播放| 日韩欧美~中文字| 欧亚综合一卡二卡中文字幕| 亚洲春色一区二区三区| 亚洲宗合网| 狠狠干婷婷| 日B操| 久久禁| 日韩紧密久久| 伊人五月天激情| 国产精品扒开腿做爽爽爽视频| 色鬼在线综合| 欧美麻豆成人同性GⅤ在线| 色综91| 香蕉免费一区二区三区不读| 极品极品色影院| 国产美女在线精品免费看| 超碰久久精品| 男人天堂.AB| 免费啪啪一级视频| 91w欧美| 本道在线| 三级片大波波| 成人国产精品三级A片| 国产精品第一区第一页| 欧美偷偷网| 99re9这里只有精品| 精品久久人妻成人网| 国产精品视频91久久| 五月天日日操夜夜操| 五月天色电影| 97干在线| 91人妻素女| 丁香婷婷五月| 丰满人妻一区二区三区四区| 日韩78m视频| 欧美老熟另类| 99热自拍| 逼逼逼逼操操操操操操操操操午夜剧场| 一区二区三区高清 | av资源在线播放天堂| 欧美激情视频在线一区| 奶水 人妻 哺乳 在线| 国产精品在线一区二区| 色爱综合网欧美| 亚洲色图超碰在线| 日本午夜福利影院| 中日韩久久久| 亚洲欧美国产中文视频| 天天亚洲| 色欧美在线| 久久久草草精品| 97在线观视频免费观看| 性无码专区2020| 日日爽熟女| 热热色国产一二区AV| 青青草成人视频在线观看二区| 福利风月五月天影院| 免费a在线播放v| 精品人妻丰满熟妇一区二区三| 九九九九九九视频| oumeizonghese,www| 麻豆久久久久久久久丝袜 | 亚洲无码太久| 日本伦乱九九九综合| 欧美超碰在线| 久久啊啊| 熟妇女伦乱视频| 超碰97丝袜| 日韩小电影| 精品人妻一区二区三区四区不卡在| 999国产精品999久久久久久| 加勒比性爱成人在线| 视频黄站| 夜夜嗨一区| 欧美操逼录像国产黄色国产| 麻豆色99999| 91白虎| 久9精品| 91亚洲欧美| 亚洲熟伦熟妇AV无码春色| 黄色免费网| 成人av影院在线观看| 少妇xx精品| 久久久精品国产亚洲AV无码| 日本人妻A片成人免费看片|