35.信号

lesson 27

不涉及io数很大。差了一万倍

看代码,啊

function是包装器,定义func_t是个返回值是void参数是()的方法

操作系统一开机就处于死循环,在别人催促之下,发送信号让操作系统执行注册的方法,

一个tast struct结构体包括一些进程的信息count是时间片,未来可以变成链表,在数组中,就是全局的所有进程,创建一个进程时,就进入这个数组,,假设这个数组有很多进程,调度时候遍历进程,找时间片最少的的那个,用它调度,这种思想就是操作系统运行原理,


如何 理解闹钟

外部以固定时间间隔刺激,我只需固定一个计数器 最开始设置一个timestamp为0,每刺激一下,这个数++,某个时刻,这个数是10000,说明执行了一万次,系统到开机到现在就是一万秒了。

还可以给进程定义整数10,调度一个进程count--,如果《=0就切换其他进程。就是时间片耗尽,本质就是个计数器,

用小堆实现,OS只检测堆顶的超时时间,与当前时间对比,比当前时间当,证明没有闹钟触发,,大于就出堆,执行该节点内函数指针的方法,向目标进程发送sigalrm,操作系统就可以一个时间间隔之后向进程发信号的工功能了,

闹钟超时向OS发送信号方式,属于软件条件,闹钟是用软件设计的,超时是软件条件。管道也是,都是操作系统内维护的


信号的保存:

进程当中不止只有位图,还有三张表,pending表最后一个位置不用,对应的是信号未决表,

按位取反然后与就可以获得可以抵达的信号,

第三个表是函数地址。

信号处理时,即便当前没有收到1号,我也知道他的动作,sig_defl叫做默认,收到了1号但是1号被block,暂时没被抵达,但是未来要被抵达,动作叫ignore叫做忽略,当前并没有收到3号信号,虽然三号信号被block了但是我还没收到,解除屏蔽我们要执行sigal header ,sigal信号本质是修改sigal表。

看testsig忽略的代码忽略一次下次停止

看表1号信号没有被bllock pending 处理动作是默认,2号横着看收到了信号因为pending 是1,block是1 所以没办法抵达,横着看3,没收到,依旧保证阻塞,就算收到也不会抵达,,这张表对应31组描述信号的关系。

block和pending没有关系,

三张表两个位图加个数组。内核还比较复杂我们就这么理解


验证:

谁调sigprocmask我们就获取设置更新 谁的block表,sig setmask用set这个信号集初始化block

sig_block是把传进来的信号集里设置为1的信号新增到block里,新增屏蔽。unclock,就是解除屏蔽,谁1谁解除。oldset是输出型参数,带老的block

sigpending 函数 获取pending信号集的,参数是输出型参数,怎么设置我们已经学了。


看整合demo:

如果信号没有被 block(阻塞),当对应的信号处理函数(handler)执行完成后,内核会将该信号的 pending 位清 0。看全部代码,屏蔽二号信号,可以看到二号,而且不会退

core 出错一次dump一次,一般公司挂一次dump一次,磁盘就满了。

打开core 看代码 关闭,core功能,看那个代码

相关推荐
AlfredZhao14 小时前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3102 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
A小辣椒4 天前
TShark:Wireshark CLI 功能
linux
A小辣椒4 天前
TShark:基础知识
linux
AlfredZhao4 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao5 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334665 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪5 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql