1.进程,线程的区别?
- 进程是资源分配的最小单位,线程是系统调度的最小单位。
- 进程拥有独立的内存空间,线程共享所属进程的内存空间
- 进程切换开销较大,线程切换开销较小
- 进程间独立,一个进程崩溃不会影响其他进程,一个线程崩溃,导致整个进程崩溃
- 进程间通信比较麻烦,线程间共享内存
- 线程是进程的一部分,一个进程可以包含多个线程
2.多线程,多进程的优缺点?
多进程的优点:稳定性高:每个进程拥有独立的内存空间,一个进程崩溃不会影响其他进程;安全性高:不同进程之间不能访问彼此内部的数据,需要通过IPC机制进行通信。
多进程缺点:创建、销毁、切换等操作开销大,每个进程都需要单独占用一些系统资源,因此创建、销毁、切换操作比较耗时;通信复杂:不同进程间通信需要通过IPC机制通信,增加编写程序的复杂度。
多线程优点:创建、销毁、切换等开销小;共享数据方便:所有进程都可以访问同一进程的的数据;响应速度快。
多线程缺点:稳定性差:所有线程共享一块内存空间,一个线程崩溃可能会影响整个进程。安全性差多个线程访问同一份数据容易引起(死锁、资源抢占等问题)
3.什么时候用进程,什么时候用线程?
(1)需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
(2)线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应
(3)因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;
(4)并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
(5)需要更稳定安全时,适合选择进程;需要速度时,选择线程更好
4.进程间通信方式
管道:有亲缘关系的进程匿名管道。没有亲缘关系命名管道。半双工通信方式,只允许单向数据传输,数据先进先出,写入的数据读取后才能继续写入。
共享内存:进程间可以共享同一段存储空间,将这段存储空间就称为共享内存。
消息队列:全双工,可读可写。在linux内核创建一个队列结构,将需要发送和读取的数据插入到队列,多个不同的进程通过相同的key值找到相同的队列。
信号量:是一个计数器,信号量用于实现进程间的互斥与同步,多个进程在资源竞争的时候,当信号值为0则阻塞,直到信号的值恢复为1才可以继续。常见操作有P和V,P操作将信号量值-1,V操作将信号的值+1.
5.父进程,子进程的关系和区别?
新的进程的创建是通过复制父进程而得到的,子进程复制了父进程的进程表项、文件屏蔽字、根目录、当前工作目录、环境表、进程的资源限制、用户id,组id、控制终端。父子进程的区别有PID、PPID;子进程内核记录的时间会初始化为0、文件锁、未决信号、未决闹钟。
6.子父进程的应用场景?
子父进程执行不同的代码段。主要在网络服务中比较常见,例如服务器父进程接收客户端的请求,创建子进程处理业务。或者子进程执行不同的程序,主要应用在shell。
7.线程的同步和互斥?
互斥,多线程的环境下,当多个线程同时访问同一资源,该资源只允许一个线程访问,其他线程需要等待,直到资源被释放。
同步,多个线程竞争时,按照一定的顺序执行。
8.孤儿进程,僵尸进程,守护进程?
孤儿进程,父进程不等待子进程退出,在子进程之前结束生命,这种子进程叫做孤儿进程。Linux存在避免过多的孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。
僵尸进程,创建子进程后,子进程退出状态不被父进程收集,变成僵尸进程。
守护进程,不与终端交互,在后台执行的程序。
9.守护进程的编程规则?
fork子进程,父进程终止,子进程调用setsid(2),文件屏蔽字设为0,工作目录切换到根目录,文件描述符0,1,2重定向到"/dev/null",关闭没必要的文件描述符。
10.死锁条件,解决方法?
死锁:多线程在竞争资源的时候,出现了僵死的状态
死锁的必要条件:①互斥条件(一个资源每次只能被一个线程或进程使用)②不可剥夺条件(已经分配给线程或进程的资源不能被强制性剥夺,只能持有者主动释放)③循环等待条件(每个线程或进程都在等待下一个进程或线程持有的资源)④请求与保持条件(进程或线程至少需要持有一个资源,等待其他资源时不释放已占有的资源)
避免产生死锁:打破请求与保持--》锁加时效,在时效内没有达到目的则释放资源
打破循环等待--》锁加顺序