什么是线程?什么是进程?
线程与进程都是CPU时间段的描述。
进程为CPU加载上下文+CPU执行上下文+CPU保存上下文的时间总和(进程资源独立)
线程是共享了进程的上下文环境的更细小的时间段(线程资源共享)
通俗理解:打开一个QQ(进程),发送语音(线程),发送文字(线程),发送图片(线程)
线程的互斥与同步
什么叫线程的互斥?
多个线程共享同一资源,当资源被某一线程抢占后,其他线程都变成挂起状态,等待资源的释放
通俗理解:就是多个线程抢占打印机
什么叫线程的同步?
A线程的结果被B线程所需要
那么从上面的同步互斥概念可以理解出:若AB线程共享同一资源,这就是互斥,要么A先获得资源B挂起,或B获得资源A挂起,这里就是同步。所以同步也就包含互斥,互斥算是特殊的同步。
如何进行线程同步
若AB抢占同一资源(临界资源),在A抢占资源时,给资源加了互斥锁,若资源为多个,那么则使用信号量(向系统提供安全分配临界资源的方法),当A线程完成后,主动去唤醒B线程,这就是事件的使用。还有另一种高级的线程同步方法:令牌
为什么会产生死锁?
线程A先占用资源a,后占用资源b,线程B先占用资源b,后占用资源a,A需要的资源B占用,B需要的资源A占用,这时就产生了僵局,这就是死锁。
由此可分析得出死锁产生的条件:
不抢占资源、循环等待、互斥条件(某段时间内,该资源只能被A线程使用)、请求与保持
如何避免死锁?
除了破坏必要四个条件中的任意一个,还有一个著名的银行家算法
银行家算法:
(1)A进程所请求的B资源数<=A所需要的B资源数
(2)A所请求的B资源数<=系统所拥有的B资源数
(3)系统所拥有的B资源数-=A所请求的B资源数,
A所需要的B资源数-=A所请求的B资源数,
A所占用的B资源数+=A所请求的B资源数
(4)安全性检测,若安全性检测无问题,那么(3)执行有效,否则作废
一、定义一个Flag[i]=false
二、在进程集合中找到满足Flag[i]==false&&所需要的资源数小于系统所拥有的资源数,
三、当该进程获得资源执行完成之后,释放出分配给它的资源,
那么:系统所拥有的资源数+=进程P执行的资源数,Flag[i]=true,转向二
四、若所有进程Flag[i]=true都满足,那么说明系统处于安全状态
哲学家就餐问题:
两个重要断言
1.系统中有N个并发进程,若规定每个进程需要2个资源,系统提供N+1个资源,那么进程间永远不会产生死锁。
2.系统中有N个并发进程,假设系统提供K个资源就不会产生死锁,每个进程所需资源为R,那么K=N(R-1)+1
网友评论