关于不可接管阻塞问题补充

关于不可接管阻塞问题补充

1、对一些磁盘读写这种较长时间等待的阻塞属于不可接管阻塞吗
2、go中对于处理io阻塞问题有用到io多路复用吗,如果有能列举哪些用到了吗。
3、对于大量不可接管阻塞go如何优雅的处理的
4、syscall阻塞时M和G会锁定吗

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Xargin 2021-05-19 17:47:47
  1. 磁盘读写确实是不可接管的,在 runtime 里的 FD 区分 pollable 和非 pollable,网络的那种才是 pollable,可以接管,文件的不行

  2. 你这个 io 多路复用我没理解。。。是说的网络协议里的多路复用么,一条连接上可以并发收发请求?类型 http2 那样的?

  3. 没有太好的办法,我们线上的服务一般和文件系统打交道比较少,还好,如果碰上了的话,一般可能是固定的 goroutine 数消费 channel(内存里的 buffer) 去写文件,控制被阻塞的数量,不让线程数涨太高。但实际场景还是会有线程数爆炸的情况的,我们在线上碰到过,特别一些用 cgo 的。

  4. syscall 阻塞的时候 M 和 G 是在一起的,不会分开。只会把 P 拿走


  • 提问者 Garry_27 #1
    曹大第二点我不知道说的对不对。在linux系统上对于io阻塞处理提供了五种io模型提供用户调用是吧。其中io多路复用这种模型应用在网络io中比较强大。我想知道除了用在网络io中还能用在其他io阻塞中吗。如果一个创建的一个系统线程只能处理一个io事件的话这样效率就会很低。想并发只能再开线程。这种结果很容易线程撑爆。那对于多个io阻塞问题复用一个线程这样子是不是就会更高效呢。
    2021-05-19 19:40:15
  • Xargin 回复 提问者 Garry_27 #2

    网络 io,linux 系统给我们提供的是同步非阻塞接口,如果 os 提供的是阻塞接口(其实就是 syscall),那在 Go 里面也处理不了,只能开线程。


    开线程就得注意线程数

    2021-05-20 16:39:09
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师