Linux下的阻塞与非阻塞:搞清楚哪种方式更优?(linux阻塞与非阻塞)
Linux是开放源码系统,一直以来就以其简洁易用而备受欢迎。Linux下有一个有趣的特性–阻塞与非阻塞,这也使系统处理I/O导致的性能变得更好。所以,一个问题便可想而知,在Linux下,哪种方式更优?
要谈论Linux下的阻塞与非阻塞,先说下它们的区别。阻塞式I/O意味着系统在等待I/O完成后才会进行下一步操作,也就是应用程序请求I/O后,就必须等待它完成后才能继续工作;而非阻塞式I/O则表示在等待I/O完成期间,应用程序仍可以响应其它較低级别的I/O请求。
关于Linux下哪种方式更优,也就要看应用程序本身的情况。如果应用程序只处理少量的简单的I/O,那么阻塞I/O方式相对简单。但如果应用程序要处理同时处理多个请求,或者要尽快处理I/O,那么最好使用非阻塞I/O,可以有效提高处理性能。
例如服务器应用程序,如果使用阻塞I/O,服务器就会在处理某个客户端的请求后一直等待,无法迅速响应其它的客户端请求。这时,采用非阻塞I/O,服务器可以不断接受客户端的请求,并由多个独立的线程(例如,使用epoll)来处理每个客户端的请求,以避免响应慢的问题。
当然,如果使用阻塞I/O,服务器只需要少量的代码,例如:
while (1)
{
client_fd = accept();
n = read(client_fd, buf, len);
write(client_fd, buf, n);
}
从性能来看,有时候,阻塞I/O能够让程序更轻量而高效,而非阻塞I/O则不太可能实现这种轻量高效性能。
总之,不管使用什么类型的I/O机制,要想得到最佳性能,最重要的是要根据应用程序的情况,来选择最恰当的方式。本文探讨了Linux下的阻塞与非阻塞,虽macbeth然有某种情况下使用非阻塞I/O可以提高性能,但在许多情况下,阻塞I/O仍然是性能佳的选择。