91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

linux異步io框架iouring應(yīng)用

科技綠洲 ? 來(lái)源:Linux開(kāi)發(fā)架構(gòu)之路 ? 作者:Linux開(kāi)發(fā)架構(gòu)之路 ? 2023-11-08 15:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux內(nèi)核5.1支持了新的異步IO框架iouring,由Block IO大神也即Fio作者Jens Axboe開(kāi)發(fā),意在提供一套公用的網(wǎng)絡(luò)和磁盤(pán)異步IO,不過(guò)io_uring目前在磁盤(pán)方面要比網(wǎng)絡(luò)方面更加成熟。

目錄

  • 背景簡(jiǎn)介
  • io_uring
  • 系統(tǒng)API
  • liburing
  • 高級(jí)特性
  • 編程示例
  • 性能對(duì)比
  • 模式對(duì)比
  • 線上應(yīng)用

背景簡(jiǎn)介

熟悉Linux系統(tǒng)編程的同學(xué)都清楚,Linux并沒(méi)有提供完善的異步IO(網(wǎng)絡(luò)IO、磁盤(pán)IO)機(jī)制。

在網(wǎng)絡(luò)編程中,我們通常使用epoll IO多路復(fù)用來(lái)處理網(wǎng)絡(luò)IO,然而epoll也并不是異步網(wǎng)絡(luò)IO,僅僅是內(nèi)核提供了IO復(fù)用機(jī)制,epoll回調(diào)通知的是數(shù)據(jù)可以讀取或者寫(xiě)入了,具體的讀寫(xiě)操作仍然需要用戶去做,而不是內(nèi)核代替完成。

在存儲(chǔ)IO棧中,做存儲(chǔ)的同學(xué)大都使用過(guò)libaio,然而那是一個(gè)巨難用啊Linux AIO這個(gè)奇葩。首先只能在DIO下使用,用不了pagecache;其次用戶的數(shù)據(jù)地址空間起始地址和大小必須頁(yè)大小對(duì)齊;然后在submit_io時(shí)仍然可能因?yàn)槲募到y(tǒng)、pagecache、sync發(fā)生阻塞,除此之外,我們?cè)谑褂胠ibaio的時(shí)候會(huì)設(shè)置io_depth的大小,還可能因?yàn)閮?nèi)核的/sys/block/sda/queue/nr_requests(128)設(shè)置的過(guò)小而發(fā)生阻塞;而且libaio提供的sync命令關(guān)鍵還不起作用,想要sync數(shù)據(jù)還得依賴fsync/fdatasync,真的是心塞塞,libaio想說(shuō)愛(ài)你不容易啊。

所以Linux迫切需要一個(gè)完善的異步機(jī)制。同時(shí)在Linux平臺(tái)上跑的大多數(shù)程序都是專用程序,并不需要內(nèi)核的大多數(shù)功能,而且這幾年也流行kernel bypass,intel也發(fā)起的用戶態(tài)IO DPDK、SPDK。但是這些用戶態(tài)IO API不統(tǒng)一,使用成本過(guò)高,所以內(nèi)核便推出了io_uring來(lái)統(tǒng)一網(wǎng)絡(luò)和磁盤(pán)的異步IO,提供一套統(tǒng)一完善的異步API,也支持異步、輪詢、無(wú)鎖、zero copy。真的是姍姍來(lái)遲啊,不過(guò)也算是在高性能IO方面也算是是扳回了一城。

io_uring

io_uring的設(shè)計(jì)目標(biāo)是提供一個(gè)統(tǒng)一、易用、可擴(kuò)展、功能豐富、高效的網(wǎng)絡(luò)和磁盤(pán)系統(tǒng)接口。其高性能依賴于以下幾個(gè)方面:

  1. 用戶態(tài)和內(nèi)核態(tài)共享提交隊(duì)列(submission queue)和完成隊(duì)列(completion queue)。
  2. 用戶態(tài)支持Polling模式,不依賴硬件的中斷,通過(guò)調(diào)用IORING_ENTER_GETEVENTS不斷輪詢收割完成事件。
  3. 內(nèi)核態(tài)支持Polling模式,IO 提交和收割可以 offload 給 Kernel,且提交和完成不需要經(jīng)過(guò)系統(tǒng)調(diào)用(system call)。
  4. 在DirectIO下可以提前注冊(cè)用戶態(tài)內(nèi)存地址,減小地址映射的開(kāi)銷(xiāo)。

