java - 单线程服务器如何能够通过非阻塞 I/O 满足多个客户端的需求?

标签 java multithreading performance server nonblocking

在实现服务器时,我们可以将一个客户端请求委托(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/

相关文章:

java - java中的空指针异常字符串二维数组

c# - 将 CancellationToken 传递给任务类构造函数有什么用?

multithreading - Kotlin:为什么 job.invokeOnCompletion() block 不在主线程上运行?

java - 每次更新时移动 JLabel 的位置

java - 尝试将布局设置为 BoxLayout

C# MD5 哈希与 Java/PHP MD5 哈希不匹配

python - 处理 Django 长时间运行的上游请求的最快、最简单的方法

c# - 性能概况显示巨大的 JIT 编译器负载

javascript - 当javascript文件全部合并到一个文件中时,它们的顺序是否重要?

c++ - 通过 const 引用传递基本值真的会损害性能吗?