学习笔记9
第六章
信号和中断
“完成”是I / O设备或CPU版本发送的外部应用程序,它将CPU转换为终止过程。例如请求结束CPU,并在该过程中请求发送“信号”,并且从正常的中断处理移动过程。在讨论信号和信号处理之前,让我们考虑概念和中断,这有助于在引用中正确显示。
(1)首先,我们总结了操作概念如下:“过程”(引用)是一系列活动。
·在日常事务中工作的人。
•在用户模式或内核模式下工作的UNIX / Linux进程。
·实施CPU指令。
(2)“完成”被送到“过程”,将正常活动的“过程”转移到其他活动,并成为“中断”。 “该过程”可以在完成“中断”处理后恢复正常活动。
(3)“停止”项可以应用于任何“过程”,而不限制计算机上的CPU。例如,我们将参考以下“中断”。
0.1成员
0.2进程
在此过程中终止这些中断终止。执行此过程时,可以从3个不同的来源休息:
·通过硬件停止:设置站的“Ctrl + C”,逗号计时等。
·中断其他进程:杀死(PID,SIG#),Death_of_Child等。
·导致中断:间隙0,无效的地址等
0.3结束硬件
这些中断是发送到处理器或CPU的信号。它还有三种可能的来源:
·I完成设备:计时器,I / O设备等
·从其他处理器中断:FFP,DMA和多处理器系统中的其他CPU。
·引起中断:GAP 0,错误防御,强度指示
每次中断都有特殊数量的矢量休息。工作功能是终端终端表中的停止怀孕。如前所述,CPU始终实现该过程。 CPU本身不会引起任何中断(除非错误)
操作中的0.4陷阱错误
这个过程可能导致自己停止。这些中断是由CPU定义的错误引起的,例如单独的0,无效的地址,指令和非法规则。
二,UNIX / Linux信号
(1)按“Control + C”键组合移动当前运行的进程。原因如下。 “Ctrl + C”按钮从键盘生成硬件中断。处理删除键盘禁用“控制+ C”组合密钥到SIGINT(2)信号,发送到站的所有操作,并且进程等待键盘数据等待。
(2)用户可以使用NOHUP A.OUT和命令制作后台程序。即使在用户退出后,此过程也会继续运行。 NOHUP使该计划制作全年儿童的外观,但孩子的操作是忽略信号(1)。
(3)可能是几天,用户找到(来自SP -U LTD)撒旦仍然再次运行。用户可以使用Sheikh的订单
杀死PID(或杀死9个PID)
他在这个过程中被杀了。方法如下。杀戮过程在针对PID,死亡请求的过程中发送Sigterm(15)信号。目标过程将继续要求并将呕吐
-
信号排队
每个进程拥有一个信号等待队列。在 task_struct 中有一个 struct sigpending pending 域, 就是进程的信号等待队列。
当向一个进程发送信号时,信号会先被送入进程的信号等待队列,然后等到进程被调度到去处理信号的时候,会从信号 等待队列中依次取出信号进行处理。
标准信号不能排队,而实时信号可以排队:
假设进程屏蔽了一个标准信号,当给它连续发送多个相同 的标准信号,则只有第一个被放入进程的信号等待队列中,后续的都被丢弃。
假设进程屏蔽了一个实时信号,当给它连续发送多个相同的实时信号,则所有 的信号都被放入进程的信号接收队列中。
实时信号是在 POSIX.4 实时信号扩展中定义的。
-
信号屏蔽
进程可以屏蔽它不想接收的信号。
在 task_struct 中有一个 block 域,指定了进程要屏蔽的信号集合。
屏蔽信号 带来的影响:
1、 当向一个进程投递信号时,如果发现进程屏蔽了此信号,则即使此进程处于睡眠状态,也不唤醒它。(否则睡眠的进程会被唤醒)。
2、 当进程开始处理它的信号等待队列的时候,对于被屏蔽的信号,不做处理。所以这些信号会一直待在等待队列中,直到进程解开对相应信号的屏蔽,才能被处 理。(按照以上理解,也就是虽说某些信号被屏蔽,但是这个信号会被保存在pending里,只是在进程从内核返回处理信号时不处理被阻塞(屏蔽)的信号, 直到该信号被解除屏蔽)
但 是 KILL 和 TERM 这两种信号是不能屏蔽的。
-
发送信号的处理过程
用户空间可以通过 kill() 或 sigqueue() 两个系统调用来向一个进程发送信号。
内核空间的入口是 sys_kill():
sys_kill() ==> kill_something_info() ==> kill_proc_info() ==> send_sig_info() ==> deliver_signal() ==> send_signal()
1、 首先,根据 PID 找到对应的目标进程。 这是通过 find_task_by_pid() 实现的。
2、 如果目标进程对信号的处理行为是“忽略”,则无需投递
3、 对于标准信号,如果前面已经有一个相同信号到达,进程还没来得及处理,则不再投递,信号丢失。
4、 否则,信号被挂在进程的信号等待队列中。
5、 如果进程屏蔽了此信号,则不唤醒此进程
6、 否则,如果此进程处于 INTERUPABLE 状态,则唤醒此进程。
signal_wake_up() ==> wake_up_process()
7、 如果进程处于其它状态,则不做处理。