返回顶部
首页 > 资讯 > 操作系统 >【Linux】volatile | SIGCHLD | 多线程概念
  • 552
分享到

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

linux运维服务器 2023-08-30 21:08:28 552人浏览 独家记忆
摘要

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

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#include#include#include#includepid_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 叫做执行流
进程包含 一大堆的执行流、地址空间、页表以及该进程对应的代码和数据
所以进程是承担分配系统资源的基本实体

来源地址:https://blog.csdn.net/qq_62939852/article/details/130693696

--结束END--

本文标题: 【Linux】volatile | SIGCHLD | 多线程概念

本文链接: https://lsjlt.com/news/383618.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Linux】volatile | SIGCHLD | 多线程概念
    文章目录 1. volatile编译器优化 2.SIGCHLD信号验证SIGCHLD的存在 3. 多线程多线程概念理解概念什么是多线程调度成本低局部性原理 什么叫做进程 1. volatile 在vsc...
    99+
    2023-08-30
    linux 运维 服务器
  • Java多线程——基础概念
    目录java多线程并发与并行:多线程使用场景:创建线程的方式:Thread类的有关方法:线程的同步:       ...
    99+
    2024-04-02
  • Java多线程编程的概念
    这篇文章主要讲解了“Java多线程编程的概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程编程的概念”吧!Java多线程编程是什么?一个程序或进程能够包含多个线程,这些线程可以...
    99+
    2023-06-17
  • Linux线程互斥锁的概念
    本篇内容介绍了“Linux线程互斥锁的概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在编程中,引入了对象互斥锁的概念,来保证共享数据操作...
    99+
    2023-06-15
  • Java多线程的概念及使用
    本篇内容介绍了“Java多线程的概念及使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录线程Thread类Runnable接口创建线程T...
    99+
    2023-06-20
  • Linux C中多线程与volatile变量
    Linux C中多线程与volatile变量 volatile 修饰的变量表示改变量的值是易变的,编译器不对其进行优化,访问该变量的时候不会从寄存器读取, 而是直接从内存读取变量。 在多线程环境下,每个线程...
    99+
    2022-06-04
    变量 多线程 Linux
  • Java多线程基础概念是什么
    本篇内容主要讲解“Java多线程基础概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程基础概念是什么”吧!并发与并行并行,表示两个线程同时做事情。并发,表示一会做这个事情,一...
    99+
    2023-06-17
  • Linux——进程概念(上)
    文章目录 1. 冯诺依曼体系结构2. 操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 如何理解 "管理"2.4 总结2.5 系统调用和库函数概念 3. ...
    99+
    2023-09-17
    linux 运维 服务器
  • Linux进程概念(上)
    Linux进程概念(上) 冯诺依曼体系结构操作系统(Operator System)概念设计OS的目的定位总结系统调用和库函数概念 进程基本概念描述进程-PCBtask_struct-PC...
    99+
    2023-09-13
    linux 运维 服务器
  • 【linux】进程概念详述
    进程概念 一、冯诺依曼系统二、操作系统2.1 OS层次图2.2 操作系统的意义2.2.1 系统调用与库函数的区别 2.3 管理的理解 三、进程3.1 进程的概念3.2 描述进程-PC...
    99+
    2023-09-06
    linux 运维 服务器
  • 【Linux系统】进程概念
    目录 1 冯诺依曼体系结构 2 操作系统(Operator System) 概念 设计OS的目的 定位 总结 系统调用和库函数概念 3 进程 3.1 基本概念 3.2 描述进程-PCB 3.2 组织进程  3.3 查看进程 3.4  通过系...
    99+
    2023-09-15
    linux 服务器 运维
  • Java多线程基本概念以及避坑指南
    目录前言1. 多线程基本概念1.1 轻量级进程1.2 JMM1.3 Java中常见的线程同步方式2. 避坑指南2.1. 线程池打爆机器2.2. 锁要关闭2.3. wait要包两层2....
    99+
    2024-04-02
  • Linux的进程线程及调度的概念是什么
    这篇“Linux的进程线程及调度的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux的进程线程及调度的概念是...
    99+
    2023-06-28
  • java线程、进程和Synchronized的概念
    这篇文章主要介绍“java线程、进程和Synchronized的概念”,在日常操作中,相信很多人在java线程、进程和Synchronized的概念问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java线程、...
    99+
    2023-05-30
    java
  • 多线服务器的概念是什么
    多线服务器是指一台服务器同时处理多个请求或连接的能力。这种服务器可以同时处理来自多个客户端的请求,提高了服务器的并发处理能力和性能。...
    99+
    2024-04-23
    服务器
  • Linux C中多线程与volatile变量的示例分析
    这篇文章主要介绍Linux C中多线程与volatile变量的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux C中多线程与volatile变量volatile 修饰的变量表示改变量的值是易变的,编译...
    99+
    2023-06-09
  • JavaScript单线程的概念是什么
    这篇文章主要介绍“JavaScript单线程的概念是什么”,在日常操作中,相信很多人在JavaScript单线程的概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2024-04-02
  • Java多线程并发编程 Volatile关键字
    volatile 关键字是一个神秘的关键字,也许在 J2EE 上的 JAVA 程序员会了解多一点,但在 Android 上的 JAVA 程序员大多不了解这个关键字。只要稍了解不当就好容易导致一些并发上的错误发生,例如好多人把 volatil...
    99+
    2023-05-31
    java volatile 关键字
  • Java深入浅出讲解多线程的概念到使用
    目录1.线程的几个相关概念2.线程的状态与生命周期3.线程的优先级与调度4.Java中多线程的创建4.1继承Thread类创建线程4.2实现Runnable接口创建线程5.多线程的同...
    99+
    2024-04-02
  • Linux中进程与线程的概念以及区别是什么
    本篇文章为大家展示了Linux中进程与线程的概念以及区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。linux进程与线程的区别,早已成为IT界经常讨论但热度不减的话题。无论你是初级程序员,还...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作