它們都是NIO中多路復用的三種實現機制,是由linux操作系統提供的。
用戶空間和內核空間:操作系統為了保證系統安全,將內核分為兩個部分,一個是用戶空間,一個是內核空間。用戶空間不能直接訪問底層的硬件設備,必須通過內核空間。
文件描述符(File Description FD):是一個抽象的概念,形式上是一個整數,實際是一個索引值,指向內核中每個進程維護進程所打開文件的記錄表。當程序打開一個文件或者創建一個文件時,內核會向進程返回一個FD,主要在unix和linux系統中。
select機制
會維護一個FD的集合fd_set。將fd_set從用戶空間復制到內核空間。激活socket。fd_set是一個數組,并且受到操作系統的限制。
poll機制
將fd_set結構進行了優化。FD集合的大小就突破了操作系統的限制。使用poll_fd結構來代替fd_set。通過鏈表實現。
EPoll
Event Poll不再掃描所有的fd,只將用戶關心的FD事件放到內核的事件表當中。這樣,可以減少用戶空間和內核空間之間需要拷貝的數據。
java中的NIO用的是哪種機制
可以查看DefaultSelectProvider源碼。在windows下,使用的是WindowsSelectorProvider。而在linux下,會根據Linux的內核版本控制,2.6版本以上使用的是EpollSelectProvider,否則就是默認的PollSelectorProvider。