您的位置:首页 > 其它

进程&线程&死锁

2016-03-21 21:26 267 查看


进程&线程&死锁

标签: 任务多线程算法存储windows磁盘
2011-09-22 22:02 2608人阅读 评论(0) 收藏 举报

版权声明:本文为博主原创文章,未经博主允许不得转载。

线程与进程

程序是计算机指令的集合,以文件形式存储在磁盘上。进程就是一个执行中的(运行的)程序,每一个进程都有其独立的内存空间和系统资源。

Windows操作系统支持多进程,即同一时间可以执行多个程序,每个程序在自己独立的内存空间内,使用自己被分配到得系统资源。

(一个CPU在某一时刻只能运行一个程序,即一个进程。所谓支持多进程,其实就是CPU轮流执行多个程序。)

线程是运行程序(进程)中单个顺序的小程序,一个进程可以由多个线程组成,而这多个线程共享同一个存储空间,这使得线程间的通信比较容易。而在一个多进程的程序中,如果要切换到另一个进程,则需要改变地址空间的位置;在多线程的程序中,由于进程中的线程位于同一个内存空间中,切换线程只需改变运行的顺序即可。

多线程指单个程序可以通过同时运行多个不同线程,来执行不同任务。所谓同时,也要依据CPU。如果是多个CPU则并发运行,如果是一个CPU,则根据系统具体情况,执行多个线程。(在Java中,线程通常是抢占式的,不需要时间片的分配)

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

死锁

死锁:在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁。也叫死亡拥抱。

例如,一个进程 p1占用了显示器,同时又必须使用打印机,而打印机被进程p2占用,p2又必须使用显示器,这样就形成了死锁。

饥饿与饿死反映了资源分配策略的不公平性。

在一个动态系统中,资源请求与释放是经常性发生的进程行为。对于每种系统资源,操作系统需要确定一个分配策略,当多个进程同时申请某种资源时,由分配策略确定资源分配给进程的次序。资源分配策略可能是公平的(fair),能保证请求者在有限的时间内获得所需资源;资源分配策略也可能是不公平的(unfair),即不能保证等待时间上界的存在。在后一种情况下,即使系统没有发生死锁,某些进程也可能会长时间等待。当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿(starvation),当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死(starve
to death)。
例如一台打印机,当有多个进程需要打印文件时,系统按照短文件优先的策略排序,该策略具有平均等待时间短的优点,似乎非常合理,但当短文件打印任务源源不断时,长文件的打印任务将被无限期地推迟,导致饥饿以至饿死。与饥饿相关的另外一个概念称为活锁(live lock),在忙式等待条件下发生的饥饿,称为活锁。

饿死与死锁有一定联系:二者都是由于竞争资源而引起的,但又有明显差别,主要表现在如下几个方面:

(1) 从进程状态考虑,死锁进程都处于等待状态,处于就绪状态(忙式等待)的进程并非处于等待状态,但却可能被饿死;

(2) 死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限没有上界;

(3) 死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死;

(4) 死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。

产生死锁的原因主要是:

(1) 因为系统资源不足。

(2) 进程运行推进的顺序不合适。

(3) 资源分配不当等。

产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

1、预防死锁

资源一次性分配:(破坏请求和保持条件)

可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)

资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求 资源,释放则相反(破坏环路等待条件)

2、避免死锁

系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法

3、死锁的消除

最简单的消除死锁的办法是重启系统。更好的办法是终止一个进程的运行。同样也可以把一个或多个进程回滚到先前的某个状态。如果一个进程被多次回滚,迟迟不能占用必需的系统资源,可能会导致进程饥饿。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: