linux中的OS时,C#中的函数Socket.Select()是否使用epoll?
Does the function Socket.Select() in C# use epoll when OS in linux?
我知道I/O多路复用有3种方式:select,Linux.I中的poll和epoll搞不懂C#函数Socket.Select()直接用select 不然会用epoll 当OS 支持.
如果不使用epoll哪个函数呢?比如java中的selector.select,当OS支持
时会使用epoll
.net core 使用 epoll 进行异步 Socket.xxxAsync
操作。
https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/
对于 Socket.Select() 调用链是 Socket.Select() -> SocketPal.Unix.cs -> SelectViaPoll -> Interop.Sys.Poll -> Interop.Poll -> [DllImport(Libraries.SystemNative, EntryPoint = "SystemNative_Poll")] internal static extern unsafe Error Poll(PollEvent* pollEvents, uint eventCount, int timeout, uint* triggered); -> Common_Poll -> inline static int32_t Common_Poll(PollEvent* pollEvents, uint32_t eventCount, int32_t milliseconds, uint32_t* triggered) -> poll()
对于异步操作:
Socket.RecieveFromAsync() -> SocketAsyncContext.Unix ReceiveFromAsync() -> _receiveQueue.StartAsyncOperation() -> SocketAsyncEngine.TryRegister();
然后我们去SocketAsyncEngine.EventLoop() -> Interop.SocketEvent.cs _> SystemNative_WaitForSocketEvents -> WaitForSocketEventsInner -> epoll()
参见 Github 上的 PAL 代码。如果系统有epoll就会编译进去。
我知道I/O多路复用有3种方式:select,Linux.I中的poll和epoll搞不懂C#函数Socket.Select()直接用select 不然会用epoll 当OS 支持.
如果不使用epoll哪个函数呢?比如java中的selector.select,当OS支持
时会使用epoll.net core 使用 epoll 进行异步 Socket.xxxAsync
操作。
https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/
对于 Socket.Select() 调用链是 Socket.Select() -> SocketPal.Unix.cs -> SelectViaPoll -> Interop.Sys.Poll -> Interop.Poll -> [DllImport(Libraries.SystemNative, EntryPoint = "SystemNative_Poll")] internal static extern unsafe Error Poll(PollEvent* pollEvents, uint eventCount, int timeout, uint* triggered); -> Common_Poll -> inline static int32_t Common_Poll(PollEvent* pollEvents, uint32_t eventCount, int32_t milliseconds, uint32_t* triggered) -> poll()
对于异步操作:
Socket.RecieveFromAsync() -> SocketAsyncContext.Unix ReceiveFromAsync() -> _receiveQueue.StartAsyncOperation() -> SocketAsyncEngine.TryRegister();
然后我们去SocketAsyncEngine.EventLoop() -> Interop.SocketEvent.cs _> SystemNative_WaitForSocketEvents -> WaitForSocketEventsInner -> epoll()
参见 Github 上的 PAL 代码。如果系统有epoll就会编译进去。