学习笔记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、    如果进程处于其它状态,则不做处理。

posted @ 2021-11-14 21:07  zzy188  阅读(6)  评论(0编辑  收藏  举报