簡體   English   中英

非阻塞mlock()

[英]Non-blocking mlock()

是否有非阻塞mlock()之類的東西? 在通信繁忙的情況下,我不想讓線程阻塞等待I / O。 我寧願只是使用mlock()告訴Linux內核我需要從mmap()文件中的哪個區域,然后在提取頁面時得到通知。 (據我所知,標准的mlock()調用正在阻止。)

mlock接口似乎沒有您想要的任何內置功能,因此我認為實現此功能的唯一方法是使用單獨的線程執行mlock並使該線程通知您(通過條件變量,信號量)或其它機構),當mlock已經返回。 顯然,這會產生一些開銷,但是如果您的目標是獲得實時延遲保證,而不是改善總體運行時/平均延遲,那仍然是一個明顯的勝利。

當然,除非使用mlockall否則很難做出任何實時假設,因為代碼可能會被換出。 因此,使用mlockall和POSIX AIO(或類似的但更清晰的API系統,根據線程自己實現)可能更有意義,而不是使用mmap 然后,您將堅決保證,一旦提取了數據,就無法將其交換出去。

我相信您想要madvise()posix_madvise()mincore()

您將使用madvise調用向內核詢問MADV_WILLNEED 然后,您將不得不使用mincore進行輪詢,以檢查是否已將頁面讀入內存。

如果系統承受沉重的內存負載,則可能無法通過madvise調用來讀取頁面,因此您將需要超時並回退到阻塞讀取模式。

如果您對文件進行mmap()處理,則將該文件視為內存,VM會根據您的使用情況來分頁輸入/輸出文件,這可能會受益於預讀。

有多種方法可以執行非阻塞I / O(異步,輪詢,選擇,epoll),但是mlock()涉及在RAM中保存一個內存區域,不允許將其分頁到交換分區。 盡管在嚴重的內存壓力下,內核可能無法兌現。

mmap(2)最有可能就好像您正在使用內存頁面一樣,它們不會被選擇用於頁面輸出,但是無論如何都會保留在內存中,因此請考慮是否這個問題是過早的優化,內核會盡力提供(默認情況下) ) 很好的表現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM