一、进程与线程的区别
1.进程是系统资源分配的最小单元。
2.线程是系统任务调度的最小单元。
3.进程间的地址空间是相互独立的,因此进程间进行数据交换需要使用IPC(进程间通信)
4.线程共享进程的地址空间,因此线程间进行数据同步是不需要使用IPC的,但是需要使用信号量,互斥量等同步机制
5.多线程消耗的系统资源少于多进程
6.多线程编程时,一旦其中的一个线程崩溃很有可能导致整个进程崩溃,而多进程就不会。
7.多进程占内存多,切换复杂,CPU的利用率低,多线程反之。
二、什么情况下使用多线程,什么情况下使用多进程
1.需要频繁创建与销毁时优先使用多线程
2.需要大量计算时优先使用多线程
3.数据需要频繁进行同步时优先使用多线程
4.任务与任务之间关联性强时优先使用多线程,反之使用多进程
三、进程间通信方式(IPC)比较
1.管道:半双工通信方式,管道文件是一种特殊的文件,可以使用read,write等系统接口操作文件。管道分为:无名管道和有名管道。
2.消息队列:通讯双方通过内核中维护的一条消息队列进行通信,该方法比较落后。
3.共享内存:进程间通过共享内存进行通信,数据在内核中只拷贝了一次,因此数据交换的速度非常快。由于是共享资源,因此需要使用信号量等同步机制来保持数据的同步。
4.信号量:不是用来传递数据,是用来协调多进程或多线程的工作,是一种保障数据同步的机制,分为system V信号量和posix信号量。
四、什么是僵尸进程,孤儿进程,守护进程(精灵进程)
1.僵尸进程:子进程退出之后,资源还没有被回收,这样的进程就被称为僵尸进程。
2.孤儿进程:父进程在子进程之前退出,这时的子进程就被称为孤儿进程,孤儿进程由init进程(守护进程)托管。
3.守护进程(精灵进程):是一种生存期很长的进程。通常独立于控制终端,不与用户交互,在后台运行。
五、父子进程的执行顺序
1.在Linux中父子进程是并行的,哪个先执行是不确定的。
六、父(主)子线程的执行顺序
顺序进行,如果主线程在子线程前,就先执行主线程,然后再交替执行子线程。如果主线程在子线程后面,那么两者一起抢占CPU,交替执行。
七、多线程,多进程的调度方式
多线程执行时跟进程一样,是来回切换运行的,跟进程的调度机制一样,分为:非抢占式和抢占式(时间片轮询,优先权原则,短作业(进程)优先原则)