最近做socket编程,遇到同步 异步 阻塞 非阻塞,一时有点理不清,认真的查了一下资料,发现网上的资料基本上一半说的是错的或者说得不着边际的。还有一些说了一大堆,又举了一大堆例子,可是却越说越乱,当然还有一小部分说得还是正确的,下面我希望把我理解的这四个概念之间的不同能够言简意赅的表达出来,希望有同样疑惑的朋友看到我的表达能更快的理解他们之间的区别,如果我说得有不正确的地方,也希望及时指正。 首先,同步 异步是一组概念,阻塞 非阻塞是一组概念,他们之间是不太相关的,最好把同步 异步放在一起思考,阻塞 非阻塞放在一起思考。注意:我说的都是有关网络通讯的同步 异步 阻塞 非阻塞 判断是阻塞还是非阻塞,主要是看函数没有数据接收时是否立刻返回, 比如recv函数,如果它执行的时候有数据就接收数据,然后返回接收到的数据总和。没有数据就一直等待直到有数据。那么就是阻塞的,如果他执行的时候是有数据就接收数据,然后返回接收到的数据总和,没有数据就立刻返回0,那么他就是非阻塞的。注意,其实在有数据时阻塞和非阻塞的执行过程是相同的,只是遇到没有数据时才体现出阻塞和非阻塞的区别 判断是同步还是异步的方法是: 同步:需要用户进程主动将存放在内核缓冲区中的数据拷贝到用户进程中。 异步:内核会自动将数据从内核缓冲区拷贝到用户缓冲区,然后再通知用户。 也许我这里讲的看着似乎过于简单,我想只要能清楚的区分什么是同步 异步 阻塞 非阻塞就行了,至于他们之间还有什么深层次的关系,就需要各位自己再去琢磨了。如果有更好的看法也希望给我留言。 我认为网上的这个文章讲的是最好的http://www./96,其他的都是垃圾,特别是用生活中的例子举例说明的那些文章,更垃圾,都是哗众取宠的。
|
|
来自: haodafeng_org > 《network》