初探伪线程

什么是伪线程

一种基于socket的与外部通信的统一架构,免除了每个用户空间模块编写基于socket代码的时候都需要编写一套基础框架。

伪线程与线程的区别

  • 伪线程并不是真正意义上的操作系统线程,不在操作系统的调度队列中
  • 对于使用伪线程机制的模块来说,一般情况下该模块会创建一个真实的线程,然后在这个线程中进行伪线程的调度
  • 伪线程相当于在操作系统线程之上的一个线程调度机制
  • 伪线程并不能代替线程,一些需要并发,或有可能挂起的操作仍然需要使用线程

伪线程有几个队列,优先级分别是?

  • Pending队列:最高优先级
  • 高优先级:
  • 中等优先级:一般的伪线程都是添加为该种类型的优先级。例如定时器线程、socket读写线程。而socket读线程又分为两种类型,即高优先级的读线程和低优先级的读线程,这两类线程最终都是中等优先级,只不过高优先级读线程会比低优先级读线程先加入到中等优先级的线程队列中,因此会先得到调度运行。
  • 低优先级:这类线程的优先级最低,一般是在处理某类优先级比定时器、socket读写等都低的事件时添加。

伪线程两种队列

  • 等待运行队列:read_pend、queue_high、queue_middle、queue_low
    在这些队列里的伪线程已经准备就绪,就等运行了。这些队列里的伪线程按照优先级高低顺序执行。高优先级队列必须全部运行完,才会轮到低优先级。
  • 等待调度队列:event、event_low、timer、read、write
    新增的伪线程根据不同的类型,分别进入上述队列。运行队列的所有伪线程都运行结束后,这些队列的伪线程才会开始调度,进入运行队列

如果先添加一个低优先级的伪线程,再添加一个高优先级的伪线程,后者不一定比前者先运行。有可能添加后者的时候,前者已经进入运行队列,而后者是在调度队列等待。

伪线程会导致低优先级队列饿死的两种原因是什么?

高优先级的伪线程长时间执行,低优先级的无法得到调度

高优先级的伪线程分批执行,执行一部分即退出,另起一个伪线程等待再次执行

有大量高优先级的伪线程等待执行,低优先级的无法得到调度
减少伪线程数量

伪线程的定时器是精确的么?为什么?

比如T1时刻启动一个伪线程定时器,时间是10秒,是否T1 + 10的时候该定时器必然得到执行?

伪线程定时器是非精确的,即伪线程的定时器机制不保证超时时间到达时能够马上取出伪线程运行,它只能保证定时器伪线程一定是在超时时间过后被取出运行。一般情况下,只有在系统较繁忙时会导致伪线程定时器不精确。

伪线程的优先级高、低是相对的,还是绝对的?如何理解?

优先级是相对的,如果先添加一个低优先级的伪线程,再添加一个高优先级的伪线程,后者不一定比前者先运行。有可能添加后者的时候,前者已经进入运行队列,而后者是在调度队列等待。

掌握伪线程的写法

  • 禁止多个线程同时操作同一个伪线程
  • 信号处理函数不允许操作伪线程
  • 如果伪线程执行函数的操作是比较耗时间或有可能挂起,则不建议使用伪线程
  • 伪线程管理器创建失败,则进程模块必须对错误返回值进行处理
  • 伪线程是一个无限循环机制,因此在系统初始化时,至少需要添加一个伪线程,否则无限循环中没有可运行的伪线程会导致后续的伪线程添加均会失败
  • 伪线程参数指针不能是临时变量,并且该变量释放前要先取消所有使用该变量的伪线程
  • 在进程运行中间,关闭某个套接字的时候,如果该套接字有添加对应的伪线程,则需要将该伪线程从伪线程管理器中摘下来取消掉,方可关闭套接字
  • select机制对于socket数量很大时,效率较低,此时可能需要使用epoll解决,这种情况下,无法使用伪线程机制。也就是说,使用伪线程时,socket数量不应很大,一般需要小于1024个。如果使用者socket数量大于1024那么必须在伪线程调度前设置使用poll/epoll机制替代默认的select机制
  • 通过add方式的伪线程,在处理函数被处理之后,相应的伪线程会自动由伪线程机制内部回收,也就是说,处理函数无需显式地调用rg_thread_cancel来释放伪线程,如果使用者有保存add的伪线程指针返回值,需要将原来自己保存的伪线程指针置空,因为该伪线程已经不可用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值