进程控制(上)

news2024/9/27 7:23:59

目录 :

          1.fork()写实拷贝    --  缺页中断

          2.进程终止

                      1.退出码

                      2.exit(进程终止)、_exit()

          3.进程等待

                    1.进程等待的必要性

                    2.进程如何进入等待

------------------------------------------------------------------------------------------------------------------------------

1.fork()写实拷贝

我们的父子进程是怎么做到写实拷贝的呢???--------我们今天可以站在地址空间的角度来看待这个问题

我们以下面这张图为例   --   对写实拷贝进行分析

图中我们的页表是简化后的,真是的页表可是非常的复杂的

我们的地址空间上可是有2^32次方个虚拟地址的,我们的页表不就是虚拟地址到物理地址的映射嘛,如果一个虚拟地址的大小是6字节,那么我们2^32次方是4GB,那么总共就需要24GB的空间,这仅仅只是一个进程的页表所需的大小,页表也是在内存当中的(我们的内存也就4GB),所以本身也不一定全部加载到内存的,在需要的时候才加载到内存的

缺页中断:当一个进程往一个不可写的内存当中写入了,操作系统检测到那么就会发生一个中断

 

 操作系统会自动发生写实拷贝将你的数据分开,确保进程的独立性

----------------------------------------------------------------------------------------------------------------------------

2.进程终止

1.退出码

进程退出场景:

              代码运行完毕,结果正确

              代码运行完毕,结果不正确

              代码异常终止

--------------------------------------------------------------------------------------------------------------------------

main函数为什么都要有一个return 一个值呢???

这个值是进程的退出码  !!!这个退出码是可以被父进程或系统所获取的

退出码的意义

代码跑完,结果正确,我们用0表示,可是为什么代码跑完我们用非0表示呢???

原因是结果不正确我们更想知道结果为什么不正确,可不正确的原因有多种可能的,我们就可以用一种数字去充当一种可能性

 代码异常终止

 2.exit(进程终止)

 main函数return代表进程退出了!!!!! 那如果是非main函数呢也就是说一个函数退出了,它不是main函数

非main函数返回仅仅代表着函数返回!!!,main函数返回代表着进程退出

我们可以通过一个调用exit终止我们所谓的一个进程

 

我们的代码是在运行完函数fun之后执行exit()终止退出码设置为12,这叫做进程终止

exit在任意的地方调用,都会导致我们的进程退出,哪怕我们没有在main函数里调用exit在fun函数里调用exit也会导致我们的进程退出

exit在任意地方调用,都代表这进程终止,参数是退出码 !!!

3._exit

_exit终止进程,强制终止进程,不要进行进程的后续收尾工作,比如刷新缓冲区!!!

进程退出, OS 层面做了什么???

在系统层面,少了一个进程:free、PCB 、mm_struct 、 free页表和各种映射关系,代码+数据申请的空间也要给释放掉!!!

3.进程等待

1.进程等待的必要性

 为什么要让父进程等待呢???

1.通过获取子进程退出的信息,能够得知子进程执行结果。

2.通过等待可以保证: 时序问题,子进程先退出,父进程后退出

(不然我父进程比你子进程先退出,那我父进程还怎么获取你子进程的退出信息啊!!!)

3.进程退出(尤其是子进程)退出的时候,会先进入僵尸状态,会造成内存泄漏的问题,需要通过父进程wait,释放该子进程占用的资源!!!!!

2.进程如何进入等待

wait      --  等待一个进程死掉,你本来是一个活着的状态,直到你的状态变成了Z状态,我才有可能再去读取你的信息,进而返回

wait的返回值   ---------  等待成功返回你等待成功的进程PID ,等待失败  -1 被返回

 -----------------------------------------------------------------------------------------------------------------------------

所以我们写一段代码

上面的代码也验证了我们的wait可以处理我们的僵尸进程的回收

wait并不是我们的重点,我们另一个重要的接口  waitpid()这个接口提供的功能更丰富

waitpid返回值一样的是  等待成功返回等待成功的哪个进程的PID  ,失败返回 -1

 

