五、进程
8. 进程地址空间
我们上节知道了进程地址空间是根据页表来使虚拟地址转换成内存中的物理地址,那这种 地址空间 + 页表 的机制有什么好处呢?①这种机制可以将物理内存从无序变有序,让进程以统一视角看待内存。②可以将进程管理和内存管理进行解耦合。③是保护内存安全的重要手段。
在我们使用 malloc / new 申请内存时,其实是向虚拟地址申请合法空间,此时页表并不将申请的虚拟地址空间映射到物理地址,即此时并没有申请到合法的物理空间,知道我们向申请的空间中写入的时候,页表才会映射物理地址,才真正的申请了内存中的物理空间,然后向物理空间中写入。
9. 进程终止
常见的进程退出方法:
正常终止:
①从main函数返回。
②调用exit函数。
③_exit
异常退出:
ctrl + c ,信号终止。
main 函数的返回值叫做进程的 退出码 ,一般 0 表示进程执行成功,非 0 表示进程执行失败,不同的数字表示不同的失败原因 。
进程的退出场景:①代码运行完毕,结果正确。②代码运行完毕,结果错误。③代码异常终止,没有运行完毕。
代码异常退出的本质就是 收到了异常信号 。
不同的编号表示不同的异常原因。
10. 进程等待
父进程通过进程等待的方式,回收子进程资源(必要的,防止出现僵尸进程),获取子进程退出信息(可选的)。
父进程可以通过 wait() 或者 waitpid() 函数来等待获取子进程的返回结果,避免子进程一直成为僵尸进程而照成内存泄漏。
如果子进程还没有运行结束,父进程就已经运行到 wait() 或者 waitpid() 函数,则父进程将会在此等待,直到子进程结束。