您的位置:首页 > 大数据 > 人工智能

读书笔记:只有在事件发生的情况下执行非阻塞才能提高效率

2017-05-16 16:52 477 查看
僵尸进程:是指父进程退出之后,而子进程退出之前,该子进程即处于僵尸态.

出现僵尸进程的两种情况:

1.子进程结束之后系统并不会立即释放子进程的进程表项,而要等父进程来确认子进程的的退出信息(如果父进程还在),在这子进程退出之后,父进程读取子进程的退出信息之前,即子进程为僵尸进程.

2.父进程异常退出或结束,然而子进程还在运行.这时子进程的ppid变为1,即init进程,init 进程接管该进程,并等待子进程结束.

僵尸进程会占据着内核资源,这是不允许的,因为内核资源有限.我们可以在父进程内调用下列函数来防止出现僵尸进程.

     #include <sys/types.h>

       #include <sys/wait.h>

       pid_t wait(int *status);

       pid_t waitpid(pid_t pid, int *status, int options);

       

  wait将阻塞父进程,直到该进程的某个子进程结束.它返回结束进程的pid.

      这wait函数的阻塞特性显然并不是服务器进程期待的,而waitpid函数解决了这个问题,处理方法如下:

      waitpid 的第一个参数是指定了父进程所等待结束的子进程,第二个参数是存储结束的子进程的状态信息

  waitpid 函数的第三个参数 options 可以控制waitpid的行为,该参数的常用取值是  WNOHANG  (waitpid的行为将是非阻塞的:等待结束的进程结束会立即返回结束进程的pid,如果等待结束的子进程没有结束或者意外终止了,则waitpid会立即返回0)

  当某个子进程要结束的时候就给父进程发送信号 SIGCHILD ,父进程接收到该信号后就调用waitpid函数,并把第一个参数设置为该子进程进程号,第三个参数设置为非阻塞选项,这样在子进程结束后就可以立即彻底结束该子进程,避免子进程长期占用内核资源或者因为调用wait函数而长期阻塞父进程(这就是所谓的事件发生的情况下调用非阻塞函数效率是最高的:在子进程结束事件发生时再调用非阻塞的等待子进程结束的函数waitpid )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息