操作系统 - 进程的控制(创建与终止)

进程控制

文章目录

  • 进程控制
    • 进程创建
    • 进程的终止
      • wait()和waitpd()
      • 僵尸进程
      • 孤儿进程

进程创建

程序在执行的过程中,可能会创建多个进程,创建进程称为父进程,新的进程称为子进程,每个新的进程也可以创建其他进程,从而形成进程树

大多数操作系统(UNIX,Linux,Windows) 对进程的识别采用的唯一的进程标识符,每个进程都有一个唯一的pid 他可以用作索引,以便访问内核中的进程的各种属性

进程树

这是一个典型的Linux 的进程树,进程init 是作为所有的用户进程的父进程,一旦系统启动,他就可以创建各种用户进程,

一般来说,当一个进程创建子进程时,该进程会需要一定的资源(CPU 时间、内存、文件、I/O 设备)来完成任务,子进程可以从操作系统哪里直接获得资源,也可以只从父进程哪里获得资源子集,父进程可能在子进程间分配资源,(如内存或文件)限制子进程只能使用父进程的资源,可以防止创建过多进程,导致系统超载。

当进程创建新的进程时,会有两种执行可能:

  • 父进程和子进程并发执行
  • 父进程阻塞,等待某个子进程或者所有子进程执行完

子进程的地址空间也有两种可能:

  • 子进程时父进程的复制品(他与父进程有同样的数据和程序)

  • 子进程的加载另外一个进程

在一个程序调用系统调用fork() 后,子进程的地址空间会复制父进程的地址空间(此处也会用到虚拟内存的写时拷贝),这种机制允许父子进程间的轻松通信

父子进程都会执行fork() 之后的指令,唯一不同的是,子进程fork()的返回值为0,父进程则为非0.

在调用fork()以后,有个进程调用了exec(),以用新的程序来取代进程的地址空间,系统调用exec()加载二进制文件文件到内存中(破坏了包含系统调用的原来的内存内容)并进行执行,采用这种方法,这两个进程能互相通信

父进程在调用系统调用wait()能把自己移出就绪队列到阻塞队列中,从就绪态到阻塞态,直到子进程结束。

进程的终止

当进程完成指向的最终语句并且通过系统调用exit() 请求操作系统删除自身时,进程终止

此时,进程可以返回状态值 到父进程(通过系统调用wait)。所有的进程资源,如物理和虚拟内存、打开的文件和I/O缓存区等,会由操作系统释放。

  • 如果终止子进程,则父进程需要知道这些子进程的的标识符,因此,当一个进程创建子进程时,则该子进程的标识符需要传递给父进程。父进程会将其存储到他的进程控制块中。

父进程终止子进程的方式有很多 比如:

  • 子进程使用了超过他所分配到的一些资源。 这要求父进程有一个检查其子进程的状态的机制。

  • 分配给子进程的任务已不再需要。

  • 父进程退出,如果父进程终止,那么操作系统不允许子进程继续

    有的系统不允许,子进程在父进程终止的情况下继续存在,对于这类系统, 如果一个进程终止(正常或不正常)。那么它的所有子进程也被终止。这种现象,称为 级联终止,通常是由操作系统进行的。

wait()和waitpd()

1、wait的工作原理

(1)子进程结束时,系统向其父进程发送SIGCHILD信号

(2)父进程调用wait函数后阻塞

(3)父进程被SIGCHILD信号唤醒,然后去回收僵尸子进程

(4)父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程

(5)若父进程没有任何子进程则wait返回错误

2、参数解读

(1)wait的参数status。

  • status用来返回子进程结束时的状态,父进程通过wait得到status后就可以知道子进程的一些结束状态信息。

(2)wait的返回值pid_t。

  • 这个返回值就是本次wait回收的子进程的PID。当前进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个子进程本次被回收了。

(3)小结:wait主要是用来回收子进程资源,回收同时还可以得知被回收子进程的pid和退出状态。

