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功能,看那个代码

相关推荐
白鸽梦游指南2 小时前
docker镜像优化
linux·运维·docker
A.A呐2 小时前
【Linux第十九章】网络基础
linux·网络
陳10303 小时前
Linux:基础开发工具
linux·运维·服务器
sg_knight3 小时前
CentOS 裸机实操:5分钟完成 MinIO 单机部署与公网访问
linux·python·centos·文件管理·minio·ftp·oss
dgvri3 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos
Coder个人博客3 小时前
06_apollo_third_party子模块整体软件架构深入分析文档
linux·人工智能·架构
我爱学习好爱好爱3 小时前
Ansible 常用模块详解:cron、archive、unarchive实战
linux·服务器·ansible
十年编程老舅3 小时前
Linux 多线程高并发编程:读写锁的核心原理与底层实现
linux·c++·linux内核·高并发·线程池·多线程·多进程
qq_339191143 小时前
uv 设置系统默认版本, linux设置uv
linux·运维·uv