1 进程间通信方式
(1)管道
管道是单向通信的一种方式,只能从一端读另一端写,有两种管道:
无名管道:linux的管道符 |
有名管道:mkfifo myPipe
(2). 消息队列
消息队列是使用队列的方式,进程将消息放入队列中,不阻塞,立即继续执行,另外一个进程从消息队列中读取消息
(3)共享内存
共享内存一般是进程与进程间共有一块物理内存,可以向共享内存写入内容,然后另外一个从内存中读取内容
(4)信号量
信号量其实是控制进程间读取共享内存的一种方式,其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。
信号量表示资源的数量,控制信号量的方式有两种原子操作:
- 一个是 P 操作,这个操作会把信号量减去 1,相减后如果信号量 < 0,则表明资源已被占用,进程需阻塞等待;相减后如果信号量 >= 0,则表明还有资源可使用,进程可正常继续执行。
- 另一个是 V 操作,这个操作会把信号量加上 1,相加后如果信号量 <= 0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行;相加后如果信号量 > 0,则表明当前没有阻塞中的进程;
(5)信号
对于异常情况下的工作模式,就需要用「信号」的方式来通知进程。比如操作系统的kill 命令
(6)Socket
跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。
2 进程,线程,协程的区别与先练
进程是操作系统进行资源分配的基本单,位每个进程都有自己的独立内存空间。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
线程又叫做轻量级进程,是进程的一个实体,是处理器任务调度和执行的基本单位位。它是比进程更小的能独立运行的基本单位。线程只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
协程,又称微线程,是一种用户态的轻量级线程,协程的调度完全由用户控制(也就是在用户态执行)。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到线程的堆区,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。调度完全有用户自己掉调度。
3 并发和并行的区别
- 并发(Concurrency)是指在同一时间段内处理多个任务的能力,任务在逻辑上是同时发生的,但在物理上可能是交替执行的。就类似于多线程,一个cpu上运行一个进程运行多个线程,多个线程之间交替占用cpu去执行
- 并行(Parallelism)则是指在同一时间点上真正在多个物理核心上同时执行多个任务。类似与多进程,每个进程占用一个cpu去执行。
4 进程调度算法
(1)先来先服务
每次从就绪队列选择最先进入队列的进程,然后一直运行,直到进程退出或被阻塞,才会继续从队列中选择第一个进程接着运行。
(2)最短作业优先调度算法
优先选择运行时间最短的进程来运行,这有助于提高系统的吞吐量。
(3) 高响应比优先调度算法
每次进行进程调度时,先计算「响应比优先级」,然后把「响应比优先级」最高的进程投入运行,「响应比优先级」的计算公式:

(4)时间片轮转调度算法
每个进程被分配一个时间段,称为时间片(Quantum),即允许该进程在该时间段中运行。
(5) 最高优先级调度算法
就绪队列中选择最高优先级的进程进行运行,这称为最高优先级(Highest Priority First,HPF)调度算法。
(6)多级反馈队列调度算法
- 设置了多个队列,赋予每个队列不同的优先级,每个队列优先级从高到低,同时优先级越高时间片越短;
- 新的进程会被放入到第一级队列的末尾,按先来先服务的原则排队等待被调度,如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成;
- 当较高优先级的队列为空,才调度较低优先级的队列中的进程运行。如果进程运行时,有新进程进入较高优先级的队列,则停止当前运行的进程并将其移入到原队列末尾,接着让较高优先级的进程运行;
5 乐观锁与悲观锁
- 悲观锁做事比较悲观,它认为多线程同时修改共享资源的概率比较高,于是很容易出现冲突,所以访问共享资源前,先要上锁。
- 乐观锁做事比较乐观,它假定冲突的概率很低,它的工作方式是:先修改完共享资源,再验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作。