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

講講在Libuv中使用Io_Uring

開發 前端
git clone https://github.com/axboe/liburing.git。執行./configure && make -j2 && sudo make install(make j2開啟兩個線程編譯,根據自己的核數定)。

 [[410623]]

本文轉載自微信公眾號「編程雜技  」,作者theanarkh 。轉載本文請聯系編程雜技公眾號。

本文介紹如果在Libuv中使用io_uring。邏輯:

1 申請一個io_uring對應的fd。

2 初始化一個poll handle,封裝1中的fd。

3 注冊到Libuv的epoll中。

4 讀取文件列表,給io_uring提交請求

5 io_uring完成,1中的fd可讀,從而epoll返回。

6 Libuv的poll io階段執行回調。

7 回調里獲取io_uring的任務完成列表,拿到每個任務關聯的請求,執行回調。

  1. #include <fcntl.h> 
  2. #include <stdio.h> 
  3. #include <string.h> 
  4. #include <sys/stat.h> 
  5. #include <sys/ioctl.h> 
  6. #include <liburing.h> 
  7. #include <stdlib.h> 
  8. #include <uv.h> 
  9. #define QUEUE_DEPTH 1 
  10. #define BLOCK_SZ    1024 
  11.  
  12. // 前向聲明 
  13. struct file_info; 
  14. // 定義回調 
  15. typedef void (*file_callback)(struct file_info*); 
  16.  
  17. // 管理一個文件讀取請求的結構體 
  18. struct file_info { 
  19.     // 文件大小 
  20.     off_t file_sz; 
  21.     // 回調 
  22.     file_callback cb; 
  23.     // 讀取的大小 
  24.     int count
  25.     // 文件名 
  26.     char *name
  27.     // 讀取的數據 
  28.     struct iovec iovecs[];      
  29. }; 
  30.  
  31. // 獲取文件大小 
  32. off_t get_file_size(int fd) { 
  33.     struct stat st; 
  34.  
  35.     if(fstat(fd, &st) < 0) { 
  36.         perror("fstat"); 
  37.         return -1; 
  38.     } 
  39.     if (S_ISBLK(st.st_mode)) { 
  40.         unsigned long long bytes; 
  41.         if (ioctl(fd, BLKGETSIZE64, &bytes) != 0) { 
  42.             perror("ioctl"); 
  43.             return -1; 
  44.         } 
  45.         return bytes; 
  46.     } else if (S_ISREG(st.st_mode)) 
  47.         return st.st_size; 
  48.  
  49.     return -1; 
  50.  
  51. // 向內核提交一個請求 
  52. int submit_read_request(char *file_path, file_callback cb, struct io_uring *ring) { 
  53.     // 打開文件 
  54.     int file_fd = open(file_path, O_RDONLY); 
  55.     if (file_fd < 0) { 
  56.         perror("open"); 
  57.         return 1; 
  58.     } 
  59.     // 獲取大小 
  60.     off_t file_sz = get_file_size(file_fd); 
  61.     off_t bytes_remaining = file_sz; 
  62.     int current_block = 0; 
  63.     int blocks = (int) file_sz / BLOCK_SZ; 
  64.     if (file_sz % BLOCK_SZ) blocks++; 
  65.     // 申請內存 
  66.     struct file_info *fi = malloc(sizeof(*fi) + (sizeof(struct iovec) * blocks)); 
  67.     // 保存文件名 
  68.     fi->name = file_path; 
  69.     // 計算和申請保存文件內容的內存 
  70.     while (bytes_remaining) { 
  71.         // 剩下的大小 
  72.         off_t bytes_to_read = bytes_remaining; 
  73.         // 一個buffer最大保存BLOCK_SZ大小 
  74.         if (bytes_to_read > BLOCK_SZ) 
  75.             bytes_to_read = BLOCK_SZ; 
  76.         // 記錄buffer大小 
  77.         fi->iovecs[current_block].iov_len = bytes_to_read; 
  78.         // 申請內存 
  79.         void *buf; 
  80.         if( posix_memalign(&buf, BLOCK_SZ, BLOCK_SZ)) { 
  81.             perror("posix_memalign"); 
  82.             return 1; 
  83.         } 
  84.         // 記錄內存地址 
  85.         fi->iovecs[current_block].iov_base = buf; 
  86.         // 下一塊 
  87.         current_block++; 
  88.         // 更新剩下的大小 
  89.         bytes_remaining -= bytes_to_read; 
  90.     } 
  91.     // 保存文件大小 
  92.     fi->file_sz = file_sz; 
  93.     // 獲取一個io_uring的請求結構體 
  94.     struct io_uring_sqe *sqe = io_uring_get_sqe(ring); 
  95.     // 填充請求 
  96.     io_uring_prep_readv(sqe, file_fd, fi->iovecs, blocks, 0); 
  97.     // 保存請求上下文,響應的時候用 
  98.     io_uring_sqe_set_data(sqe, fi); 
  99.     // 保存回調 
  100.     fi->cb = cb; 
  101.     // 提交請求給內核 
  102.     io_uring_submit(ring); 
  103.  
  104.     return 0; 
  105.  
  106. // io_uring相關的結構體 
  107. struct io_uring_info { 
  108.   int fd; 
  109.   int32_t pending; 
  110.   struct io_uring ring; 
  111.   uv_poll_t poll_handle; 
  112. }; 
  113.  
  114. // io_uring完成任務后,Libuv執行的回調 
  115. void uv__io_uring_done(uv_poll_t* handle, int status, int events) { 
  116.     struct io_uring* ring; 
  117.     struct io_uring_info* io_uring_data; 
  118.     struct io_uring_cqe* cqe; 
  119.     struct file_info* req; 
  120.     // 獲取Libuv中保存的io_uring信息 
  121.     io_uring_data = uv_default_loop()->data; 
  122.     ring = &io_uring_data->ring; 
  123.     // 處理每一個完成的請求 
  124.     while (1) {  
  125.         io_uring_peek_cqe(ring, &cqe); 
  126.  
  127.         if (cqe == NULL
  128.             break; 
  129.         // 全部處理完則注銷事件 
  130.         if (--io_uring_data->pending == 0) 
  131.            uv_poll_stop(handle); 
  132.         // 拿到請求上下文 
  133.         req = (void*) (uintptr_t) cqe->user_data; 
  134.         // 記錄讀取的大小 
  135.         req->count = cqe->res; 
  136.  
  137.         io_uring_cq_advance(ring, 1); 
  138.         // 執行回調 
  139.         req->cb(req); 
  140.     } 
  141.     // 處理完則退出 
  142.     if (io_uring_data->pending == 0) 
  143.         uv_stop(uv_default_loop()); 
  144.  
  145. // 文件讀取后的業務回調 
  146. void filedone(struct file_info* info) { 
  147.     printf("讀取的大小:%d,文件信息:%s => %d\n", (int)info->count, info->name, (int)info->file_sz);}int main(int argc, char *argv[]) { 
  148.  
  149.     if (argc < 2) { 
  150.         fprintf(stderr, "請輸入文件名稱\n"); 
  151.         return 1; 
  152.     } 
  153.     // 申請一個io_uring相關的結構體 
  154.     struct io_uring_info *io_uring_data = malloc(sizeof(*io_uring_data)); 
  155.     // 初始化io_uring 
  156.     io_uring_queue_init(1, &io_uring_data->ring, 0); 
  157.     // 初始化poll handle,保存監聽的fd 
  158.     uv_poll_init(uv_default_loop(), &io_uring_data->poll_handle, io_uring_data->ring.ring_fd); 
  159.     // 注冊事件和回調 
  160.     uv_poll_start(&io_uring_data->poll_handle, UV_READABLE, uv__io_uring_done); 
  161.     // 保存io_uring的上下文在loop中 
  162.     uv_default_loop()->data = (void *)io_uring_data; 
  163.     // 處理每一個文件 
  164.     for (int i = 1; i < argc; i++) { 
  165.         submit_read_request(argv[i], filedone, &io_uring_data->ring); 
  166.         io_uring_data->pending++; 
  167.     } 
  168.     // 開始事件循環 
  169.     uv_run(uv_default_loop(), UV_RUN_DEFAULT); 
  170.     // 退出 
  171.     uv_loop_close(uv_default_loop()); 
  172.     io_uring_queue_exit(&io_uring_data->ring); 
  173.     return 0; 

編譯過程

1 git clone https://github.com/axboe/liburing.git。執行./configure && make -j2 && sudo make install(make j2開啟兩個線程編譯,根據自己的核數定)。

2 git clone https://github.com/libuv/libuv.git。執行./autogen.sh && ./configure && make -j2 && sudo make install。

3 安裝完依賴后新建test.cc。然后編譯 gcc -xc test2.cc -luring -luv(xc指定按c語言編譯,c++的話限制不一樣,會報錯)。

4 新建兩個測試文件hello.cc和world.cc 。執行 ./a.out hello.cc world.cc。

5 輸出

  1. 讀取的大小:6997,文件信息:hello.cc => 6997 
  2. 讀取的大小:11019,文件信息:world.cc => 11019 

代碼倉庫:https://github.com/theanarkh/learn-io_uring。

可以參考

1.https://github.com/shuveb/io_uring-by-example/blob/master/03_cat_liburing/main.c

2 https://github.com/libuv/libuv/pull/2322

 

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2023-10-20 06:26:51

Libuvio_uring

2023-02-07 19:46:35

NIOCQ內核

2023-04-12 18:36:20

IO框架內核

2021-07-07 23:38:05

內核IOLinux

2025-10-16 02:00:00

2025-06-27 01:44:00

2023-12-28 11:24:29

IO系統請求

2021-07-03 08:04:10

io_uringNode.js異步IO

2020-09-30 06:44:39

存儲IO

2025-02-03 09:53:42

2021-09-05 17:46:21

云計算No.jsio_uringJS

2009-06-25 16:49:24

Hibernate

2013-12-13 17:21:14

Lua腳本語言

2023-11-17 12:04:39

GORM并發

2023-04-12 15:25:09

Bytrace鴻蒙

2011-06-15 10:08:01

Qt CVS

2023-07-23 19:26:18

Linuxcat 命令

2023-07-04 16:36:03

Linuxcd 命令

2010-04-29 17:51:40

Unix工具

2017-04-05 13:17:26

LinuxShellvi
點贊
收藏

51CTO技術棧公眾號

91国语精品自产拍在线观看性色 | 欧美xxxx日本和非洲| 日韩有码电影| 欧美精品啪啪| 日韩av在线影院| 免费在线观看视频a| 久久精品色图| 青青草成人在线观看| 91日韩视频| 亚洲不卡在线观看| 午夜免费电影一区在线观看| 99riav国产| 久久精品午夜| 久久久国产视频91| 亚洲av无码成人精品区| 欧洲av一区二区| 欧美电影在线观看免费| 精品国产一区二区三区久久久蜜臀| 欧美日韩成人一区二区| 黄色片网址在线观看| 永久免费在线观看视频| 国产成人在线视频网址| 国产精品第一视频| 妺妺窝人体色www聚色窝仙踪| 美女精品一区最新中文字幕一区二区三区| 欧美人与z0zoxxxx视频| 那种视频在线观看| 日本免费在线观看| 97久久精品人人澡人人爽| 91精品国产电影| 看免费黄色录像| heyzo久久| 亚洲美女av在线| 三级视频中文字幕| 周于希免费高清在线观看| 亚洲精品成人少妇| 成年人黄色在线观看| 国产三区四区在线观看| 91亚洲精华国产精华精华液| 成人9ⅰ免费影视网站| 中文字幕欧美人妻精品一区蜜臀| 亚洲最黄网站| 欧美精品性视频| 91人妻一区二区三区蜜臀| 国产剧情在线观看一区| 亚洲男人av在线| 中文字幕第九页| 草草视频在线一区二区| 日韩欧美国产麻豆| 欧美特黄aaa| 四虎影视精品永久在线观看| 欧洲生活片亚洲生活在线观看| 国产91美女视频| 欧美日韩国产观看视频| 午夜婷婷国产麻豆精品| 欧美精品一区二区三区三州| аⅴ资源天堂资源库在线| 亚洲一二三区视频在线观看| 97超碰国产精品| 男女视频在线| 亚洲r级在线视频| 精品久久一二三| 成人一区福利| 在线观看精品一区| 日本一二区免费| 91成人短视频在线观看| 日韩午夜激情电影| 亚洲av永久无码精品| 网红女主播少妇精品视频| 亚洲老司机av| 国产在线免费av| 婷婷综合伊人| 久久久久亚洲精品成人网小说| 中文字幕一区二区三区手机版| 在线一区免费观看| 国产精品国产自产拍高清av水多 | 欧美精品乱码久久久久久| 五月天av在线播放| 国产不卡精品| 亚洲第五色综合网| 伊人网伊人影院| 99久久亚洲精品蜜臀| 欧美激情一二三| 香蕉影院在线观看| 狠狠色狠狠色综合系列| 国产一区二区三区无遮挡| 黄色在线免费观看大全| 综合欧美一区二区三区| 蜜桃传媒一区二区三区| 成人福利小视频| 日韩精品色哟哟| 91亚洲精品一区二区| 少妇视频一区二区| 影音先锋一区| 国产精品揄拍一区二区| 欧美一区二区黄片| av免费不卡| 粉嫩嫩av羞羞动漫久久久| 激情伦成人综合小说| 久久国产精品波多野结衣| 99久久免费精品国产72精品九九 | 97人人澡人人爽人人模亚洲| 亚洲特级毛片| 日韩免费观看网站| 日韩av片在线播放| 日韩精品色哟哟| 97超级碰碰碰久久久| 免费看av在线| 成人福利电影精品一区二区在线观看| 午夜精品美女久久久久av福利| 怡红院在线播放| 粉嫩aⅴ一区二区三区四区五区| 欧美精品 国产精品| 男女性杂交内射妇女bbwxz| 精品久久久久中文字幕小说| 欧美黄色性视频| 亚洲熟妇av乱码在线观看| 久久久精品五月天| 国产女主播一区二区三区| av中文字幕一区二区三区| 亚洲一区二区三区在线| 91好吊色国产欧美日韩在线| 国产日本亚洲| 日韩中文字幕欧美| 国产一级做a爱免费视频| 蜜臀va亚洲va欧美va天堂| 免费成人深夜夜行视频| 国产天堂在线播放视频| 日韩欧美在线观看一区二区三区| 娇妻被老王脔到高潮失禁视频| 999在线观看精品免费不卡网站| 日韩av男人的天堂| 激情视频网站在线观看| av在线免费不卡| 免费av一区二区三区| 国产精品原创| 制服丝袜成人动漫| 成人性做爰aaa片免费看不忠| 外国成人在线视频| 狠狠88综合久久久久综合网| 欧美久久精品一级黑人c片| 超碰在线观看91| 成人一区在线观看| 中文字幕一区二区三区四区五区六区| 欧美xxxx性xxxxx高清| 欧美刺激脚交jootjob| 国产视频不卡在线| 一区二区三区国产在线| 麻豆久久久9性大片| 欧美大片xxxx| 国产精品白丝jk白祙喷水网站| 最新黄色av网站| 日韩视频一二区| 欧美极品美女电影一区| 天天爽夜夜爽夜夜爽| 亚洲一区二区免费视频| 国产精品入口麻豆| 国产精品毛片| 精品国产二区在线| 成人在线爆射| 中文字幕日韩在线观看| 91精品国产乱码久久久| 亚洲免费观看高清完整版在线| 激情视频免费网站| 伊人久久影院| 欧美一级视频免费在线观看| www.黄色一片| 精品福利视频导航| 国产伦精品一区二区三区妓女| 国产主播一区| 欧美欧美一区二区| 91精品视频一区二区| 欧美激情图片区| 男女污污视频在线观看| 欧美日韩国产区一| 久久久精品视频免费| 久久一夜天堂av一区二区三区| 精品日韩久久久| 午夜久久一区| 欧美久久电影| 国产精品一区免费在线| 国产91精品久久久久久| 拍真实国产伦偷精品| 精品国内二区三区| 五月婷婷激情五月| 亚洲精品国产精品乱码不99| 无遮挡aaaaa大片免费看| 美女任你摸久久| 日韩 欧美 视频| 久久国产精品成人免费观看的软件| 97超碰最新| 欧美三区四区| 欧美激情乱人伦| a天堂在线资源| 精品国产露脸精彩对白| 中文亚洲av片在线观看| 五月婷婷激情综合| 极品色av影院| 国产亚洲综合av| 国产一精品一aⅴ一免费| 青草国产精品久久久久久| 草草视频在线免费观看| 日韩大片在线| 精品无人区一区二区三区竹菊| 祥仔av免费一区二区三区四区| 911国产网站尤物在线观看| 黄色成人在线| 一区二区亚洲精品国产| 五月婷婷六月丁香综合| 91精品国产综合久久蜜臀| 中文字幕xxxx| 欧美日韩免费看| 久久精品第一页| 亚洲视频免费观看| 中文字幕有码在线播放| 不卡一区二区三区四区| 污免费在线观看| 麻豆免费看一区二区三区| 人妻内射一区二区在线视频 | 中文字幕日韩专区| 亚洲三级中文字幕| 欧美成人免费网站| 国产又大又黄的视频| 欧美性猛交xxxx黑人交| 免费污污视频在线观看| 岛国av一区二区在线在线观看| 久久久久久久久久久网 | 久久av网站| 国产欧美日韩免费| jizz欧美| 国产精品入口免费视| 欧美日韩五区| 国产精品久久久久久久久久99| 日韩电影免费观| 日本国产精品视频| 最新中文字幕在线播放| 69精品小视频| 女厕盗摄一区二区三区| 97在线观看视频| 天堂av在线网| 热99精品里视频精品| 免费观看亚洲| 国产精品91久久久久久| 日本一区二区三区视频在线| 国产精品盗摄久久久| 激情久久一区二区| 成人福利网站在线观看| 91精品国产一区二区在线观看| 亚洲wwwav| 亚洲3区在线| 国产精品久久久久久久久婷婷| 超碰97久久国产精品牛牛| 国产免费一区二区| 九九精品久久| 五月天亚洲综合情| 91精品国产成人观看| 日韩精品免费一区| 亚洲毛片av| 日韩欧美xxxx| 精品一区在线看| 日韩欧美中文视频| 99re视频这里只有精品| 无码人妻精品一区二区中文| 亚洲国产成人午夜在线一区 | 午夜国产精品影院在线观看| 欧美一级视频免费观看| 色网站国产精品| 一区二区久久精品66国产精品| 日韩一区二区三区视频| 熟妇人妻系列aⅴ无码专区友真希| 亚洲老头老太hd| 久操视频在线播放| 久久久免费精品| 写真福利精品福利在线观看| 成人免费直播live| 久久综合五月婷婷| 亚洲成人一区二区三区| 欧美国产综合| 国产又黄又猛视频| 国产一区999| 狠狠人妻久久久久久综合蜜桃| 国产精品嫩草影院com| 免费无遮挡无码永久在线观看视频| 精品久久久久久久久久久久久| 精品国产www| 精品成a人在线观看| www在线免费观看| 久久久久久久久久婷婷| 电影在线观看一区二区| 国产成人精品日本亚洲11| 精品久久久亚洲| 日本五级黄色片| 老司机一区二区| 日本黄色录像片| 亚洲天堂网中文字| 精品免费囯产一区二区三区 | 女人被狂躁c到高潮| 亚洲女厕所小便bbb| 三级网站在线播放| 日韩精品资源二区在线| www.视频在线.com| 97国产在线视频| 91丨精品丨国产| 日本一区高清不卡| 在线欧美不卡| 亚洲高清在线不卡| 国产女主播一区| 精品成人久久久| 日韩三级中文字幕| www亚洲人| 国产精品6699| 亚洲涩涩av| 缅甸午夜性猛交xxxx| 国产一区二区三区在线观看精品| 日韩精品电影一区二区| 五月婷婷综合激情| 午夜精品一区二区三| 日韩少妇与小伙激情| avav成人| 欧美一区1区三区3区公司| 亚洲日本黄色| 熟妇高潮一区二区| 亚洲精品你懂的| 精品乱码一区内射人妻无码| 亚洲欧美国产精品| 中国字幕a在线看韩国电影| 国产精品裸体一区二区三区| 综合久久精品| 中文字幕欧美视频| 亚洲另类在线制服丝袜| 国产喷水吹潮视频www| 精品国内亚洲在观看18黄| 久久av影院| 亚洲一卡二卡三卡四卡无卡网站在线看| 久久亚洲影院| 国产高潮呻吟久久| 在线观看国产一区二区| 国产亚洲依依| 国产精品成人一区二区三区吃奶| 精品久久久久久久| 一本色道久久亚洲综合精品蜜桃 | 国产黄色精品视频| 青草草在线视频| 欧美电影免费提供在线观看| 日日夜夜天天综合入口| 懂色av一区二区三区在线播放| 综合激情网站| www.17c.com喷水少妇| 偷窥国产亚洲免费视频| 同心难改在线观看| 国产va免费精品高清在线观看| 要久久电视剧全集免费 | 成人av电影在线| 国产情侣自拍av| 亚洲天堂第一页| 久久福利在线| 亚洲一区 在线播放| 成人性生交大合| 久久国产黄色片| 国产亚洲精品久久久久久牛牛 | 91精品久久久久久久久99蜜臂| av在线播放国产| 含羞草久久爱69一区| 天堂一区二区在线| 午夜激情视频在线播放| 日韩一本二本av| 欧美在线极品| 亚洲激情图片| 国产成人精品免费| 国产精品人人人人| 色天天综合狠狠色| 视频一区日韩精品| www黄色av| 亚洲三级在线看| 午夜影院免费体验区| 国产精品小说在线| 黑丝一区二区三区| 免费看的黄色网| 欧美成人a视频| 欧美日韩不卡| 黄色一级片国产| 国产无一区二区| 成人福利小视频| 国产精品亚洲激情| 在线观看一区| 日韩亚洲欧美中文字幕| 亚洲成人三级在线| 农村妇女一区二区| 131美女爱做视频| 中文字幕亚洲电影| 午夜视频免费看| 亚洲自拍欧美色图| 久久久水蜜桃av免费网站| 男人的天堂久久久| 亚洲人成在线一二| 91麻豆精品激情在线观看最新 | 日韩一级特黄| 日韩精品一区二区三区久久| 亚洲欧洲中文日韩久久av乱码| 秋霞av在线|