滿足無鎖進程保證的編寫算法或數據結構的困難之一是動態內存分配:調用類似malloc
或new
的調用不保證以便攜方式無鎖。然而,存在許多無鎖實現malloc
或new
,並且還有各種可用於實現無鎖算法/數據結構的無鎖內存分配器。動態鎖定內存分配器
但是,我仍然不明白如何實際上完全滿足無鎖進度保證,除非你特別限制你的數據結構或算法到一些預先分配的靜態內存池。但是,如果你需要動態內存分配,我不明白如何任何指稱的無鎖內存分配器永遠真正無鎖的長期。問題是無論您的無鎖malloc
或new
可能有多驚人,最終可能會導致內存不足,此時您必須要求操作系統提供更多內存。這意味着最終你必須調用brk()
或mmap()
或者一些這樣的低級別等價物,以實際獲得更多的內存。並且不能保證任何這些低級調用都是以無鎖方式實現的。 (除非您使用的是像MS-DOS這樣的不提供內存保護的古老操作系統,或者您自己編寫了完全無鎖的操作系統 - 兩種不實用的方案或者可能)。那麼,怎樣才能使任何動態內存分配器真正無鎖?
你說的沒錯,但是......由於分配只能從OS請求大塊,並且不需要及時發佈它們,對「sbrk()」或任何其他語言的調用總數可以嚴格限制到無關緊要的程度。當然,這並不能滿足硬實時要求,但我認爲即使動態分配完全無鎖,也不會滿足這些要求。 –
您是否擔心延遲,或者您是否擔心使用https://en.wikipedia.org/wiki/Non-blocking_algorithm?如果是後者,我認爲最好的操作系統使得線程無法在內核中睡眠,同時持有一個會阻止其他線程使用mmap的鎖。所以就編寫一個非阻塞算法而言,我認爲使用'mmap'並不是一個問題,因爲如果一個線程可以在保持一個線程的同時睡眠,那麼鎖只是一個問題。臨界區內的一對CPU高速緩存未命中可能是你得到的最差的。 –
在真實系統上運行的所有分配器在某個時刻不得不耗盡內存;在分配靜態池時運行的無鎖分配器在操作系統認爲你已經擁有足夠的時間的情況下與正常的分配器沒什麼質的區別。 –