系統(tǒng)API

io_uring提供了3個(gè)系統(tǒng)調(diào)用API,雖然只有3個(gè),但是直接使用起來(lái)還是蠻復(fù)雜的。

  • io_uring_setup
int io_uring_setup(unsigned entries, struct io_uring_params *params);

entries:queue depth,表示隊(duì)列深度。

io_uring_params:初始化時(shí)候的參數(shù)。

在io_uring_setup返回的時(shí)候就已經(jīng)初始化好了 SQ 和 CQ,此外,還有內(nèi)核還提供了一個(gè) Submission Queue Entries(SQEs)數(shù)組。

圖片

之所以額外采用了一個(gè)數(shù)組保存 SQEs,是為了方便通過(guò) RingBuffer 提交內(nèi)存上不連續(xù)的請(qǐng)求。SQ 和 CQ 中每個(gè)節(jié)點(diǎn)保存的都是 SQEs 數(shù)組的偏移量,而不是實(shí)際的請(qǐng)求,實(shí)際的請(qǐng)求只保存在 SQEs 數(shù)組中。這樣在提交請(qǐng)求時(shí),就可以批量提交一組 SQEs 上不連續(xù)的請(qǐng)求。 但由于 SQ,CQ,SQEs 是在內(nèi)核中分配的,所以用戶態(tài)程序并不能直接訪問(wèn)。io_setup 的返回值是一個(gè) fd,應(yīng)用程序使用這個(gè) fd 進(jìn)行 mmap,和 kernel 共享一塊內(nèi)存。 這塊內(nèi)存共分為三個(gè)區(qū)域,分別是 SQ,CQ,SQEs。kernel 返回的 io_sqring_offset 和 io_cqring_offset 分別描述了 SQ 和 CQ 的指針在 mmap 中的 offset。而 SQEs 則直接對(duì)應(yīng)了 mmap 中的 SQEs 區(qū)域。 mmap 的時(shí)候需要傳入 MAP_POPULATE 參數(shù),以防止內(nèi)存被 page fault。

  • io_uring_enter
int io_uring_enter(unsigned int fd, u32 to_submit, u32 min_complete, u32 flags);

io_uring_enter即可以提交io,也可以來(lái)收割完成的IO,一般IO完成時(shí)內(nèi)核會(huì)自動(dòng)將SQE 的索引放入到CQ中,用戶可以遍歷CQ來(lái)處理完成的IO。

IO 提交的做法是找到一個(gè)空閑的 SQE,根據(jù)請(qǐng)求設(shè)置 SQE,并將這個(gè) SQE 的索引放到 SQ 中。SQ 是一個(gè)典型的 RingBuffer,有 head,tail 兩個(gè)成員,如果 head == tail,意味著隊(duì)列為空。SQE 設(shè)置完成后,需要修改 SQ 的 tail,以表示向 RingBuffer 中插入一個(gè)請(qǐng)求。

io_uring_enter 被調(diào)用后會(huì)陷入到內(nèi)核,內(nèi)核將 SQ 中的請(qǐng)求提交給 Block 層。to_submit 表示一次提交多少個(gè) IO。

如果 flags 設(shè)置了 IORING_ENTER_GETEVENTS,并且 min_complete > 0,那么這個(gè)系統(tǒng)調(diào)用會(huì)同時(shí)處理 IO 收割。這個(gè)系統(tǒng)調(diào)用會(huì)一直 block,直到 min_complete 個(gè) IO 已經(jīng)完成。

這個(gè)流程貌似和 libaio 沒(méi)有什么區(qū)別,IO 提交的過(guò)程中依然會(huì)產(chǎn)生系統(tǒng)調(diào)用。

