操作系统详解(5.1)——信号(Signal)的相关题目

news2025/4/21 11:14:48

系列文章:
操作系统详解(1)——操作系统的作用
操作系统详解(2)——异常处理(Exception)
操作系统详解(3)——进程、并发和并行
操作系统详解(4)——进程控制(fork, waitpid, sleep, execve)
操作系统详解(5)——信号(Signal)

文章目录

  • 题目
  • 第一问
  • 第二问
  • 第三问

题目

屏幕截图 2024-01-14 131145.png
屏幕截图 2024-01-14 131332.png

第一问

要解决第一问,我们首先分析一下程序的流程。
第22行到第28行:sigfillset把当前进程的所有信号赋给mask_all, 然后用sigprocmask把所有的信号都Block,并把原来的状态存在prev_one中
然后Signal函数把信号和handler绑定。

第29行到第34行fork() 创建了一个子进程。若在子进程中,则先调用两次alarm.
32行将信号unblock,也就是在32行以后子进程才会收到信号。
于是30行与31行必定会先执行。由于之前从未设置过alarm, 所以30行alarm返回0.
虽然现实中一般两行间是紧接着执行的,或者操作系统中断执行后在非常短的时间后就会将控制流回到下一行。但是这里题目是理想状态下,即操作系统在任意时刻都可能把当前进程阻塞,并且在任意时长以后再恢复。所以31行的alarm可能返回0,1,2. 即30执行完后可能被阻塞了0, 1, 2秒甚至更长的时间。
33行子进程暂时休眠。等被信号唤起后exit退出。

36行到41行:父进程的内容。在39行前,父进程的信号全部被BLOCKED. 38行向子进程发送了SIGALRM信号。最后是一个while循环,等待子进程返回。

handler里的内容
可以知道,handler想要执行,必定在子进程执行32行之后。初次执行从第8行开始。第9行再次调用alarm. 但是由于handler会block自身的信号,所以只是设置pending bit, 不会再次执行Handler.
这里的alarm会返回什么呢?由于前一次alarm是3秒,所以这里的返回值可能是0,1,2,3. 之所以会有这些区别,是因为handler并不一定是被alarm(3)触发。前一次的alarm(2)和alarm(3)间可能有两秒以上的间隔使得alarm(2)结束后向子进程发送SIGALRM信号。并且,父进程中的kill也可以触发handler

11行接着向父进程发送SIGUSR1信号,对应的handler在第18行。那么18行一定会执行吗?答案是对的。即使父进程设置了block, 但是第39行unblock信号后还是会check pending bit,这时候就会执行handler_usr1.

回到子进程。第12行子进程休眠5秒,当然随时有可能被Exception打断(比如说其它信号,或者收到了一个网络包什么的)。第13行向子进程自己发送了SIGUSR2. 执行完第13行进程会立刻执行handler_usr2. 一般情况下,信号的生效时间是不确定的。但在此例中,由于kill是一个系统调用,而系统在从内核态返回用户态时会check pendning bit. 由于发现SIGUSR2还没有被接收,所以会执行handler_usr2.

执行完了handler,子进程回到原来的控制流位置。这里很有意思的是,第33行的 pause() 函数有可能不会返回,也就是说子进程可能会永久休眠。这是因为,很可能在39行UNBLOCK信号以后,handler就处理了所有进程的SIGALRM信号,pause 以后没有再接收信号,故不会返回。这种情况下第20行的handler_chld就不执行。所以第20行是可能执行的。

而第5&6行是不可能被执行到的。前面说过,handler不会被同种信号再次打断,所以一旦执行过一次handler, pre_alarm和post_alarm都会置1,所以不存在post_alarm为0而pre_alrm为1的情况。

所以第一问的答案是:

LineVisibilityPossible return values of alarm()
5&6F----
9&10T0/1/2/3
15T------
18T------
19T------
20M------
30T0
31T0/1/2
36T------

第二问

