多线程之基础篇01:进程与线程的基本概念

多线程之基础篇01:进程与线程的基本概念

标签: 多线程


进程的基本知识

进程的概念与特征

为了更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性,引入了进程的概念。

我们可以从不同的角度来定义进程:

  1. 进程是程序的一次执行过程。
  2. 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
  3. 进程是具有独立功能的程序在一个数据集合上的运行的过程,它是系统进行资源分配和调度的一个独立单位。

在笔试时可能会遇到这样的问题,我们要记住:进程是动态的运行过程,是系统进行资源分配和调度的一个独立单位。

进程的特征

  1. 动态性:进程是程序的一次执行,具有一定的生命周期,是动态的。
  2. 并发性:多个进程实体同存于内存中,能在一段时间内同时运行。
  3. 独立性:进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。
  4. 异步性:由于进程的相互制约,使进程具有执行的间断性,进程按各自独自的、不可预知的速度向前推进。
  5. 结构性:每一个进程都配置一个PCB对其进行描述。

进程的状态与转换

进程的状态:

  1. 运行状态:进程正在处理机上运行。
  2. 就绪状态:进程处于准备运行的状态,一旦得到处理机即运行。
  3. 阻塞状态:又称等待状态,进程等待某一事件或某一资源而暂停。
  4. 创建状态:进程正在被创建,尚未转到就绪状态。
  5. 结束状态:进程正在从系统中消失。

线程的基本概念

引入线程的概念,是为了减小程序在并发执行时的开销,提高操作系统的并发性能。

对于线程理解最直接的理解就是:“轻量级进程”。它是一个基本的CPU执行单元,也是程序执行流的最小单元。

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,但是可以与同一个进程的其他县城共享进程所拥有的全部资源。

在引入了线程的概念以后,进程的地位就发生了变化:进程只作为除CPU以外系统资源的分配单元,而线程则是独立调度的基本单位。

线程的状态

多线程之基础篇01:进程与线程的基本概念

说明:
线程共包括以下5种状态:

  1. 新建状态(New):
    线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread();

  2. 就绪状态(Runnable):
    也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。

  3. 运行状态(Running) :
    线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。

  4. 阻塞状态(Blocked):
    阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

    1. 等待阻塞:调用wait(),使该线程处于等待池(wait blocked pool),直到notify()/notifyAll(),线程被唤醒被放到锁定池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable)。
    2. 同步阻塞:对Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。
    3. 其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  5. 死亡状态(Dead):
    线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

这5种状态涉及到的内容包括Object类,Thread和synchronized关键字。这些内容我们会在后面的章节中逐个进行学习。

  • Object类,定义了wait(), notify(), notifyAll()等休眠/唤醒函数。

  • Thread类,定义了一些列的线程操作函数。例如,sleep()休眠函数,interrupt()中断函数, getName()获取线程名称等。

  • synchronized,是关键字;它区分为synchronized代码块和synchronized方法。synchronized的作用是让线程获取对象的同步锁。

在后面详细介绍wait(),notify()等方法时,我们会分析为什么“wait(), notify()等方法要定义在Object类,而不是Thread类中”。