程序地址空间:进程的虚拟地址空间
虚拟地址空间:mm_struct,内存描述符
进程控制:
fork--通过复制调用进程创建一个新的子进程,复制--pcb代码共享,数据独有--程序计数器(运行的位置也一样)
返回值:父进程返回子进程的Pid,子进程返回0;
写时复制技术
vfork--创建子进程,共用同一个虚拟地址空间--(共用同一个调用栈)为了防止调用栈混乱,因此父进程调用vfork会阻塞,
阻塞到子进程“exit退出”或者子进程程序替换(不能return退出,会释放自己的地址空间),开辟内存创建自己的地址空间
fork/vfork在内核中创建进程都是调用clone函数实现pcb创建并拷贝数据的;
vfork存在的意义是为了创建子进程的效率更高,但是fork通过写时拷贝技术实现了进程创建;
进程终止: 进程退出
退出场景:正常退出(结果符合预期),异常退出
如何退出:只有main 函数中return 1; //退出前刷新缓冲区
void exit这是一个库函数;//任意位置都是退出进程,退出前刷新缓冲区
void_exit这是一个系统调用接口 ;//不会刷新缓冲区,即不会打印(去掉printf中\n就可以打印)
库函数和系统调用接口的关系:上下级的封装调用关系
进程等待:等待子进程的状态改变(等待子进程的退出)------获取子进程的退出返回值,避免子进程成为僵尸进程;
若父进程获取了子进程的返回值,僵尸子进程将没有存在的意义,就会被释放资源
因为不知道何时退出,因此只能创建之后一直等着子进程的退出
为什么要等待子进程的退出:因为子进程退出时,为了保存退出原因,因此操作系统不能释放子进程全部资源,因此通知获取子进程推出返回值
允许释放资源,但是操作系统的通知没有使父进程关注到子进程的退出,因此子进程成为僵尸进程。
如何等待:pid_t wait(int *status)
pid_t waitpid(int pid,int* statu,int option)
wait接口功能时以置等待任意一个子进程退出,子进程退出后,获取到返回值,放到传入的参数statu中
如果没有子进程退出,wait函数将一直阻塞;
waitpid可以等待指定的一个子进程退出,并且可以设置为非进程;
阻塞:为了完成一个功能发起系统调用,当前若不具备完成条件,等待直到条件具备完成功能后返回;
非阻塞:为了完成一个功能发起系统调用,当前若不具备完成条件,则立即报错返回;
statu中,高16位没有使用,其中低16位中,高八位存储子进程退出返回值,低八位中的高一位中存储core dump标志,低七位中的存储一场推出信号值
低七位中异常退出返回值若为0,则表示程序正常退出
进程3
最新推荐文章于 2024-03-14 21:49:17 发布
