操作系统:线程间通信之信号

        在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改动全局变量的值,另一个功能对此全局变量进行读取,根据读取的全局变量值执行相应的动作,达到通信协作的目的。下面会分享一些如何将邮箱、消息队列、信号用于线程间的通信。

相关文章:

1、《操作系统:线程间通信之消息队列》

2、《操作系统:线程间通信之邮箱》

3、《操作系统:线程间通信之信号》

目录

一、信号

二、信号的工作机制


一、信号

          信号(又称为软中断),在软件层次上是对中断机制的一种模拟,在原理上,一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。

二、信号的工作机制

          信号在操作系统中用作异步通信,POSIX 标准定义了“sigset_t” 类型来定义一个信号集,然后“sigset_t”类型在不同的系统可能有不同的定义方式,在RT-Thread中,将“sigset_t”定义为unsigned long类型。

          信号的本质是软中断,用来通知线程发生了异步事件,用做线程之间的异常通知、应急处理。一个线程不必通过任何操作来等待信号的到达,事实上,线程也不知道信号到底什么时候到达,线程之间可以通过调用相关的接口发送软中断信号。

收到信号的线程对各种信号有不同的处理方法,处理方法可以分为三类:

第一种:类似中断的处理程序,对于需要处理的信号,线程可以指定处理函数,由该函数来处理。

第二种:忽略某个信号,对该信号不做任何处理,就像未发生过一样。

第三种:对该信号的处理保留系统的默认值。

如下图所示,假设线程1需要对信号进行处理,首先线程1要安装一个信号并解除阻塞,并在安装的同时设定了对信号的异常处理方式;然后其他线程可以给线程1发送信号,触发线程1对该信号的处理。

操作系统:线程间通信之信号_第1张图片

        当信号被传递到线程1时,如果它正处于挂起状态,那会把状态改为就绪状态去处理对应的信号。如果它正处于运行状态,那么会在它当前的线程栈基础上建立新栈帧空间去处理对应的信号,需要注意的是使用的线程栈大小也会相应增加。

你可能感兴趣的:(操作系统,操作系统,线程间通信,信号,软中断)