跳到主要内容

并发和并行的简单区分

· 阅读需 3 分钟

刚开始学并发和并行时总是整得有点懵,现在终于下手来好好梳理着两者的关系了。

首先并发的单词是 Concurrency,词根 con - 的意思是“一起”,而 current - 词根的意思是“当前”,所以总的意思就是“一起发生的事情”

并行的单词是 Parallelism,词根 parallel - 是平行、并列的意思,所以总的意思就是“平行发生的事情”,也可以说“同时发生的事情”

举一个知乎答主提到的一个形象的例子:

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。

你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以我认为它们最关键的点就是:是否是『** 同时 **』。

从这位知乎答主的我们其实就能够知道:并行是并发的一种特殊情况。 并发只要求有处理多个任务的能力,而并行要求有 同时 处理多个任务的能力

借此,我们来梳理一下多核 CPU 和单核 CPU 的并发、并行性

首先是针对单核 CPU,单核 CPU 很明确,一个时刻只能做一件事情,所以它不可能具备并行性,但它可能具备并发性(如果这台 CPU 支持处理多个任务的能力的话)

其次是多核 CPU,多核 CPU 就是多个单核 CPU 组成的,那么同一时刻处理多个任务就是一件轻而易举的事情了,也就是具有了并行性(有并行性就一定有并发性,前面我们已经说了并行性是并发性的一种特殊情况)

✨ 分享对编程、生活和宇宙的思考,目前仅在本站发布,欢迎 RSS 订阅: https://wukaipeng.com/blog/rss.xml

简要介绍进制和 ASCII 码表

· 阅读需 5 分钟

1. 什么是进制

  • 进制 进制全称“进位计数制”,一种计数方式,比较常用的是十进制
    • 十进制 十进制就是逢十进一,所以十进制有 10 个数字表示——0,1,2,3,4,5,6,7,8

生活中除了十进制还有很多常见的进制,可能你没有注意到,比如时钟,秒数是 60 进制,秒针从 0 走到 59 后,再走一分钟逢 60 进一成为一分钟。

再说计算机,计算机中也可以采用十进制来代表数字,那为什么偏偏要用二进制呢?原因很简单,因为二进制只有 0 和 1,表示起来很简单。

那为什么说二进制为什么简单呢?因为计算机底层也是硬件,每次硬件在两条路径和十条路径中选择肯定前者来得轻松,只不过为了达到同样目的地,二进制需要多走几步。

2.话说二进制

我们先来看看十进制是怎么表示的,假设我们现在有一个十进制的数字 (3107)10(3107)_{10}

注意

  1. 这里数字 (3107)10(3107)_{10} 用括号括起来,下标是10,表示它是10进制 这个下标就是用来表明它是什么进制的,比如 (3107)8(3107)_{8}注意此时它的下标是 8,那它就不是十进制了,而是八进制了 另外,为什么平时不这些写呢?因为十进制太通用了,不写默认它就是十进制
  2. 除了这种表示方法,常用的还有后缀字母表示法,你可能遇到过: 比如 3107H,在数字后面加上字母H,表明它是个十六进制的数字

这个 (3107)10(3107)_{10} 我们拆开来看的话:

3×103+1×102+0×101+7×1003×10^3+1×10^2+0×10^1+7×10^0

我们再来看一个二进制数字(1101)2(1101)_2,它也可以表示为

1×23+1×22+0×21+1×201×2^3+1×2^2+0×2^1+1×2^0

看到这里你应该能明白到为什么叫做十进制和二进制的原因了吗?

再说进制的转化,二进制转十进制很简单,你把

1×23+1×22+0×21+1×201×2^3+1×2^2+0×2^1+1×2^0

接下来按十进制来计算

8+4+0+18+4+0+1

就等于 (13)10(13)_{10},直接写成 (1101)2(1101)_2=(13)10(13)_{10}

3.什么是ASCII码

  • ASCII ((American Standard Code for Information Interchange)美国信息交换标准代码),名字怪长的,我们只着眼于代码这两个字就好了

我们知道,计算机表示数字是比较简单的,但如何表示文本呢?比如 a、b、c、d 这些英文,甚至是标点符号、汉字等等

前人做了一个很好的替换,就是先建一个表,表中存放着这些文本符号

文本符号
a
b
c

再给这些文本编个顺序

号码文本符号
0a
1b
2c

你要取的时候,按照号码来就好了,想要 a 输入 1,想要 b 输入 2,依次类推(这时你可能会明白一点“代码”的意思)

那么 ASCII 码表是作为较早期的符号表,多早呢?1967年,当时美国人发明的,要知道美国人用的语言就 26 个字母,再加上一些乱七八糟的符号等等,用 128 个字符就能够涵盖了

那为什么是 128 这个数字呢?在前面提到,计算机是用二进制表示的,从 0 号开始编码,一直到 127 号,刚好就是 128 个号码

那么最小号码是 0 号,最大号码是 127 号,那么如果我们能用数字表示最大的号码,那么比他小的号码也都能表示,而 (1111111)2(1111111)_2 就等于 127,我们展开来看

1×26+1×25+1×24+1×23+1×22+1×21+1×201×2^6+1×2^5+1×2^4+1×2^3+1×2^2+1×2^1+1×2^0

另外,这个(1111111)2(1111111)_2 一共有7位,所以也可以说成用 7 位表示的ASCII码表

✨ 分享对编程、生活和宇宙的思考,目前仅在本站发布,欢迎 RSS 订阅: https://wukaipeng.com/blog/rss.xml