目录

1、进程和线程

2、并发和并行

3、协程

4、对比协程、线程和进程

1、进程和线程

进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行。

进程是什么?

直白地讲,进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源、数据资源、独立的内存空间。

线程又是什么呢?

线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。

线程拥有自己的栈空间。

 对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。

无论进程还是线程,都是由操作系统所管理的。

2、并发和并行

最开始的计算机只有一个处理器,也就是单核,最开始处理任务的模式也是只能处理一个任务,但是这种就比较傻瓜式,比如你在看视频时,就不能同时登微信聊天,简直离谱。 后来就想着我们是否可以给任务分配一个时间片,时间到了就切换另外一个任务,由于时间片很短,用户的眼睛几乎感觉不到停顿,可以给用户一种“任务并行起来了”的假象。这种交替执行不同任务的方式就是并发。 后来计算机随着发展,就有了多核处理器,每个核都可以处理一个任务,并且这两个任务之间不需要抢夺时间片,这种方式就是并行。

紧接着我们分别了解一下并行和并发和概念。

并发

当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。这种方式我们称之为并发。

对单处理器而言 – 多个程序在同一时间段发生。

 并行

当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

对多处理器而言 – 多个程序在同一时刻发生。

 并发和并行的区别和联系

计算机操作系统中把并行性和并发性明显区分开,主要是从微观的角度来说的,具体是指进程的并行性(多处理机的情况下,多个进程同时运行)和并发性(单处理机的情况下,多个进程在同一时间间隔运行的)。

并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。 在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。 若在计算机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可以同时执行。 并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在。

3、协程

协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。

线程:一个线程上可以跑多个协程,协程是轻量级的线程。

什么是协程?

“协程”(Coroutine)概念最早由 Melvin Conway 于 1958 年提出。虽然被提出的时间很早,但是使用它的年限很短。尤其是最近几年,随着 Go、Lua 等语言的流行,把协程推向了一个新的高潮。

协程,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。协程又称为微线程,是一种用户态的轻量级线程。

最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。

这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。

为什么协程的切换消耗资源少

消耗资源少是相对于线程来说的,线程:

线程在进行切换的时候,需要将CPU中的寄存器的信息存储起来,然后读入另外一个线程的数据,这个会花费一些时间。 CPU的高速缓存中的数据,也可能失效,需要重新加载。 线程的切换会涉及到用户模式到内核模式的切换,据说每次模式切换都需要执行上千条指令,很耗时。

协程的切换之所以快,可能的原因是:

在切换的时候,寄存器需要保存和加载的数据量比较小。 高速缓存可以有效利用。 没有用户模式到内核模式的切换操作。 更有效率的调度,因为协程是非抢占式的,前一个协程执行完毕或者堵塞,才会让出CPU,而线程则一般使用了时间片的算法,会进行很多没有必要的切换(为了尽量让用户感知不到某个线程卡)。

4、对比协程、线程和进程

协程 vs 线程 比较有以下 3 个重要的优势:

减少了线程切换的成本。线程,不管是创建还是切换,都需要较高的成本。子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。这也就是说,协程的效率比较高。 协程的第二大优势就是没有并发问题,不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。 协程更轻量级。创建一个线程栈大概需要 1M 左右,而协程栈大概只需要几 K 或者几十 K。

协程认知注意

对于操作系统来说只有进程和线程,协程的控制由应用程序显式调度,非抢占式的。 协程的执行最终靠的还是线程,应用程序来调度协程选择合适的线程来获取执行权。 协程适合于 IO 密集型场景,这样能提高并发性,比如请求接口、Mysql、Redis 等的操作。 协程并不是说替换异步,协程一样可以利用异步实现高并发。 程要利用多核优势就需要比如通过调度器来实现多协程在多线程上运行,这时也就具有了并行的特性。如果多协程运行在单线程或单进程上也就只能说具有并发特性。

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: