进程与线程总结
1.什么是进程?
进程其实是一个运行中的程序,从操作系统的角度来看,进程是一个pcb,是对运行程序的描述,在linux下,这个pcb其实是一个task_struck{…}结构体
2.什么是线程?
线程是进程的一条执行流,是进程的一个实体,一个进程中可以有多条线程,同一个进程中的线程共享进程中的大多数资源,因此,线程可以说是一个轻量级进程。
3.进程与线程的区别
根本区别:
进程是资源调度和分配的基本单位;
线程是cpu调度的基本单位;
从资源开销方面讲:
进程有自己独立的代码和空间,进行进程间切换是开销比较大;
同一类线程共享进程的资源,开销比较小
从内存分配方面讲:
进程中的资源和地址空间是独立运行的
同一进程中的线程共享进程中的资源与空间
4.多进程与多线程
多进程:
同时运行多个程序。比如:qq,微信,浏览器同时运行;
多线程:
同一时刻执行多条线程。比如说:在浏览器上一边下载视频,一边看视频;
5.并发与并行
并发:
当一个进程中有多条线程运行时,如果操作系统只有一个cpu,根本不可能同时运行一条以上线程,只能把cpu运行时间分为多个时间段,再把这些时间段分配给各个线程去执行,这就是并发。
并行:
当一个系统有一条以上的cpu时,线程的运行有可能非并发,当一个cpu执行一条线程时,另一个cpu执行另一条线程,两个线程互不抢占cpu资源,可以同时进行,我们称这种情况为并行。
6.线程安全
概念:
就是线程对临界资源的访问是安全的。
实现:
通过同步与互斥实现的。
同步:使线程按照某一秩序访问临界资源,保证访问的合理性。
互斥:使进程在同一时间内只有一个访问资源,保证访问的安全性。
同步的实现:
通过条件变量实现。条件变量提供了一个等待队列,以及使线程阻塞或唤醒的接口,程序员根据流程控制,使线程在不满足资源获取或访问的情况下阻塞,在满足访问条件下唤醒阻塞线程。
互斥的实现:
互斥主要通过互斥锁来实现的。互斥锁的本质是一个0/1计数器,它标记了临界资源的两种访问状态,当有一个线程在访问临界资源时,互斥锁将临界资源置为不可访问状态,而当这个线程不再访问时,互斥锁就将临界资源置为可访问状态,这样其他线程就可以争抢该资源。
7.死锁
概念:
死锁描述的是同一组进程中,一个进程无限等待被同一组进程中的另一进程所占有的资源,导致这个处于等待中的程序流程无法推进,出现程序卡死的状态。
产生死锁的四个必要条件
互斥条件:一份资源每次只能分配给一个进程所使用
请求与保持条件:进程在申请新资源的同时保持对原有资源的占有。也就是说,进程并不是一次性地得到所有资源,而是得到一部分后,继续申请其他资源。
不可剥夺条件:资源申请者不能强行从资源占有者手中夺取资源,资源只能有占有者主动释放。
环路等待条件:存在一个进程等待队列 {p1,p2…pn},其中p1等待被p2占有的资源,p2等待被p3占有的资源…pn等待被p1占有的资源,形成一个进程等待环路。
预防死锁:
破坏产生死锁的必要条件,加解锁顺序一致,如果无法解锁则释放已有的锁。
避免死锁:
银行家算法,死锁检测算法
8.线程池
概念:
线程池是多线程的一种处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。
组成:
线程池管理器:用于创建和管理线程池。
工作线程:线程池中的线程
任务接口:每个任务都必须实现的接口,以便于工作线程对任务的调度执行。
任务队列:用于存放一些没有处理的任务。提供一种缓冲机制。
功能作用:
节省了大量线程频繁创建和销毁所带来的的时间成本上的开销。
避免了资源无限使用导致资源耗尽的风险。
9.进程间通信
进程间通信方式有:管道,消息队列,共享内存,信号量。
原因:
因为进程之间具有独立性(每个进程都有自己独立的虚拟地址空间),因此它们无法进行直接通信,所以操作系统提供了进程间的通信方式来实现进程间通信。
管道:
内核中的一块缓冲区,多个进程通过进入同一个管道(同一块缓冲区)就可以实现通信。
管道分类:匿名管道/命名管道
依据:根据有没有标识符进行区别
匿名管道没有标识符,命名管道含有标识符。
管道特性:
1.半双工通信(通信双方都可以发送信息,但不能同时发送,这种通信方式是一方发送另一方接收,过一段时间再反过来)
2.读写特性(管道中没有数据则read阻塞/管道中数据满了则write阻塞/关闭所有读端write会出发异常导致进程退出/关闭所有写端read会返回0不再阻塞)。
3.自带同步与互斥。
同步:通过条件判断实现对临界资源的访问合理性。
互斥:通过唯一访问实现对临界资源的访问安全性。
4.生命周期随进程
消息队列
概念:
内核中的一个优先级队列,多个进程通过访问同一个队列,进行添加或获取节点的方式实现进程间通信。
流程:
1.创建消息队列(在内核中创建一个优先级队列)
2.进程向消息队列里添加/删除节点
3.销毁消息队列
消息队列特性:
自带同步与互斥
生命周期随内核
共享内存:
本质原理:
在物理上开辟一块内存空间,多个进程可以将同一块内存空间映射到自己的虚拟地址空间,通过自己的虚拟地址访问这块空间,通过这种方式实现进程间通信。
共享内存的流程:
1.创建共享内存–在物理上开辟空间
2.进程将共享内存映射到自己的虚拟地址空间
3.基本的操作都可以在这块空间上完成
4.解除虚拟地址空间与内存空间的关系
5.释放共享内存资源
共享内存特征:
1.最快的进程间通信方式
2.生命周期随内核
3.共享内存并没有自带同步与互斥,光使用共享内存进行进程间通信是存在安全隐患的。
信号量:
实现进程间的同步与互斥。
本质:
信号量的本质是内核中的一个计数器+pcb等待队列。
具体实现:
信号量实现同步:
通过计数器对资源计数;计数>0表示进程可以直接获取资源;计数<=0表示进程不能直接获取资源,进程通过等待队列接口进入等待队列,等有资源再唤醒进程。
信号量实现互斥:
只需保证信号量的资源不会大于1就可以实现了。