进程与线程的相关知识点总结

  • 进程(process):
  1. 首先要知道操作系统在底层,负责任务的分配、资源的管理和分配,统领整个计算机硬件。而应用程序是运行在操作系统上的,需要占用操作系统的资源。那么进程就是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程。(一颗CPU同一时间段内只能处理一个任务)
  2. 定义:进程是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体,拥有独立的地址空间(系统资源)。作为拥有资源的基本单位。
  3. 进程一般由程序、数据集合和进程控制块(Program Control Block, PCB)组成。程序控制块包含进程的描述信息和控制信息,是进程存在的唯一标志。
  4. 创建或销毁进程时,操作系统要位置分配或回收资源。因此操作系统在不断地切换进程时,会不断地分配和回收资源,导致系统开销巨大。
  5. 多个程序的多个进程可以并发执行,会通过时间片轮转的抢占式调度方式来占用CPU的资源。
  • 线程(thread):
  1. 定义:线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。作为调度和分配的基本单位。
  2. 线程是包含于进程之内的,一个线程必须依托在一个进程内,同时一个进程内可能含有多个线程,但至少含有一个线程。
  3. 线程的组成:线程ID、一个指向当前被执行指令的指令指针、一个栈、一个寄存器集合(定义了一部分描述正在执行线程的处理器状态的值)以及一个私有数据区。
  4. 线程不拥有独立的资源,同一进程内的线程共享同一地址空间(系统资源)。
  5. 线程同步:一个线程访问数据时,其它线程不能访问同一数据。通过消息通信来实现线程同步。
  6. 线程的状态:创建、就绪、运行、等待(阻塞)、退出。
  7. 线程的生命周期:当线程的数量小于处理器的数量时,线程的并发是真正的并发,不同的线程运行在不同的处理器上。但当线程的数量大于处理器的数量时,线程的并发会受到一些阻碍,此时并不是真正的并发,因为此时至少有一个处理器会运行多个线程。在单个处理器运行多个线程时,并发是一种模拟出来的状态。操作系统采用时间片轮转的方式轮流执行每一个线程。现在,几乎所有的现代操作系统采用的都是时间片轮转的抢占式调度方式,如我们熟悉的Unix、Linux、Windows及Mac OS X等流行的操作系统。

  • 进程与线程的联系与区别:

       1. 进程拥有独立资源,同一进程中各线程共享资源:

       

      2. 线程是同一个进程中代码的不同执行路线。线程不独立存在,必须存在于某个进程内,当进程结束时,其中的所有线程都将结束。

      3. 进程是静态的,没有活力的,必须拥有至少一个线程,以线程为单位去抢占CPU的资源来执行任务。

      4. 在调度和切换时,线程比进程要快许多。

      5. 多对多模型结合了一对一模型和多对一模型的优点,将多个用户线程映射到多个内核线程上。多对多模型的优点有:1.一个用户线程的阻塞不会导致所有线程的阻塞,因为此时还有别的内核线程被调度来执行;2.多对多模型对用户线程的数量没有限制;3.在多处理器的操作系统中,多对多模型的线程也能得到一定的性能提升,但提升的幅度不如一对一模型的高。

  • 线程同步:

所谓同步(synchronization)就是指一个线程访问数据时,其它线程不得对同一个数据进行访问,即同一时刻只能有一个线程访问该数据,当这一线程访问结束时其它线程才能对这它进行访问。同步最常见的方式就是使用锁(Lock),也称为线程锁。锁是一种非强制机制,每一个线程在访问数据或资源之前,首先试图获取(Acquire)锁,并在访问结束之后释放(Release)锁。在锁被占用时试图获取锁,线程会进入等待状态,直到锁被释放再次变为可用。

1. 二元信号量

二元信号量(Binary Semaphore)是一种最简单的锁,它有两种状态:占用和非占用。它适合只能被唯一一个线程独占访问的资源。当二元信号量处于非占用状态时,第一个试图获取该二元信号量锁的线程会获得该锁,并将二元信号量锁置为占用状态,之后其它试图获取该二元信号量的线程会进入等待状态,直到该锁被释放。

2. 信号量

多元信号量允许多个线程访问同一个资源,多元信号量简称信号量(Semaphore),对于允许多个线程并发访问的资源,这是一个很好的选择。一个初始值为N的信号量允许N个线程并发访问。线程访问资源时首先获取信号量锁,进行如下操作:

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. 检测和解除死锁:

先检测:这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源。检测方法包括定时检测、效率低时检测、进程等待时检测等。然后解除死锁:采取适当措施,从系统中将已发生的死锁清除掉。这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

原文地址:https://www.cnblogs.com/ChenZhongzhou/p/5685637.html