多线程学习(一)---线程与进程

参考文章:

多线程三分钟就可以入个门了!
多线程全面详解总结

1. 进程与线程的定义

1.1 进程

很常见,在windows下,打开任务管理器,就能看见操作系统正在运行的进程:
进程
网上进程的定义有很多:

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

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

进程是系统进行资源分配和调度的独立单位。每一个进程都有它自己的内存空间和系统资源。

是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。

是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

1.2 线程

线程,计算机科学术语,有时也被称为轻量级进程(Light Weight Process,LWP),它是运行中的程序的调度单位。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程被包含在进程之中,是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

简单来说,单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。

2. 进程已经是可以进行资源分配和调度了,为什么还要线程

为使程序能并发执行,系统必须进行以下的一系列操作:

(1)创建进程,系统在创建一个进程时,必须为它分配其所必需的、除处理机以外的所有资源,如内存空间、I/O设备,以及建立相应的PCB;
(2)撤消进程,系统在撤消进程时,又必须先对其所占有的资源执行回收操作,然后再撤消PCB;
(3)进程切换,对进程进行上下文切换时,需要保留当前进程的CPU环境,设置新选中进程的CPU环境,因而须花费不少的处理机时间。

进程
可以看到进程实现多处理机环境下的进程调度,分派,切换时,都需要花费较大的时间和空间开销。

引入线程主要是为了提高系统的执行效率,减少处理机的空转时间和调度切换的时间,以及便于系统管理,使OS具有更好的并发性。

简单来说:进程实现多处理非常耗费CPU的资源,而我们引入线程是作为调度和分派的基本单位(取代进程的部分基本功能------调度),使一个进程可以执行多个任务。

也就是说:在同一个进程内可以执行多个任务,这每一个任务就可以看做是一个线程。

所以说:一个进程会有1个或多个线程的!

3. 进程与线程的比较

进程是资源分配的基本单位。所有与该进程有关的资源,都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。
另外,进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。

与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。
当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。

线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。

发生进程切换与发生线程切换时相比较,进程切换时涉及到有关资源指针的保存以及地址空间的变化等问题;线程切换时,由于同不进程内的线程共享资源和地址 空间,将不涉及资源信息的保存和地址变化问题,从而减少了操作系统的开销时间。而且,进程的调度与切换都是由操作系统内核完成,而线程则既可由操作系统内 核完成,也可由用户程序进行。

总结:
进程作为资源分配的基本单位。
线程作为资源调度的基本单位,是程序的执行单元,执行路径(单线程:一条执行路径,多线程:多条执行路径)。是程序使用CPU的最基本单位。

4. 线程

线程的3个基本状态: 执行、就绪、阻塞
线程的5种基本操作: 派生、阻塞、激活、 调度、 结束
线程状态
线程的属性:

  1. 轻型实体
  2. 独立调度和分派的基本单位
  3. 可并发执行
  4. 共享进程资源

线程有两个基本类型:

  1. 用户级线程:管理过程全部由用户程序完成,操作系统内核心只对进程进行管理。
  2. 系统级线程(核心级线程):由操作系统内核进行管理。操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行以及撤消线程。

线程的生命周期:

  1. 新建 :从新建一个线程对象到程序start() 这个线程之间的状态,都是新建状态;
  2. 就绪 :线程对象调用start()方法后,就处于就绪状态,等到JVM里的线程调度器的调度;
  3. 运行 :就绪状态下的线程在获取CPU资源后就可以执行run(),此时的线程便处于运行状态,运行状态的线程可变为就绪、阻塞及死亡三种状态。
  4. 等待/阻塞/睡眠 :在一个线程执行了sleep(睡眠)、suspend(挂起)等方法后会失去所占有的资源,从而进入阻塞状态,在睡眠结束后可重新进入就绪状态。
  5. 终止 :run() 方法完成后或发生其他终止条件时就会切换到终止状态。

5. 多线程执行流程

多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率,程序的执行其实都是在抢CPU的资源,CPU的执行权。多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权。

为什么要用多线程:
①、为了更好的利用cpu的资源,如果只有一个线程,则第二个任务必须等到第一个任务结束后才能进行,如果使用多线程则在主线程执行任务的同时可以执行其他任务,而不需要等待;
②、进程之间不能共享数据,线程可以;
③、系统创建进程需要为该进程重新分配系统资源,创建线程代价比较小;
④、Java语言内置了多线程功能支持,简化了java多线程编程。

6. 并行与并发

并行性是指同一时刻内发生两个或多个事件。
并行是在不同实体上的多个事件。

并发性是指同一时间间隔内发生两个或多个事件。
并发是在同一实体上的多个事件。

由此可见:并行是针对进程的,并发是针对线程的。

猜你喜欢

转载自blog.csdn.net/a770794164/article/details/91979238