Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在考虑使用阻塞套接字时,我可以使用哪些选项?_Java_Multithreading_Sockets_Networking_Io - Fatal编程技术网

Java 在考虑使用阻塞套接字时,我可以使用哪些选项?

Java 在考虑使用阻塞套接字时,我可以使用哪些选项?,java,multithreading,sockets,networking,io,Java,Multithreading,Sockets,Networking,Io,在利用Java的阻塞套接字进行独立读写的同时,我发现我的两个选择要么为每个操作指定一个单独的线程,要么使用setSortimeout()轮询超时 在这两种实现之间做出选择似乎是内存(线程)与CPU时间(轮询)的权衡 我看到许多线程的调度程序和上下文切换可能会出现缩放问题,这可能会超过轮询所花费的CPU时间以及从单个线程读取和写入数据包之间可能出现的延迟,具体取决于接收到的数据包的大小。或者,如果进行了适当的调优,可以使用一个小的线程池进行扩展,并对几个套接字进行轮询 除了Java的NIO作为替代

在利用Java的阻塞套接字进行独立读写的同时,我发现我的两个选择要么为每个操作指定一个单独的线程,要么使用
setSortimeout()
轮询超时

在这两种实现之间做出选择似乎是内存(线程)与CPU时间(轮询)的权衡

我看到许多线程的调度程序和上下文切换可能会出现缩放问题,这可能会超过轮询所花费的CPU时间以及从单个线程读取和写入数据包之间可能出现的延迟,具体取决于接收到的数据包的大小。或者,如果进行了适当的调优,可以使用一个小的线程池进行扩展,并对几个套接字进行轮询


除了Java的NIO作为替代方案(不在本问题的讨论范围内)之外,我是否正确理解了使用阻塞套接字的可用选项?

首先,我认为您排除了唯一可以扩展的选项;i、 e.使用NIO

每个套接字线程或轮询都不会扩展

  • 在线程情况下,每个套接字需要两个线程。(线程池不工作。)这会为线程堆栈和线程对象占用空间,为本机线程描述符占用内核资源。还有一些次要影响,如上下文切换、额外的GC跟踪等

  • 在轮询情况下,需要对每个套接字进行常规系统调用。无论您是使用一个线程还是一个小的线程池执行此操作,系统调用的数量都是相同的。如果您更频繁地轮询,系统调用速率将增加。如果您的投票频率降低,您的系统响应速度就会降低

好吧,考虑到你设置的限制,没有其他选择了


现在,如果您试图找出哪个线程和轮询更好,答案将是“这取决于”。有很多变量:

  • 备用物理内存和备用CPU周期的数量
  • 套接字的数量
  • 插座的相对活动性
  • 对反应能力的要求
  • JVM中还发生了什么(例如触发GCs)
  • JVM之外还发生了什么
  • 操作系统性能特征

所有这些加起来就构成了一个复杂的场景,可能很难进行数学分析,很难(准确地)模拟,也很难进行经验测量。

首先,我认为您排除了唯一可以扩展的选项;i、 e.使用NIO

每个套接字线程或轮询都不会扩展

  • 在线程情况下,每个套接字需要两个线程。(线程池不工作。)这会为线程堆栈和线程对象占用空间,为本机线程描述符占用内核资源。还有一些次要影响,如上下文切换、额外的GC跟踪等

  • 在轮询情况下,需要对每个套接字进行常规系统调用。无论您是使用一个线程还是一个小的线程池执行此操作,系统调用的数量都是相同的。如果您更频繁地轮询,系统调用速率将增加。如果您的投票频率降低,您的系统响应速度就会降低

好吧,考虑到你设置的限制,没有其他选择了


现在,如果您试图找出哪个线程和轮询更好,答案将是“这取决于”。有很多变量:

  • 备用物理内存和备用CPU周期的数量
  • 套接字的数量
  • 插座的相对活动性
  • 对反应能力的要求
  • JVM中还发生了什么(例如触发GCs)
  • JVM之外还发生了什么
  • 操作系统性能特征
所有这些加起来就构成了一个复杂的场景,可能很难进行数学分析,很难进行(精确)模拟,也很难进行经验测量。

不完全如此

首先,有超时的阅读并不比没有超时的阅读贵多少。无论哪种情况,线程都会在告诉操作系统如果有数据就唤醒它之后进入睡眠状态。如果您有一个超时,它会另外告诉操作系统在指定的延迟后唤醒它。等待时不会浪费cpu周期

另一方面,上下文切换的开销大约有几千个cpu周期,所以大约只有几微秒。网络通信延迟>1ms。在这一开销使服务器崩溃之前,您可能可以为数千个并发连接提供服务。

不尽然

首先,有超时的阅读并不比没有超时的阅读贵多少。无论哪种情况,线程都会在告诉操作系统如果有数据就唤醒它之后进入睡眠状态。如果您有一个超时,它会另外告诉操作系统在指定的延迟后唤醒它。等待时不会浪费cpu周期


另一方面,上下文切换的开销大约有几千个cpu周期,所以大约只有几微秒。网络通信延迟>1ms。在这种开销使服务器崩溃之前,您可能可以提供数千个并发连接。

您设想有多少个并发连接?您设想有多少个并发连接?但是,如果您以零超时轮询,则操作系统不需要安排另一个线程。因此,您可以在调度上节省CPU周期。但您使用的周期更多,因为您定期进行轮询,而大多数情况下,读取轮询将不返回任何结果。一句话:分析非常复杂,变量很多。至少对于java套接字和
setSocket()
,零超时被解释为无限超时。我相信你的意思是绝对的