Linux 进程:进程控制

news2024/11/15 11:52:08

目录

  • 一、进程创建
    • 1.fork
    • 2.vfork
  • 二、进程终止
  • 三、进程等待
  • 四、进程替换
    • 1.理解程序替换
    • 2.子进程在程序替换中的作用

Linux的进程控制分为四部分:

  • 进程创建
  • 进程终止
  • 进程等待
  • 进程替换

一、进程创建

常见的创建进程的函数有两个:

  • pid_t fork(void)
  • pid_t vfork(void)

这两个函数的实现方式有所不同,其中我们最常用的还是frok函数。

1.fork

  fork函数以写时拷贝的方式创建一个子进程,子进程复制父进程的pcb、虚拟空间、页表。因此父子进程代码共享,但数据独享,互不干涉。

fork

2.vfork

  vfrok函数创建子进程,子进程只复制父进程的pcb,虚拟内存和页表是父子进程共用的

vfork

二、进程终止

  进程终止就是终止一个进程,也就是退出进程。但进程的退出也是分情况的,分为正常退出和异常退出:

  • 正常退出:运行了exit_exitreturn语句导致的退出
  • 异常退出:程序出错导致的退出

  正常退出就是程序员在代码中规定的,规定程序运行到这里就应该退出,因此使用了exit、_exit、return来控制进程在合适的位置退出,这种退出是在人为的控制下发生的,因此是正常退出。

  异常退出则是程序在运行时,发生了预料之外的错误,比如对空指针进行解引用等错误操作,这些错误操作使得程序崩溃退出,是不属于人为控制的,因此是异常退出。

三、进程等待

  什么是进程等待?

 (1)父进程创建子进程后,等待子进程退出,子进程退出后,父进程获取子进程的退出返回值,释放子进程的资源,避免僵尸进程产生。因为僵尸进程产生的原因就是:子进程先于父进程退出,通知父进程后,父进程没有处理子进程的后事,导致子进程变成了僵尸进程

 (2)为了避免父进程没有接收到子进程的退出通知,从而产生僵尸进程。父进程创建子进程后,就一直等待子进程的退出通知,子进程一退出,父进程就马上处理,避免僵尸进程的产生。这就是进程等待。

 常用来实现进程等待的函数有两个:

  • pid_t wait(int *stat_loc);
  • pid_t waitpid(pid_t pid, int *stat_loc, int options);

 这两个函数都可以用来处理退出的子进程,它们的详细使用放在了另一篇文章。

四、进程替换

