当前位置: 首页 > news >正文

Linux 进程:进程控制

目录

  • 一、进程创建
    • 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.lryc.cn/news/25466.html

相关文章:

  • 过滤器的创建和执行顺序
  • JDK1.8 ConcurrentHashMap
  • 参考 Promise/A+ 规范和测试用例手写 Promise
  • yolov5数据集制作
  • 主板EC程序烧写异常致无法点亮修复经验
  • 【Java爬取赛事网站】命令行输出(仅供学习)
  • redis主从复制原理
  • buu刷题(第一周)
  • 算法训练营 day62 单调栈 每日温度 下一个更大元素 I
  • ChIP-seq 分析:Peak 注释与可视化(9)
  • ABB机器人配置DeviceNet总线IO板以及信号分配的具体方法示例
  • 2023 年网络安全漏洞的主要原因
  • 剑指 Offer 34. 二叉树中和为某一值的路径
  • 2023前端vue面试题(边面边更)
  • webpack配置完全指南
  • juju创建lxd容器时如何使用本地镜像(by quqi99)
  • 后端程序员学习前端开发之第一步环境搭建
  • 【记录问题】RuntimeError:working outside of application context. Flask使用SQLAlchemy数据库
  • 自动化测试难点案例分析,其实自动化你用错方向还不如不用
  • 866363-70-4,N3-C5-NHS ester,叠氮-C5-NHS 主要物理性质分享
  • 字符流定义及如何深入理解字符流的编码
  • 什么是pod类型
  • 2023年中小企业实施智能制造的建议
  • 【LeetCode】剑指 Offer 19. 正则表达式匹配 p124 -- Java Version
  • linux和windows中安装emqx消息服务器
  • 【XXL-JOB】XXL-JOB的搭建和使用
  • HCIP-5OSPF基本原理及基本配置学习笔记
  • Migrate your data into databend with DataX
  • ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
  • 有限元中三角形的一些积分公式