功能
多进程系统内的进程(或任务)有时需要等待其他进程以完成自己的执行过程,而在包含父-子进程机制的类UNIX系统中,父进程能创建可独立运行的子进程,并在需要时调用wait(函数声明为pid_t wait(int *stat_loc))以使自己在子进程执行过程中保持休眠状态。当任一子进程结束后,该子进程会向操作系统返回一个退出状态,而后系统即向休眠中的父进程发送一个SIGCHLD信号以提醒之,至此父进程“复苏”并从内核获取子进程的退出状态,而后内核释放原有子进程所占用的资源,父进程也继续执行。
派生
对于带有线程机制的类UNIX系统来说,对于线程调度也有对应wait的实现:pthread_join会让当前进程强制休眠,等待指定线程执行完毕后再继续执行。
类UNIX系统还提供多种wait的派生调用(如waitpid和waitid)以扩展适用范围。借助于这些变种,父进程可以休眠至任一子进程结束,也可以等待满足指定条件(如匹配给定的进程标识符)的子进程结束后再继续执行。另外,若利用额外选项做参数,waitpid和waitid在指定进程继续运行或暂停执行时也会返回。
僵尸进程
即使没有提前调用wait,在任一进程终止后,系统内核都会向其父进程发送SIGCHLD,这时父进程可以选择使用SIG_IGN作为处理函数,令内核知晓自己不需获得状态,并直接交由init进程处理;亦可调用wait,则立即返回子进程退出状态。若两者皆不做,则子进程在进程表中占用的资源就无法得到释放,进而成为僵尸进程,持续浪费资源[1]。为解决这一问题,系统常以特殊进程reaper(“收割者”)定位僵尸进程,并获取其状态以使系统可以解除资源分配,从而“收割”之[2]。
参见
- exit (操作系统)
- fork (操作系统)
- sleep (操作系统)
- Spawn (电脑)
- wait (Shell)
- 等待状态
参考来源
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.