进程
所谓的进程就是运行中的程序的一种封装,是系统进行资源调度和分配的基本单位,是实现操作系统的并发,以提高系统的资源利用。但是有一些缺陷,比如说进程在同一时间只能做一件事,而且呢,进程如果在执行的过程中被阻塞,整个进程就会处于被挂起的状态,即使进程中有些工作不依赖于被挂起的资源,他仍然不会被执行。所以这时候线程就出现了。
线程
线程是进程的子任务,是CPU进行资源调度的基本单位,是用于保证程序的实时性,实现进程内部的并发。
线程的生命周期
新建->就绪->运行->等待/阻塞/睡眠->终止
线程与进程的关系
- 一个进程可以有多个线程,但至少有一个线程;但一个线程只能属于一个进程。
- 进程在执行的过程中有独立的内存单元,多个线程可以共享进程的内存。
多线程
多线程模型优势是线程间切换代价比较小,因此适用I/O密集型的工作场景,多线程也适用于单机多核分布场景。每个线程都独占一个虚拟处理器:独立的寄存器组,计数器,处理器,在多线程中每个线程完成不同的任务,但共享同一地址空间
- 多线程可以更好地利用CPU的资源,若只有一个线程,则第二个任务必须等到第一个任务结束后才能进行,若使用多线程,则在主线程执行任务的同时可以执行其他任务,而不需要等待。
- 线程之间可以共享数据,进程不可以
- 系统创建进程需要重新为该进程分配系统资源,而创建一个线程的代价比较小
线程间通信方式:
1、临界区
通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量
采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以保证公共资源不会被多个线程同时访问。
3、信号
用于通知操作的方式来保持多线程的同步,还可以方便实现多线程优先级比较。
4、信号量
用于控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻访问同一资源,但一般要限制最大访问的线程数。
多线程中的互斥锁、读写锁
互斥锁:用于保证在任一时刻,都只有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠状态,等待锁释放时被唤醒
读写锁:保证能同时被读,但只能有一个线程可写,等待写锁释放,被唤醒。 写锁会阻塞其他读写锁。写优先于读。
死锁
多个线程对锁资源竞争访问,但因为推进顺序不当,导致互相等待,使程序无法往下运行。
产生条件:
- 互斥条件: 一个锁只有一个线程可以获取
- 不可剥夺条件: 我加的锁,别人不能解
- 请求与保持条件: 一个进程因为请求资源被阻塞,他已获取的资源保持不放
- 循环等待条件: 若干进程形成头尾衔接循环等待资源