关闭

网络编程-阻塞非阻塞同步异步

标签: 网络编程 异步 同步 阻塞 非阻塞
279人阅读 评论(0) 收藏 举报
分类:

这四个词语都跟线程有关,跟函数有关,跟数据就绪有关,跟主动还是被动有关

1.阻塞----------相对于函数 基于线程上下文

调用者线程调用函数时,因为条件不满足(没有数据),函数不返回,调用者线程状态进入暂停状态,

等待其它线程(也许是内核)待条件满足时通知,即激活线程进入运行状态,继续执行

有2点注意  调用者线程不干活了  调用者主动取数据

2.非阻塞----------相对于函数 基于线程上下文

调用者线程调用函数时,因为条件不满足(没有数据),函数立即返回,调用者线程继续执行,可以执行其它函数,

那啥时获取数据呢,的调用者自己决定了,一次不成功就再尝试,记得很多API 有返回值AGAIN,就是再试试。问题来了,试多少次呢,

这就的根据业务决定了,比如可以超时。

有2点注意  调用者线程继续干活,调用者主动获取数据


3.同步--------------相对于线程

同步一词在多线程编程中资源的竞争经常用到,且还经常用同步的函数,锁,信号量,条件,互斥等等。所以效率不高。

同步的目的保证了代码的串行执行。一件事一件事地做完才能做下一件事

 所以 阻塞 和非阻塞 都属于 同步范畴


4.异步 ---------相对于线程

与同步相反,我不需要同步,不需要锁与另外一个线程协调。(咱俩100米短跑比赛看看谁跑的快)

调用者只需发出请求后,可以继续干其它事,另外一个线程(也许是内核)回主动通知并把数据给你

有2点   调用者线程继续干活  调用者被动获取数据(一般在回调函数返回,数据已返回)


======================网上也有一篇讲的靠谱一点的================================

IO操作分为两个过程,第一个是内核有没有准备好数据,第二个是准备好的数据由内核空间拷贝到用户空间。


阻塞、非阻塞、IO复用都是同步的,都是第一个阶段的不同,阻塞是主动去询问内核数据有没有准备好数据,阻塞的就停止了,直到内核说有了。非阻塞的内核告诉没有,直接返回,干其他事情。IO复用也是同理,与非阻塞相比,这里的IO复用是监听多个IO操作,比如在网络编程中,用select或者epoll可以监听一组套接字,这时候哪个套接字准备好数据了,就读,没有就接着干其他的,然后等到下次循环去问。同步中,数据由内核拷贝到用户空间的过程也是需要等待的,只是操作系统处理这个过程比较快,所以我们感觉不到程序已经停下来了,其实是等待数据结束,IO操作才结束。


至于异步,是真正的非阻塞。IO操作的两个过程都没有阻塞,就是说,我在IO的过程中,只告诉内核,我是异步IO,我要读什么什么,然后我就不管了,直接去做其他事情,内核准备好数据后,然后把数据拷贝到用户空间,这两个过程完成后会给进程一个信号,告诉进程,数据都准备好了,请拿走,然后进




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:104679次
    • 积分:1913
    • 等级:
    • 排名:千里之外
    • 原创:71篇
    • 转载:103篇
    • 译文:0篇
    • 评论:47条
    最新评论