(4)WIFEXITED、 WIFSIGNALED、 WEXITSTATUS这几个宏用来获取子进程的退出状态。

  • WIFEXITED宏用来判断子进程是否正常终止(return、exit、_exit退出)。
  • WIFSIGNALED宏用来判断子进程是否非正常终止(被信号所终止)。
  • WEXITSTATUS宏用来得到正常终止情况下的进程返回值。

4、wait和waitpd差别

(1)基本功能一样,都是用来回收子进程的

(2)waitpid可以回收指定PID的子进程

(3)waitpid可以阻塞或者非阻塞两种工作模式

原文链接:https://blog.csdn.net/xuw_xy/article/details/105793619

僵尸进程

当一个进程终止时,操作系统会释放其资源。不过他位于进程表中的信息还是在的,直到父进程调用wait(),这是因为进程表中包含了进程的退出状态。

当一个进程终止,但是其父进程没有调用wait(),这样的进程称为僵尸进程

一旦父进程调用了wait(),僵尸进程的进程标识符和他在父进程进程表中的信息就会释放

原因可见上文中,对于wait()解读 转载部分

孤儿进程

如果父进程没有调用wait()就终止了,以致于子进程成为了孤儿进程。

Linux和UNIX 对于这种情况的处理是:

  • 进程init定期调用wait(),以便于收集任何孤儿进程的退出状态,并释放孤儿进程的进程标识符和进程表中的信息。

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

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

相关文章

LinkedHashMap详解

目录 LinkedHashMap详解1、LinkedHashMap的继承体系2、LinkedHashMap的特性介绍和代码示例①、特性②、适用场景使用LinkedHashMap 实现最简单的 LRU缓存 3、LinkedHashMap的构造函数4、LinkedHashMap是如何存储元素的,底层数据结构是什么?LinkedHashMap…

功能强大的多功能文档转换工具Neevia Document Converter Pro 7.5.0.241

Neevia Document Converter Pro是一款功能强大的Windows软件,旨在将文档转换为各种格式,包括PDF、TIFF、JPEG和许多其他格式。该程序专为在企业环境中使用而设计,提供文档转换和处理过程的自动化,这使其成为处理大量文档的组织的***工具。 Neevia Document Converter Pro的…

基于Quartus Prime18.1的安装与FPGA的基础仿真(联合Modelsim)教程

Quartus是一种美国科技公司Intel(英特尔)公司开发的FPGA(现场可编辑门阵列)设计编译软件,用作设计、仿真、综合和布局、支持多种编程语言,包括VHDL、Verilog等,并具有丰富的功能和工具库&#x…

游戏中插入音效

一、背景音乐 准备:素材音乐 方法: 1、方法1: (1) 将背景音乐 bgAudio 拖放到Hierarchy面板 (2) 选中 bgAudio,勾选开始运行就播放、循环播放。调节音量(volume) 2、方法2: (1) Create Empty&#x…

日志通关(一)

转载:https://mp.weixin.qq.com/s/eIiu08fVk194E0BgGL5gow 一、 日志体系 日志发展到今天,被抽象成了三层:接口层、实现层、适配层: 接口层:或者叫日志门面(facade),就是interfa…

Aspice介绍——测试流程

文章目录 ASPICE简介一、V字模型的示意二、测试领域2.1 SWE.6:软件合格性测试过程目的过程成果基本实践(BP) 2.2 SYS.4:系统集成和集成测试过程目的过程成果基本实践(BP) 2.3 SYS.5:系统合格性测试过程目的…

【linux网络(四)】传输层协议详解(上)

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux网络 1. 前言2. UDP协议…

备忘录怎么插入文件和附件 备忘录插入文件附件方法

在繁忙的工作与生活中,我们时常需要记录各种信息,而备忘录则成为了我们不可或缺的得力助手。然而,当备忘录中需要包含的文件或附件越来越多时,如何高效、便捷地管理这些文件,便成为了一个亟待解决的问题。 想象一下&a…

