操作系统中断与信号处理

一、中断机制原理与实践
中断是操作系统实现紧急事件处理和任务调度的关键机制,通过硬件与软件协同工作,确保系统对各类突发情况的及时响应。
1.1 中断分类
中断主要分为硬件中断与软件中断两类。硬件中断由外部硬件设备触发,如键盘、网卡等;软件中断则由程序执行特定指令引发,常见于系统调用场景。
1.2 典型硬件中断流程示例
(1)键盘输入中断处理
1 | /* 按键动作 |
(2)网卡数据接收中断
1 | /* 数据到达检测 |
1.3 软件中断示例(以文件读取系统调用为例)
1 |
|
在上述代码中,read
函数调用触发软件中断,CPU 切换到内核态执行文件读取操作,完成后将数据返回给用户态程序。
二、信号机制原理与应用
信号作为进程间通信的轻量级方式,在操作系统中承担着事件通知与进程控制的重要功能。
2.1 信号的产生与分类
在 Linux 系统中,信号产生来源广泛,主要包括:
- 用户交互信号:如
SIGINT
(Ctrl+C,中断进程)、SIGQUIT
(Ctrl+\,终止进程并生成核心转储)、SIGTSTP
(Ctrl+Z,暂停进程)。 - 异常相关信号:
SIGSEGV
(非法内存访问)、SIGFPE
(算术运算错误)、SIGBUS
(硬件故障相关内存访问)。 - 进程状态信号:
SIGCHLD
(子进程状态改变)、SIGHUP
(终端连接断开)。 - 显式控制信号:
SIGKILL
(强制终止进程,不可捕获)、SIGSTOP
(暂停进程,不可捕获)。
2.2 信号处理机制
(1)默认处理
进程对未自定义处理的信号采用系统默认行为,例如SIGINT
默认终止进程,SIGCHLD
默认忽略。
(2)信号忽略
1 |
|
上述代码通过signal
函数将SIGINT
信号设置为忽略状态,此时按下 Ctrl+C 无法终止程序。
(3)自定义信号处理
1 |
|
此代码为SIGINT
信号绑定自定义处理函数,当接收到该信号时,执行signal_handler
函数。
2.3 信号递送与管理
信号在 Linux 系统中的完整处理流程包括:
- 信号生成:由事件触发,内核创建对应信号。
- 信号传递:内核修改目标进程
task_struct
中信号相关字段,将信号加入待处理队列。 - 信号排队:区分可排队信号(如
SIGRTMIN
-SIGRTMAX
)与不可排队信号,处理重复信号覆盖或丢弃情况。 - 信号阻塞与解除:进程通过信号掩码控制信号处理时机,被阻塞信号暂不执行。
- 信号处理:进程从内核态返回用户态时,检查并执行未阻塞的待处理信号。
三、中断与信号的协同关系
中断与信号在操作系统中既相互独立又紧密协作。中断侧重于 CPU 对硬件事件的即时响应,实现任务切换与资源调度;信号则专注于进程间异步事件通知与控制。以键盘输入为例,硬件中断完成底层数据采集,信号机制将用户输入事件传递给目标进程进行高层处理,二者共同保障系统的高效运行与用户交互体验。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.