1.理解程序替换

  什么是进程替换?

  假如此时系统正在运行A程序,这样就有A程序对应的pcb,然后操作系统把另一个程序B从硬盘加载到内存中,让A程序的pcb断开与A程序的联系,去操作B程序,同时修改进程的页表映射信息,更改为新程序的数据,这就是进程替换。(程序替换后,pcd的ID是不变的,因为并没有新创建pcb,使用的还是原来的pcb

  如下图:此时运行的是A程序,页表、虚拟空间、pcb中都是A程序的相关信息。

A程序
  如下图:加载B程序到内存中。

加载
 如下图:进程pcb不再控制A程序,而是去控制B程序。并且将页表、虚拟空间初始化为B程序的相关信息,同时pcb中也会修改一些对应的信息。

B程序

2.子进程在程序替换中的作用

 (1)父进程创建子进程后,最能体现子进程价值的就是程序替换。刚开始接触子进程时,我们只是通过创建子进程后,父子进程的函数返回值来区分父子进程,区分后让父子进程进入不同的代码分支执行程序。

 (2)但这样总感觉有点浪费子进程,因为作为一个代码分支来说,它所能包含的程序自然不能过多,否则整个程序就显得臃肿或复杂。但是如果不能包含过多的程序,也就意味着代码分支并不能实现太过复杂的功能。这样就不太过瘾,有点浪费子进程的性能。

 (3)所以我们可以将要实现的功能,单独做成一个程序,让子进程进行程序替换后去运行这个程序,这样不但让代码不臃肿,还让代码的功能更强大。所以程序替换才是子进程的最佳选择。

  程序替换常使用的函数都在exec函数簇中,关于它们的使用会在另一篇文章讲到。

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

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

相关文章

一篇文章帮助你初步了解CDN内容分发网络

文章目录CDN内容分发网络CDN内容分发网络的工作原理CDN的作用CDN如何实现内容的加速CDN内容分发网络 CDN(Content Delivery Network)内容分发网络。CDN 是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过…

手撕CSDN博文:学用curl命令获取博文页面源码,学不会爬虫先手剥CSDN博文阅读点赞收藏和评论数量

学用curl命令获取博文页面源码,学不会爬虫先手剥CSDN博文阅读点赞收藏和评论数量。 (本文获得CSDN质量评分【xx】)【学习的细节是欢悦的历程】Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&…

客户服务软件推荐榜:28款!

在这个竞争激烈的时代,做到服务对企业的存亡有着深刻的意义。改善客户服务,做好客户服务工作,是关键,因为客户服务团队代表着企业的形象,面孔,客户有可能 不大会记得企业的某个东西,但是他们将会…

module java.base does not “opens java.xxx“ to unnamed module @xxxx

错误截图 在springboot集成dubbo中 消费者服务和生产者复核都报错 错误原因 高版本JDK禁止了报错所提示的几个包的反射 而dubbo里用到了 解决 看自己的报错里有几个包被禁止了 我这有两个java.math和java.lang 添加两个JVM启动参数 –add-opens java.base/java.mathALL…

Python爬虫之Scrapy框架爬虫实战

Python爬虫中Scrapy框架应用非常广泛,经常被人用于属于挖掘、检测以及自动化测试类项目,为啥说Scrapy框架作为半成品我们又该如何利用好呢 ?下面的实战案例值得大家看看。 目录: 1、Scrapy框架之命令行 2、项目实现 Scrapy框架…

安卓手机当旁路网关

一、安卓shell调试工具下载【电脑版下载地址】安卓adb调试工具,包含MAC苹果、Windows和Linux 三种版【手机版下载地址Termux】下载地址:https://github.com/termux/termux-app/releases如果不懂下载哪个版本,可以直接下载通用版:t…

Jackson CVE-2017-7525 反序列化漏洞

0x00 前言 Jackson 相对应fastjson来说利用方面要求更加苛刻,默认情况下无法进行利用。 同样本次的调用链也可以参考fastjson内容:Java代码审计——Fastjson TemplatesImpl调用链 相关原理,可以参考:Jackson 反序列化漏洞原理 …

基于Java+SpringBoot+Vue+Uniapp(有教程)前后端分离健身预约系统设计与实现

博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及…

6款yyds的可视化搭建开源项目

之前我一直在研究低代码可视化相关的技术和产品, 也主导过很多可视化搭建项目, 主要目的是降低企业研发成本和缩短产品交付周期, 随着互联网技术的发展也陆陆续续有很多优秀的技术产品问世, 接下来我就和大家分享几款非常有价值的可视化搭建项目, 助力企业数字化转型. 1. Form…

轻松搞懂Linux中的用户管理

文章目录概念用户账户用户组用户权限用户管理工具概念 用户管理是Linux系统管理员必须掌握的重要技能之一。Linux系统是一个多用户操作系统,可以支持多个用户同时使用,每个用户拥有自己的账户和权限,因此管理员需要了解如何创建、管理和删除…

当参数调优无法解决kafka消息积压时可以这么做

今天的议题是:如何快速处理kafka的消息积压 通常的做法有以下几种: 增加消费者数增加 topic 的分区数,从而进一步增加消费者数调整消费者参数,如max.poll.records增加硬件资源 常规手段不是本文的讨论重点或者当上面的手段已经使…

vue 在install时候node-sass@4.14.1 postinstall: node scripts/build.js错误

今天重装了node和Vue脚手架,在install的时候报了下面的错误 报错如下: Build failed with error code: 1 [npminstall:runscript:error] node-sass^4.14.1 run postinstall node scripts/build.js error: Error: Command failed with exit code 1: node…

Allegro如何输出钻孔表操作指导

Allegro如何输出钻孔表操作指导 用Allegro做PCB设计的时候,需要输出钻孔表格,用于生产加工,如下图 如何输出钻孔表,具体操作如下 点击Manufacture点击NC

面试问题【集合】

集合常见的集合有哪些List、Set、Map 的区别ArrayList 和 Vector 的扩容机制Collection 和 Collections 有什么区别ArrayList 和 LinkedList 的区别是什么ArrayList 和 Vector 的区别是什么ArrayList 和 Array 有何区别ArrayList 集合加入1万条数据,应该怎么提高效率…

全面了解 B 端产品设计 — 基础扫盲篇

在今天,互联网的影响力与作用与日俱增,除了我们日常生活领域的改变以外,对于商业领域的渗透也见效颇丰。 越来越多的企业开始使用数字化的解决方案来助力企业发展,包括日常管理、运营、统计等等。或者通过互联网的方式开发出新的业务形态,进行产业升级,如这几年风头正劲的…

WMS相关知识点

目录一、WMS简介二、窗口的分类三、添加Window一、WMS简介 Window:在Android视图体系中Window就是一个窗口的概念。Android中所有的视图都是依赖于Window显示的。 Window是一个抽象的概念,它对应屏幕上的一块显示区域,它不是实实在在的内容&…

大学生实践| 微软ATP“师徒制”AI实战项目收获满满!

ChatGPT在极短时间内掀起了一轮AI狂潮,AI数据、AI大模型、AIGC……对我们AI实践项目感兴趣的同学也越来越多!微软(亚洲)互联网工程院下属的微软ATP为大学生们提供了丰富的企业级实践项目。2个月内!本期优秀的Chen同学在微软AI工程师团队带领下…

研报精选230301

目录 【行业230301天风证券】家用电器23W9周度研究:一图解读立达信招股说明书【行业230301财信证券】风电设备行业深度:受益大兆瓦、国产替代和技术进步,风电轴承or滚子有望迎来高景气度【行业230301中泰证券】有色金属行业周报:静…

composer安装thinkphp

人家的官方文档上步骤都有了,按照步骤走就行 安装composer 不作赘述 附一个文档链接: 安装 ThinkPHP5.1完全开发手册 看云 主要说一个自己踩过的坑吧 composer create-project topthink/think5.1.* tp5 在输入这个命令以后提示 [Composer\Downl…

git repack多包使用及相关性能测试

1、git数据结构 git 中存在四种数据结构,即object包含四种,分别是tree对象、blob对象、commit对象、tag对象 1.1 blob对象 存储文件内容,内容是二进制的形式,通过SHA-1算法对文件内容和头信息进行计算得到key(文件名)。 如果一…