但 io_uring 的精髓在于,提供了 submission offload 模式,使得提交過(guò)程完全不需要進(jìn)行系統(tǒng)調(diào)用。

如果在調(diào)用 io_uring_setup 時(shí)設(shè)置了 IORING_SETUP_SQPOLL 的 flag,內(nèi)核會(huì)額外啟動(dòng)一個(gè)內(nèi)核線程,我們稱作 SQ 線程。這個(gè)內(nèi)核線程可以運(yùn)行在某個(gè)指定的 core 上(通過(guò) sq_thread_cpu 配置)。這個(gè)內(nèi)核線程會(huì)不停的 Poll SQ,除非在一段時(shí)間內(nèi)沒(méi)有 Poll 到任何請(qǐng)求(通過(guò) sq_thread_idle 配置),才會(huì)被掛起。

圖片

當(dāng)程序在用戶態(tài)設(shè)置完 SQE,并通過(guò)修改 SQ 的 tail 完成一次插入時(shí),如果此時(shí) SQ 線程處于喚醒狀態(tài),那么可以立刻捕獲到這次提交,這樣就避免了用戶程序調(diào)用 io_uring_enter 這個(gè)系統(tǒng)調(diào)用。如果 SQ 線程處于休眠狀態(tài),則需要通過(guò)調(diào)用 io_uring_enter,并使用 IORING_SQ_NEED_WAKEUP 參數(shù),來(lái)喚醒 SQ 線程。用戶態(tài)可以通過(guò) sqring 的 flags 變量獲取 SQ 線程的狀態(tài)。

https://github.com/axboe/liburing/blob/master/src/queue.c#L22

if (IO_URING_READ_ONCE(*ring->sq.kflags) & IORING_SQ_NEED_WAKEUP) {
*flags |= IORING_ENTER_SQ_WAKEUP;
return true;
}

  • io_uring_register

主要包含IORING_REGISTER_FILES、IORING_REGISTER_BUFFERS,在高級(jí)特性章節(jié)會(huì)描述。

int io_uring_register(unsigned int fd, unsigned int opcode, void *arg, unsigned int nr_args)

liburing

我們知道io_uring雖然僅僅提供了3個(gè)系統(tǒng)API,但是想要用好還是有一定難度的,所提fio大神本人封裝了一個(gè)Liburing,簡(jiǎn)化了io_uring的使用,通過(guò)使用liburing,我們很容易寫(xiě)出異步IO程序。

代碼位置:github.com/axboe/liburi,在使用的時(shí)候目前仍然需要拉取代碼,自己編譯,估計(jì)之后將會(huì)融入內(nèi)核,在用戶程序中需要包含#include "liburing.h"。

列舉一些比較常用的封裝的API:github.com/axboe/liburi

// 非系統(tǒng)調(diào)用,初始化io_uring,entries:隊(duì)列深度 queue depth
extern int io_uring_queue_init(unsigned entries, struct io_uring *ring, unsigned flags);

// 非系統(tǒng)調(diào)用,清理io_uring
extern void io_uring_queue_exit(struct io_uring *ring);

// 非系統(tǒng)調(diào)用,獲取一個(gè)可用的 submit_queue_entry,用來(lái)提交IO
extern struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring);

// 非系統(tǒng)調(diào)用,準(zhǔn)備階段,和libaio封裝的io_prep_writev一樣
static inline void io_uring_prep_writev(struct io_uring_sqe *sqe, int fd,const struct iovec *iovecs, unsigned nr_vecs, off_t offset)

// 非系統(tǒng)調(diào)用,準(zhǔn)備階段,和libaio封裝的io_prep_readv一樣
static inline void io_uring_prep_readv(struct io_uring_sqe *sqe, int fd, const struct iovec *iovecs, unsigned nr_vecs, off_t offset)

// 非系統(tǒng)調(diào)用,把準(zhǔn)備階段準(zhǔn)備的data放進(jìn) submit_queue_entry
static inline void io_uring_sqe_set_data(struct io_uring_sqe *sqe, void *data)

