学编程,来源栈;先学习,再交钱
当前系列: 认识计算机 修改讲义



敲黑板:这是整个小节最复杂的内容,认真听!不然你学着累,飞哥讲得也累,o(╥﹏╥)o

复习

  1. 计算机所有的工作都由CPU完成,
  2. (很长一段时期)一台电脑只能有一个CPU,一个CPU只有一个核心
  3. CPU像机枪的击发器一样,一次只能做一件事

那么,我们凭啥能够:一边敲着代码,一边听着歌?


进程(Process)

现代操作系统都是多进程的。

进程是操作系统分配给应用程序复习:操作系统上运行的软件)独享的一块资源:

  • 由操作系统管理(调度)
  • 一个应用程序至少一个进程(可以有多个)
  • 资源包括:内存、CPU、I/O等
  • 进程之间的资源不能共享

多个进程“同时”运行,由此产生了很多人一直没弄明白的概念:


并行和并发

并行(parallel)在同一时间点,任务被多个处理器处理执行。其对应的是概念是

串行(serial):任务被同一个处理器处理执行,会出现同一个时间点上多个处理器处理执行的情况。

以炒菜为例,任务是炒完2个菜

  • 一个锅,先炒一个再炒下一个:这是串行
  • 两个锅,同时开炒:这是并行

注意:真正的并行,只能在多(核)处理器上实现,因为一个CPU核心同一个时间只能处理一个任务。

很多时候(即使有了多核处理器),操作系统上的多进程是发生在一个CPU核心上的,这被称之为:

并发(concurrency)实际上是对并行的一种模拟。

按我们上面“炒菜”的例子,厨师对应CPU,灶对应进程/任务

  • 2个厨师2口灶,那才是并行;
  • 1个厨师2口灶,那只是并发;

时间片

那么,CPU是如何实现并发的呢?

简单的说:

  • CPU的运行被分成很多的“时间片
  • 这个时间片里CPU执行A任务,下一个时间片里CPU就执行B任务,再下一个时间片C任务;然后再回来执行A,再执行B,再C;再A……如此往复
  • 时间片持续的时间通常都非常短,所以用户察觉不到,在用户看来,A/B/C三个任务似乎被同时执行一样(效果和并行类似)

仍然以炒菜为例,我们只观察饭菜的生成,会觉得两个菜都是在“同时”生成呢。


并发的作用

并行,很明显能够真正的缩短任务完成时间。但是……

@想一想@,既然并发不是并行,反正都是一个CPU

如果CPU有空闲

就像厨师做菜A,需要蒸10分钟:
  • 如果没有并发,厨师就在蒸菜的时候就闲着
  • 如果允许并发,蒸菜的时候厨师就可以做其他事,比如切菜

实际项目中,并发通常会提高的CPU的应用效率,或者说:减少CPU闲置。

理解:很多任务,需要CPU、内存和I/O共同配合完成。

但随着计算机硬件技术的发展,CPU的运算速度大幅提升(摩尔定律),远超内存的“供给”速度。

PS:运算速度:CPU > 内存 > 外存 > 网络

非并发场景,CPU不得不停下来等待I/O,如图所示:

但是,如果可以并发,CPU就可以不用等待I/O,而是做其他事情,如图所示:

如果CPU都没有空闲了呢?

我们换个例子,中午用餐高峰,厨房很忙很忙,完全没有空闲,餐馆里坐了5桌人等着上菜,厨房有两种选择:

  • 先把A桌的10道菜做完端出去,再把B桌的10道菜做完端出去,再把C……好吧,C桌的客人已经气得掀桌子走人了!^_^
  • 正确的做法肯定是A桌1道菜,B桌1道菜,C桌一道菜……这样轮着来
这是不是就是“并发”?厨房把所有菜做完的总的时间不会改变,但是顾客的用餐体验会变。

在计算机领域,我们称之为“减少用户等待时间”或者“提高系统响应速度”,这也是非常重要的。(有时候给个进度条都是有用的……)

PS:很多时候,进度条的进度是假的。@想一想@:为什么?

另外:日常交流中(包括接下来的课程),如果没有必要,我们不会严格区分并行并发。


线程(Thread

线程可以看成是一个“更轻量级”的进程,一个进程中有可以有多个线程。但是,

  • 线程不具备独立完成一个任务的资源,它需要进程的支持
  • 多个线程可共享进程资源

一个应用程序只有/使用了一个线程,就被称之为单线程应用;使用了多个线程,就被称之为多线程应用。

我们应用开发人员,最有可能涉及到的,就是多线程的操作(进程由操作系统负责……)

PS:进程和线程都是操作系统层面的概念。换言之,不同的操作系统有不同的实现。比如,Linux内核就没有Windows意义上的线程。


为什么需要多线程?

原因其实和多进程一样。

本质上都是为了让多个进程/线程同时(或者至少看起来像同时)完成一个工作,从而:

  1. 满足应用本身的要求。比如:
    • 操作系统多进程,我们才可以一边听歌(一个进程)一边写代码(又一个进程);
    • 射击游戏多线程,所以你跑你的,我打我的,不会你跑的时候我就不能开枪,我开枪的时候你就不能跑……(用WinForm做坦克大战就这效果,^_^)
  2. 在计算机资源(主要就是CPU)充足的情况下(注意这个前提),压榨系统性能(减少CPU闲置)
  3. 提高用户响应。完成任务的总时间不变,但减少用户等待时间。

学习笔记
源栈学历
今天学习不努力,明天努力找工作

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 认识计算机 中继续学习:

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码