信号2.0,深入信号三张表block pending handlers,core文件的使用,信号执行逻辑:CPU虚拟内存物理内存,时钟源,软中断。

@bit::Shadow
✧(≖ ◡ ≖✿

目录

信号表管理函数

管理基于下图

block表

sigprocmask()

pending表

sigpending()

简析信号频繁发送

内存转储文件的gdb使用

[core dump 内存转储文件](#core dump 内存转储文件)

[ulimit -a指令查询](#ulimit -a指令查询)

core的临时修改与使用

信号执行

图解---系统调用下内核的执行逻辑

内核态与用户态

计算机组成原理---硬件中断

☆☆中断控制器

CPU的针脚

硬件中断的信息转换

外设与CPU的链接原理

[回顾冯 • 诺依曼体系结构](#回顾冯 • 诺依曼体系结构)

CPU与OS的链路处理

硬件中断总图

时钟源

[在进程信号传递中断的作用: 承接上篇文章🔗🔗🔗](#在进程信号传递中断的作用: 承接上篇文章🔗🔗🔗)

计时准则举例:

软中断

系统调用表

CPU怎么区分的内核态和用户态?

操作系统总结

可重入函数与不可重入函数

使用场景:


信号表管理函数

管理基于下图

通过设定表内位值来达到"阻塞" / "未决"的目的。

block表

sigprocmask()

功能:++设定block区值++。

cpp 复制代码
int sigprocmask(int how, const sigset_t* set, sigset_t* oldset);

how :

|-------------|----------------|
| SIGBLOCK | 希望添加的位 |
| SIG_UNBLOCK | 希望删除的位 |
| SIG_SETMASK | 按需直接设定(覆盖) |

set:设置值。

oldset 输出型参数:旧值拷贝。

返回值:-1表示失败。

pending表

sigpending()

功能:++获取pengding表++。

cpp 复制代码
int sigpending(sigset_t* set);

简析信号频繁发送

当信号量过多 / 处理复杂情况,需要足够长时间时处理,仍然频繁发送的处理原则:

处理信号时接收到同种信号:

1.普通信号:直接丢失,(这是因为阻塞队列深度限制 为1)。

2.实时信号(34-64):++纳入阻塞队列,暂时挂起。++

内存转储文件的gdb使用

core dump 内存转储文件

core dump文件记录进程崩溃时的内存,寄存器,堆栈状态等。

单词 原意 在计算机中的含义
Core 磁芯(早期计算机内存) 引申为"内存"
Dump 倾倒、转储 将内存内容保存到文件
  • 若进程使用了巨大内存(如100GB),core dump 同样接近100GB。 // 由于需要记录详细信息使用占用极大内存。

core终止的解释:在异常时终止,并产生core文件。供以debug(不过云服务器下常常禁止产生,因为频繁的重启消耗大------可通过指令开启)。

The default action of certain signals is to cause a process to terminate and produce a

core dump file, a file containing an image of the process's memory at the time of termi‐

nation. This image can be used in a debugger (e.g., gdb(1)) to inspect the state of the

program at the time that it terminated.

term终止:异常直接终止,不会产生core文件。

ulimit -a指令查询

功能:一个内置命令,表示当前Shell环境进程 及其启动拥有的各种资源限制

bash 复制代码
w@instance-qhw6x01g:~/e2026/June/6-13$ ulimit -a
real-time non-blocking time  (microseconds, -R) unlimited 
core file size              (blocks, -c) 0 #可见此处的最大限制为0,那么就无法形成文件
data seg size               (kbytes, -d) unlimited

core的临时修改与使用

cpp 复制代码
# 修改 core dump 大小(单位:blocks,通常 1 block = 512 字节或 1024 字节)
ulimit -c 1024         # 限制为 1024 blocks(约 512KB/1MB)
ulimit -c unlimited    # 不限制大小

除零错误演示:

设置大小

运行--出错产生文件

gdb调试(cgdb会出错),调试直接定位错误段

当core文件大小超出限制则不会生成。

信号执行

图解---系统调用下内核的执行逻辑

内核态与用户态

计算机组成原理---硬件中断

寄存器不仅存储在CPU中,在硬件(外设)中也有,像:磁盘。

☆☆中断控制器

外部设备(硬件)链接CPU是间接联系并非直接联系,其**间接链接设备称为"中断控制器"**一种常见的设备是"8259"电路板:

CPU的针脚

位于CPU背面,作为通信链接。

硬件中断的信息转换
外设与CPU的链接原理

中断控制器的线路链接外部设备和CPU的针脚等通信通道,中断控制器通过传递中断号在外设和CPU之间交互。

当外设作用(准备好、发送信号),通过(线路等)链接中断控制器,中++断控制器操纵寄存器被给予"中断号",后通过针脚通知CPU,CPU通过中断号 获知外设类型++,从而实现了从硬件到软件信息的转换。

回顾冯 • 诺依曼体系结构

存储器与CPU进行交互,信息交流。

CPU与OS的链路处理

外设与CPU通信完成后CPU无法处理数据只能获悉信息。

CPU维护中断例程信息再与**存储器(内存)**间沟通。

内存根据CPU提供的中断号索引操作系统注册的方法(像:函数指针方法处理键盘、网卡、处理显示器等),这些函数指针自然被统一封装,内核中称为IDT(Iterrupt Description Table 中断向量表 )。

硬件中断总图

从外设到操作系统的通信


时钟源

  1. 时钟源是一个计时器,它集成在CPU内
  2. 时钟源内部使用高频信号和引用计数产生了进程时间片的概念。
  3. 时钟源控制进程轮转,其频率在100--1000Hz范围内与系统处理进程的终止及调度工作相关,所以称之为系统的脉搏。

在进程信号传递中断的作用: 承接上篇文章🔗🔗🔗

其集成于CPU内当中断信号发送到CPU内后,对时间片检查决定是否传递信号到中断向量表......。

正常情况下(大部分)操作系统是暂停的(pause()),当进程出现异常。OS首先进行重试,若多次重试无果(造成了)时间片耗尽,发送中断信号终止进程。

计时准则举例:

int count = 10;

CPU的多次请求(基于标准频率如:100Hz),请求前检查count是否大于0,每次请求后count--。

对应的count == 0 count > 0 都分别执行对应的进程调度。

*拓展:时钟源还与计算机的主频相关。

软中断

软中断指软件造成的中断导致执行流陷入内核。

虚拟内存表中,从低地址到高地址大约【0,3】GB为用户区【3,4】GB为内核区。

系统调用表

进程间所有的系统调用,调用同一张页表项(内核区页表) ,页表映射在物理内存中的操作系统区域。对于中断信号有物理内存相应区域维护的 **fs_ptr sys_call_table0**函数指针数组。

cpp 复制代码
// 系统调用函数列举(以 x86_64 为例):
fs_ptr sys_call_table[0] = {
    sys_setup,   sys_exit,   sys_fork,        sys_read,   sys_write,
    sys_open,    sys_close,  sys_waitpid,     sys_creat,  sys_link,
    sys_unlink,  sys_execve, sys_chdir,       sys_time,   sys_mknod,
    sys_chmod,   sys_chown,  sys_break,       sys_stat,   sys_lseek,
    sys_getpid,  sys_mount,  sys_umount,      sys_setuid, sys_getuid,
    sys_stime,   sys_ptrace, sys_alarm,       sys_fstat,  sys_pause,
    sys_utime,   sys_stty,   sys_gtty,        sys_access, sys_nice,
    sys_ftime,   sys_sync,   sys_kill,        sys_rename, sys_mkdir,
    sys_rmdir,   sys_dup,    sys_pipe,        sys_times,  sys_prof,
    sys_brk,     sys_setgid, sys_getgid,      sys_signal, sys_geteuid,
    sys_getegid, sys_acct,   sys_phys,        sys_lock,   sys_ioctl,
    sys_fcntl,   sys_mpx,    sys_setpgid,     sys_ulimit, sys_uname,
    sys_umask,   sys_chroot, sys_ustat,       sys_dup2,   sys_getppid,
    sys_getpgrp, sys_setsid, sys_sigaction...
};

CPU怎么区分的内核态和用户态?

CPU怎么保证内核代码的安全?

CPU内拥有权限标志寄存器cs值为0表示内核态,值为3( 1 1 )表示用户态。在用户态与内核态切换的历程中会发生值的改变。

操作系统总结

总结:操作系统就是躺在中断向量表(IDT)和中断信号池中的软件集合
CPU内的软中断,如syscall等使得程序陷入(陷入前保存下一条指令的地址)内核的的调用
称为"陷阱"。

可重入函数与不可重入函数

可重入函数指:一个函数可以同时被多个执行流(如信号调用函数、多线程)同时安全地调用

这样就涉及到了++数据同步++的问题。

使用场景:

你的主程序正在调用func()此时一个信号发过来,导致执行流立即陷入内核,而信号处理函数同样也调用了该函数func()。

多线程:多个线程同时调用该函数。

不可重入函数:通常具有外部属性的改变(如全局变量、内存申请、标准I/O函数像printf scanf"这些函数内部有缓冲区且可能调用malloc")。

感谢支持,持续更新

欢迎关注

相关推荐
jieyucx1 小时前
Go MongoDB 实战完全指南|从连接、CRUD、BSON结构体映射到高并发避坑全解
开发语言·mongodb·golang
深圳市晶科鑫实业有限公司1 小时前
AI服务器为何对低抖动差分晶振如此挑剔?
服务器·人工智能·单片机·物联网·车载系统·云计算·信息与通信
爱和冰阔落1 小时前
【MCP实战】从0写一个本地工具服务器:文件搜索、SQLite查询与安全边界
服务器·安全·sqlite
日取其半万世不竭1 小时前
Project Zomboid 服务器进不去?端口、MOD 和日志排查清单
运维·服务器
极创信息1 小时前
信创产品适配测试认证,域名和SSL是必须的吗?
java·开发语言·网络·python·网络协议·ruby·ssl
嵌入式修炼师1 小时前
搭建linux nfs服务远程调试环境
linux
humcomm1 小时前
Go语言在AI领域的最新进展(2026年上半年)
开发语言·人工智能·golang
不吃土豆的马铃薯1 小时前
高并发服务器数据库连接池设计详解
服务器·网络·数据库·c++·mysql
码云骑士1 小时前
11-GIL不是性能杀手(上)-CPU密集vsIO密集的实测对比
开发语言·python