多线程:并发并行线程进程上下文切换?

在学习多线程之前,这几个概念是我们必须先了解的。

并行和并发

多线程:并发并行线程进程上下文切换?_第1张图片
这是《并发编程之美》书中的原话,
用大白话来讲就是
并行:你在吃饭,同时还能说话。
并发:你必须吃一口饭,然后再说话,说完话后再吃下一口饭。

对于单核CPU来说,多个线程不管怎样都是并发运行。但是现在时代变了,4核8核16核轻轻松松,那么为什么还说是“并发编程”呢?

是的,你核数多了,对应的线程数目自然也就多了,所以通常情况下,我们面对的依然是并发编程。

线程与进程

进程是操作系统的管理单位,而线程则是进程的管理单位;一个进程至少包含一个执行线程。不管是在单线程还是多线程中,每个线程都有一个程序计数器(记录要执行的下一条指令),一组寄存器(保存当前线程的工作变量),堆栈(记录执行历史,其中每一帧保存了一个已经调用但未返回的过程)。虽然线程寄生在进程中,但与他的进程是不同的概念,并且可以分别处理:进程是系统分配资源的基本单位,线程是调度CPU的基本单位。
一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并行多个线程,每条线程并行执行不同的任务。每个线程共享堆空间,拥有自己独立的栈空间。

大白话来讲就是:
你电脑上面跑的QQ就相当于一个进程,而一个个的线程组成了QQ。

上下文切换

既然在多线程编程中,线程数目一般都大于CPU个数,于是CPU为了能够雨露均沾,让用户能够觉得是多个线程在同时执行,采取时间片轮转的策略。

也就是给每个线程分配 个时间片,线程在时间片内占用 CPU 执行任务。当
线程使用完时间片后,就会处于就绪状态并让出 CPU 让其他线程占用,这就是上下文切换。

用大白话来讲就是:
你和小伙伴轮流用电脑玩游戏,你玩五分钟,时间到了就得把电脑让给你小伙伴玩。

但是有个问题,上下文切换后,线程怎么知道自己之前运行到哪里了呢?在这里,Java是采用程序计数器记录的是正在执行的虚拟机字节码指令的地 址;如果正在执行的是本地(Native)方法,这个计数器值则应为空。

你可能感兴趣的:(多线程)