永发信息网

C语言 阻塞,非阻塞和多线程有什么关系

答案:1  悬赏:60  手机版
解决时间 2021-02-03 12:54
C语言 阻塞,非阻塞和多线程有什么关系
最佳答案
阻塞是在传统的网络编程中我们依赖于ServerSocket,Socket进行通信,大致的框架就是ServerSocket调用accept方法,等待客户端的连接,如果连接进来的时候则创建一个服务器端socket,客户端和服务器端socket建立好InputStream 和outputStream通道进行通信,在这个网络IO的过程中inputStream的read 和outputStream的write方法都可能发送阻塞。为了减少这种阻塞对其他连接的影响,一般都会在服务器端为每个连接开辟一个新的线程,或者使用线程池技术来避免线程的创建销毁同时又一定程度支持并发量。然而这种情况下,如果发生大量的read 或者write阻塞线程池的效率会大大降低,而且操作系统也额外需要频繁的处理cpu的切换。
非阻塞式通信实际是对上述模式的扩展,它的核心思想是为传统的socket加入事件监听的功能,操作系统可以在socket和serversocket上进行事件监听,一旦监听的对象发生了连接和可读可写的事件,监听器就会对注册了事件的对象返回相应的通知。在javaNIO中实现这一套的机制就是把socket 和ServerSocket重写成为SocketChanel,ServerSocketChanel,他们的底层仍然使用socket实现,所以原则上javaNIO包可以完全实现阻塞和非阻塞两种编程模式。事件监听的功能由Selection类完成,他使用select方法一直阻塞式监听注册了的事件是否发生,对于每一个发生的事件,他都会返回一个selectionKey,通过这个key我们就可以确定这个事件的发生源(socket)和相关信息。对于ServerSocketChanel,Socketchanel分别对应了不同的事件,serverChanel只有OP_ACCEPT代表是否可以接受连接,而socketChanel则有OP_CONNECT、read、write事件。笔者认为与阻塞IO相比他的优势在于可以避免read 和write的阻塞,因为这个比较具有实际意义的。比如是一个网络文件传输系统,read方法可能会因为网络原因发生多次阻塞,使用非阻塞IO read的话线程可以立即返回去处理其他任务。
多线程是在进程中进一步去划分的独立单元。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
有按揭车可以贷款多少
oppo最新款手机贷款要多少钱
丽江宴我想知道这个在什么地方
老婆在外偷情被我抓到我也拍了照在法律上会对
人寿的意思是什么啊?知道的请说下!
恩。。。。之前听过一首歌,在酷狗找到了,但
翻译documents must be sent in one lot by s
win7 C盘活动分区和u盘活动分区关闭了开不了
鹏达电器在哪里啊,我有事要去这个地方
去哪里能学到皮草衣服制作?
上海葡美国际贸易有限公司怎么样?
淘宝贷款到期了,现在没有钱还,怎么办?
黄冈市黄州区嘉盛大厦具体位置
梦见老家门口鲜花怒放,阳光柔和,特美。想拍
目前国际上形成的不同的地面数字电视传输标准
推荐资讯
下图为“甲.乙.丙三个地区牛奶生产和销售模式
平盈的意思是什么啊?知道的请说下!
电脑蓝屏000021a怎么解决
运动后耳闷过一会又会好
自制仓鼠喜欢吃的甜品
什么复什么什么成语
敏捷针棉织品专卖在哪里啊,我有事要去这个地
上海家乐福总部地址是什么
湘达印务地址在什么地方,我要处理点事
莱州市个体私营企业协会土山分会地址有知道的
宝骏汽车(庆阳西峰区西环路北段)地址有知道的
东贺伍庄村地址有知道的么?有点事想过去
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?