首页
最新活动
服务器租用
香港服务器租用
台湾服务器租用
美国服务器租用
日本服务器租用
新加坡服务器租用
高防服务器
香港高防服务器
台湾高防服务器
美国高防服务器
裸金属
香港裸金属服务器
台湾裸金属服务器
美国裸金属服务器
日本裸金属服务器
新加坡裸金属服务器
云服务器
香港云服务器
台湾云服务器
美国云服务器
日本云服务器
CDN
CDN节点
CDN带宽
CDN防御
CDN定制
行业新闻
官方公告
香港服务器资讯
帮助文档
wp博客
zb博客
服务器资讯
联系我们
关于我们
机房介绍
机房托管
登入
注册
帮助文档
专业提供香港服务器、香港云服务器、香港高防服务器租用、香港云主机、台湾服务器、美国服务器、美国云服务器vps租用、韩国高防服务器租用、新加坡服务器、日本服务器租用 一站式全球网络解决方案提供商!专业运营维护IDC数据中心,提供高质量的服务器托管,服务器机房租用,服务器机柜租用,IDC机房机柜租用等服务,稳定、安全、高性能的云端计算服务,实时满足您的多样性业务需求。 香港大带宽稳定可靠,高级工程师提供基于服务器硬件、操作系统、网络、应用环境、安全的免费技术支持。
联系客服
服务器资讯
/
香港服务器租用
/
香港VPS租用
/
香港云服务器
/
美国服务器租用
/
台湾服务器租用
/
日本服务器租用
/
官方公告
/
帮助文档
【Linux】volatile - SIGCHLD - 多线程概念
发布时间:2024-02-27 20:13:47 分类:帮助文档
【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
#include
#include
#include
#include
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 叫做执行流 进程包含 一大堆的执行流、地址空间、页表以及该进程对应的代码和数据 所以进程是承担分配系统资源的基本实体
上一篇
【Linux】进程信号
下一篇
服务器租用公司名字怎么取
相关文章
抖音认证邀请码该怎么填写
阿里云怎么备份数据库
nginx启动、配置、测试(全网最全)
mysql8.0允许远程计算机连接
Prometheus服务器、Prometheus被监控端、Grafana、监控MySQL数据库、自动发现概述、配置自动发现、Alertmanager
访问海外服务器慢怎么办
asp网站用ftp怎么替换图片
VMware vCenter Server 7.0 完整安装教程
吃鸡怎么进香港服务器
香港云服务器租用推荐
服务器租用资讯
·广东云服务有限公司怎么样
·广东云服务器怎么样
·广东锐讯网络有限公司怎么样
·广东佛山的蜗牛怎么那么大
·广东单位电话主机号怎么填写
·管家婆 花生壳怎么用
·官网域名过期要怎么办
·官网邮箱一般怎么命名
·官网网站被篡改怎么办
服务器租用推荐
·美国服务器租用
·台湾服务器租用
·香港云服务器租用
·香港裸金属服务器
·香港高防服务器租用
·香港服务器租用特价
7*24H在线售后
高可用资源,安全稳定
1v1专属客服对接
无忧退款试用保障
德讯电讯股份有限公司
电话:00886-982-263-666
台湾总部:台北市中山区建国北路一段29号3楼
香港分公司:九龙弥敦道625号雅兰商业二期906室
服务器租用
香港服务器
日本服务器
台湾服务器
美国服务器
高防服务器购买
香港高防服务器出租
台湾高防服务器租赁
美国高防服务器DDos
云服务器
香港云服务器
台湾云服务器
美国云服务器
日本云服务器
行业新闻
香港服务器租用
服务器资讯
香港云服务器
台湾服务器租用
zblog博客
香港VPS
关于我们
机房介绍
联系我们
Copyright © 1997-2024 www.hkstack.com All rights reserved.