2

我知道对于一个线程(一个套接字),我不能同时执行 read() 或 write(),或者我可以吗?

但是,如果我创建 2 个线程并且每个线程分别处理 read() 和 write() 怎么办?我不知道在低级视图中,read() 和 write() 是否会获得套接字锁,因此一次只允许执行一个操作?会吗?

我使用Window作为平台,但也想知道在Unix机器上有什么不同吗?

我问这个问题是因为我很困惑,为什么我们需要非阻塞 IO,因为 2 个线程能够让我们同时读取()和写入()?

4

4 回答 4

5

我知道对于一个线程(一个套接字),我不能同时执行 read() 或 write(),或者我可以吗?

当然不是。一个线程一次只能调用一个方法。这个问题没有意义。

但是,如果我创建 2 个线程并且每个线程分别处理 read() 和 write() 怎么办?我不知道在低级视图中,read() 和 write() 是否会获得套接字锁,因此一次只允许执行一个操作?会吗?

他们不需要锁。TCP 是全双工的。您可以在同一个套接字上读取和写入。同时。

我使用Window作为平台,但也想知道在Unix机器上有什么不同吗?

不。

我问这个问题是因为我很困惑,为什么我们需要非阻塞 IO,因为 2 个线程能够让我们同时读取()和写入()?

下定决心。首先你问是否可能,现在你(正确地)说它是可能的。

NIO 允许您在同一个线程中处理多个套接字。这样做的目的是保护线程,例如在必须处理数十万个连接的服务器中。

于 2012-09-11T02:38:02.453 回答
2

线程是非常昂贵的资源。我们应该尽量谨慎有效地使用它们,以充分利用它们。

NIO 允许我们在同一个线程上打开多个套接字。您基本上可以在单个线程上获得 1000 个套接字连接,而不是 1000 个线程。

让我们以Tomcat为例。Tomcat 是一个带有 JSP/Servlet 容器的网络服务器。它同时支持阻塞 IO 和非阻塞 IO。使用阻塞 IO,它最多可以连接 5K HTTP 连接,但是使用 NIO,当有足够的 RAM 内存可用时,它可以达到 20K HTTP 连接。

于 2012-09-11T02:37:52.847 回答
1

因为创建数千个线程会对 JVM 和系统资源造成压力。使用异步 IO,您可以让几个线程监控大量连接,并且效率更高。

于 2012-09-11T02:28:24.343 回答
0

对于一个线程(一个套接字),我不能同时执行 read() 或 write(),

您可以同时读取和写入,但您可以在同一个线程中读取和写入。如果您希望写入已知数量的数据或消息,并且希望返回已知数量的数据或消息,您可以在同一个线程中写入然后读取。

例如,如果您有一个简单的服务器进程,您可能会使用单个线程读取请求并写入响应。

我会为不超过几百个连接使用阻塞 IO。如果你有几十个或更少的连接,非阻塞 IO 可能不值得额外的复杂性。

于 2012-09-11T07:18:11.257 回答