linux信号机制

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入

信号提供了一种通知进程系统事件发生的机制,它也是作为用户进程之间通信和同步的

一种原始机制。在进程迁移的情况下,如何处理信号呢?这部分介绍了MOSIX系统对信号

机制的处理。

LINUX信号机制

信号是异步的进程间通讯机制,是在软件层次上对中断机制的一种模拟。LINUX内核的信

号机制符合POSIX.4的规定,这是POSIX.1标准的一个超集。

每个进程的task_struct结构中都有个指针sig,指向一个singal_struct结构,结构中的

数组action[]相当于一个信号向量表,每个元素确定了进程接收到一个具体的信号时应

该采取的行动。

struct signal_struct {

atomic_t count;

struct k_sigaction action[_NSIG];

spinlock_t siglock;

};

那么系统如何判断一个进程是否有信号在等待处理呢?这是通过task_struct结构中的si

gpending成员。task_struct结构中的blocked成员则为屏蔽信号的集合,pending成员则

为信号队列,每产生一个信号则把它挂入这个队列,信号位图signal也保存在其中。

用户常常要自己定义对信号的处理程序,并且用户的处理函数是位于用户空间的。LINUX

提供了系统调用signal(sys_signal)和sigaction(sys_sigaction 或sys_rt_sigacti

on)为信号设置处理向量。用户设置信号处理的时机我们是不能确定的,可以在进程迁

移前,也可以在进程迁移之后,进程可以在不同的节点间多次迁移,因此,如何保证信

号不被丢失并且都能被正确处理就很重要。并且我们注意到,进程在迁移时,并不将信

号向量表迁移到目标进程,而只是将进程的异步信号和强制信号信息传送到目标进程【

参见mig_send_misc()和mig_do_receive_misc()】。

struct asig_h

{

unsigned int sigs;/*信号*/

int nforced;/*内核发送的强制信号的个数*/

};

struct mosix_task

{……

uint32_t asig; /*到达REMOTE的信号 */

siginfo_t *forced_sigs; /* REMOTE强制信号信息*/

int nforced_sigs; /* REMOTE强制信号的个数 */

short sigmig; /* 迁移时接收的信号 */

}

int mig_send_misc(int credit)

{ struct mig_misc_h m;

register struct task_struct *p = current;

……

m.asig.sigs = p->mosix.asig;

m.asig.nforced = p->mosix.nforced_sigs;

forced_sigs = p->mosix.forced_sigs;

sti();

if(comm_send(MIG_MISC, &m, sizeof(m), forced_sigs,

m.asig.nforced * sizeof(siginfo_t), 0))

……

}

因此,我们可以说进程信号处理的状态是保留在DEPUTY方的。这样做也是很自然的。首

先在MOSIX中,对于REMOTE进程,几乎所有的系统调用都是请求DEPUTY来处理,和信号相

关的一些系统调用也不了例外。例如,sigprocmask()改变本进程得信号屏蔽位图,sigp

ending()检查有哪些信号已到达而未被处理,signal()和sigaction()安装信号处

理程序。其次,在不少内核操作中,进程进入睡眠以后刚被唤醒时,都会检测信号的存

在从而提前返回到用户空间。而DEPUTTY和REMOTE可以分别看作对系统上下文和用户上下

文的抽象,所以DEPUTY保留着信号处理的状态。

[1][2][3]

临行之前,面对太多的疑问和不解:

linux信号机制

相关文章:

你感兴趣的文章:

标签云: