【程序、进程、线程、协程的概念和区别,什么是多线程?什么是单线程?】

36 篇文章 0 订阅

目录

【程序、进程、线程、协程的概念和区别,什么是多线程?什么是单线程?】

什么是多线程?如何实现多线程?

多线程:原理分析整理 (***)

=====================================

多线程:原理分析整理 (***)

  https://juejin.cn/post/6844903740739158023

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

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

理解:??????

1. 进程:由操作系统来管理的 多任务模型,一个程序就是一个进程。

多进程:同一时刻,可以运行多个不同作者的不同程序。由操作系统来管理进程时间片的切换。

2. 线程:进程的一部分由程序员来设计,允许单个任务分成不同的部分运行;只有程序员自己,才会知晓一个程序需要拆分成几个不同的部分来运行另一部分由操作系统来控制进程的切换。

比如,场景:在一个 ui界面中,执行拷贝大文件的任务。

单进程时,ui出现假死。

多进程时,将 ui 和 拷贝大文件安排在 2个不同的进程中进行;大文件进程一直在运行,比如 qt copy()就是一个原子进行,在拷贝大文件的时候,不能/不会再运行其他的任务。

此时,ui 进程不会出现假死。拷贝大文件一直被占用,就好像是假死了的进程,但这个进程的终止,可以由 ui通过操作系统来控制。

=================================

什么是多线程?如何实现多线程?

  https://zhuanlan.zhihu.com/p/94980360

一分钟教你理解什么是多线程

  https://blog.csdn.net/nishiwodebocai21/article/details/97246521

什么是多线程?多线程有哪些使用场景?多线程如何实现?

一、什么是多线程

线程是操作系统能够进行运算调度的最小单位;它被包含在进程之中,是进程中的实际运作单位。

多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。

简单来说:线程是程序中一个单一的顺序控制流程;而多线程就是在单个程序中同时运行多个线程来完成不同的工作

多线程是为了同步完成多项任务不是为了提高运行效率,而是为了提高资源使用效率提高系统的效率多线程是在同一时间需要完成多项任务的时候实现的。

二、多线程有哪些使用场景

并发量大的场景,譬如从一个目录里读入大量文件写入数据库,使用多线程能够极大提高效率

三、多线程的优缺点

多线程的好处:

1.使用线程可以把占据时间长的程序中的任务放到后台去处理

2.用户界面更加吸引人,这样比如用户点击了一个按钮去触发某件事件的处理,可以弹出一个进度条来显示处理的进度

3.程序的运行效率可能会提高

4.在一些等待的任务实现上如用户输入,文件读取和网络收发数据等,线程就比较有用了.

多线程的缺点:

1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换.

2.更多的线程需要更多的内存空间

3.线程中止需要考虑对程序运行的影响

4、通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生

四、多线程如何实现

1、继承Thread类

2、实现Runable接口

五、实际案例

使用多线程读取数据库中的写入到文件

====================================

【程序、进程、线程、协程的概念和区别,什么是多线程?什么是单线程?】

目录

    一、程序
        1、定义
    二、进程与线程关系图
    三、进程
        1、定义
        2、进程的特征
    四、线程
        1、定义
        2、线程具有五种状态
    五、协程
        1、什么是协程?
        2、协程的使用场景
    六、协程、线程、进程关于上下文切换的比较
    七、进程与线程的区别
    八、并行与并发
    九、线程共享了进程哪些资源
    十、单线程与多线程
        1、什么是单线程与多线程?
        2、单线程与多线程的优点?
        3、单线程与多线程的劣处?
        4、小拓展

一、程序
1、定义

    程序(Program):程序的为了让计算机执行某些操作或解决某个问题而编写一系列有序的指令集合。
    软件的目的:提高人们的工作效率,简化工作流程。动态概念。

二、进程与线程关系图


三、进程
1、定义

    进程(Process):通常被定义为一个正在运行的程序的实例,包括程序计数器、寄存器和程序变量的当前值。是一个程序在其自身的地址空间中的一次执行活动。
    当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。

2、进程的特征

1、进程依赖于程序运行而存在,进程是动态的,程序是静态的;

2、 进程是操作系统进行资源分配和调度的一个独立单位(CPU除外,线程是处理器任务调度和执行的基本单位);

3、 每个进程拥有独立的地址空间,地址空间包括代码区、数据区和堆栈区,进程之间的地址空间是隔离的,互不影响。
四、线程
1、定义

    线程:进程可以进一步细化为线程,是一个程序内部的一条执行路径。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

