一、非堵塞读与写分析
1、老版本1分析--- 基于tcp的堵塞io模型
是read和write,结合起来处理的io模型,因为如果服务器没有数据过来,那么read将会一直堵塞下去。因为堵塞将会导致程序的效率不够高效。
伪代码如下如实:
while(fgets(buf, maxline,stdin) != NULL){
write(sockfd, buf, strlen(buf));
read(sockfd, buf, maxline);
}
分析堵塞条件:
1).write当中如果套接字发送缓冲区已满,write调用将会堵塞
2).read当中如果套接字接受缓冲区没有数据, 那么read将会一直堵塞下去,直到收到了来之服务器的数据。
2、老版本2分析---基于tcp的select中堵塞的io复用模型
在select来判断, 是否能读取数据, 可以排除老版本一当中的读取数据时候而造成的程序堵塞情况, 很大程度的提高了程序的执行效率。
伪代码如下所示:
for(;;){
FD_SET(fileno(stdin), &rset);
FD_SET(sockfd, &rset);
select(maxfd + 1, &rset, NULL, NULL, NULL);
if(FD_ISSET(fileno(stdin), &rset)){
相关处理过程
}
if(FD_ISSET(sockfd, &rset)){
相关处理过程
}
}
分析堵塞条件:
1).然而当调用write函数的时候,也会应为套接字发送缓冲区已满,而导致堵塞。
2).如果标准输出比网络慢, 那么进程也有可能堵塞与后续的write调用。