现在的位置: 首页 > 综合 > 正文

线程、多线程、进程、多进程是什么

2020年02月24日 综合 ⁄ 共 1929字 ⁄ 字号 评论关闭

  1.线程和进程简介:

  进程

  一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。

  线程

  又称其为轻量级进程(Light Weight Process)。是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。他们彼此之间交替执行,称为多线程;

  多线程

  多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

  硬件基础:

  具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。

  软件多线程:

  即便处理器只能运行一个线程,操作系统也可以通过快速的在不同线程之间进行切换,由于时间间隔很小,来给用户造成一种多个线程同时运行的假象。这样的程序运行机制被称为软件多线程。如微软的Windows作业系统和Linux就是在各个不同的线程间来回切换,被称为单人多任务作业系统。而DOS这类文字接口作业系统在一个时间只能处理一项工作,被视为单人单工作业系统。

  2.操作系统中的多进程

  以图形化界面操作系统Windows为例,桌面未点击运行的程序不能称之为进程,只有点击运行之后才为进程,运行的进程会在任务管理器上可查看到

  Windows任务管理器

  单核的CPU在任何时间点上只能运行一个进程;而达到实际意义上在同一时间运行多个进程则需要多核CPU,这是最基本的硬件需求。

  单核cpu怎么进行多进程操作的呢?

  假设我们现在Windows运行QQ,Chrome,IDEA等应用程序,那么CUP的执行方式如下:

  多进程运行方式

  举例:CPU先执行运行QQ的一百行代码,然后进入暂停;CPU接着去执行Chrome一百多行代码,进入暂停;CPU接着执行IDEA一百行代码,进入暂停:然后重新回到QQ继续执行······循环往复~这也体现了CPU的雨露均沾!

  因此这里操作系统通过快速的在不同进程之间进行切换,因为CPU的执行速度是非常快的,CPU循环依次执行各个程序,以达到给用户造成一种多个进程同时运行的假象。

  因此当从微观角度去观察时,其实线程还是串行进行的,但是从宏观角度来看,整体是并行进行的,

  即:宏观并行,微观串行;

  3.程序中的多线程

  一个进程是由多个线程组成的,他们是包含关系;比如某个程序运行起来需要执行1000行代码,CPU需要将这些代码分给多个线程来执行,因为线程才是CPU的最小调度单位,当这些线程执行完毕之后,那么我们的进程也就随之执行完毕。

  回顾整个多进程的实现:

  在执行多进程的时候(执行QQ,Chrome,IDEA等应用程序),前文叙述是依次执行一些代码,循环执行,事实上是,CPU会将每个进程的任务分配给多个线程,(如若QQ,Chrome,IDEA等三个进程分别包含5个线程),然后QQ执行该进程里的第一个线程,执行完毕后开始执行Chrome的第一个进程,其次执行IDEA的第一个进程,然后回到QQ看是执行它的第二个进程······循环往复~ 当这些线程执行完毕之后,那么我们的进程也就随之执行完毕。

  4.JVM(Java虚拟机)

  类似地, Java虚拟机是一个进程,当默认中包含主线程(Main),可通过代码创建多个独立进程,与Main并发执行。这就是程序员需要做的——多线程编程。

  5.线程的组成

  线程的组成:CPU时间片;运行数据:堆空间、栈空间;线程的逻辑代码。

  CPU时间片:操作系统会为每个线程分配执行时间(执行的线程对象和执行的时间都是随机的)。

  运行数据:

  堆空间:存储线程需使用的对象,多线程可以共享堆中的对象。

  栈空间:存储线程需使用的局部变量,每个线程都拥有独立的栈。

  线程逻辑代码:程序员需要写相应的逻辑代码让CPU执行。

  堆:堆中是用来存放对象的,一个Java程序拥有一个堆,堆对于多个线程来说是可共享的;

  栈:栈里面存的是栈帧结构,对应的是一个方法,每个方法里面会有局部变量,仅供本方法使用,因此栈也称之为线程私有空间;所有的线程都会拥有自己的栈;即:堆空间共享,栈空间独立。

抱歉!评论已关闭.