【Linux】volatile | SIGCHLD | 多线程概念

文章目录

  • 1. volatile
    • 编译器优化
  • 2.SIGCHLD信号
    • 验证SIGCHLD的存在
  • 3. 多线程
    • 多线程概念
    • 理解概念
      • 什么是多线程
      • 调度成本低
        • 局部性原理
      • 什么叫做进程

1. volatile

在vscode中,创建signal.c文件

故意在while中没有写代码块,让编译器认为在main中,quit只会被检测


运行可执行程序后,当输入 2号信号时,调用自定义方法将quit置为1,跳出while循环


编译器优化

编译器有对应的编译优化级别 -O1 -O2 -O3

在makefile中,添加-O2的优化级别


再次执行可执行程序时,输入2号信号,只调用了对应的自定义方法,说明进入main中的while循环 无法停止


在这里插入图片描述

全局变量被加载到内存中
while循环判断实际上是一种计算,会在CPU去执行的
进行计算时,将内存中的数据load到CPU中的寄存器上,然后才对quit进行真假判断
内存中有当前进程的代码和数据,CPU中有对应的PC指针去指向
若while循环条件满足,pc指针继续指向while循环的代码


在这里插入图片描述

若while循环条件不满足,则pc指针会向下移动,指向下一条语句,并向后执行


正常来说,每次都要尝试数据从内存load到CPU的过程
在main函数中 quit是没有被修改的,只是被检测,编译器发现quit变量没有被修改,就不会重复把数据从内存load到CPU中
因此编译器会优化,只需第一次把数据从内存load到CPU中,后续只需要检测寄存器中的数据即可

在这里插入图片描述
所以刚开始quit为0,将0传给CPU中,后续输入2号信号后,调用自定义方法,quit变为1,
但是在CPU中依旧quit为0,修改了内存中的quit,那CPU中quit就无法影响内存的quit了
一直使用quit为0,所以while循环无法退出


所以要告诉编辑器,保证每次检测,都要从内存中进行数据读取,不要用寄存器中的数据
为了解决这个问题,使用volatile

使quit变为volatile修饰的全局变量
volatile作用:杜绝对quit变量进行寄存器级别的优化,保证内存可见性


再次运行可执行程序,输入2号信号,跳出while循环,执行main中的printf打印

2.SIGCHLD信号

子进程在运行时会退出,若父进程不关心子进程退出,子进程就会变成僵尸状态
父进程要使用 wait/waitpid去等待子进程 回收僵尸,获取子进程的退出结果
即父进程进行阻塞式等待(什么都不干,就等待子进程的退出结果)
父进程主动检测--------因为子进程退出了,父进程暂时不知道


子进程要退出时,会向父进程发信号 SIGCHLD
父进程对于该信号的处理动作是SIG_DFL 什么都不做

验证SIGCHLD的存在

#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
pid_t id;
void handler(int signo)
{
    sleep(5);
    printf("捕捉到一个信号:%d,who:%d\n",signo,getpid());
    //-1代表等待任意一个子进程
    pid_t ret=waitpid(-1,NULL,0);
    if(ret>0)
    {
        printf("wait success,ret:%d,id:%d\n",ret,id);
    }
}
int main()
{
    signal(SIGCHLD,handler);//自定义捕捉
   id=fork();
  if(id==0)
  {
    //子进程
    int cnt=5;
    while(cnt)
    {
        printf("我是子进程,我的pid是:%d,ppid:%d\n",getpid(),getppid());
        sleep(1);
        cnt--;
    }
    exit(1);
  }

  //父进程
  while(1)
  {
    sleep(1);
  }

    return 0;
}



实现一个自定义方法,当子进程退出时,会向父进程发送信号SIGCHLD
调用对应的自定义方法,打印出对应的信号以及父进程的pid值


运行可执行程序后,who的pid值就是父进程的pid
17号信号就是SIGCHLD
同时通过waitpid返回的pid值与子进程的pid值相同


通过for循环创建出10个子进程,若10个子进程发送信号,处理信号需要一个一个处理,所以当发送一个信号时,可能暂时被保留下来,但是父进程只有一个比特位 pending位图保留信号,当再次保留信号时,pending位图再次被置为1
,把上次信号覆盖掉,造成信号丢失,最后处理信号时可能比发送信号的数量少


在这里插入图片描述
有多少子进程,就回收几次,若没有子进程就退出即可

3. 多线程

多线程概念

1.线程是一个执行分支,执行粒度比进程更细,调度成本更低
2.线程是进程内部的一个执行流
3.线程是CPU调度的基本单位,进程是承担分配系统资源的基本实体


