目录
[2.1 通过终端按键产生信号](#2.1 通过终端按键产生信号)
[2.2 调用系统函数向进程发信号](#2.2 调用系统函数向进程发信号)
[2.3 硬件异常产生信号](#2.3 硬件异常产生信号)
[4.1 内核态和用户态](#4.1 内核态和用户态)
1.什么是信号
1.1信号的概念
信号是进程之间事件异步通知的一种方式,属于软中断。
1.2操作系统有哪些信号
可以通过kill -l命名查看
2.信号是如何产生的 (部分产生方式)
2.1 通过终端按键产生信号
例如使用ctrl+c 或 ctrl+z 来关闭进程。
2.2 调用系统函数向进程发信号
可以通过 man 2 kill 来查看具体用法。
2.3 硬件异常产生信号
当我们代码出现除零错误 或访问一些非法地址时为什么程序会崩溃呢?
实际上是操作系统给我们的进程发送了对应的信号。
core和term的区别
core类型的信号通常指的是那些能够导致进程终止并生成core文件的信号。
当进程接收到这类信号时,它会立即终止执行,并可能生成一个core文件,该文件包含了进程终止时的内存映像和其他相关信息,可用于后续的调试和分析。
常见的core类型信号包括SIGSEGV(无效内存引用)、SIGBUS(总线错误)等。
云服务器默认core file size 为0表示没有开启core dump功能。
可以通过 ulimit -c + corefilesize来开启core dump例如 ulimit -c 10240
调试方法:
bash
//gdb 调试
//输入 core-file your_corefile_name(ubuntu系统一般就叫core)
//然后就可以自动定位到程序崩溃的位置了
term类型的信号通常指的是那些用于请求进程正常终止的信号。
当进程接收到这类信号时,它会根据预设的信号处理函数或默认动作来执行相应的操作,以完成进程的终止过程。
常见的term类型信号包括SIGTERM(请求终止进程)、SIGINT(中断进程,通常由用户按下Ctrl+C产生)等。
3.信号的产生
实际执行信号的处理动作称为信号递达(Delivery)
信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞 (Block )某个信号。
被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.
注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。
3.1信号在内核中的表示
在task_struct(PCB)中有block,pending,handler字段前两个是位图最后一个是函数指针数组。 内核中做了封装不太看得出来。如下图。
pending表用于记录已经产生但尚未被递达的信号。这些信号可能是因为被阻塞而处于等待状态,或者是因为进程正在执行其他任务而无法立即处理。
block表用于记录进程希望阻塞(即忽略或延迟处理)的信号。
handler 表示执行什么信号动作,例如忽略,默认,自定义。
所以操作系统结合两张表就可以知道要执行那些信号动作,根据handler就可以知道该怎么执行信号动作。
引发问题:那么操作系统什么时候处理未决的信号呢?
4.信号的捕捉
如图大部分情况我们程序执行都是在用户态的,当因为中断,异常,系统调用是会进入内核态。当从内核态重新切换回用户态时,操作系统会先处理这些未决的信号。
4.1 内核态和用户态
一、内核态
定义与特点:
内核态是操作系统内核所运行的模式,也称为核心态、管态或特权态。
运行在该模式的代码可以无限制地对系统存储、外部设备进行访问。
内核态代码运行在处理器特权级别最高(通常是0级)的模式下,可以执行指令集中的任何指令,并且可以访问系统中的任何存储位置。
功能与作用:
内核态代码负责执行操作系统的核心功能,如内存管理、进程调度、设备驱动等。
它能够处理系统调用、中断和异常,确保系统的稳定运行。
二、用户态
定义与特点:
用户态是用户程序运行的模式,也称为目态或非特权态。
运行在用户态的程序不能直接访问操作系统的数据和程序,也不能执行特权指令,如停止处理器、改变模式位或发起I/O操作。
用户态程序只能访问操作系统分配给它的资源,受到操作系统的严格控制。
限制与安全:
用户态程序的执行受到处理器的诸多检查,以防止恶意程序或错误程序损害系统。
用户态程序试图执行特权操作会导致操作系统中断其执行,并通过系统调用请求内核的帮助。
三、内核态与用户态之间的切换
系统调用:
用户态程序通过系统调用申请使用操作系统提供的服务程序完成工作。
系统调用触发中断,CPU切换到内核态执行相应的内核代码。
内核处理完请求后,将结果返回给用户态程序,并恢复用户态程序的上下文信息。
中断:
中断是由硬件设备或软件异常触发的,导致CPU切换到内核态处理中断事件。
中断处理完成后,CPU恢复中断发生之前的用户态程序的上下文,并继续执行。
异常:
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常(如除零错误、内存访问违规等),会触发由当前运行进程切换到处理此异常的内核相关程序中,从而转到内核态。