当前位置: 首页 > 科技观察

大家好,我是一根线

时间:2023-03-20 00:59:13 科技观察

一根线的自传:出生、死亡和重生。图片来自Unsplash1上的JustinLim。一个新手我是一个线程。我的出生编号为0x3704,被带到一个黑暗的房间,在那里我发现了很多和我一样的朋友。我的伙伴0x6900在这里已经有一段时间了。他用老练的语气对我说话。“处理包裹是我们的宿命,你处理完包裹就得尽快回来,否则你可能再也不会回来了。”我天真地问。“包裹?什么包裹?”“放心吧,很快你就会知道了,我们这里可不留闲人。”没过多久,门就开了。一个来势汹汹的家伙大喊:“0x3704,出来!”一个沉重的包裹压在我身上。还有一份概述该程序的文件。“走,出去处理这个包裹。”“但是哪里?”“按照指示,先去RunnableShop。”我在地上发现了一个箭头。它把我带到一栋明亮的房子里,里面已经住着一些线人。每个人都显得紧张,准备冲上前去。刚进去,就听到广播里说,“0x3704,进入runshop。”我走得更快了。有人在我身后说话。“好幸运的狗!能跑就跑!”“也许他认识什么人。”“不,他有更高的优先级。呃!”。“跑步车间就在我面前,太美了,难怪老线程一直唠叨说要永远住在这里。房间大一点,视野好一点,空气清新,香香的,还有很多等待服务的工作人员。他们都有编号。更重要的是,他们有“硬盘”,“数据库”,“内存”,“网卡”等标签。只是我不知道他们在做什么时间到了,我们看一下步骤,第一步解开参数包中有一个HttpRequest对象,包含两个参数:userName和password,第二步登录,嗯,有人尝试登录了,我把数据库服务器的用户名和密码。他走的很慢。但他怎么这么慢?总之,我可以在这里多呆一会儿,因为第三步无法操作。这时,广播说:“0x3704,我是中央处理器记住你要走的步骤,马上带着包裹离开!”慢慢地,我开始收拾东西。“快点,另一个线程要进入了。”我离开了这个车间,进入了另一个大房间,里面有很多线头正在喝茶,懒洋洋地打牌。“哥,你现在没事做?”“你一定是新来的吧,我在等数据库那家伙的数据呢,据说他们比我们慢了几十万倍,先休息一下吧。””“他们多慢啊!我还有人等着登录,他们能等那么久吗?”“放心,你不知道现实中一天等于一个CPU年吗?我们的时间是以纳秒和毫秒计算的。所以现实中的一秒钟相当于我们世界中的几天。我们绝对可以做到。“也许我可以睡一会儿。过了一会儿,扬声器又开始工作了。”0x3704,你的数据来了,快去执行吧!”我转身就往CPU车间跑去,才发现那是一扇单向门,进不了车间。背后传来笑声。”他一定是个新手。他都不知道我们要在“runnableshop”里等!窃窃私语。”你知道最近有一个线程被杀死了吗?”“可是为什么呢?”“那个人不肯离开CPU车间,导致CPU利用率一直停留在100%。所以他被杀了。”“他当时在哪儿呢?”“说不定是当垃圾被收起来了。”偷偷打了一个寒颤,加快了工作速度。第2步完成。第3步,登录成功后构建主页是一个有点耗时的步骤,因为要处理的HTML很多。不管是谁写代码,这对我来说无关紧要这是一份烦人的工作。当我忙于操作HTML时,CPU又开始大喊大叫。“0x3704,这里是CPU。记住你跑的步骤,马上带着包裹离开!”“我为什么要这样做?”“每个线程只能在CPU上运行一段时间,然后就轮到其他人了。所以,请到可运行的车间等待轮到你。”然后我在“可运行”、“等待”和“运行”之间切换了几次,最后按照步骤表完成了工作。最终成功回传包含HTML的数据包。至于登录后会发生什么,我不太关心。我很快就会回到我的小黑屋。我觉得有点甘心。但与其他一些线程相比,我很幸运。他们在手术后完全被摧毁了,我还活着!”。回到黑暗的房间,我被旧线程0x6900难住了。“你的第一天怎么样?”“我们世界的规则很复杂。首先,你不知道什么时候轮到你;第二,在执行过程中,您可能随时被打断并被要求离开CPU车间;第三,一旦有涉及到硬盘或数据库的耗时操作,需要离开CPU等待;第四,即使你有数据,也可能无法立即开始工作。你必须等待CPU调度。”“够了,伙计。”“我只是不明白为什么有些线程在我们还活着的时候完成了他们的工作就死了。”“你知道,永恒是我们的特权。我们的地方有个正式的名字:线程池。”2.进步作为一个线程,我每天的生活就是捡包,处理,然后回到线程池,我的黑暗家园。有一天,我在回来的时候,听到一个兄弟说:“祝你玩得开心今天休息。明天将是疯狂的一天。“我看了看日历,明天是十一月的第四个星期五。果然,当午夜的钟声敲响的时候,那些人类开始发疯似的开始送包裹了。为了应对蜂拥而至的包裹,线程库里谁也闲不下来。我们都出去处理包裹了。CPU车间利用率超高。硬盘嗡嗡作响,网卡灯疯狂闪烁。尽管我们很努力,但包裹很快就堆了起来。我们无能为力。包裹太多了,主要是浏览网页,下单,买买买。一堆包裹逐渐消失。我终于可以喘口气了。我想我永远不会忘记今天。通过这些,我意识到我生活的世界in是一个电商网,我每天做的事情就是处理登录、浏览、购物车、下单、支付,我问0x6900的老员工:“我们应该工作多久?”“直到系统重启。0x6900表示。“你经历过系统重启吗?”“不,系统重启将是我们葬礼的挽歌,是末日。一旦系统重启,整个线程库都会被毁灭,时间和空间都会逝去,一切从头再来。”“所以当是吗?”“我说不出来,好好享受你的一天吧。”生活其实很丰富多彩。我最喜欢的包是上传图片。由于网速较慢,我可以在CPU车间呆久了,遇到很多有趣的线程。例如,我遇到了线程Memcached。他告诉我,在他的帮助下,电子商务网络拥有大量用户数据,并且分布在许多机器上。我问他:“难怪登陆速度变快了,不用再去数据库拉数据了,你已经有数据了。哦,对了,既然你是分布式的,你有没有去过到另一台机器?”“不,我只能通过网络向那台机器发送GET和PUT命令来访问数据。我不知道其他任何事情。”上次,在我等待的时候,我遇到了一个正在为数据库连接工作的线程.直到那时我才知道还有一个连接池,和我们的线程池几乎一模一样。“有些包太变态了,他们要求看一整年的订单数据,这让我恶心,”他说告诉我。我说,“来吧,这对你来说是纯粹的数据。”在你发送完这些数据后,我必须将它构建成HTML,这比你的工作更古怪!”然后他给了我一个建议。“你得和Memcached搞好关系,这样我们才能直接从他那里获取数据。我们尽量不要频繁调用数据库。”这样,我们的JDBC连接生活就会轻松很多。““当然。重点是你要提前把数据存到缓存里,不然我只好去问缓存,查不到数据,再找你。“人生就是这样,不找点乐子,人生怎么有意义?3.九死一生前几天,我经历了一件很可怕的事,差点死在线程池外,其实我早该看到的。”我很粗心,那天我正在处理HTTP的一些存取款,旧行0x6900特意告诉我“处理这些数据包时需要非常小心。您必须先获取锁。当您从账户中存款或取款时,请记住锁定账户。否则,其他线程可能会闯入并造成一些损害。年少时,粗心大意惹来不少麻烦。为了“威吓”,0x6900的好心人给了我两张表,内容如下。银行账户。余额为$1000的账户A线程1:存款线程2:取款表1-1解锁多线程表1-2锁定多线程从那以后,每当我看到访问权限时,我都会非常小心地处理它。幸运的是,没有发生任何事故。今天,我收到一个包裹,要从一个著名演员的账户转账到一个著名导演的账户。我就不透露名字了,但是我可以告诉你,这笔钱真的很大。按照旧线程的命令,我锁定了演员的帐户,然后锁定了导演的帐户。但令我惊讶的是,还有另一个线程,是的,0x7954,同时从导演账户向演员账户转账。现在的情况是这样的。起初我不知道发生了什么事。我等了又等。几十秒过去了,什么都没有发生。我以前从未经历过这样的事件。这时,我看到了线程号0x7954。他坐在那里悠闲地喝着咖啡。我问他(过去式。“伙计,我看到你喝了第八杯咖啡,你为什么不完成你的工作?”“好吧,你已经喝了第九杯茶了。你为什么不工作?”“我在等一把锁。有些混蛋就是不肯放过它。”“我也在等一把锁呢,要是知道是谁放的,早就揍死他了。”0x7954恶狠狠的回答。我偷偷看了他一眼,才意识到他拿着导演锁。这正是我一直在等待的!显然,0x7954也发现我持有他一直在等待的锁。很快,我们两个就打起来了。“把你的锁给我,让我先完成!”。““不可能的。在我完成我的工作之前,我不会释放这个锁。你现在不能要了!”从争论变成真正的打斗只需要几毫秒。更何况,我们两人不仅持有名导和演员的锁,还有很多其他的锁。排队的人越来越多,围观的人挤满了房间。最后,真的成了大事。我们素未谋面的大BOSS“OS”来了。毕竟,大老板更清楚。他看着我们,哼了一声,不屑的说道。“又陷入僵局。”“你们一个人会被杀。你们两个过来,抽签。”把我吓坏了。我战战兢兢地抽签。幸运的是,我活了下来。在被迫交出所有资源后,可怜的0x7954被杀死并消失了。我得到了导演的锁,现在可以开始工作了。大BOSS的“操作系统”一阵风般消失,随之而来的只有他的声音。“记住,在我们这里,导演>演员,也就是说你需要第一时间拿到导演的锁。”因为这里不仅有导演和演员,还有很多人,大佬留了个表格,上面有计算资源大小的算法。计算完成后,我们需要将锁从大到小排序。(p.s.资源“size”的计算指的是将资源转化为数字进行比较,比如我们可以通过string的hascode来进行比较。)我又回到了线程池中。每个人都听说过我的冒险经历,并不断向我询问详情。长相邪恶的线程调度器,把大佬的算法挂在墙上。每天早上,我们都要站在门前,用滑稽的方式大声朗诵。“记住资源锁的顺序,记得按照老大的算法比较,记得从大到小锁。”4.再见很多天后,我和其他线程发现了一件奇怪的事情:包的处理越来越容易了。无论您是登录、浏览还是存款,步骤都是相同的。一切都回到一个固定的HTML页面。我偷偷看了一眼,看到上面写着。“系统将于今晚00:00至4:00进行维护升级,给您带来的不便,我们深表歉意。”我把这件事告诉了0x6900。他叹了口气。“唉,我们的命到头了,系统马上就要重启了,我们就要走了。再见,我的兄弟。”然后那一刻终于来了。只见东西一个个从房间里消失:waitingworkshop,Runnableworkshop,甚至是CPUworkshop。身边的线人兄弟越来越少了。最后,我一个人呆着。我隔着空地大喊。“还有谁?”无回复。这一代线程池已经完成了它的工作。然而,下一代即将重生。