码农翻身读书笔记-第一章

码农翻身

不知是何时,我关注了一个名为「码农翻身」的公众号,点进去一看,里面的文章的标题都是一些诸如:我是一个线程,我是一个 CPU 等等类似的文章,看标题就觉得很有意思,仔细的读完整篇文章,你会发现这个作者的编程功力有多深厚。前段时间看到公众号里面说作者出书了,我立马就买了本,准备好好研读一番,本篇博客是对书的第一章内容的总结。

前言

在不断的学习过程中,我 “痛恨” 那些采用 bottom-up 方式来讲解技术的资料和文章,一上来就是技术细节,安装步骤,配置方法,让初学者晕头转向,不知所云,看完了以后也不知道为什么有这个东西,解决了什么问题,它有什么来龙去脉。换句话说,这些资料和文章讲解 How,热不是 Why。但是在我看来,How 有时候比 Why 更重要。

有时候在听技术讲座,看到上面的人眉飞色舞,下面的人却一脸茫然,我总在想:不举一些生动有趣的例子呢?如果是我在讲,那我怎么才能通俗易懂地把这个知识点讲解出来呢?我改怎么去类比呢?我该从哪个角度切入呢?

上面是作者在书的前言中写下的话,可以看到作者更喜欢把一个技术点通过有趣生动的方式讲解出来,当然我不知道作者在理解一个知识点的时候会不会采用这种方式,但是至少作者写的文章都是很生动有趣的。

我是一个线程

线程再熟悉不过的词语,在现代编程语言中,一定会有线程的身影,没有线程我们无法完成异步的编程,换句话说,如果我们写的程序中没有线程,我们所有的代码都是一行一行的执行,下一行代码一定要在上一行代码执行完成才会被执行(不考虑特殊情况)。

那么线程究竟是个什么样的一个东西呢?首先线程肯定要有个编号如:0x3704,这个编号就是这个线程的唯一标识,有了编号之后,线程会被创建出来,被放在一个黑屋子里,在这间黑屋子里面都是线程,只不过编号不一样而已。

线程肯定是用来干活的,不然它就不会被创建出来,活肯定不能再这个黑屋子里面干,而且活也不能乱干,肯定要有一个人来负责指挥,所以线程就会被叫到一个车间的地方,这个车间比黑屋子环境好多了,对于线程来说,车间就是它们梦寐以求要去的地方。

来到了车间之后,CPU 会让线程一步一步的执行代码,但是一个程序的代码有很多行。不能因为就为了执行一个程序就把车间霸占着不然别的线程进来,所以线程在执行一大段代码的时候,会被 CPU 叫停,这个时候 CPU 就会要求线程记住正在执行的步骤,然后就会让线程到一间大屋子等着。

在这个大屋子里面,会有很多线程,有些线程是因为要获取数据库的内容所以在这里等待,因为数据库的速度要比线程的速度慢好几十万倍,当数据查询完毕以后,会有人通知对应的线程去执行。但是这里通知线程不是直接让线程去车间执行,车间是一个只出不进的地方,所以需要先到一个叫做就绪车间的地方等,这里不难看出线程在车间中待的时间是有多么的宝贵!

在就绪车间中只能等 CPU 的叫唤了,为了不让线程一直霸占车间不出来,就有一套线程的 kill 机制,一旦发现哪个线程霸占车间不出来,而且一直把 CPU 搞的百分之百的占用,这个时候就会执行这个 kill 机制,将这个线程 kill 掉。

所以一个线程就有了 “就绪”,“等待”,“运行” 这三种状态,一个线程如果想执行完一段代码,这三个状态一定会不停切换,最终代码就被执行完毕,执行完代码后这个线程就会变的没有用处,这个时候有些线程就会被 kill 掉,而有些线程就是幸运儿,他们不会被 kill 掉,那么不会被 kill 掉的线程会到哪儿去呢?那就是去前面说的小黑屋里面这个小黑屋有个好听的名字,那就是线程池。

就这样,线程按照上面的步骤有条不紊的运行着,不过在一些特殊的情况下,会出现一些不可挽回的错误,比如在执行银行业务代码的时候,存钱和取钱分别是由两个线程来执行的。具体操作流程如下图:

通过上面两张图可以看到,