跟我们预期的结果一样!!!!!

上面我们是指定一个进程等待,那我们如何让父进程等待任意一个进程呢

 

 如何让父进程通过等待获取子进程的退出信息呢????

 

这边导致我们期望的结果不是12,又该如何理解呢???

 所以实际上我们是需要有两组信息,被我们所获取到,一个进程退出码,一个信号

如果没有收到信号,那么我们的程序是正常跑完的,再来关心我们的退出码,否则不关心退出码

那么其中次低8位,也就是进程退出的退出状态(传说中去退出码),第七个比特位代表着进程终止时所收到的信号,大部分情况下都0

所以我获得的status是由32个比特位构成的,我们的次低8位对应着我们进程退出时的退出码,那么我们的第七位代表着我们的进程收到的信号,那么只要将来我们收到的退出码时,第七位是0,代表着没有收到信号,这个进程是正常运行完的,运行完了对还是不对,通过次低8位获得。。。

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

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

相关文章

MySQL常见的存储引擎

InnoDB:InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL 5.5之后,InnoDB是默认的MySQL存储引擎。 特点:1、DML操作遵循ACID模型,支持事务; 2、行级锁,提高并发访问性能; 3、支持外键FOREIGN KEY约…

爬虫框架有Scrapy、BeautifulSoup、Selenium

爬虫框架有Scrapy、BeautifulSoup、Selenium BeautifulSoup比Scrapy相对容易学习。Scrapy的扩展,支持和社区比BeautifulSoup更大。Scrapy应被视为蜘蛛,而BeautifulSoup则是Parser。 1.爬虫基础知识 在开始Python爬虫之前,需要先掌握一些基础知…

C++特殊类设计

文章目录 1.设计一个类,不能被拷贝2.设计一个类,只能在堆上创建对象3.设计一个类,只能在栈上创建对象4.设计一个类,不能被继承5.设计一个类,只能创建一个对象5.1 单例模式5.2 饿汉模式5.3 懒汉模式5.4 两种模式的析构函…

操作系统进程线程(二)—父子进程、僵尸进程、孤儿进程、进程终止、守护进程

父子进程、进程组、作业、会话 父进程 已创建一个或者多个进程 子进程 fork创建的。这个函数被调用一次但是返回两次,子进程返回0,父进程返回子进程id。 fork之后,操作系统会赋值一个与父进程完全相同的子进程,虽然是父子关系…

微软 BingChat,全面开放使用 !

前两天,微软突然官宣全面开放BingChat: 无需任何等待。只需注册一个账户,首页即可体验。 更关键的是,还有一大堆堪称“家底”的新功能来袭! 支持100种语言多模态输出、持续聊天且记录可随时导出、类ChatGPT插件功能…

企业内部信息太琐碎怎么办?选择一款在线工具制作内部知识库

在一个企业内部,信息的传递和沟通是非常重要的。企业内部的信息往往比较杂碎,包括各种文件、资料、报告、流程等等,如果不加以整理和管理,就会给企业的工作带来困难和不便。因此,选择一款在线工具制作内部知识库是非常…

桌面虚拟化的优势

启用基于云的虚拟桌面基础架构 (VDI) OpenText™ Exceed TurboX™ (ETX) 长期以来一直是虚拟化在 Linux 主机上运行的图形要求苛刻的软件的黄金标准。ETX 最新版本(12.5)增加了许多Microsoft Windows功能&…

JetPack WindowManager详解

