进程 & 线程
进程、线程、协程的概念
-
进程:
进程是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态的概念,竞争计算机系统资源的基本单位。
进程有独立的地址空间。
-
线程:
线程是比进程粒度更小的单元,线程是进程的一个执行单元,每个线程拥有独立的程序计数器、栈、寄存器、状态,并且一个进程内的所有线程共享进程的地址空间、全局变量、子进程与打开文件等。
关键词:划分尺度、共享、地址空间、并发
操作系统的四个特性
- 并发
- 异步
- 共享
- 虚拟
进程间通信的几种方式
-
管道(pipe)
调用pipe函数,会在内核中开辟一块缓冲区进行进程间通信,这个缓冲区就称为管道,管道有一个读入端和一个写入端,依赖于文件系统(只能用于具有亲缘关系的进程
-
命名管道(FIFO)
与管道的不同之处在于它提供了一个路径名与之关联,以FIFO的文件形式存储于文件系统中。该管道允许无亲缘关系的进程间通信
-
共享内存
共享内存会建立一块协作进程共享的内存区域,进程通过共享区交换数据
-
信号量
信号量本质上是一个计数器,信号量可用于实现临界区的互斥使用
-
信号
信号可以用于通知某个进程某个事件已经发生
信号本质是软件层次对中断机制的一种模拟,信号是异步的(进程间通信中唯一的异步通信机制)
-
消息队列
-
套接字
线程同步的几种方式
-
互斥对象
互斥量、锁之类的,只有拥有互斥对象才可以访问
-
临界区
串行化访问一些公共资源
-
信号量
允许多个线程在同一时刻访问一个公共资源
-
事件对象
通过通知操作的方式来保持多线程同步
死锁的概念及产生的条件
概念
在两个或多个并发的进程中,如果进程持有某种资源而其正在等待别的资源被释放,而该资源同样的被其他进程持有并且等待前一个进程持有的资源被释放。
在这种状态下进程无法向前推进,进而导致死锁。
产生的四个必要条件
- 互斥:
- 占有并等待
- 不可抢占
- 循环等待
死锁后的解决方案
- 回滚至安全状态
- 强制结束某个进程
死锁的预防
- 打破互斥条件
- 鸵鸟算法(因为死锁发生频率,就不管,遇到就重启
进程的状态
三种状态:运行态、就绪态、阻塞态。
graph LR
就绪态 --> 运行态
运行态 --> 就绪态
运行态 --> 阻塞态
阻塞态 --> 就绪态
线程的状态
在 JVM 中,线程有以下几种状态
- 创建(new
- 就绪(runnable
- 运行(running
- 阻塞(blocked
- 等待(waiting
- 时间等待(time waiting
- 终止(terminated
进程调度策略
-
FCFS(先到先服务
-
SJF(Shortest job fist,最短作业优先调度算法
-
时间片轮转调度算法(可抢占的)
在就绪队列中每个进程只会被分配一个时间片的CPU时间,如果进程的CPU区间超过了一个时间片,那么该进程将会被抢占并重新回到就绪队列
-
多级队列调度算法(多个队列,每个队列有优先级,每个进程永久的属于某个队列
-
多级反馈队列调度算法(同上,不过进程可以动态调整所属队列
IPC通信的七种方式
- 管道/匿名管道 传统Unix的通信机制,管道是半双工的,数据只能向一个方向流动,调用pipe函数,会在内核中开辟一块缓冲区进行进程间通信,这个缓冲区就称为管道。【只能用于具有亲缘关系的进程】
- 有名管道 无名管道是一种特殊类型的文件,在内核空间中对应的资源即是一段内存空间,内核在这段空间以循环对列的方式临时存入一个进程发送给另一个进程的信息,这段内核空间完全由操作系统管理和维护,应用程序只需要,也只能通过系统调用来访它。
- 信号 信号其实是软件层次上对中断机制的一种模拟,是一种异步通信方式,信号可以在用户空间进程和内核之间直接交互,可以用于通知某个进程某个事件已经发生,Linux中常用信号:用户注销、进程退出、定时器等
- 信号量 信号量本质是一个计数器,用于多进程对共享数据的访问
- 消息队列 消息队列是存放在内核中【与两种管道不同】的消息链表,允许多个进程对其进行读取写入,遵循FIFO且允许随机查询。
- 共享内存 允许多个进程对同意快内存空间进行访问,速度最快,需要使用同步机制来打到同步及互斥
- 套接字 套接字是一种通信机制,凭借这种机制,B/S(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。