进程控制

进程控制:进程创建/进程终止/进程等待/程序替换

进程创建:

pid_t fork(void);–创建一个进程–父子进程数据独有,代码共享
进程创建采用写时拷贝技术,目的是为了提高进程的创建效率
原因:按理说每个进程都应该有自己独有的内存空间,但是若创建子进程时直接开辟空间拷贝数据,将会比较慢,并且拷贝过来的数据子进程从来都不用
写时拷贝技术:子进程赋值父进程,一开始与父进程指向同一块物理内存;因此看起来父子进程完全相同;但是进程之间具有独立性,意味着当这块物理内存中的数据即将发生改变时会重新给子进程开辟物理内存,将数据拷贝过来,因为子进程应该有自己独有的数据 代码共享:因为代码段是只读的

pid_t vfork(void):创建一个子进程,并且阻塞父进程,知道子进程exit退出或者程序替换之后,父进程才会运行
vfork创建子进程效率较高,因为vfork创建子进程之后父子进程共用同一个虚拟地址空间,共用同一个虚拟地址空间,意味着共用代码段,数据段,这样如果父子进程同时运行会造成栈混乱,因此必须子进程运行,父进程阻塞,知道子进程退出,所有函数出栈;vfork创建的子进程不能使用main中的return退出,因为main中的return退出会释放资源
为什么要创建一个子进程?
创建子进程大多数情况下并不是为了让子进程干跟自己一样的活,而是让子进程去调度另一个程序运行
进程创建的流程:在内核中调用clone接口创建pcb,从父进程-pcb中拷贝数据过来,-写时拷贝

进程终止:

退出一个进程
main函数中的return,退出进程时会刷新缓冲区
void exit(int status);—库函数 退出时调用进程,将status作为返回值返回给父进程
void _exit(int status);—系统调用接口 退出调用进程,将status作为返回值返回给父进程
库函数和系统调用接口的关系:库函数封装了系统调用接口
exit/return退出时都会刷新缓冲区;_exit退出的时候直接释放资源,不刷新缓冲区
exit和return又有什么区别:return之后再main函数中才会退出进程,而exit在任意位置调用都会退出进程

进程等待:

父进程等待子进程退出,获取子进程的返回值,避免产生僵尸进程
pid_t wait(int* status);–阻塞等待任意一个子进程退出,获取子进程的返回值放到status指向的空间中,并且释放资源,返回退出子进程的pid
阻塞:为了完成某个功能发起的一个调用,若不具备完成功能的条件,则调用不返回一直等待
非阻塞:为了完成某个功能发起的一个调用,若不具备完成功能的条件,则立即报错返回;非阻塞操作通常需要循环操作
pid_t waitpid(pid_t pid,int *status,int options);
pid:若 == -1,则表示等待任意一个子进程退出,若是>0,则表示等待指定的子进程退出
status:输出型参数,传入一个int空间的首地址,获取退出的子进程返回值
options:选项参数,0–则表示默认阻塞等待;WNOHANG–将waitpid设置为非阻塞–没有子进程已经退出的话就立即报错返回
如何判断子进程是否是正常退出?
若status低7位为0则表示程序正常退出;否则表示程序异常退出
获取子进程的返回值:低16位中的高8位

程序替换:

替换一个进程的程序调度信息(进程是一个pcb,负责调度管理一个程序的运行,运行的数据和代码都在内存中),将另一个程序加载到内存中,让原有的pcb不再调度原程序,而去调度新的程序。
程序替换本质上来说就是替换一个pcb在内存中的代码和数据(加载另一个程序到内存中,然后更新页表信息,初始化虚拟地址空间)这个进程pcb将从头重新开始调度新的程序。
程序替换之后,当前进程运行完替换后的程序就会退出,并不会重新回去运行原先的程序

我们在终端中运行一个程序,这个程序的父进程实际上是shell程序,这时候我们来理解一下到底为什么我们输入一个./main就能运行main程序?
当我们在shell送输入一个命令,这时候其实shell对这个标准输入进行解析,得到了程序名称然后创建子进程,并且将子进程的程序替换为当前这个解析出来的程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值