06 进程为何终止?
有什么事件会触发进程的终止呢?
- 正常退出(自愿):进程完成了工作正常终止,UNIX中退出进程的系统调用是exit。
- 出错退出(自愿):进程发现了错误而退出。可以看如下代码:
- 严重错误(非自愿):进程发生了严重的错误而不得不退出,通常是程序的错误导致,例如执行了一条非法指令,引用不存在的内存,或者除数是0等,出现这些错误时进程默认会退出。而有些时候如果用户想自行处理某种类型的错误,发生不同类型错误时进程会收到不同类型的信号,用户注册处理不同信号的函数即可。
- 被其它进程杀死(非自愿):其它进程执行kill系统调用通知操作系统杀死某个进程。
当一个进程退出后,操作系统确实会回收该进程占用的资源。具体来说:
-
内存资源:进程占用的内存空间,包括栈、堆、代码段中的机器指令和数据段中的全局变量等,都会被操作系统回收并标记为可用,以便其他进程可以使用。
-
PCB(进程控制块)资源:虽然进程退出后,内核会释放该进程所有的资源,包括打开的文件和占用的内存等,但仍然会为其保留一定的信息,主要是进程控制块PCB的信息,如进程号、退出状态、运行时间等。
-
父进程的责任:如果一个进程正常或异常终止,内核会向其父进程发送SIGCHLD信号。父进程可以通过调用wait()或waitpid()函数等待子进程结束,获取子进程结束时的状态,并回收它们的资源。父进程必须显式地回收子进程的资源,否则可能会导致系统资源的浪费。
-
内存泄漏的处理:即使存在内存泄漏的情况,进程退出后,操作系统会正确回收这些内存资源。因此,不用担心动态分配的内存没有释放会导致内存泄漏。不过,为了系统的健康运行,仍应避免在程序运行时发生内存泄漏,并尽量找到并修复内存泄漏的原因。
综上所述,进程退出后,操作系统会回收大部分占用的资源,但父进程有责任通过调用wait()或waitpid()函数来显式回收子进程的PCB资源和确保系统资源的正确释放。