zl程序教程

您现在的位置是:首页 >  Java

当前栏目

我看到了一个很有意思的评论!

2023-02-18 16:34:47 时间

大家好,我是轩辕。

今年国庆,因为此起彼伏的疫情,只好选择待在成都。这几年国庆,从出国游变成国内游,从国内游变成省内游,今年变成市内游···

好吧,既然出不去,那就多看看书充实一下自己,多做几个视频分享给大家(隔壁B站小伙伴别催了)。

今天我在知乎刷到一个问题:

看到问题的第一瞬间,我的反应是笑了,居然会有人提这种问题。

接下来第二瞬间,我猛然想到,当年的我不也有过这样的疑问吗?

阻塞到底是什么?

我们天天都在说阻塞,但真的有几个人想过阻塞到底是什么意思?

像我当初学习操作系统的时候,也简单的以为,线程执行到阻塞的地方后就一直停在那里,进入死循环,一直检查等待,直到条件满足了,就继续往下执行。

后来学习操作系统内核的时候,接触到了一个叫“自旋锁”的概念,就像我上面想的那样,一直转圈儿等待。

但同时,那本操作系统的书籍也特别强调了一点:自旋锁要慎重使用,很容易霸占CPU浪费资源。

那时候我就在想:咦?那其他普通的锁不是这样的吗?那它们所谓的阻塞,底层到底是怎么个阻塞法呢?

后来随着知识的增长,不断的学习,才醒悟过来,所谓阻塞,就是操作系统把线程挂入了等待队列,转头去调度别的线程执行了。在我们人类看来,那个被挂起的线程看起来就像卡住了一样,没法继续执行。等到等待的条件(比如网络数据、锁、条件变量、信号等)满足了,操作系统再把它放入就绪队列,参与后续的调度。在人们看起来,好像阻塞消失,继续执行了。

现在看起来再简单不过的道理,当初刚学操作系统的自己却是怎么也想不明白。我想,可能也有很多像我一样不是科班出身,靠自学出道的同学都有过这样的感受。

好在,现在这年头比起我们那时候要幸运,有很多免费的视频、免费的学习资源。

还有很多的技术博主在分享着他们的知识,就拿操作系统为例吧,我有一个朋友闪客Sun就连载了几十篇的操作系统文章,从最基础的概念开始讲解,以实战开发为指导,一步一步开发出一个操作系统,基于Linux内核,是新手们学习操作系统一个非常值得推荐的选择。

他的这个项目还在GitHub上获取了14K的Star!

这个系列很受欢迎,已经有出版社签约出书了:

我之前还转载过他的几篇文章,他最擅长的就是从一个最简单的模型出发,逐渐迭代,最后把一个复杂的技术名词解释清楚,让人有一种恍然大悟的概念。

他的破玩意儿系列计算机、文件系统我是百看不厌。

大家可以去他的公众号关注这个完整的操作系统系列,这位公众号作者自己说不发广告,这年头专注技术分享不搞营销和广告的号主太少了,强烈推荐大家关注。

一不小心扯远了,回到我们开始的知乎问题上。

回答区的所有回答基本上都差不多,都在科普回调、中断···诸如此类的概念,并且强调,线程阻塞不是轮询,包括我也是这么认为的。

然而在一个回答的评论区,我看到了另一个观点,突然觉得脑子一震:

尤其是最后那句:所谓回调就是把它放到轮询代价更小的环节里

然后一堆人开始为这个问题开始争论起来。

我认为这个评论非常好,这些争论也非常好,比成天争论谁是最好的编程语言有意义得多。

我们长久以来接受的一个概念就是,中断就是异步的,中断不是轮询。但从某一个微观的角度来看,中断是不是也是一种特别的硬件轮询呢?

对于这个问题,可能见仁见智,大家怎么看,可以评论区交流一下,说说你的看法。