深入剖析 Laravel 框架:构建高效PHP应用的最佳实践

引言 随着互联网的高速发展,PHP 作为一门广泛使用的服务器端脚本语言,始终备受开发者青睐。而在众多 PHP 框架中,Laravel 凭借其优雅的设计和高效率,成为了构建现代 Web 应用的热门选择。本文将从零开始,探讨如何使用 …

arcgis portal安装教程(含ECP授权文件)

本文介绍Portal 在windows环境下的安装部署过程,为了顺利进行Portal的安装,建议安装环境是windows server 2016。所以在操作之前首先保证有符合条件的安装机器或虚拟机,安装环境的存储空间建议不低于100G。 安装环境及软件 1、环境&#xff…

o.upload.addEventListener is not a function

o.upload.addEventListener is not a function 在本地的开发环境是可以正常上传的,但是到测试环境,上传就报了这么一个错 在网上寻找的方法 一、 在 node_modules/mockjs/dist/mock.js 第8308行 和 node_modules/mockjs/src/xhr/xhr.js 第216行 添加…

用一个ESP32S3-Zero把有线键盘变为无线

三脚猫最近一直琢磨,那些喜欢买剪线键盘,以及自制键盘瞎折腾的人都是怎么搞的。经过不懈努力,终于想明白除了直接的硬件一个个pin针的高低电压判断后转给蓝牙,拿到现成的古董剪线键盘还有一个方式其实是在usb host转发给蓝牙类似这…

通过iDrac8.0安装Windows Server 2022

1:登录iDrac。 2:启动虚拟控制台。 3:点击虚拟机介质。 4:连接虚拟介质。 5:映射CD/DVD 6: 找到本地的安装镜像。映射设备。 7:在下次引导中选择虚拟CD/DVD/ISO引导。 8:可以在电源中选择重置设备启动&…

替换掉的文件怎么恢复?5个方法,找回数据!

“怎么办呀?刚刚在操作电脑的时候一不小心替换了一个文件,现在根本不知道应该怎么操作才能恢复文件,希望大家可以帮帮我!” 在数字化办公和日常生活中,我们时常会面临文件被意外替换的情况。或许是不小心将新版本的文…

据说可以防静电和浪涌的P6KE30CA

公司有些变送器之前在最后一道校准时,经常发生烧毁的情况。所以在电路的防反接的M7二极管前面又增加了一个TVS二极管,型号P6KE30CA。但愿加了这个好使把。今天又研究了一下这个TVS管子,把搜索到的东西记录一下。放这里备忘把,忘记…

Spring5依赖注入(DI)Set方式注入收录

Spring5依赖注入(DI)Set方式注入收录 依赖注入(Dependency Injection,DI)。 依赖 : 指Bean对象的创建依赖于容器,Bean对象的依赖资源。 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配。 Set方式…

用java代码实现一个函数,反转一个整数

import java.util.Scanner; public class Test_A25 {public static int reverseInte(int num){int reverse0;while(num!0){int digitnum%10;reversereverse*10digit;num/10;}return reverse;}public static void main(String[] args){System.out.print("请输入你要反转的…

【图书推荐】《Hive入门与大数据分析实战》

本书重点 Hive的网站流量分析项目、旅游酒店评价大数据分析项目,两个案例(均包括SQL和Java编程两种解决方法,SQL实现不用编程)可用于课题研究和毕业论文素材。 内容简介 Hive是基于Hadoop的一个数据仓库工具,用来进…

【Android】安Android Studio环境搭建注意点

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

通过python操作redis(windows)

注意在连接之前要确保 redis 服务已经安装。 更多的安装信息请查看:https://blog.csdn.net/sinat_20471177/article/details/132042779?spm1001.2014.3001.5501 redis 模块 Python 要使用 redis,需要先安装 redis 模块。如果要做数据导入/导出操作的…