进程控制

本文详细介绍了操作系统的进程管理机制,包括进程切换的过程、上下文的保存与恢复、进程创建的方法(如fork/exec/vfork)、进程加载的流程以及进程间的等待与退出机制。此外还涉及进程的优先级控制和调试技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇博客简要说明以下几个问题:
进程切换,内核如何实现进程间切换?
进程创建,用户要创建新进程,如何创建呢?
进程加载,如何运行一个新进程?
进程等待与退出,父子进程的交互

进程切换:

进程切换实际上是上下文的切换。暂停当前运行的进程,从运行态变成其他状态;调度另一个进程从就绪态变成运行态。
进程切换的要求是 切换前保存进程上下文,切换后恢复进程上下文(上下文:主要指寄存器中的信息),快速切换
进程生命周期的信息有寄存器信息(PC,SP…),CPU状态,内存地址空间
那这些信息都保存在哪里呢?保存在PCB(进程控制块)里。内核为每个进程维护了对应的进程控制块(PCB);内核将相同状态的进程PCB放置在同一队列
进程控制块怎么组织呢?如下图:
在这里插入图片描述
PCB里大致都放些啥东西呢?分为这么几类:
进程的标识信息(执行的哪个可执行文件,id是多少,父进程id等)
进程的状态信息(CPU状态寄存器里的信息,地址空间,页表起始地址,进程状态,是否允许调度等)
进程占用的资源(分配给它的内存(内存地址空间mm),内核堆栈信息等)
保护现场的信息(寄存器信息等上下文信息)
指针结构(本进程在哪个PCB队列当中)

进程创建:

fork/exec
fork()把一个进程复制成两个进程
exec()用新程序来重写当前进程

在这里插入图片描述
fork()创建一个继承的子进程,复制父进程的所有变量和内存,复制父进程的所有CPU和寄存器(有一些寄存器例外,为了区别进程id)
fork()一次调用两次返回,子进程中的fork()返回0,父进程的fork()返回子进程标识符,子进程可以使用getpid()获取PID。
exec()的执行会重新加载进程中的代码,把地址空间理的代码都换掉。堆栈也会被换掉。
fork()怎么实现呢?都干些什么呢?1.先分配个进程控制块PCB。2.创建内核堆栈。3.设置地址空间。4.修改子进程状态变为运行状态。
空闲进程。空闲进程是什么?当操作系统把用户的进程都执行完了,没任务了,这时候我们认为系统是暂停的,实际上CPU没停下来,CPU还在执行指令,这时候执行的就是空闲进程。
空闲进程的创建:分配资源,对进程控制块进行设置,完成初始化。优先级最低,没任务了来执行它。

fork()的开销:对子进程分配内存,复制父进程的内存和CPU寄存器到子进程里,开销非常大!
而且,一般情况下,我们在调用了fork()后接着就调用了exec();那fork()里复制一大堆东西不是脱裤子放屁——多此一举吗,刚复制来,又给丢了。那是不是可以别进行复制,把复制的这个开销给省掉呢?答案是可以,用vfork()。
vfork():创建进程时,不再创建一个同样的内存映像;可称之为轻量级fork();子进程应该立即调用exec();现在使用COW技术(Copy on Write)

进程加载:

进程加载指用户的程序通过调用exec()来完成一个可执行文件的加载,覆盖原来的当前进程的地址空间,然后开始执行。(把文件从外存中加载进来,然后跳转到上面执行)
加载后,代码段、堆栈、堆和数据等完全重写。

进程等待与退出:

父子进程之间的交互,完成子进程资源的回收。
wait()系统调用用于父进程等待子进程的结束。子进程结束时通过exit()向父进程返回一个值;父进程通过wait()接受并处理返回值。
wait()系统调用的功能:1.有子进程存活时,父进程进入等待状态,等待子进程的返回结果;当某子进程调用exit()时,唤醒父进程,将exit()返回值作为父进程中wait()的返回值。2.有僵尸子进程等待时,wait()立即返回一个值。3.没有子进程存活时,wait()立即返回。
exit()系统调用的功能:1.将调用参数作为进程的运行结果。2.关闭所有打开的文件等占用资源。3.释放内存。4.释放大部分进程相关的内核数据结构。5.检查父进程是否存活着(存活:保留结果的值直到父进程需要他,进入僵尸进程;不存活:释放所有的数据结构,进程结果)6.清理所有等待的僵尸进程。

优先级控制
nice()指定进程的初始优先级,Unix系统中进程优先级会随执行时间而衰减。

进程调试
ptrace()允许一个进程控制另一个进程的执行,设置断点和查看寄存器等

定时:sleep()可以让进程在定时器的等待队列中等待

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值