// 非系統(tǒng)調(diào)用,設(shè)置submit_queue_entry的flag
static inline void io_uring_sqe_set_flags(struct io_uring_sqe *sqe, unsigned flags)

// 非系統(tǒng)調(diào)用,提交sq的entry,不會(huì)阻塞等到其完成,內(nèi)核在其完成后會(huì)自動(dòng)將sqe的偏移信息加入到cq,在提交時(shí)需要加鎖
extern int io_uring_submit(struct io_uring *ring);

// 非系統(tǒng)調(diào)用,提交sq的entry,阻塞等到其完成,在提交時(shí)需要加鎖。
extern int io_uring_submit_and_wait(struct io_uring *ring, unsigned wait_nr);

// 非系統(tǒng)調(diào)用 宏定義,會(huì)遍歷cq從head到tail,來(lái)處理完成的IO
#define io_uring_for_each_cqe(ring, head, cqe)

// 非系統(tǒng)調(diào)用 遍歷時(shí),可以獲取cqe的data
static inline void *io_uring_cqe_get_data(const struct io_uring_cqe *cqe)

// 非系統(tǒng)調(diào)用 遍歷完成時(shí),需要調(diào)整head往后移nr
static inline void io_uring_cq_advance(struct io_uring *ring, unsigned nr)

高級(jí)特性

io_uring里面提供了polling機(jī)制:IORING_SETUP_IOPOLL可以讓內(nèi)核采用 Polling 的模式收割 Block 層的請(qǐng)求;IORING_SETUP_SQPOLL可以讓內(nèi)核新起線程輪詢提交sq的entry。

IORING_REGISTER_FILES

這個(gè)的用途是避免每次 IO 對(duì)文件做 fget/fput 操作,當(dāng)批量 IO 的時(shí)候,這組原子操作可以避免掉。

IORING_REGISTER_BUFFERS

如果應(yīng)用提交到內(nèi)核的虛擬內(nèi)存地址是固定的,那么可以提前完成虛擬地址到物理 pages 的映射,避免在 IO 路徑上進(jìn)行轉(zhuǎn)換,從而優(yōu)化性能。用法是,在 setup io_uring 之后,調(diào)用 io_uring_register,傳遞 IORING_REGISTER_BUFFERS 作為 opcode,參數(shù)是一個(gè)指向 iovec 的數(shù)組,表示這些地址需要 map 到內(nèi)核。在做 IO 的時(shí)候,使用帶 FIXED 版本的opcode(IORING_OP_READ_FIXED /IORING_OP_WRITE_FIXED)來(lái)操作 IO 即可。

內(nèi)核在處理 IORING_REGISTER_BUFFERS 時(shí),提前使用 get_user_pages 來(lái)獲得 userspace 虛擬地址對(duì)應(yīng)的物理 pages。在做 IO 的時(shí)候,如果提交的虛擬地址曾經(jīng)被注冊(cè)過(guò),那么就免去了虛擬地址到 pages 的轉(zhuǎn)換。

IORING_SETUP_IOPOLL

這個(gè)功能讓內(nèi)核采用 Polling 的模式收割 Block 層的請(qǐng)求。當(dāng)沒(méi)有使用 SQ 線程時(shí),io_uring_enter 函數(shù)會(huì)主動(dòng)的 Poll,以檢查提交給 Block 層的請(qǐng)求是否已經(jīng)完成,而不是掛起,并等待 Block 層完成后再被喚醒。使用 SQ 線程時(shí)也是同理。

編程示例

通過(guò)liburing使用起來(lái)還是比較方便的,不用操心內(nèi)核的一些事情,簡(jiǎn)直爽歪歪啊。具體可參考ceph:github.com/ceph/ceph/bl

  1. io_uring_queue_init 來(lái)初始化 io_uring。IORING_SETUP_IOPOLL / IORING_SETUP_SQPOLL。
  2. io_uring_submit 來(lái)提交 IO,在這個(gè)函數(shù)里面會(huì)判斷是否需要調(diào)用系統(tǒng)調(diào)用io_uring_enter。設(shè)置了IORING_SETUP_SQPOLL則不需要調(diào)用,沒(méi)有設(shè)置則需要用戶調(diào)用。
  3. io_uring_for_each_cqe 來(lái)收割完成的IO,這是一個(gè)for循環(huán)宏定義,后面直接跟 {} 就可以。