进程的创建、销毁与切换存在着较大的时空开销,因此人们急需一种轻型的进程技术来减少开销。在80年代,线程的概念开始出现,线程被设计成进程的一个执行路径,同一个进程中的线程共享进程的资源,因此系统对线程的调度所需的成本远远小于进程。
2、线程具有五种状态

    ①初始化②可运行③运行中④阻塞⑤销毁

这五种状态的转化关系如下:

进程和线程的痛点:

    线程之间是如何进行协作的呢?
    最经典的例子就是生产者/消费者模式:
    若干个生产者线程向队列中写入数据,若干个消费者线程从队列中消费数据。


举个例子:
1.定义了一个生产者类,一个消费者类。
2.生产者类循环100次,向同步队列当中插入数据。
3.消费者循环监听同步队列,当队列有数据时拉取数据。
4.如果队列满了(达到5个元素),生产者阻塞。
5.如果队列空了,消费者阻塞。

实现了生产者/消费者模式,但是却并不是一个高性能的实现。为什么性能不高呢?原因如下:

1.涉及到同步锁。
2.涉及到线程阻塞状态和可运行状态之间的切换。
3.涉及到线程上下文的切换。以上涉及到的任何一点,都是非常耗费性能的操作。
所以才有了协程。
五、协程
1、什么是协程?

    协程,英文Coroutines,是一种比线程更加轻量级的存在。

    协程不是进程,也不是线程,它就是一个可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。

    一个进程可以包含多个线程,一个线程也可以包含多个协程,也就是说,一个线程内可以有多个那样的特殊函数在运行。但是有一点,必须明确,一个线程内的多个协程的运行是串行的。如果有多核CPU的话,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内的多个协程却绝对串行的,无论有多少个CPU(核)。这个比较好理解,毕竟协程虽然是一个特殊的函数,但仍然是一个函数。一个线程内可以运行多个函数,但是这些函数都是串行运行的。当一个协程运行时,其他协程必须挂起。

2、协程的使用场景

    一个线程内的多个协程是串行执行的,不能利用多核,所以,显然,协程不适合计算密集型的场景。协程适合I/O 阻塞型。

I/O本身就是阻塞型的(相较于CPU的时间世界而言)。就目前而言,无论I/O的速度多快,也比不上CPU的速度,所以一个I/O相关的程序,当其在进行I/O操作时候,CPU实际上是空闲的。

我们假设这样的场景,如下图:1个线程有5个I/O的事情(子程序)要处理。如果我们绝对的串行化,那么当其中一个I/O阻塞时,其他4个I/O并不能得到执行,因为程序是绝对串行的,5个I/O必须一个一个排队等待处理,当一个I/O阻塞时,其它4个也得等着。

而协程能比较好地处理这个问题,当一个协程(特殊子进程)阻塞时,它可以切换到其他没有阻塞的协程上去继续执行,这样就能得到比较高的效率,如下图所示:

上面举的例子是5个I/O处理,如果每秒500个,5万个或500万个呢?已经达到了“I/O密集型”的程度,而“I/O密集型”确实是协程无法应付的,因为它没有利用多核的能力。这个时候的解决方案就是“多进程+协程”了。

所以说,I/O阻塞时,利用协程来处理确实有优点(切换效率比较高),但是我们也需要看到其不能利用多核的这个缺点,必要的时候,还需要使用综合方案:多线程+协程。
查看文章:http://t.csdn.cn/zfFhY
六、协程、线程、进程关于上下文切换的比较

    表面上,进程、线程、协程都存在上下文切换的问题,但是三者上下文切换又有明显不同,见下表:

    进程    线程    协程
切换者    操作系统    操作系统    用户(编程者/应用程序)
切换时机    根据操作系统自己的切换策略,用户不感知    根据操作系统自己的切换策略,用户不感知    用户(的程序)自己决定
切换内容    页全局目录 内核栈 硬件上下文    内核栈 硬件上下文    硬件上下文
切换内容的保存    保存于内核栈中    保存于内核栈中    保存于用户自己的变量(用户栈/堆)
切换过程    用户态-内核态-用户态    用户态-内核态-用户态    用户态(没有陷入内核态)
切换效率    低    中    高

七、进程与线程的区别

    本质区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。

    包含关系:一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

    资源开销:每个进程都有独立的地址空间,进程之间的切换会有较大的开销;线程可以看做轻量级的进程,同一个进程内的线程共享进程的地址空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。

    影响关系:一个进程崩溃后,在保护模式下其他进程不会被影响,但是一个线程崩溃可能导致整个进程被操作系统杀掉,所以多进程要比多线程健壮。

进程与线程的一个简陋模型用图表示的话,是这样的:

理论过于抽象难解,下面还是用大家喜闻乐见的现实中的例子去类比,没错还是工厂的例子:

