进程和线程单线程多线程和多进程

Posted 永远没有404

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程和线程单线程多线程和多进程相关的知识,希望对你有一定的参考价值。

欢迎学习交流!!!
持续更新中…


进程和线程

       由于理论概念难以理解,我在查资料的过程中经常能看到这样一个形象的比喻:

进程 == 火车,线程 == 车厢

  • 线程在进程下行进(单纯的车厢无法运行)
  • 一个进程可以包含多个线程(一辆火车可以有多个车厢)
  • 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
  • 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
  • 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
  • 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
  • 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
  • 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-“互斥锁”
  • 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”

除此之外,也可以看一下阮一峰大神的一篇博客:进程与线程的一个简单解释,大神用图解释地十分清楚,他将进程和线程比喻成工厂和工人的关系

在任务管理器中可以查看自己电脑目前的进程:

理论知识

       进程是资源(CPU、内存等)分配的基本/最小单位,具有一定独立功能的程序关于某个数据集合上的一次运行活动。系统由一个个进程(程序)组成,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。

  • 文本区域存储处理器执行的代码
  • 数据区域存储变量和进程执行期间使用的动态分配的内存;
  • 堆栈区域存储着活动过程调用的指令和本地变量。

       因此进程的创建和销毁都是相对于系统资源,所以是一种比较昂贵的操作。进程有三个状态:

  • 等待态:等待某个事件的完成;
  • 就绪态:等待系统分配处理器以便运行;
  • 运行态:占有处理器正在运行。

       进程是抢占式的争夺CPU运行自身,而CPU单核的情况下同一时间只能执行一个进程的代码,但是多进程的实现则是通过CPU飞快的切换不同进程,因此使得看上去就像是多个进程在同时进行。

通信问题:由于进程间是隔离的,各自拥有自己的内存内存资源,因此相对于线程比较安全, 所以不同进程之间的数据只能通过 IPC(Inter-Process Communication) 进行通信共享。

       线程进程的一个实体,是独立运行和独立调度的基本单位(CPU上真正运行的是线程)。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

  • 线程属于进程
  • 线程共享进程的内存地址空间
  • 线程几乎不占有系统资源

通信问题:进程相当于一个容器,而线程而是运行在容器里面的,因此对于容器内的东西,线程是共同享有的,因此线程间的通信可以直接通过全局变量进行通信,但是由此带来的例如多个线程读写同一个地址变量的时候则将带来不可预期的后果,因此这时候引入了各种锁的作用,例如互斥锁等。

       同时多线程是不安全的,当一个线程崩溃了,会导致整个进程也崩溃了,即其他线程也崩溃,但多进程而不会,一个进程崩溃了,另一个进程依然照样运行。

二者区别

  • 进程是资源分配的基本单位线程是程序执行/CPU调动的基本单位
  • 进程拥有自己的资源空间,没启动一个进程,系统就会为它分配地址空间;而线程与CPU资源分配无关,多个线程共享同一进程内的资源,使用相同的地址空间。
  • 一个进程可以包含若干个线程。
  • 由于默认进程内只有一个线程,所以多核CPU处理多进程就像是一个进程一个核心

优劣

  • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(Inter Process Communication,IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  • 线程的调度与切换比进程快很多,同时创建一个线程的开销也比进程要小很多。
  • 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

单线程和多线程

单线程就是一个进程只开一个线程
       javascript 就是属于单线程,程序顺序执行(这里暂且不提JS异步),可以想象一下队列,前面一个执行完之后,后面才可以执行,当在使用单线程语言编码时切勿有过多耗时的同步操作,否则线程会造成阻塞,导致后续响应无法处理。
       如果采用 Javascript 进行编码时候,应可能的利用Javascript异步操作的特性。

       单线程处理是指一个进程中只能有一个线程,其他线程必须等待当前线程执行结束后才能执行。例如,DOS 操作系统就是一个典型的单任务处理,同一时刻只能进行一项操作。其缺点在于系统完成一个很小的任务都必须占用很长的时间。

       如果遇到大量的数据和过于狭窄的信息通道,最好的解决方案就是安排更多的线程,也就是「多线程」策略。

       多线程处理是指将一个进程分为几部分,由多个线程同时独立完成,从而最大限度地利用 CPU 和用户的时间,提高系统的效率。

       例如,在执行复制大文件操作时,系统一方面在进行磁盘的读写操作,同时还会显示一个不断变化的进度条,这两个动作是在不同线程中完成的,但给用户的感受就像两个动作是同时进行的。

       对比单线程,多线程的优点是执行速度快,同时降低了系统负荷;但其缺点也不容忽略,使用多线程的应用程序一般比较复杂,有时甚至会使应用程序的运行速度变得缓,因为开发人员必须提供线程的同步,以保证线程不会并发地请求相同的资源,导致竞争情况的发生。所以要合理地使用多线程处理技术。


多线程和多进程

多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多进程:多进程指的是在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态。多进程带来的好处是明显的,比如可以听歌的同时,打开编辑器敲代码,编辑器和听歌软件的进程之间丝毫不会相互干扰。


操作系统的设计,可以归纳为三点:

  1. 以多进程形式,允许多个任务同时运行;
  2. 以多线程形式,允许单个任务分成不同的部分运行;
  3. 提供协调机制,一方面防止进程之间和线程之间的冲突,另一方面允许进程之间和线程之间共享资源。

优秀文章引用:进程、线程和协程的概念

以上是关于进程和线程单线程多线程和多进程的主要内容,如果未能解决你的问题,请参考以下文章

多进程和多线程有啥区别?

单核和多核,单进程和多进程,单线程与多线程

多线程和多进程的区别

011_Python中单线程多线程和多进程的效率对比实验

单线程多线程和多进程的效率对比实验

多线程和多进程分别是啥意思?