性能對(duì)比

intel團(tuán)隊(duì)測(cè)試結(jié)果

可以看出來(lái)intel自己測(cè)試的結(jié)果表明延遲方面spdk比io_uring要低60%。使用了自己帶的perf的測(cè)試工具測(cè)的。

圖片

fio作者測(cè)試結(jié)果

4k randread,3D Xpoint 盤(pán):

io_uring vs libaio,在非 polling 模式下,io_uring 性能提升不到 10%,好像并沒(méi)有什么了不起的地方。

然而 io_uring 提供了 polling 模式。在 polling 模式下,io_uring 和 SPDK 的性能非常接近,特別是高 QueueDepth 下,io_uring 有趕超的架勢(shì),同時(shí)完爆 libaio。

圖片

模式對(duì)比

項(xiàng)目io_uringspdk
驅(qū)動(dòng)程序內(nèi)核態(tài)驅(qū)動(dòng)程序有鎖用戶態(tài)驅(qū)動(dòng)程序、無(wú)鎖、輪詢、線程綁定
run_to_completion非rtc模型,可能會(huì)有上下文切換?rtc模型,單線程擼到底
內(nèi)存管理mmu、4k2MB大頁(yè)
提交任務(wù)有無(wú)鎖無(wú)鎖無(wú)鎖
系統(tǒng)調(diào)用可有可無(wú)無(wú)系統(tǒng)調(diào)用
用戶內(nèi)核態(tài)切換輕量級(jí)的無(wú)內(nèi)核切換
poll模型可選polling

線上應(yīng)用

目前發(fā)現(xiàn)已經(jīng)有幾個(gè)項(xiàng)目在做嘗試性的應(yīng)用:rocksdb、ceph、spdk、第三方適配(nginx、redis、echo_server)

rocksdb

rocksdb官方實(shí)現(xiàn)了PosixRandomAccessFile::MultiRead()使用io_uring。

圖片

除此之外,tikv擴(kuò)展了一些實(shí)現(xiàn):openinx.github.io/ppt/i

  1. wal和sstbale的寫(xiě)入使用io_uring,但是測(cè)完之后性能提升不明顯。
  2. compaction file write的時(shí)間降低了一半。
  3. 可用io_uring優(yōu)化的點(diǎn):參考 Conclusion & Future work 章節(jié)。

spdk

SPDK與io_uring新異步IO機(jī)制,在其抽象的通用塊層加入了io_uring的支持。

圖片

圖片

ceph

ceph的io_uring主要使用在block_device,抽象出了統(tǒng)一的塊設(shè)備,直接操作裸設(shè)備,對(duì)上層提供統(tǒng)一的讀寫(xiě)方法。

bluefs僅僅需要提供append only的寫(xiě)入即可,不需要提供隨機(jī)寫(xiě),大大簡(jiǎn)化了bluefs的實(shí)現(xiàn)。

圖片

第三方適配(nginx、redis、echo_server)

第三方io_uring適配(nginx、redis、echo_server)性能測(cè)試結(jié)果:

redis:

以下是 redis 在 event poll 和 io_uring 下的 qps 對(duì)比:

  1. 高負(fù)載情況下,io_uring 相比 event poll,吞吐提升 8%~11%。
  2. 開(kāi)啟 sqpoll 時(shí),吞吐提升 24%~32%。這里讀者可能會(huì)有個(gè)疑問(wèn),開(kāi)啟 sqpoll 額外使用了一個(gè) CPU,性能為什么才提升 30% 左右?那是因?yàn)?redis 運(yùn)行時(shí)同步讀寫(xiě)就消耗了 70% 以上的 CPU,而 sq_thread 只能使用一個(gè) CPU 的能力,把讀寫(xiě)工作交給 sq_thread 之后,理論上 QPS 最多能提升 40% 左右(1/0.7 - 1 = 0.42),再加上 sq_thread 還需要處理中斷以及本身的開(kāi)銷(xiāo),因此只能有 30% 左右的提升。

