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

系列文章:
操作系统详解(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.mfbz.cn/a/319748.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ES搜索的安装以及常用的增删改查操作(已经写好json文件,可以直接使用)

1.es的下载 https://www.elastic.co/cn/downloads/past-releases 2.elasticsearch安装及配置,遇到9200访问不了以及中文乱码,能访问了却要账户密码等问题 Elasticsearch启动后访问9200失败_http://localhost:9200无返回值-CSDN博客 3.开启es服务&#x…

Qat++,轻量级开源C++ Web框架

目录 一.简介 二.编译Oat 1.环境 2.编译/安装 三.试用 1.创建一个 CMake 项目 2.自定义客户端请求响应 3.将请求Router到服务器 4.用浏览器验证 一.简介 Oat是一个面向C的现代Web框架 官网地址:https://oatpp.io github地址:https://github.co…

Error: L6218E: Undefined symbol 系列错误汇总 (referred from main.o)

传送门 错误1: Undefined symbol(referred from main.o)错误2:Undefined_symbol _use_two_region memory 错误1: Undefined symbol(referred from main.o) Cube_GPIO\Cube_GPIO.axf: Error: L6218E: Undefined symbol LED_GPIO_Init (referr…

15个为你的品牌增加曝光的维基百科推广方法-华媒舍

维基百科是全球最大的免费在线百科全书,拥有庞大的用户群体和高质量的内容。在如今竞争激烈的市场中,利用维基百科推广品牌和增加曝光度已成为许多企业的重要策略。本文将介绍15种方法,帮助你有效地利用维基百科推广品牌,提升曝光…

GPT编程:运行第一个聊天程序

环境搭建 很多机器学习框架和类库都是使用Python编写的,OpenAI提供的很多例子也是Python编写的,所以为了方便学习,我们这个教程也使用Python。 Python环境搭建 Python环境搭建有很多种方法,我们这里需要使用 Python 3.10 的环境…

浅谈对Mybatis的理解

一、Mybatis的概述 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,由谷歌托管,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是支持普通SQL查询,存储过程和高级映射的优…

ssm基于Web的课堂管理系统设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

数据库(1)

目录 1.什么是数据库 1.1.数据 1.2.数据库 1.3 常见数据库 1.3.1 关系型数据库 1.3.2 非关系型数据库 2.mysql概述 ​编辑 **3.MySQL本地仓库安装 在Linux端操作 4.MySQL网络安装 **方法一:RPM捆绑包 下载安装RPM捆绑包: 在windows端操作&a…

开箱即用的企业级前后端分离【.NET Core6.0 Api + Vue 2.x + RBAC】权限框架-Blog.Core

前言 今天要给大家推荐一个开箱即用的企业级前后端分离【.NET Core6.0 Api Vue 2.x RBAC】权限框架(提高生产效率,快速开发就选它):Blog.Core。 推荐原因 Blog.Core通过详细的文章和视频讲解,将知识点各个击破&…

element表格数据,表头上(下)角标,html字符串渲染

1. 问题描述 在动态渲染的element表格中&#xff0c;表头和表中数据是一个含有html的字符串&#xff0c;需要渲染 2. 效果 3. 代码 const columns ref([{ text: 差值<sub>-3</sub> / 10<sup>-6</sup>℃<sup>-1</sup>, value: aallowEr…

三菱FX系列PLC定长切割控制(线缆裁切)

三菱PLC绝对定位指令DDRVA实现往复运动控制详细介绍请查看下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍线缆行业的定长切割控制相关算法。 未完待…

Xmind 网页端登录及多端同步

好久没用 Xmind 了&#xff0c;前几天登录网页端突然发现没办法登录了&#xff0c;总是跳转到 Xmind AI 页面。本以为他们不再支持网页端了&#xff0c;后来看提示才知道只是迁移到了新的网址&#xff0c;由原来的 xmind.works 现在改成了的 xmind.ai。又花费好长时间才重新登录…

Vue3 移动端自适应方案postcss-px-to-viewport

我的环境 依赖名版本pnpm8.14.0Node16.20.1Vue3.3Vite5.0.8 一、安装 pnpm install postcss-px-to-viewport1.1.1 --save-dev 二、配置 vite.config.ts import postcsspxtoviewport from postcss-px-to-viewportexport default defineConfig({css: {postcss: {plugins: [p…

【HarmonyOS】网络数据请求连接与数据持久化操作

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

QT获取程序编译时间与当前时间的区别及应用场景

一.获取编译时间与当前时间的区别 1.编译日期时间&#xff1a;这个信息通常用于标识某个源代码文件或整个应用程序的编译时间&#xff0c;程序一旦编译出来不会再改变&#xff0c;通常用于记录或跟踪代码的版本和更改历史。 2.运行当前日期时间&#xff1a;这是指程序在运行时…

ssm基于web的电影购票系统+vue论文

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

NI PXIe-6386国产替代,8路AI(16位,14 MS/s/ch),2路A​O,24路DIO,PXI多功能I/O模块

PXIe-6386 PXIe&#xff0c;8路AI&#xff08;16位&#xff0c;14 MS/s/ch&#xff09;&#xff0c;2路A​O&#xff0c;24路DIO&#xff0c;PXI多功能I/O模块 PXIe-6386是一款同步采样的多功能DAQ设备。该模块提供了模拟 I/O、数字I/O、四个32位计数器和模拟和数字触发。板载N…

【Linux】 系统目录结构

进入到根目录 cd /ls目录名具体作用/存放系统系统相关的目录文件/boot放置linux系统内核文件和启动时用到的一些引导文件/home包含linux系统上各用户的主目录&#xff0c;子目录名称默认以该用户名命名/root系统管理员root的家目录/bin包含常用的命令文件&#xff08;如ls 等&a…

JVM内存区域详解,一文弄懂JVM内存【内存分布、回收算法、垃圾回收器】

视频讲解地址 学习文档 一、内存区域 区域描述线程私有如何溢出程序计数器为了线程切换后能恢复到正确的执行位置&#xff0c;每个线程都要有一个独立的程序计数器。✅唯一一个不会内存溢出的地方虚拟机栈1. 每个方法执行的时候&#xff0c;Java虚拟机都会同步创建一个栈帧用于…

基于springboot+vue2的课程教学考试系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…
最新文章