在实现服务器时,我们可以将一个客户端请求委托(delegate)给一个线程。我读到这种方法的问题是每个线程都有自己的堆栈,这将非常“昂贵”。另一种方法是让服务器是单线程的,并在这个服务器线程上实现所有客户端请求,并将 I/O 请求作为非阻塞请求。我的疑问是,如果一个服务器线程同时运行多个客户端请求,服务器代码不会有指令指针、局部变量集、每个客户端请求的函数调用堆栈,那么这不会像以前一样“昂贵”。我们如何真正节省?
最佳答案
I read that problem with this approach is that each thread will have its own stack and this would be very "expensive".
取决于您的系统资源有多紧张。在许多当前架构上,每个线程分配的典型 JVM 堆栈空间默认为 1mB,尽管这可以使用 -Xss
命令行参数进行调整。您的 JVM 有多少系统内存可供使用以及您需要多少线程决定了您是否愿意为编写单线程服务器付出高昂的代价。
My doubt is that if one server thread is running multiple client requests simultaneously, won't server code have instruction pointer, set of local variables, function calls stacks for each client request, then won't this again be "expensive" as before
它肯定需要在堆中存储每个请求的上下文信息,但我怀疑保存传入连接服务所需的变量的信息量会少于 1mB。
与大多数事情一样,当我们寻求优化程序时,无论是减少内存还是其他系统资源的使用,我们真正竞争的是代码复杂性。做对更难,维护也更难。 尽管线程程序可能非常复杂,但将请求处理程序隔离在单个线程中可以使代码极其简单,除非它需要以某种方式与其他请求协调。在大多数情况下,编写高性能单线程服务器比线程版本复杂得多。当然,如果不能使用多个处理器,性能也会受到限制。
关于java - 单线程服务器如何能够通过非阻塞 I/O 满足多个客户端的需求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68288201/