nginx:

  1. 單 worker 場(chǎng)景,當(dāng)連接數(shù)超過(guò) 500 時(shí),QPS提升 20% 以上。
  2. connection 固定 1000,worker 數(shù)目在 8 以下時(shí),QPS 有 20% 左右的提升。隨著 worker 數(shù)目增大,收益逐漸降低。
  3. 短連接場(chǎng)景,io uring 相對(duì)于 event poll 非但沒(méi)有提升,甚至在某些場(chǎng)景下有 5%~10% 的性能下降。究其原因,除了 io uring 框架本身帶來(lái)的開(kāi)銷(xiāo)以外,還可能跟 io uring 編程模式下請(qǐng)求批量下發(fā)帶來(lái)的延遲有關(guān)。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213854
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1620

    瀏覽量

    64061
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    17903
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95273
  • 磁盤(pán)
    +關(guān)注

    關(guān)注

    1

    文章

    390

    瀏覽量

    25839
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    一文讀懂Linux各模塊框架

    Linux各模塊框架整理。
    的頭像 發(fā)表于 06-30 11:27 ?8782次閱讀
    一文讀懂<b class='flag-5'>Linux</b>各模塊<b class='flag-5'>框架</b>

    Linux驅(qū)動(dòng)學(xué)習(xí)筆記:異步IO

    前幾篇介紹了幾種IO模型,今天介紹另一種IO模型——異步IO。
    發(fā)表于 06-12 16:24 ?1006次閱讀

    linux下的IO模型詳解

      開(kāi)門(mén)見(jiàn)山,Linux下的如中IO模型:阻塞IO模型,非阻塞IO模型,IO復(fù)用模型,信號(hào)驅(qū)動(dòng)IO
    發(fā)表于 10-09 16:12

    異步IO是什么

    python 異步ioAsync IO is a concurrent programming design that has received dedicated support
    發(fā)表于 09-06 07:26

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步IO
    發(fā)表于 10-27 11:33 ?0次下載
    《<b class='flag-5'>Linux</b>設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、<b class='flag-5'>Linux</b>設(shè)備驅(qū)動(dòng)中的<b class='flag-5'>異步</b>通知與<b class='flag-5'>異步</b><b class='flag-5'>IO</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、Linux設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、Linux設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞IO
    發(fā)表于 10-27 11:35 ?9次下載
    《<b class='flag-5'>Linux</b>設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、<b class='flag-5'>Linux</b>設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞<b class='flag-5'>IO</b>

    Linux DMA Engine框架的介紹

    此會(huì)話描述如何從設(shè)備驅(qū)動(dòng)程序在Linux中使用DMA。 這包括內(nèi)存分配,緩存控制和DMA設(shè)備控制。 詳細(xì)介紹了Linux DMA Engine框架
    的頭像 發(fā)表于 11-23 06:29 ?6727次閱讀

    你對(duì)Linux總線設(shè)備驅(qū)動(dòng)框架是否了解

    Linux的設(shè)備驅(qū)動(dòng)模型,或者說(shuō),Linux的設(shè)備驅(qū)動(dòng)框架,都是同一個(gè)意思。應(yīng)該這樣理解,(Linux的設(shè)備)驅(qū)動(dòng)框架,即某類設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)
    發(fā)表于 05-05 15:13 ?883次閱讀

    Linux驅(qū)動(dòng)技術(shù)中的異步通知技術(shù)

    異步通知的全稱是"信號(hào)驅(qū)動(dòng)的異步IO",通過(guò)"信號(hào)"的方式,期望獲取的資源可用時(shí),驅(qū)動(dòng)會(huì)主動(dòng)通知指定的應(yīng)用程序,和應(yīng)用層的"信號(hào)"相對(duì)應(yīng),這里使用的是信號(hào)"SIGIO"。
    發(fā)表于 05-12 09:24 ?804次閱讀
    <b class='flag-5'>Linux</b>驅(qū)動(dòng)技術(shù)中的<b class='flag-5'>異步</b>通知技術(shù)

    嵌入式Linux 異步IO機(jī)制

    嵌入式linux中文站向廣大嵌入式linux愛(ài)好者介紹一下嵌入式linux系統(tǒng)的I/O機(jī)制。Linux的I/O機(jī)制經(jīng)歷了一下幾個(gè)階段的演進(jìn):1. 同步阻塞I/O: 用戶
    發(fā)表于 04-02 14:31 ?463次閱讀

    io_uring 優(yōu)化 nginx,基于通用應(yīng)用 nginx 的實(shí)戰(zhàn)

    引言 io_uring是Linux內(nèi)核在v5.1引入的一套異步IO接口,隨著其迅速發(fā)展,現(xiàn)在的io_uring已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)了純
    的頭像 發(fā)表于 10-10 16:19 ?3505次閱讀
    <b class='flag-5'>io</b>_uring 優(yōu)化 nginx,基于通用應(yīng)用 nginx 的實(shí)戰(zhàn)

    Linux內(nèi)核開(kāi)發(fā)框架學(xué)習(xí)資料匯總

    Linux內(nèi)核開(kāi)發(fā)框架學(xué)習(xí)資料匯總
    發(fā)表于 06-17 09:29 ?24次下載

    信號(hào)驅(qū)動(dòng)IO異步IO的區(qū)別

    一. 談信號(hào)驅(qū)動(dòng)IO (對(duì)比異步IO來(lái)看) 信號(hào)驅(qū)動(dòng)IO 對(duì)比 異步 IO進(jìn)行理解 信號(hào)驅(qū)動(dòng)
    的頭像 發(fā)表于 11-08 15:32 ?1511次閱讀
    信號(hào)驅(qū)動(dòng)<b class='flag-5'>IO</b>與<b class='flag-5'>異步</b><b class='flag-5'>IO</b>的區(qū)別

    異步IO框架iouring介紹

    前言 Linux內(nèi)核5.1支持了新的異步IO框架iouring,由Block IO大神也即Fio
    的頭像 發(fā)表于 11-09 09:30 ?3907次閱讀
    <b class='flag-5'>異步</b><b class='flag-5'>IO</b><b class='flag-5'>框架</b><b class='flag-5'>iouring</b>介紹

    一文解讀Linux 5種IO模型

    Linux里有五種IO模型:阻塞IO、非阻塞IO、多路復(fù)用IO、信號(hào)驅(qū)動(dòng)式IO
    的頭像 發(fā)表于 11-09 11:12 ?864次閱讀
    一文解讀<b class='flag-5'>Linux</b> 5種<b class='flag-5'>IO</b>模型
    主站蜘蛛池模板: 国产精品久久久久久影院 | 成人丁香 | 一色屋成人免费精品网站 | 一级特黄aaa大片大全 | 4hu影院在线观看 | 女同性大尺度床戏视频 | 狂野欧美性色xo影院 | 亚洲68283精品人体 | 久久精品亚洲 | 日本在线观看成人小视频 | 丁香六月激情综合 | bt天堂电影 | 久久99热精品免费观看k影院 | 激情六月天婷婷 | 国产成人综合网在线播放 | 毛片观看网址 | 免费黄色国产视频 | 日韩黄a级成人毛片 | 免费看av的网址 | 色综合久久久久久久久五月性色 | 欧美日本一区二区 | 操夜夜| 五月激情片 | 国产三级影院 | 五月婷婷一区 | 午夜黄视频 | 国产精品青草久久久久福利99 | 国产精品综合色区在线观看 | 麻豆三级在线播放 | 性免费视频 | 中国高清色视频www 中国高清性色生活片 | 色免费视频 | 亚洲成人精品在线 | 大尺度在线 | 日日操夜夜操天天操 | 欧美h视频 | 国产婷婷综合丁香亚洲欧洲 | 嫩草影院网站入口 | 亚欧成人乱码一区二区 | 久久久久久9 | 午夜小影院 |