程序的详细逻辑已经在上面分析过了,第二问就是把过程以流程图呈现。主要是弄清楚哪些行是某一行的必要条件,比方说只有unblock信号后才可能执行handler

  • 30在31前
  • 31在9&10前
  • 9&10在15前
  • 15在19前
  • 19在20前
  • 36在20前
  • 36在18前
  • 9&10在18前

时序图:
image.png

第三问

由代码可知,第30,31,38,9行都可能会向子进程发送信号, 故最多发送4个信号。
但是最多只会收到3个信号,原因如下:
如果31行的alarm取消了30行的alarm,那么30行的信号就不会发出。
即使30行的alarm没有被取消,第31行和第9行的信号最多只会收到一个:
如果31行的alarm()结束了以后才解除block,那么31发送信号的pending bit就会被原来30发送的信号覆盖(因为pending signal is not queued)
而如果进入handler后31行的alarm尚未结束,那么在运行第9行时,要么取消了31行的alarm,要么第9行发送的信号被31行发送的pending signal覆盖
所以第31行和第9行的信号最多只会收到一个。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1383117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python24.1.14while循环

当条件结束时间未知时,while循环比for循环更合适 实践

Debian(Linux)局域网共享文件-NFS

NFS (Network File system) 是一种客户端-服务器文件系统协议,允许多个系统或用户访问相同的共享文件夹或文件。最新版本是 NFS-V4,共享文件就像存储在本地一样。它提供了中央管理,可以使用防火墙和 Kerberos 身份验证进行保护。 本文将指导…

docker-compose部署kafka、SASL模式(密码校验模式)

一.基础kafka部署 zookeeper,kafka,kafka-ui docker-compose.yml 注意点:192.168.1.20 是宿主机的ip version: "3" services:zookeeper:image: wurstmeister/zookeepercontainer_name: zookeeperrestart: alwaysports:- 2181:2…

未来的失业将是常态吗?

2024年,科技巨头谷歌、亚马逊都在本周宣布大规模裁员,影响到众多部门。此外,社交平台 Discord 表示将裁员 17%,游戏服务商 Unity Software 宣布将裁员 25%,语言学习应用程序 Duolingo 则称解雇了 10% 的正式职工&#…

使用 rosdep 管理依赖关系

什么是rosdep? rosdep是 ROS 的依赖管理实用程序,可以与 ROS 包和外部库一起使用。 是一个命令行实用工具,用于标识和安装依赖项以生成或安装包。 在以下情况下,可以调用或调用它:rosdep 构建工作区并需要适当的依赖项…

关于CodeReview的一些实践和思考

在日常开发中,Code Review 的重要性日益凸显。它不仅有助于提升代码质量,还促进了团队成员之间的知识共享和技能提升。本文将主要聚焦于 Code Review,分享在这个过程中的一些心得和思考。 CodeReview常用到的一些术语 之前看到公司的大佬经…

ssm基于Java的众惠商城的设计与实现论文

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统用户购物信息管理难度大,容错率低&#xff0c…

Python基础知识:整理14 利用pyecharts生成地图

1 地图可视化的基本使用 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts # 准备地图对象 map Map()# 准备数据 data [("北京市", 8), ("上海市", 99), ("广州省", 199), ("重庆市", 400), ("…

【Python学习】Python学习18- 方法OS 文件/目录方法

