学习Linux网络编程后关于伪线程的一些概念记录和理解

​​​​​​       在Linux网络编程中,有较多的进程模块是基于socket编程,例如通过TCP/UDP socket与外界设备通信、通过unix domain socket与内部模块通信等。在使用socket编程时,程序的主要处理部分一般是调用select或者poll侦听套接字集合,并根据socket的可读或者可写调用对应的处理函数,这部分代码在各进程模块中基本类似,可以合并为公共的库。伪线程机制提供了这个封装功能,并且它把socket可读以及可写事件的处理转化为一个个伪线程加以调度运行。

伪线程机制是一种模拟线程调度的机制,它提供了将一系列异步事件[1]转换为伪线程来运行的方法,这些伪线程在等待、就绪、运行等各种状态中迁移,处于就绪状态的伪线程将被一一调度执行。伪线程并非实际意义上的线程,它不存在于操作系统的调度队列中。对于使用伪线程机制的模块来说,一般情况下该模块会创建一个真实的线程,然后在这个线程中进行伪线程的调度。因此,伪线程相当于在操作系统线程之上的一个线程调度机制,两个伪线程并不会被并发地执行,某个伪线程挂住将使得伪线程调度器无法再继续运行,也就会造成相应的Linux进程或线程挂住。因此,如果要求Linux进程或线程不挂住,那么伪线程的处理中不能有挂起操作。在设计考虑的时候,通过伪线程调度机制一般情况下可以做到伪线程的处理不挂起,或者挂起概率较低。例如,对于socket读写操作,不再使用原先的直接尝试去阻塞读写的方式,而是添加一个读或写伪线程,伪线程调度机制在判断socket可读或者可写的时候才进行读或写操作,此时在读或写伪线程中进行读写操作一般不会挂住。

使用伪线程的优点如下:

1)将伪线程作为一个公共库之后,这种机制使得进程模块的设计可以更加简单,设计人员可以把一个进程模块看作操作系统,新增一种事件处理只需为它新增一个伪线程即可,伪线程如何调度则完全无需考虑。

2)外部模块和本模块的交互都通过socket异步通信的方式,最终转换为一种伪线程事件在本模块运行。因此,如果进程模块只需创建一个线程,则无需考虑模块内部的临界资源互斥机制。

       说明:伪线程机制只是提供了一个封装socket基本操作的公共库,并且额外提供了事件以及定时器机制,这个库可以使进程模块的编程更加简单。伪线程机制对于应用协议以及路由协议类的进程比较适用,然而,RGOS平台并未强制要求进程模块使用伪线程库,各进程模块设计时可以不使用伪线程库进行设计,可以采取其它实现方式,例如自己编写select、使用其它定时器机制等。设计人员可以先查阅另一篇文章的“伪线程使用注意事项”,以便判断进程模块对伪线程的一些设计约束是否可以接受。

[1] 异步事件:非同时发生的事件。

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值