线程和进程的区别是什么?

进程:

时间片轮转的抢占式调度方式:

        先了解一下操作系统的一些相关概念,大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(并发简单来说多个任务同时执行)。(https://mp.weixin.qq.com/s?__biz=MzA4NzQzMzU4Mg==&mid=2652936390&idx=2&sn=6e3d85164b0dd3bc2e22f389a1173203&chksm=8bedb0c7bc9a39d1fcdf8802599cd3e279c1b2b5cbc2a357f9afe8c2075766330bab495f31ec&mpshare=1&scene=23&srcid=10273bVzwCvk1PUaPPLHvouO&sharer_sharetime=1603812684134&sharer_shareid=4ed060cc4cd1efce40e3ab6dd8d8c7d4#rd)

 

 

 

进程:

计算机的核心是CPU,它承担了所有的计算任务;

操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;

应用程序则是具有某种功能的程序,程序是运行于操作系统之上的;

 

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体

进程一般由程序、数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志

 

进程具有的特征:

•动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;

•并发性:任何进程都可以同其他进程一起并发执行;

•独立性:进程是系统进行资源分配和调度的一个独立单位;

•结构性:进程由程序、数据和进程控制块三部分组成。

进程的生命周期

在早期只有进程的操作系统中,进程有五种状态,创建、就绪、运行、阻塞(等待)、退出。

 

 

 时间片用尽和阻塞什么关系???  

•创建:进程正在创建,还不能运行。操作系统在创建进程时要进行的工作包括分配和建立进程控制块表项、建立资源表格并分配资源、加载程序并建立地址空间;

•就绪:时间片已用完,此线程被强制暂停,等待下一个属于他的时间片到来;

•运行:此线程正在执行,正在占用时间片;

•阻塞:也叫等待状态,等待某一事件(如IO或另一个线程)执行完;

•退出:进程已结束,所以也称结束状态,释放操作系统分配的资源。

 

线程

在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。

后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程,线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间

一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。

 

多线程与多核 上面提到的时间片轮转的调度方式说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。很多操作系统的书都说“同一时间点只有一个任务在执行”。其实“同一时间点只有一个任务在执行”这句话是不准确的,至少它是不全面的。

 

 

看了一遍排在前面的答案,类似”进程是资源分配的最小单位,线程是CPU调度的最小单位“这样的回答感觉太抽象,都不太容易让人理解。(https://www.zhihu.com/question/25532384)

资源分配 ?CPU调度?

首先来一句概括的总论:进程和线程都是一个时间段的描述,是CPU工作时间段的描述。是运行中的程序指令的一种描述,这需要与程序中的代码区别开来。

另外注意这里我说的进程线程概念,和编程语言中的API接口对应的进程/线程是有差异的。

 

 一个最最基础的事实:CPU太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM和别的挂在各总线上的设备则难以望其项背。那当多个任务要执行的时候怎么办呢?轮流着来?或者谁优先级高谁来?不管怎么样的策略,一句话就是在CPU看来就是轮流着来。这些任务,在外在表现上就仿佛是同时在执行。

一个必须知道的事实:执行一段程序代码,实现一个功能的过程之前 ,当得到CPU的时候,相关的资源必须也已经就位,就是万事俱备只欠CPU这个东风。所有这些任务都处于就绪队列,然后由操作系统的调度算法,选出某个任务,让CPU来执行。然后就是PC指针指向该任务的代码开始,由CPU开始取指令,然后执行。
 
这里要引入一个概念:除了CPU以外所有的执行环境,主要是寄存器的一些内容,就构成了的进程的上下文环境。进程的上下文是进程执行的环境。当这个程序执行完了,或者分配给他的CPU时间片用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去做的主要工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。(寄存器是什么?
(寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,存器有累加器(ACC)。
寄存器是位于CPU或GPU内部的少量的高速存储器,用于保存机器指令的操作数。由于其价格昂贵导致其数量有限,又由于存取速度快,使其不可或缺。因此,寄存器是计算机体系结构中的关键资源之一。在计算复杂表达式的过程中产生的中间结果也保存在寄存器中。更复杂的编译器会把经常使用的变量放在寄存器里,来避免反复地存取。如果是优化的编译器,会把公共子表达式消除或者循环不变量移动以后的重用值放在寄存器中。
其中寄存器是GPU上运行速度最快的内存空间,通常其带宽为8TB/s左右,延迟为1个时钟周期。核函数中声明的一个没有其他修饰符的自变量,通常就存储在寄存器中。最快速也最受偏爱的存储器就是设备中的寄存器,属于具有重要价值有极度缺乏的资源。)
 
串联起来的事实前面讲过在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是:先加载进程A的上下文,然后开始执行A,保存进程A的上下文,调入下一个要执行的进程B的进程上下文,然后开始执行B,保存进程B的上下文。。。

========= 重要的东西出现了========
进程和线程就是这样的背景出来的,两个名词不过是对应的CPU时间段的描述,名词就是这样的功能。

  • 进程就是上下文切换之间的程序执行的部分。是运行中的程序的描述,也是对应于该段CPU执行时间的描述。
  • 在软件编码方面,我们说的进程,其实是稍不同的,编程语言中创建的进程是一个无限loop,对应的是tcb块。这个是操作系统进行调度的单位。所以和上面的cpu执行时间段还是不同的。 ???
  • 进程,与之相关的东东有寻址空间,寄存器组,堆栈空间等。即不同的进程,这些东东都不同,从而能相互区别。

线程是什么呢?
进程的颗粒度太大,每次的执行都要进行进程上下文的切换。如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:

程序A得到CPU =》CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。

这里a,b,c的执行是共享了A进程的上下文,CPU在执行的时候仅仅切换线程的上下文,而没有进行进程上下文切换的。进程的上下文切换的时间开销是远远大于线程上下文时间的开销。这样就让CPU的有效使用率得到提高。里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段。线程主要共享的是进程的地址空间。

 

到此全文结束,再一个总结:

进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。

注意这里描述的进程线程概念和实际代码中所说的进程线程是有区别的。编程语言中的定义方式仅仅是语言的实现方式,是对进程线程概念的物化。

 

这个问题,是操作系统里问的最多的问题之一,也是被误解最深的概念之一。Alan Kay说过,好的角度可以提升80分的智商。理解它们的差别,我从资源使用的角度出发。所谓的资源就是计算机里的中央处理器,内存,文件,网络等等

进程,在一定的环境下,把静态的程序代码运行起来,通过使用不同的资源,来完成一定的任务。比如说,进程的环境包括环境变量,进程所掌控的资源,有中央处理器,有内存,打开的文件,映射的网络端口等等。

这里我把进程对内存的管理稍微展开说一下。一个系统中,有很多进程,它们都会使用内存。为了确保内存不被别人使用,每个进程所能访问的内存都是圈好的。一人一份,谁也不干扰谁。还有内存的分页,虚拟地址我就不深入探讨了。这里给大家想强调的就是,进程需要管理好它的资源

 

其中,线程作为进程的一部分,扮演的角色就是怎么利用中央处理器去运行代码。这其中牵扯到的最重要资源的是中央处理器和其中的寄存器,和线程的栈(stack)。这里想强调的是,线程关注的是中央处理器的运行,而不是内存等资源的管理

当只有一个中央处理器的时候,进程中只需要一个线程就够了。随着多处理器的发展,一个进程中可以有多个线程,来并行的完成任务。比如说,一个web服务器,在接受一个新的请求的时候,可以大动干戈的fork一个子进程去处理这个请求,也可以只在进程内部创建一个新的线程来处理。线程更加轻便一点。线程可以有很多,但他们并不会改变进程对内存(heap)等资源的管理,线程之间会共享这些资源

总结一下,我上面的解释是通过计算机操作系统的角度出发的。进程和线程不是同一个层面上的概念,线程是进程的一部分,线程主抓中央处理器执行代码的过程,其余的资源的保护和管理由整个进程去完成。
 
进程与线程的一个简单解释:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
 
进程作为程序的一次执行(有独立的内存空间),线程作为CPU调度单位。
 
进程和线程简单而基本靠谱的定义如下:
1. 进程:程序的一次执行
2. 线程:CPU的基本调度单位
这两个概念虽然过于简单,但是完全可以为理解OS/线程/进程打下坚实的基础,我认为关于进程/线程的探讨,无论采用何种方式,都必须以这两句话为落脚点,才算靠谱。
 

 

 

抛开各种技术细节,从应用程序角度讲:

1、在单核计算机里,有一个资源是无法被多个程序并行使用的:cpu。

没有操作系统的情况下,一个程序一直独占着全都cpu。

如果要有两个任务来共享同一个CPU,程序员就需要仔细地为程序安排好运行计划--某时刻cpu和由程序A来独享,下一时刻cpu由程序B来独享

这种安排计划后来成为OS的核心组件,被单独名命为“scheduler”,即“调度器”,它关心的只是怎样把单个cpu的运行拆分成一段一段的“运行片”,轮流分给不同的程序去使用,而在宏观上,因为分配切换的速度极快,就制造出多程序并行在一个cpu上的假象。

 

2、在单核计算机里,有一个资源可以被多个程序共用,然而会引出麻烦:内存。

在一个只有调度器,没有内存管理组件的操作系统上,程序员需要手工为每个程序安排运行的空间 -- 程序A使用物理地址0x00-0xff,程序B使用物理地址0x100-0x1ff,等等。

然而这样做有个很大的问题:每个程序都要协调商量好怎样使用同一个内存上的不同空间,软件系统和硬件系统千差万别,使这种定制的方案没有可行性。
为了解决这个麻烦,计算机系统引入了“虚拟地址”的概念,从三方面入手来做:

2.1、硬件上,CPU增加了一个专门的模块叫MMU,负责转换虚拟地址和物理地址。
2.2、操作系统上,操作系统增加了另一个核心组件:memory management,即内存管理模块,它管理物理内存、虚拟内存相关的一系列事务。
2.3、应用程序上,发明了一个叫做【进程】的模型,(注意)每个进程都用【完全一样的】虚拟地址空间,然而经由操作系统和硬件MMU协作,映射到不同的物理地址空间上。不同的【进程】,都有各自独立的物理内存空间,不用一些特殊手段,是无法访问别的进程的物理内存的。

PS:在有的操作系统里,进程不是调度单位(即不能被调度器使用),线程是最基本的调度单位,调度器只调度线程,不调度进程

 

我觉得比喻的挺好的。至于 线程是CPU的基本调度单位,也能从工人的点去理解,因为工厂里的基本单位也是人,即使分成小组,来调度,也是人为单位的

 

进程(Process)

定义

进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度(若不支持线程机制,进程的系统调度的单位。否则,线程是系统调度的单位)的独立单位。
#### 特点

  • 进程是程序的一次执行过程。若程序执行两次甚至多次,则需要两个甚至多个进程。
  • 进程是是正在运行程序的抽象。它代表运行的CPU,也称进程是对CPU的抽象。(虚拟技术的支持,将一个CPU变幻为多个虚拟的CPU)
  • 系统资源(如内存、文件)以进程为单位分配。
  • 操作系统为每个进程分配了独立的地址空间
  • 操作系统通过“调度”把控制权交给进程。

为什么引入线程 有了进程这概念之后 应用程序可以并发地去执行了 那么为什么要在进程当中再派生出线程呢?

为什么引入线程?

首先我们引入了进程这个概念,虽然进程有利于资源的管理和保护。然而在实际应用中,进程有这样的问题:

  1. 进程切换的代价、开销比较大;
  2. 在一个进程内也需要并行执行多个程序,实现不同的功能。
  3. 进程有时候性能比较低。

引入线程有以下三个方面的考虑

  1. 应用的需要。比如打开一个浏览器,我想一边浏览网页,一边下载文件,一边播放音乐。如果一个浏览器是一个进程,那么这样的需求需要线程机制。
  2. 开销的考虑。在进程内创建、终止线程比创建、终止进程要快。同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。线程之间相互通信无须通过内核(同一进程内的线程共享内存和文件)
  3. 性能的考虑。多个线程中,任务功能不同(有的负责计算,有的负责I/O),如果有多个处理器,一个进程就可以有很多的任务同时在执行。

线程的属性

线程

    • 有标识符ID
    • 有状态及状态转换,所以需要提供一些状态转换操作
    • 不运行时需要保存上下文环境,所以需要程序计数器等寄存器
    • 有自己的栈和栈指针
    • 共享所在进程的地址空间和其它资源

 

 CPU 工作的分配一般是以线程为级别的,只不过大部分程序一个进程只用一个线程,所以看起来好像 CPU 只能是以进程为粒度分配任务。(https://www.v2ex.com/t/285551)

 

cpu 眼里没有进程的概念,进程只提供一个 cr3。

可以简单的理解 cpu 的调度单位是线程。

一个cpu核心有一套寄存器,可以执行一个任务(一般是线程),所以一个核心同一时刻只能运行一个线程。(不论这个线程是哪个进程的,cpu眼里没有进程的概念)。每隔一定时间(没记错的话是20ms)会切换线程(可能是同一个进程的线程,也可能是另外一个进程的线程,如果是其它进程的线程,会切换cr3)。


摘抄:总而言之:进程是组织资源的最小单位,而线程是安排 CPU 执行的最小单位。

进程描述的是资源分配的单位,一个进程里面的所有线程都可以共享这些资源。
线程是 CPU 调度的单位,一个逻辑 CPU 核心在某一时刻只能 hold 住一个线程。

操作系统原理的基础内容,楼主可以找本书过一下。
好久没碰这些概念了,不知道我说得有没有严谨。
 
讲个通俗不严谨的说法, CPU 看到的是线程,看不到进程,进程是 OS 上的概念。
 
多线程当然可以利用多核,调度单元是线程,不是进程。
不然 Java 程序的 1600%的 CPU 利用率是怎么跑出来的。。?(同时占满 16 个 CPU 核心)
 
在 Linux 里,创建新进程和新线程可以用同一个系统调用,唯一的区别是,创建新线程时不创建行调用栈。而且你仔细看, tid 和 pid 其实是在同一个范围里
主进程 tid=pid
子进程很多时候就是主进程 pid+n
而后面其他新进程会顺延下去
所以,其实进程和线程的区别只在于内存空间是不是共享而已………

 

对于 CPU 而言,看到的是线程,多核 CPU 可以同时调度多个线程执行。我想楼主可能不是很理解线程的意义把。一个进程有多个线程的好处:对于单核 CPU 而言,CPU每次只能调度 1 个线程,但是若当前线程阻塞了, CPU 可以不必等待,而是先调用别的线程执行,这样就提高了 CPU 的利用率

 

最早 UNIX 的调度是以 “进程” 为最小调度单位,那个时候还没有线程的概念。线程有两种,一种是 “用户态线程” ,对内核不可见,内核不可以调度,现在一般叫做纤程或协程。另一种是 “内核态线程”,由内核调度,也称作轻量进程 LWP 。现在说的线程,一般不特殊指定,都是内核线程。

能不能利用多核的关键是能不能被内核调度,既然内核态线程可以被调度,自然可以利用多核。

 

 

 

现代操作系统进程代表的是地址空间 (Address Space)。目的是隔离,一个进程不可以直接访问另一个进程的内存空间,这是由操作系统内核保护的。

 

计算机有多少个核心,意味着实际可以同时运行的了进程是多少个,cpu处理任务的顺序是时间片轮转的方式,因此造成多个进程在同时运行的假象。线程是cpu调度的基本单元,一个进程(一个核心)可以包含一到多个线程,多个线程之间可以实现部分资源的共享,多个线程的目的是为了降低颗粒度,切换时间片的成本更低,多个线程协作,更快的完成这个进程。 

 

一个系统中,有很多进程,它们都会使用内存。为了确保内存不被别人使用,每个进程所能访问的内存都是圈好的。一人一份,谁也不干扰谁。

 线程:CPU的基本调度单位

进程之间不能实现资源共享,线程之间可以实现资源共享。

 

从cpu来讲,一个计算机的核心越多(单点时间实际可以运行的进程越多),每个核心中的线程越多(处理一个任务进程的颗粒度更细),处理能力就越强。

posted @ 2020-11-07 14:41  小鲨鱼2018  阅读(590)  评论(0编辑  收藏  举报