当前位置: 代码迷 >> 综合 >> 线程和进程的小结(未完待续)
  详细解决方案

线程和进程的小结(未完待续)

热度:110   发布时间:2023-11-27 21:39:10.0

进程与线程
关系:
进程程序的一次运行实例,是cpu等硬件资源分配的最小单位
线程是进程中执行运算的最小单位
一个进程可以有多个线程
一个线程只属于一个进程
线程是一种轻量级进程,与进程相比线程的操作给操作系统带来的创建、维护、管理的负担要轻,即线程的代价或开销比较小
线程的缺点
性能损失
健壮性降低
缺乏访问控制
编程难度提高
线程控制
线程创建
线程终止
线程等待
线程分离:-----在任意一个时间点上,线程是可结合(joinable)或者是可分离的(detached)。
一个可结合线程是可以被其他线程收回资源和杀死的。在被回收之前,他的存储器资源(栈等)是不释放的。
而对于detached状态的线程,其资源不能被别的线程收回和杀死,只有等到线程结束才能由系统自动释放

线程安全
多个线程同时操作临界资源而不会出现数据二义性
在线程中是否对临界资源进行了非原子操作
实现
同步:临界资源的顺序访问
互斥:临界资源同一时间的唯一访问权
互斥锁:
0/1计数器
步骤:
定义互斥锁变量
初始化互斥锁变量
加锁
(工作)
解锁
销毁互斥锁
死锁:因为对一些无法加锁的锁进行加锁而导致程序卡死
一组进程中每个进程都无限等待被该组进程中另一进程所占有的资源,而处于的一种僵持局面,若无外力作用,它们都无法向前推进, 这种现象称为进程死 锁(Deadlock),这组进程就称为死锁进程。
死锁产生的四个必要条件
1.互斥条件:唯一访问(临界资源或者说是不共享资源)
2.不可剥夺条件:紧紧捆绑,分不开
3.请求与保持条件:给了我就属于我,不还
4.环路等待条件: 乌洛波洛斯(咬住尾巴的蛇)
产生:加锁解锁的顺序不同,死犟,也不看有没有危险
预防死锁:破坏必要条件 (设置限制条件,去破环至少一种死锁产生的必要条件)
避免死锁:死锁检测算法,银行家算法(用某种方法防止进入不安全状态,即确保始终处于安全状态)
同步
实现:
定义条件变量
初始化条件变量
等待和唤醒
销毁条件变量
生产者与消费者模型:一个场所,两种角色,三种关系
功能:解耦合,支持忙闲不均,支持并发
信号量:计数器+等待队列+等待+唤醒
信号量和条件变量:信号量与互斥量不同的地方在于,信号量一般用在多个进程或者线程中,分别执行P/V 操作。条件变量一般和互斥锁同时使用,或者用在管程中。
线程池: 以对规定数量/有最大数量限制的线程+任务队列–用于并发处理任务请求
优点:
*
避免大量频繁的线程的创建销毁的时间成本
*
避免峰值压力带来的瞬间大量线程被创建资源耗尽,程序崩溃的危险

三个调研:感谢大佬们的总结
种类和使用场景: http://www.cnblogs.com/sachen/p/7401959.html
设计模式: https://www.cnblogs.com/wq920/p/6143132.html
锁的种类及应用场景:https://blog.csdn.net/u012658346/article/details/51188116

  相关解决方案