一、JetPack架构 Android Jetpack 是Android官方提供的一套组件、工具和指导,可以帮助开发者摆脱编写样板代码并简化复杂任务,并且Jetpack组件提供向后的兼容性, 能够帮助开发者更快的开发更稳定且易维护的应用。 Jetpack大体分为4类:Architecture(架构)、Foundationy(…

项目经理如何及时掌控项目进度?

延迟是指超出计划的时间,而无法掌控则意味着管理者对实际情况一无所知。 为了解决这些问题,我们需要建立好的制度和沟通机制。例如使用项目管理软件来跟踪进度、定期开会并避免沟通障碍等。 管理者可以建立相关制度: 1、建立进度记录制度。…

SpringBoot启用web模拟测试(二)

1.web环境模拟测试 设置测试端口(见SpringBoot启用web模拟测试(一)) 模拟测试启动(见SpringBoot启用web模拟测试(一)) 测试模拟匹配(各组成信息皆可配置) …

JUC----ThreadLocal

目录 一、什么是ThreadLocal 二、ThreadLocal常用API 三、ThreadLocal的内部结构 四、ThreadLocal内存泄漏问题 一、什么是ThreadLocal ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程…

shell脚本中函数的运用

shell脚本中函数的运用 一、函数的定义二、函数的作用范围三、实验1、阶乘2、函数库 一、函数的定义 shell函数是经常使用的,因为有些命令序列是需要反复调用执行的,将命令序列按格式写在一起,以便可以重复的使用。 shell函数: 使…

【C++】STL简介

在C领域我们正式进入到STL的学习,本期我们简单的介绍一下STL 目录 一、什么是STL 二、STL的版本 2.1 原始版本 2.2 P. J. 版本 2.3 RW版本 2.4 SGI版本 三、STL的六大组件 四、STL的缺陷 一、什么是STL STL(standard template libaray-标准模板库)&#x…

保姆级教程!教你打造自己的AI孙燕姿;全程使用AI工具设计一款桌游;搭建基于LLM的客服系统的实践 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『大模型技术与应用思考导图』跟着大佬做判断 王咏刚,创新工场CTO,技术撰稿人,有数个知名出版作品…

Nat. Commun. | 无需参数的几何深度学习,可准确预测蛋白质结合界面

编译 | 曾全晨 审稿 | 王建民 今天为大家介绍的是来自Matteo Dal Peraro团队的一篇关于预测蛋白质结合的论文。蛋白质是生命的重要分子组成部分,由于其特定的分子相互作用而负责大多数生物功能。然而,预测它们的结合界面仍然是一个挑战。作者提出了一种几…

【JS】1676- 重学 JavaScript API - Page Visibility API

在前端开发中,我们经常需要根据页面的可见性来控制资源的使用和提高页面的性能和响应速度。而 JavaScript 中的 Page Visibility API[1] 就提供了一种「检测页面是否可见」的方法。 本文将介绍 Page Visibility API 的概念、使用方法、兼容性和实际应用案例。 什么是…

【负载均衡式的在线oj(1.compile_runner_server模块)】

🎉实战项目:负载均衡式在线OJ 博主主页:桑榆非晚ᴷ 博主能力有限,如果有出错的地方希望大家不吝赐教 给自己打气:成功没有快车道,幸福没有高速路。所有的成功,都来自不倦地努力和奔跑&#xf…

并发编程07:CAS

文章目录 7.1 原子类7.2 没有CAS之前7.3 使用CAS之后7.4 是什么?7.5 CAS底层原理?谈谈对Unsafe类的理解?7.5.1 Unsafe7.5.2 源码分析7.5.3 底层汇编 7.6 原子引用7.7 CAS与自旋锁,借鉴CAS思想7.7.1 是什么?7.7.2 自己实…

K8S管理系统项目实战[API开发]-1

前端: Vueelement plus 后端: gogin kubernetes v1.24.2 golang v1.18.3 后端代码地址GitHub - yunixiangfeng/k8s-platform: K8s管理系统后端: gogin Go 快速入门 Gin Web框架 K8s管理系统项目实战[API开发] 项目背景,整体设计,Client-go&#x…

代码随想录算法训练营day34 | 1005.K次取反后最大化的数组和 ,134. 加油站,135. 分发糖果

代码随想录算法训练营day34 | 1005.K次取反后最大化的数组和 ,134. 加油站,135. 分发糖果 1005.K次取反后最大化的数组和解法一:两次正常排序解法二:一次排序 134. 加油站135. 分发糖果 1005.K次取反后最大化的数组和 教程视频&a…