4.进程和线程的区别
-
资源分配上
有线程前,进程是计算机资源分配的最小单位;有线程后,除了cpu,进程仍然是计算机分配资源的最小单位。进程创建时分配整个虚拟内存地址空间(无论是不是子进程),进程间内存地址空间相互隔离;线程创建时,只分配独立的栈空间,与其它线程共享进程的公共资源。
-
创建和销毁上
进程创建和销毁时,给进程分配或回收资源需要内核参与,而线程创建或销毁时不需要内核参与,由用户空间的线程库管理,只有涉及到线程的进程资源回收时才会有内核的参与,整体上线程的开销更小。进程通过fork创建子进程,线程通过pthread_create创建子线程。子进程在创建时,逻辑上复制父进程的整个地址空间,包括文件描述符等。子线程创建时,只在进程空间的栈区新建一个自己的栈,其它资源线程间共享。进程和线程在销毁上也有差别,如果不做特殊设置,父进程结束时,子进程不会自动结束,变成孤儿进程;父线程结束时,如果不做特殊设置,子线程会随之结束。
-
os调度上
有线程前,os调度的基本单位是进程;有线程后os调度的基本单位变为线程。进程的调度需要保存的上下文包括cpu状态、进程的地址空间、分配的io设备、打开的文件等等,需要内核参与,且要处理的东西很多;线程的调度需要保存和切换的上下文只包括cpu状态和线程的栈,虽然也需要内核参与,但要处理的东西相对于进程来说大大减少,开销小。
-
进程或线程间通信上
进程间通信方法有信号、管道、信号量、共享内存、消息队列等,大部分需要内核参与,操作也比较复杂;线程间通信的方法有共享内存空间、互斥锁、条件变量、信号量等,相较进程更加灵活。
-
稳定和可靠性上
由于线程独占资源很少,大部分内存空间的数据线程间共享,很容易产生竞争条件,导致数据不安全,一个线程的崩溃可能会导致其它线程崩溃;进程由于内存地址空间相互隔离,一个进程发生错误不容易影响到其它进程,基本上没有这样的问题,比线程来说更容易实现稳定和可靠。
5.中断和异常的区别
-
产生原因
-
中断是由于外部条件变化产生的,比如io数据到来或者io传输完成等。
-
异常是由于内部条件变化产生的,比如除0异常
-
-
响应方式
- 中断:通常是由硬件触发,当硬件设备发出中断请求时,CPU 会在当前指令执行完后,暂停正在执行的程序,转而执行中断处理程序。中断处理程序执行完毕后,再返回原来被中断的程序继续执行。
- 异常:大多是由软件或 CPU 内部事件引发。异常发生时,CPU 会根据异常类型,立即跳转到相应的异常处理程序进行处理。处理完成后,根据异常的具体情况,可能返回原程序继续执行,也可能终止程序。
-
优先级
- 中断:具有不同的优先级,硬件可以根据紧急程度设置中断的优先级。例如,电源故障中断的优先级通常较高,而一些普通的 I/O 中断优先级相对较低。CPU 会优先处理高优先级的中断请求。
- 异常:也有优先级之分,但一般来说,异常的优先级相对固定。例如,除数为零异常、内存访问越界异常等通常具有较高的优先级,会被优先处理,以避免系统出现严重错误。
-
可屏蔽性
- 中断:通常可以被屏蔽,即通过设置中断屏蔽寄存器等方式,暂时禁止某些中断请求的响应。这样可以在处理一些关键任务时,避免被其他不重要的中断干扰。
- 异常:一般不可屏蔽,因为异常通常表示程序或系统出现了严重的问题,需要立即处理,不能被忽略或延迟。例如,除零异常一旦发生,必须马上进行处理,否则程序将无法继续正确执行。
-
处理程序的位置
- 中断:中断处理程序通常是由操作系统或设备驱动程序提供,存放在内存的特定区域。不同的中断源对应不同的中断处理程序,这些处理程序主要负责与硬件设备进行交互,完成数据传输、状态更新等操作。
- 异常:异常处理程序一般由操作系统内核提供,也可能由编程语言的运行时环境提供。异常处理程序主要用于处理程序运行过程中出现的错误或特殊情况,如进行错误恢复、资源释放等操作。
6.进程和线程的本质区别
- 进程独占内存地址空间,线程大部分资源共享。进程切换在内核态,线程切换在用户态。
7.多进程和多线程的区别是什么?换句话说,什么时候该用多线程,什么时候该用多进程?
-
使用多进程的场景:
-
CPU 密集型任务,因为多进程可充分利用多核 CPU,并行处理任务,避免单核瓶颈。
-
高隔离性需求,因为进程间内存隔离,一个进程崩溃不会影响其他进程。
-
跨平台或分布式系统,因为进程模型更易扩展到不同主机(如通过消息队列)。
-
-
使用多线程的场景:
-
I/O 密集型任务,因为线程在 I/O 等待时可快速切换,提高 CPU 利用率。
-
低延迟响应需求,因为线程切换开销小,适合需要快速响应的场景。
-
资源共享便捷性(内存数据库 Redis),因为线程直接共享内存,无需复杂 IPC 机制。
-
8.进程间通信方式?
-
管道(半双工单向数据流,基于内核缓冲区,适用于父子进程(匿名管道)或有亲缘关系的进程(命名管道 FIFO))。
-
共享内存(多个进程映射同一块物理内存到各自的虚拟地址空间,直接读写共享区域。速度最快,但需配合同步机制,需处理竞态条件和缓存一致性问题)。
-
信号(内核向进程发送异步事件通知,仅传递信号编号,不携带数据,适合简单控制)。
-
文件映射(将文件映射到进程的虚拟地址空间,多个进程可共享同一文件映射。结合了共享内存和文件持久化的优势,适合大文件读写)。
-
消息队列 内核维护的链表结构,进程通过消息类型收发数据。支持异步通信,允许随机读取消息,但数据块大小受限)。
-
信号量(计数器+等待队列,用于协调多个进程对共享资源的访问。P 申请资源,V 释放资源。主要用于同步,而非传输数据)。
-
套接字*(基于网络的通信接口,支持跨主机进程通信。流式套接字* TCP *可靠,面向连接。*数据报套接字 UDP 不可靠,无连接)
9.线程间通信的方式?
- 共享内存(线程直接读写进程内的全局变量或堆内存。必须使用互斥锁,读写锁等避免
竞态)。
- 互斥锁(确保同一时间进一个线程访问共享资源。lock 获取锁,unlock 释放锁。解决写
冲突,但可能引发死锁)。
-
条件变量(允许线程在特定条件满足时唤醒其他线程。wait阻塞等待条件,signal或broadcast 通知条件变化)。
-
信号量(类似进程间信号量,控制线程对共享资源的并发访问)。
10.Linux程序运行找不到动态库.so文件的三种解决办法
11.Linux进程同步的机制
-
什么是同步、异步?什么是阻塞、非阻塞?
-
进程间通信的方式有哪些?
-
进程的六种状态
-
什么是孤儿进程?什么是僵尸进程?怎么避免僵尸进程?
-
结束进程的方式有哪些?
-
什么是会话(session)?
-
守护进程与后台进程的区别
-
写时拷贝
-
自旋锁
-
谈一下对多线程的理解,如生产者 - 消费者问题。
-
什么是死锁?死锁产生的条件?怎么解决死锁问题?
-
信号量处理耗费多长时间,信号量同步会有什么问题
-
登录 shell 进程是如何启动的?shell 是如何调用系统调用的?
-
sleep()调用后进程有哪些过程,在sleep()的过程中进程占用CPU了吗?
-
线程池有什么好处?
-
讲一下线程池?
-
什么是线程安全?
-
多线程间共享数据,用什么方式来保存它们的安全性
-
什么是线程安全函数,工作中如何保证线程安全
-
可重入函数是什么意思,为什么一定是线程安全的
评论