在计算机这个大工厂中,进程被比作一个车间,为生产活动提供了设计图、场地、生产线(线程)等生产要素,而线程是这个车间中的一条条生产线。生产线本身会有一个操作台,具体的零件在这里被生产。生产线必须由工人操作才能动起来,当工人来到一个生产线旁并启动它之前,必须查阅生产线的生产记录以便弄清楚这个生产线的零件加工到哪种程度了,然后才能准确地接续生产,当工人停止生产线前也必须记录这次的生产进度以备下次读取,这些进度信息可以理解为上下文,读取和记录生产进度的过程称为上下文切换。

一个工人可以在多条生产线间穿梭操作,就像CPU在不同线程间切换一样,这个动作被称为并发,与之对应的,多个工人操作多条生产线同时生产,称为并行。如果生产线不需要太多原料输入就能生产,那这种生产任务被称作CPU密集型,反之如果生产线大部分时间在等待原料的输入,那这种任务被称为IO密集型。显然,前者最好一条生产线由一个工人专管效率更高,而后一种任务,一个人在原料输入的间隙去操作其他生产线,无疑能提高工人利用率。

八、并行与并发

    一个基本的事实前提:一个CPU在一个瞬间只能处理一个任务。但为什么在我们人类视角,哪怕是单核心计算机也能同时做很多事情,比如同时听音乐和浏览网页,作为整个系统唯一可以完成计算任务的 CPU 是如何保证两个进程“同时进行”的呢?时间片轮转调度!

    时间片轮转调度,每个进程会被操作系统分配一个时间片,即每次被 CPU 选中来执行当前进程所用的时间。时间一到,无论进程是否运行结束,操作系统都会强制将 CPU 这个资源转到另一个进程去执行。为什么要这样做呢?因为只有一个单核 CPU,假如没有这种轮转调度机制,那它该去处理写文档的进程还是该去处理听音乐的进程?无论执行哪个进程,另一个进程肯定是不被执行,程序自然就是无运行的状态。如果 CPU 一会儿处理 word 进程一会儿处理听音乐的进程,起初看起来好像会觉得两个进程都很卡,但是 CPU 的执行速度已经快到让人们感觉不到这种切换的顿挫感,就真的好像两个进程在“并行运行”。


随着多核心CPU的出现,真正的并行得以实现,于是并行与并发的区别也成了面试常见题:

    所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它 需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。

九、线程共享了进程哪些资源

    “进程是操作系统分配资源的单位,线程是调度的基本单位,线程之间共享进程资源”。

    可是你真的理解了上面的那句话吗?到底线程之间共享了哪些进程资源,共享资源意味着什么?共享资源这种机制是如何实现的?

答案详解:参考文章:https://blog.csdn.net/mu_wind/article/details/124616643
十、单线程与多线程
1、什么是单线程与多线程?

    定义:单线程就是在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。例如说我们上班正要打卡时,你的手机响了,这时候你先打卡,打完卡后再接电话。这相当于单线程操作

    定义:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行。还拿上面的例子,我们就可以一手接听电话一手打卡。这就是多线程。

    他们的结果都是一样的,不一样的只是步骤。

2、单线程与多线程的优点?

    单线程优点:1.系统稳定。2.扩展性极强。3.软件丰富。4.不会对服务器造成压力。

    多线程优点:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

3、单线程与多线程的劣处?

    单线程缺点:
    1.当具有多个进程时,这时候CPU不会分配资源给其他进程,处理时间会变长变慢。
    2.程序在运行时窗口是不能拖动的,必须等到程序运行结束。

    多线程缺点:

        线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
        多线程需要协调和管理,所以需要CPU时间跟踪线程;
        线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
        线程太多会导致控制太复杂,最终可能造成很多Bug;

4、小拓展

    了解了多线程的好处以后,就要了解应该在什么样的情况下使用多线程技术。因为并不是说所有情况下用多线程都是好事,因为多线程的情况下,CPU还要花时间去维护,CPU处理各线程的请求时在线程间的切换也要花时间,所以一般情况下是可以不用多线程的,用了有时反而会得不偿失。大多情况下,要用到多线程的主要是需要处理大量的IO操作时或处理的情况需要花大量的时间等等,比如:读写文件、视频图像的采集、处理、显示、保存等。

参考文章:https://blog.csdn.net/u012134199/article/details/46290465
————————————————
版权声明:本文为CSDN博主「꒰ঌsnail໒꒱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_46839072/article/details/125398489

————————————————
版权声明:本文为CSDN博主「꒰ঌsnail໒꒱」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_46839072/article/details/125398489

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值