目录 【Python学习】Python学习17- File方法 前言os.access()语法: os.chdir(path)语法 os.chflags(path, flags)语法 os.chmod(path, mode)os.chown(path, uid, gid)os.chroot(path)os.close(fd)os.unlink(path)os.popen(command[, mode[, bufsize]])os.read(fd, …

【数据开发】大型离线数仓OLAP数据开发指南(目录)

文章目录 1、什么离线数仓OLAP2、OLAP数仓建设3、OLAP数仓开发指南 1、什么离线数仓OLAP 离线数仓OLAP(Online Analytical Processing)是一种数据分析技术,它通过对离线数据仓库中的数据进行分析,为企业提供决策支持的数据分析服…

瑞_Java开发手册_(五)MySQL数据库

文章目录 (一) 建表规约(二) 索引规约(三) SQL 语句(四) ORM 映射附:雪花算法(Java) 🙊前言:本文章为瑞_系列专栏之《Java开发手册》的MySQL数据库篇,主要介绍建表规约、索引规约、SQL语句、ORM映射。由于博…

Http协议简述

目录 HTTP-概述 2.1.1 介绍 2.2.2 特点 2.2 HTTP-请求协议 2.3 HTTP-响应协议 2.3.1 格式介绍 2.3.2 响应状态码 HTTP-概述 2.1.1 介绍 HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。 http是互联…

牛刀小试---二分查找(C语言)

题目&#xff1a;在给定的升序数组中查找指定的数字n&#xff0c;并输出其下标 代码举例&#xff1a; #include <stdio.h> int main() {int arr[] { 1,2,3,4,5,6,7,8,9,10 };//给定的升序数组int left 0;//定义左下标int right sizeof(arr) / sizeof(arr[0]) - 1;//…

.NET开源免费、企业级、可商用内容管理系统 - SSCMS

前言 今天给大家推荐一款基于.NET Core开源、企业级、可商用、能够以最低的成本、最少的人力投入在最短的时间内架设一个功能齐全、性能优异、规模庞大并易于维护的内容管理系统&#xff1a;SSCMS。 系统官方介绍 SSCMS 内容管理系统基于微软 .NET Core 平台开发&#xff0c…

YOLOv5源码中的参数超详细解析(7)— yolo.py

前言:Hello大家好,我是小哥谈。YOLOv5是一种先进的目标检测算法,它可以实现快速和准确的目标检测。yolo.py是YOLOv5项目中的一个Python文件,用于实现目标检测算法。该文件包含了YOLOv5模型的定义、训练和推理过程。本节课就结合源码对yolo.py文件进行逐行解析~!🌈 前期…

【Linux】线程池实现

&#x1f4d7;线程池实现&#xff08;单例模式&#xff09; 1️⃣线程池概念2️⃣线程池代码样例3️⃣部分问题与细节&#x1f538;类成员函数参数列表中隐含的this指针&#x1f538;单例模式&#x1f538;一个失误导致的bug 4️⃣调用线程池完成任务 1️⃣线程池概念 线程池是…

树莓派ubuntu22桌面配置(一)

烧录系统至树莓派 下载系统&#xff1a;https://ubuntu.com/download/raspberry-pi 选择合适的版本下载 镜像安装器安装&#xff1a;终端输入&#xff1a; sudo snap install rpi-imager 打开镜像安装器&#xff0c;按照需求选择树莓派版本与要写入的系统还有安装的u盘 方案…

阿里状态机引擎实现

状态机的技术选型看这篇就够了&#xff0c;最后一个直叫好&#xff01; - 掘金 实现一个状态机引擎&#xff0c;教你看清DSL的本质_cola状态机-CSDN博客 一、引入jar包 <!--阿里状态机jar--> <dependency><groupId>com.alibaba.cola</groupId><a…

blender 导入到 Marvelous Designer

1&#xff09; 将模型的所有部分合并为一个单独的mesh 2&#xff09; 先调整计量单位&#xff1a; 3&#xff09;等比缩放&#xff0c;身高调整到180cm左右 4&#xff09;应用当前scale 首先&#xff0c;选中你要修改的物体&#xff0c;然后按下Ctrl-A键&#xff0c;打开应用…

大数据仓库开发规范示例

大数据仓库开发规范示例 一、前提概要二、数仓分层原则及定义2.1 数仓分层原则2.2 数仓分层定义 三、数仓公共开发规范3.1 分层调用规范3.2 数据类型规范3.3 数据冗余规范3.4 NULL字段处理规范3.5 公共字段规范3.6 数据表处理规范3.7 事实表划分规范 四、数仓各层开发规范4.1 分…