2012-02-25 56 views
2

我希望aio在讀取操作完成時向我的程序發送信號,並且根據this page,可以通過內核發送的信號或通過啓動運行用戶函數的線程來接收此類通知。通過設置正確的值sigev_notify可以選擇任何行爲。AIO可以不創建線程而運行嗎?

我試了一下,很快發現,即使設置爲通過信號接收通知,也創建了另一個線程。

(gdb) info threads 
    Id Target Id   Frame 
    2 Thread 0x7ffff7ff9700 (LWP 6347) "xnotify" 0x00007ffff7147e50 in gettimeofday() from /lib64/libc.so.6 
* 1 Thread 0x7ffff7fc3720 (LWP 6344) "xnotify" 0x0000000000401834 in update (this=0x7fffffffdc00) 

該文檔還指出:這些功能的實現可以在內核中使用的支持(如果有的話),或使用基於用戶級在線程的實現來完成。 我想沒有線程,這是可能的嗎?

我查了我的內核,那看起來不錯:

[email protected] /home/qdii $ grep -i aio /usr/src/linux/.config 
CONFIG_AIO=y 

是否有可能AIO沒有任何(用戶區)線程運行在所有(從主一個分開,當然)?

編輯: 我深入瞭解它。 librt似乎提供的AIO函數的集合:通過glibc的源尋找可疑暴露了一句:內/rt/aio_read.c是一個函數存根:

int aio_read (struct aiocb *aiocbp) 
{ 
    __set_errno (ENOSYS); 
    return -1; 
} 

stub_warning (aio_read) 

我發現在子目錄sysdeps第一相關實施/並行線程,它直接調用__aio_enqueue_request(..., LIO_READ),這反過來又創建了pthread。但是當我想知道爲什麼會出現這種情況時,我想可能這個存根可能是由linux內核本身實現的,而pthread實現可能是某種後備代碼。

通過我的/ usr/src/linux目錄下載aio_read給出了很多結果,我現在正在嘗試理解。

回答

1

我發現,實際上有兩種不同的真庫aio:一個是的glibc的一部分,包含在librt,並通過使用並行線程異步訪問。另一個aio庫實現與第一個接口相同的接口,但它建立在Linux內核本身之上,可以使用信號異步運行。

相關問題