Linux下应用层进程、应用层线程和内核线程
前言
总结一下,应用层进程、应用层线程和内核线程的一些基本知识点、以及它们的通信方式、比较比较不同。
主要参考了两本书 《UNIX环境高级编程》、《Linux内核设计与实践》
一、应用层进程
1.ID
每个进程都有独一无二的进程ID,ID为0:调度进程,也叫交换进程,属于内核的一部分。ID为1:Init进程(自举过程中由内核调用,自举后启动一个UNIX内核),不会终止、会成为所有孤儿进程的父进程。
2.fork和vfork
fork和vfork都是创建一个新的子进程,会有两个返回值,返回值为0的是子进程、返回值不为0(子进程ID)的是父进程。其中vfork的主要目的就是创建一个新的进程执行新的程序(exec),并且它可以保证一定是子进程先运行,子进程要调用exec或者exit后,父进程才运行。如果子进程的运行对父进程有依赖,就有可能导致死锁。
3.一些特殊的进程/线程
①父进程运行完了,子进程还在-------> 孤儿进程
②父进程还在,子进程运行完了都是没有释放(父进程未收尸)------->僵尸进程。init进程会接手子进程,为他收尸。
③主线程推出了,子线程强制退出。
4.wait与waitpid
wait与waitpid用于父进程等待子进程,为他收尸(释放资源)。
5.exec函数族
调用一种exec函数时,该进程执行的程序会替换为新的程序。