1.线程 vs 进程
线程 CPU执行的最小单位
进程 资源分配和任务调度基本单位
2. 各自特点 (优缺点)
(1).创建 和 调度
线程
创建速度快
调度速度快
并发程度 更高
(2). 安全性
线程
好处:
共享了进程的数据空间
共享数据方面 方便
缺点:
安全性不好
带来资源竞争
进程
进程空间相互独立
好处,
安全性好
缺点:
进程间共享数据不方便 //进程间通信 (管道,信号,共享内存)
线程间的资源竞争:
共享资源: 临界资源
临界区 : 访问共享资源(临界资源)那段代码
机制:
互斥锁
互斥 排他性 --- 要么不访问 要访问就是一次完整操作 (原子操作)
//锁的操作机制
框架:
定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁
定义互斥锁:
pthread_mutex_t mutex;
互斥锁类型 互斥锁变量 内核对象
初始化锁
pthread_mutex_init(); //初始化一把锁
加锁 //加锁 加在 要访问临界资源的地方
pthread_mutex_lock(); //上锁
解锁
pthread_mutex_unlock(); //解锁 临界资源访问之后就解开
销毁
pthread_mutex_destroy();//销毁一把锁
锁是一种线程间 同步机制
互斥锁 -- 保证线程对于共享资源的排他性访问 。
保证每个线程访问时的原子性操作
什么时候会发生死锁
1.对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资
源(CPU)的竞争是不会引起死锁的。
2.进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、P2分别申请并占有了资源R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。
3.信号量的使用不当也会造成死锁。如生产者消费者问题中,如果实现互斥的P操作在实现同步的
P操作之前,就有可能导致死锁。(可 以把互斥信号量、同步信号量也看做是- -种抽象的系统资
源)总之,对不可剥夺资源的不合理分配,可能导致死锁。
死锁产生的必要条件
产生死锁必须同时满足一下四个条件,只要其中任一.条件不成立,死锁就不会发生。
➊互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。
像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待
这种资源)。
❷不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
❸请求和保持条件:进程已经保持了至少-一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
❹循环等待条件:存在- -种进程资源的循环等待链,链中的
每一个进程已获得的资源同时被下一个进程所请求。
注意!发生死锁时- -定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)
如果同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有
一个,那循环等待就是死锁的充分必要条件了。
死锁的处理策略
1.预防死锁。破坏死锁产生的四个必要条件中的一个或几个。
2.避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
3.死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措
施解除死锁。