题目来源牛客网文章——《感谢牛客网!发一波面经!》
索引:
Q | Title |
---|---|
1 | 进程和线程的区别? |
2 | 进程间通信的方式有什么?线程间通信的方式有什么? |
Q1:进程和线程的区别?
参考资料《进程和线程的主要区别(总结)》
进程 | 线程 | |
---|---|---|
根本区别 | 操作系统资源分配基本单位任务调度和执行的基本单位 | 任务调度和执行基本单位 |
转换开销 | 每个进程都有独立代码和数据空间,程序间切换会有较大开销 | 线程可看做轻量级的进程。同一类线程共享代码和数据空间,每个线程拥有独立的程序计数器和运行栈,切换开销小 |
所处环境 | 操作系统中可以有多个进程 | 一个进程中可以有多个线程 |
内存分配 | 每个进程都有分配的内存 | 不分配内存,线程使用的资源来自于所属进程,线程组之间共享资源 |
Q2:进程间通信的方式有什么?线程间通信的方式有什么?
一、进程间通信
参考资料《进程间的五种通信方式介绍》
总结
管道:速度慢,容量有限,只能父子进程通信
FIFO:任何进程间都可以通信,但是速度慢
消息队列:容量受系统限制,且需要考虑上次未读完内容。
信号量:不能传递复杂消息,只能用于同步
共享内存:容易控制容量,速度快,但要保持同步。
管道
半双工:数据只能在一个方向流动,有固定读端和写端
仅能用于亲缘关系进程间通信:父子进程或兄弟进程
只存在于内存:可以看做特殊的文件,也可以用read和write。但是他不是普通的文件,并不输入任何文件系统。
FIFO
可以在无关进程之间通信
有路径名,以特殊设备文件形式存在于文件系统
消息队列
消息的链接列,存放在内核
面向记录,消息有特定格式和特定优先级
独立于发送和接收进程,进程终止,消息队列中内容不会消失
可以实现消息随机查询,消息不一定按先入先出读取,也可以按消息类型读取
信号量
用于进程间同步,在进程间传递数据需要结合共享内存
基于操作系统PV操作,程序对信号量操作是原子的
每次操作可加减任意值
支持信号量组
共享内存
两个或多个进程,共享一个给定的存储区
共享内存是最快的IPC,因为进程直接对内存存取
多个线程可以同时操作,所以需要同步
信号量+共享内存通常同时使用,信号量用于同步对共享内存的访问
二、线程间通信
同步
多个线程通过synchronized通讯,类似于共享内存
while轮询
线程A不断改变条件,线程B不断查看条件是否满足需求(比方说=5),从而实现通讯。
效率不高,因为B一直在查看,没做别的
wait/notify
进入阻塞,而不是像轮询一样一直占用CPU资源
管道通信
通过管道,将一个线程的消息发送个另一个线程
网友评论