1. 进程拥有独立资源,同一进程中各线程共享资源:安全
2. 线程是同一个进程中代码的不一样执行路线。线程不独立存在,必须存在于某个进程内,当进程结束时,其中的全部线程都将结束。并发
3. 进程是静态的,没有活力的,必须拥有至少一个线程,以线程为单位去抢占CPU的资源来执行任务。性能
4. 在调度和切换时,线程比进程要快许多。ui
5. 多对多模型结合了一对一模型和多对一模型的优势,将多个用户线程映射到多个内核线程上。多对多模型的优势有:1.一个用户线程的阻塞不会致使全部线程的阻塞,由于此时还有别的内核线程被调度来执行;2.多对多模型对用户线程的数量没有限制;3.在多处理器的操做系统中,多对多模型的线程也能获得必定的性能提高,但提高的幅度不如一对一模型的高。spa
所谓同步(synchronization)就是指一个线程访问数据时,其它线程不得对同一个数据进行访问,即同一时刻只能有一个线程访问该数据,当这一线程访问结束时其它线程才能对这它进行访问。同步最多见的方式就是使用锁(Lock),也称为线程锁。锁是一种非强制机制,每个线程在访问数据或资源以前,首先试图获取(Acquire)锁,并在访问结束以后释放(Release)锁。在锁被占用时试图获取锁,线程会进入等待状态,直到锁被释放再次变为可用。操作系统
1. 二元信号量线程
二元信号量(Binary Semaphore)是一种最简单的锁,它有两种状态:占用和非占用。它适合只能被惟一一个线程独占访问的资源。当二元信号量处于非占用状态时,第一个试图获取该二元信号量锁的线程会得到该锁,并将二元信号量锁置为占用状态,以后其它试图获取该二元信号量的线程会进入等待状态,直到该锁被释放。设计
2. 信号量指针
多元信号量容许多个线程访问同一个资源,多元信号量简称信号量(Semaphore),对于容许多个线程并发访问的资源,这是一个很好的选择。一个初始值为N的信号量容许N个线程并发访问。线程访问资源时首先获取信号量锁,进行以下操做:blog
1) 将信号量的值减1,进入运行状态;
2) 若是信号量的值等于0,则进入等待状态,不然继续执行;
访问资源结束以后,线程释放信号量锁,进行以下操做:
1) 将信号量的值加1,该线程继续下一步执行;
2) 若是信号量的值大于1,唤醒一个等待中的线程;
3. 互斥量
互斥量(Mutex)和二元信号量相似,资源仅容许一个线程访问。与二元信号量不一样的是,信号量在整个系统中能够被任意线程获取和释放,也就是说,同一个信号量能够由一个线程获取而由另外一线程释放。而互斥量则要求哪一个线程获取了该互斥量锁就由哪一个线程释放,其它线程越俎代庖释放互斥量是无效的。
4. 临界区
临界区(Critical Section)是一种比互斥量更加严格的同步手段。互斥量和信号量在系统的任何进程都是可见的,也就是说一个进程建立了一个互斥量或信号量,另外一进程试图获取该锁是合法的。而临界区的做用范围仅限于本进程,其它的进程没法获取该锁。除此之处,临界区与互斥量的性质相同。
5. 读写锁
读写锁(Read-Write Lock)容许多个线程同时对同一个数据进行读操做,而只容许一个线程进行写操做。这是由于读操做不会改变数据的内容,是安全的;而写操做会改变数据的内容,是不安全的。对同一个读写锁,有两种获取方式:共享的(Shared)和独占的(Exclusive)。当锁处于自由状态时,试图以任何一种方式获取锁都能成功,并将锁置为对应的状态;若是锁处于共享状态,其它线程以共享方式获取该锁,仍然能成功,此时该锁分配给了多个线程;若是其它线程试图如独占的方式获取处于共享状态的锁,它必须等待全部线程释放该锁;处于独占状态的锁阻止任何线程获取该锁,不论它们以何种方式。
定义:是指两个或两个以上的进程在执行过程当中,因争夺资源而形成的一种互相等待的现象,若无外力做用,它们都将没法推动下去。
造成死锁的四个必要条件(缺一不可):
1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已得到的资源保持不放。
3.不剥夺条件:进程已得到资源,在末使用完以前,不能强行剥夺。
4.循环等待条件:若干进程之间造成一种头尾相接的循环等待资源关系。
1. 预防死锁:经过应用程序的设计来破坏造成死锁的必要条件
这是一种较简单和直观的事先预防的方法。方法是经过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被普遍使用。可是因为所施加的限制条件每每太严格,可能会致使系统资源利用率和系统吞吐量下降。
2. 避免死锁:
该方法一样是属于事先预防的策略,但它并不须事先采起各类限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程当中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
3. 检测和解除死锁:
先检测:这种方法并不须事先采起任何限制性措施,也没必要检查系统是否已经进入不安全区,此方法容许系统在运行过程当中发生死锁。但可经过系统所设置的检测机构,及时地检测出死锁的发生,并精确地肯定与死锁有关的进程和资源。检测方法包括定时检测、效率低时检测、进程等待时检测等。而后解除死锁:采起适当措施,从系统中将已发生的死锁清除掉。这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。经常使用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统得到较好的资源利用率和吞吐量,但在实现上难度也最大。