查看原文
其他

我也是一个线程,为什么每天累得像狗一样?

码农翻身刘欣 码农翻身 2021-04-27

我的编号是0x7954,我以为世界上的人都和我一样,一出生就忙碌个不停,一直忙到世界的毁灭。


我每天与CPU阿甘为伍,忙着读写内存,一刻不得闲,阿甘这傻小子的速度实在是太快,指令周期都是按纳秒计算的,他经常对我说的一句话就是:快点儿,跟上!


我就纳闷了,这程序员都是996,至少有一天可以休息,我这怎么得7*24工作啊,每天累得像狗一样!


不过读写内存这个活是老大分配给我的,我认命。


有一天深夜,工作很少,我终于可以稍微休息一下,和CPU阿甘聊了一会儿,他无意中提起一件事:“这个机器原来安装过一个叫Tomcat的软件,这Tomcat运行起来以后,会启动很多线程,他们的日常工作就是处理各种各样的包裹。”


“还存在这样的世界?有多少线程啊?” 我很惊讶, 为什么老大只安排我一个人干活? 孤零零的。


“没错,Tomcat有个线程池,具体有多少个线程我也不清楚,这些线程在处理包裹的时候,有些就是执行一下简单的业务逻辑代码,马上返回,有些需要访问数据库,有些需要读写文件,有些还要通过网络来访问别的系统,这个时候就可以阻塞休息了, 对了,其中有个叫做0x3074的线程特别出名。”


CPU给我讲了一下0x3704的故事,都在《我是一个线程》当中。


听完后我心情低落,十分委屈,我也是一个线程,人家的生活多么丰富多彩,线程还会阻塞,一伙人可以聚在一起喝茶、聊天、打牌。哪像我,像个驴子一样每时每刻都在转圈拉磨。


“后来Tomcat去哪里了?”  我十分憧憬,幻想着自己也能成为其中的一个线程,和0x3704谈天说地。


“程序员把他们关闭了,然后搬了家,到另外一台机器上启动了,才把这个机器单独留给了你们老大: Redis,现在专门用来缓存数据。你每秒处理上万次的缓存读写请求, 也许就有0x3704发过来的。”


原来如此! 这世界上不止我一个线程,还有很多线程在访问我们Redis缓存。


我算是明白了老大为什么要我把放到墙内,这一旦了解了外边的花花世界,心就野了,每天带着怨气工作,屡屡出错。


Redis老大看到我状态不佳,赶紧跑来慰问:“0x7954,最近是怎么回事啊!”


我没声好气地说:“为什么只有我一个线程在干活!”


“谁说只有你一个? 做持久化的时候,比如RDB的bgsave,那不是有别的线程在干活嘛!”


“我说的是读写内存中缓存数据的线程!为什么只有我一个? ”看到老大想转移矛盾,我赶紧把他拉回来,“人家Tomcat能弄个线程池,里边很多线程,大家都可以阻塞休息,我们为什么不能这么做?!”


Redis老大听到我这么说,就知道外边的世界无法对我隐藏了, 只好对我解释:“我做出这么一个决定是有原因的,最主要的原因就是我们负责的业务和Tomcat不同!”


老大从怀里掏出一张图,小心翼翼地递给我:“这可是宝贝,别弄坏了:”


看到满纸的英文,我真是后悔为什么不把四级学好。


不过我还是看出了端倪,这CPU阿甘最快,一个时钟周期是0.3纳秒,内存访问需要120纳秒,固态硬盘访问需要50-150微秒,传统硬盘访问需要1-10毫秒, 网络访问最慢,需要几十到上百毫秒。


如果CPU阿甘的一个时钟周期按1秒算,那内存访问就是6分钟,固态硬盘是2-6天,传统硬盘是1-12个月,网络访问就是几年了!


(1秒= 1000毫秒= 1000,000 微秒 = 1000,000,000纳秒)


都是人类制造的电脑设备,这速度差异怎么如此之大! 可是这和我有什么关系?


Redis老大说:“ 我们负责的业务主要是和内存打交道,你每天就是读写内存的那些数据结构,像string ,hash, set, list等等,内存的速度是很快的。我们来假设一个场景, 有10万个请求发给了我们Redis, 假设你10微秒处理一个,那这10万个请求,你1秒内就轻松搞定!但是如果同样多的请求发给Tomcat,它的线程需要读写文件,访问硬盘,甚至网络,速度那是非常非常慢的,假设平均处理时间是10毫秒,你算算需要多长时间?”


我稍加计算,吓了一跳,需要1000秒才能搞定,这实在是太慢了,人类是万万等不及的。


Redis老大说:“所以嘛,那Tomcat肯定要建立一个线程池,里边养一堆线程来干活喽。并且,一个Tomcat还不够,需要多个Tomcat组成集群来分担压力,他是不得已而为之。”


原来如此,看来业务不同,这工作模式也大为不同啊!  可是不对啊,这么多的网络请求肯定是很慢的啊!


“这个不用你操心,我们是非阻塞的I/O,使用了epoll作为I/O多路复用的实现,我还有一个自己的事件处理模型,不会在网络I/O上浪费时间。 ” Redis老大深思熟虑,早就考虑到了这一点。


“单线程还有一个重要的好处就是,不用给资源加锁,所有的命令都会放到一个队列中,你只要从队列中取出指令,逐个执行就可以了,根本不用考虑锁的问题,非常安全。”



“最后还有一点,由于只有你一个线程,也没有线程切换开销了,你一个人独霸CPU阿甘。”(确切来说,只能用一个CPU 核心)


老大一口气说了这个么多好处,我无语了,资本家真坏,看来我这辈子就是劳累命。


不过不能就这么算了,我还得提出那个关键问题:“我7*24小时工作,也该长点儿工资了!”


“没问题,等到张大胖给我们加了内存,我就给你发双份工资!”


往期精彩回顾

我是一个线程

CPU阿甘

TCP/IP之大明邮差

Redis:MySQL算老几?

MySQL:缓存算什么东西?

后端风云


码农翻身,用故事讲解技术本质, 更多精彩文章,请移步《码农翻身三年文章精华

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存