Skip to content

Latest commit

 

History

History
31 lines (19 loc) · 3.18 KB

进程,线程与协程.md

File metadata and controls

31 lines (19 loc) · 3.18 KB

[[进程控制|进程]]

电脑中每个软件的启动就代表一个进程,简单来说就是把写的程序加载到操作系统中来执行预定好的任务。进程是资源分配的基本单位,操作系统会为进程分配相应的资源来支撑它完成任务,每个进程会分配一个唯一的标识PID。 我们用老王来举例,假如说老王现在想盖个房子,我们就可以把盖房子这件事作为一个任务,当盖房子这件事启动的时候也就意味者启动了一个进程。

[[线程控制|线程]]

线程是进程的执行实例,是一个程序执行的最小单元,每个进程里的任务会有线程去具体执行。 我们还是继续说老王,现在盖房子这个任务已经确定下来了,但是他发现自己不会盖,要请个工人来盖房子,于是他去外面请了一个工人A,这个工人A要做搬砖和搬木头的工作,此时这个工人A就是一个线程,老王还要求他这两个任务不能差距太大,要同步进行,所以这个工人A只能搬一趟转头,搬一趟木头,这样的操作就是单线程的并发操作。

干了两天,工人A不高兴了干的活太多了要加钱,这时老王一看一个人干也确实慢,就去外面又请了一个工人B,此时工人B也就对应着一个线程,老王让工人A继续搬砖,而工人B来负责搬木头,这样两个任务就能同时进行了,这就是多线程的并行操作。而且此时工人A和工人B是同时共享着老王提供的资源。

进程与线程+单核与多核

其实刚才老王那个例子已经能解释进程与线程的操作了,但是有些细节描述的不够清楚。

  • 如果我们使用的是单核CPU,那么我们是无法执行并行操作的,只能做到并发,这样来充分调用CPU的资源。
  • 如果我们使用的是多核CPU,我们才可以真正的意义上做到并行操作。

我们的操作系统在进程或线程间切换是比较消耗资源的,因为要保存当前运行状态的上下文信息,而且进程或线程的切换是由操作系统决定的,到达运行时间之后,操作系统会将当前执行的任务挂起,我们只能等待下个分配到的时间片来继续执行任务。这也就引出来协程的概念。

协程

就像我们刚才说到的,任务的切换是操作系统来控制,我们有没有什么办法来减小这种开销呢?我们就可以使用协程,协程我们可以理解为轻量级的线程。

协程在执行过程中不会由操作系统直接操作,而是由调度器决定,比如调度器发现协程A是一个长耗时操作,那么调度器就可以将其挂起去执行其他协程,等到协程A耗时任务结束后会加入待执行队列等待调度器调度。

线程和协程的区别

来源