下面将会对于这些概念进行解析


理解概念

什么是多线程

在这里插入图片描述
创建子进程时,只创建PCB,创建出来的PCB继续指向父进程的地址空间
代码区假设有很多函数存在,让不同的PCB执行不同的函数
相当于在一个进程内部包含多个执行流,指向同一个进程内的不同代码区域
每个PCB都是单独的线程
线程在地址空间内运行,所以该线程属于进程


调度成本低

多个线程之间使用的是同一个地址空间和页表
若为新的进程,则还需再次找到新的地址空间和页表并进行切换


局部性原理

CPU内部存在一个硬件cache


把一部分数据预先加载到缓冲区里,提高整机的效率
如CPU正在访问第100行代码,未来有很大概率访问101行,
所以一旦访问到第100行就把100行附近的数据全部load到内存中或者CPU的cache中


多线程在执行代码和数据时,依旧属于这个进程,CPU里面的cache会缓存各种各样的数据


在这里插入图片描述
若进行线程切换,因为都属于同一个进程,cache中缓存的数据是不变的


在这里插入图片描述
若进行进程切换,把当前缓存的数据设为失效,cache要重新加载当前的代码和数据

调度成本更低,体现在不用对cache进行切换

什么叫做进程

在这里插入图片描述
task_struct 叫做执行流
进程包含 一大堆的执行流、地址空间、页表以及该进程对应的代码和数据
所以进程是承担分配系统资源的基本实体

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

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

相关文章

Mac上如何装Nacos?

Nacos大家都很熟悉,服务注册中心,那么今天给大家写一篇Mac上如何装Nacos的文章。 安装步骤如下: 1、上官网 http://nacos.io/zh-cn/ 点击跳到nacos的官网上。然后点击前往Github 2、找到release 发布版本 来到GitHub上后,页面往下滑,找到latest stable release,点击…

谷歌慌了!想发论文得审批,优先开发产品,让OpenAI没得看

来源 | 机器之心 ID | almosthuman2014 众所周知&#xff0c;谷歌就像人工智能领域的「黄埔军校」&#xff0c;自深度学习兴起后培养出了整整一代机器学习研究人员和工程师。很长一段时间里&#xff0c;谷歌就是领先 AI 技术的代名词。 人们已经习惯跟随谷歌的脚步&#xff0c…

2023 年第八届数维杯大学生数学建模挑战赛 B 题详细思路 节能列车运行控制优化策略

一种可能的建模方法是基于列车的动力学方程和阻力方程&#xff0c;将列车视为单质点&#xff0c;忽略车厢间的车钩力和速度差。根据给定的参数&#xff0c;可以建立如下的方程&#xff1a; $$m(p1)\frac{dv}{dt}F-f(v)-g(i)$$ $$f(v)2.08950.0098v0.006v^2$$ $$g(i)mgi$$ 其…

酒精和肠内外健康:有帮助还是有害?

谷禾健康 酒精与健康 饮酒作为一种特殊的文化形式&#xff0c;在我们国家有其独特的地位&#xff0c;在几千年的发展中&#xff0c;酒几乎渗透到日常生活、社会经济、文化活动之中。 据2018年发表的《中国饮酒人群适量饮酒状况》白皮书数据显示&#xff0c;中国饮酒人群高达6亿…

NFTScan: 蓝筹 NFT 跌幅严重,如何保持竞争力?

最近的市场大跌影响了 NFT 二级市场&#xff0c;市场情绪冷淡下跌严重&#xff0c;交易量和买家骤然下降&#xff0c;而蓝筹作为市场里的中流砥柱也表现不佳。以 BoerdApeYachtClub 为首的等主流 NFT 价格下跌超过 20%。此外&#xff0c;随着 PFP 的热潮已经过去&#xff0c;市…

外网SSH远程连接linux服务器,看这一篇就够了

文章目录 视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 转载自内网穿透工具的文章&#xff1a;无公网IP&#xff0c;SSH远程连接Linux CentOS服务器【内网穿透】 本次教程我们来实现如何在外公网环境下…

你真的理解分布式数据的分区吗?

分布式数据存储是指将数据分散存储在多个节点或服务器上的技术。而分区是将数据划分为逻辑上的片段或部分&#xff0c;每个分区可以在分布式系统中的不同节点上存储。分区主要是为了可扩展性。不同的分区可以放在不共享集群中的不同节点上&#xff0c;可以帮助实现负载均衡、高…

MySQL 表操作

目录 创建表 案例 查看表结构 修改表 案例&#xff1a; 删除表 创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎 ; 说明&#xff1a; field 表示列名 dat…

OTA实现设备升级方案

引言 空中下载技术&#xff08;Over-the-Air Technology&#xff0c; OTA&#xff09;是通过移动通信的空中接口实现对移动终端设备进行远程管理的技术。 该技术在IOT行业非常的重要&#xff0c;当随着市场上的产品越来越多&#xff0c;保有量也越来越多&#xff0c;随着时间…

Vue换肤主题

拷贝颜色选择组件 **ThemePicker <template><!-- navabar的换肤组件 --><el-color-pickerv-model="theme":predefine="[#409EFF,

计算机组成原理实验三-----系统总线和具有基本输入输出功能的总线接口实验

总线是计算机中连接各个功能部件的纽带&#xff0c;是计算机各部件之间进行信息传输的公共通路。 总线不只是一组简单的信号传输线&#xff0c;它还是一组协议。他有两大特征 分时: 同一总线在同一时刻&#xff0c;只能有一个部件占领总线发送信息&#xff0c;其他部件要发送…

IDEA 导入 spring 源码

文章目录 前言一、下载源码二、安装 Gradle1. 下载 Gradle2. 配置环境变量 三、导入前准备四、编译源码1. 导入源码2. 我所遇见的问题 五、测试1. 创建 module2. 编写测试代码3. 我所遇到的问题 六、总结 前言 我们在学习 spring 源码的时候&#xff0c;有时候是需要在阅读源码…

HS6621系列低功耗国产蓝牙芯片 支持蓝牙5.1

HS6621CxC是一个功耗优化的蓝牙低功耗和专有的2.4 ghz应用真正的芯片上系统(SOC)解决方案。它集成了一个具有蓝牙基带和丰富外设的低功耗射频收发器I0扩展。HS6621CxC还集成了电源管理&#xff0c;提供高效率电源管理。它的目标是2.4 G蓝牙低功耗系统&#xff0c;人机界面设备(…

File类、IO数据流介绍

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;File类的设计&#x1fa85;数据流的流向 &#x1f3c5;对数据操作的类&#x1f9f8;按单位划分&#x1f9f8;按封装类型划分 &#x1f380;整理File常用方法 &#x1f41…

有赞一面:亿级用户DAU日活统计,有几种方案?

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; (1) 亿级用户场景&#xff0c;如何高性能统计日活&#xff1f; (2) 如何实现亿…

智见|中国能建中电工程罗必雄:数能融合为数字中国夯实底座

出品|网易科技《智见访谈》 作者&#xff5c;赵芙瑶 编辑&#xff5c;丁广胜 数字化浪潮的风&#xff0c;吹到了能源结构转型领域。 中国作为全球最大的能源生产国和消费国&#xff0c;正积极推动能源行业的数字化和智能化建设。数字化智能化升级在能源产业中被视为一项重要的战…

lambda处理异常四种方式

最近对接第三方呼叫系统&#xff0c;第三方SDK的所有方法里都有异常抛出&#xff0c;因为用到了lambda&#xff0c;所以异常处理还是很必要的。 本文主要用到了四种解决方案&#xff1a; 直接代码块处理自定义函数式接口&#xff0c;warp静态方法通过Either 类型包装通过Pair 类…

【Android】Exam5 ListView组件简单应用

Exam5 ListView组件简单应用 ListView组件简单应用 Exam5 ListView组件简单应用目的实验内容及实验步骤采用SimpleAdapter自定义Adapter运行及结果&#xff1a;实验总结 目的 掌握常用的UI布局及组件&#xff1b; 掌握使用Intent启动Activity的方法 掌握ListView组件的简单应用…

[离散数学] 函数

文章目录 函数判断函数的条件复合函数复合函数的性质 逆函数 函数 判断函数的条件 dom F A ⇔ \Leftrightarrow ⇔所有x 都有 F&#xff08;x&#xff09;与之对应 有唯一的与其对应 < x , y > ∈ f ∧ < y , z > ∈ f ⇒ y z <x,y>\in f \land <y,z…

无需繁琐手工操作,如何利用Web自动化测试元素定位做到快速高效的测试?

1、什么是Web自动化测试元素定位&#xff1f; 在Web自动化测试中&#xff0c;元素定位是非常重要的环节。因为我们需要找到需要进行操作的页面元素&#xff0c;例如按钮、输入框、下拉菜单等等。元素定位可以帮助我们在自动化测试中对这些元素进行操作&#xff0c;如点击、输入…