iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > html >什么是阻塞
  • 909
分享到

什么是阻塞

2024-04-02 19:04:59 909人浏览 八月长安
摘要

本篇内容主要讲解“什么是阻塞”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是阻塞”吧!1. 中断就是从中断掉不是让太监来帮你干活的,他没有那个能力。太监是用

本篇内容主要讲解“什么是阻塞”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是阻塞”吧!

1. 中断就是从中断掉

不是让太监来帮你干活的,他没有那个能力。太监是用来给你调度工作的。

比如,有反叛的军队攻到了城外,太监慌慌张张来报告,你就不得不暂停后宫的活动,提着裤子处理首要的问题;再比如,有刚来的妃子频频抛媚眼,但你还有一大堆公文要批,心有余而力不足。

什么是阻塞

这种处理问题的方式,就是中断(从中断掉就是太监)。中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的 CPU  暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。

我们来看下底层的中断处理程序。

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,         const char *name, void *dev)

可以看到,太监只需要给皇帝要做的事情,都编码备案,并固定下处理流程,调整好优先级,皇帝的时间片就可以有效的轮转起来。不至于江山都丢了,还在后宫里风花雪月。

网络传输来说,当有了网络数据包,就需要及时处理,否则客户端会超时。这个时候,网卡会立马发出中断请求,CPU就会通过网卡的中断程序去处理这些缓冲区。这都是非常重要的工作。

中断又有硬中断和软中断之分。硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。软中断是由当前正在运行的进程所产生的,通常优先级比硬中断低一些。

2. 阻塞会占用CPU么?

代入了皇帝这个身份,我们就可以解释一些平常遇到的,令人疑惑的问题。

我们都见过在Concurent包下面,有一个叫做LinkedBlockingQeque的类。从它的名字就可以看出,这是一个阻塞队列。实际上,它也并不是挂着羊头卖狗肉。

如下面的代码,我们通常把它放在循环中。我对while(true)这种东西是有心理阴影的,因为它有可能会跑满你的CPU。

while(true){    Object o =  linkedBlockingQeque.poll(); }

但实际上,并不会。因为人家都说了,这是个阻塞队列。

相似的,还有NIO中的select。把逻辑放在while循环里,不怕得报应么?

while (!stop) { int num = selector.select();    if (num == 0) {        continue;    }    Iterator<SelectionKey> events = selector.selectedKeys().iterator(); }

这还真不怕。因为阻塞并不会占用任何资源。

比如,小太监上报了一个折子,是关于吕嫔妃的舅舅的贪污问题处理。但是这个问题,需要等待司法调查的结果,还需要听听爱妃的意见,就先可以把它搁置在一旁。

把问题记录在一个其他的小册子里,等这些依赖的事办的差不多了,同时你又有龙时,那就可以继续处理。

可以看到,这种阻塞性的问题,虽然是个任务,但并不会占用你的任何时间,这在计算机中是一样的。

我们来看一下常见的Java阻塞方式。

sleep和wait

睡和等。用词很巧妙,到底妙在哪呢?因为它是现实中的场景。

sleep

sleep函数会让线程在一定的时间内进入阻塞状态,不能得到cpu时间,但不会释放资源。指定的时间一过,线程重新进入可执行状态。

注意我们这里说的是线程,并不是CPU本身。线程不活动了,并不代表CPU不能干其他事情。

比如,今天是接见大臣的黄道吉日,王天师得到了接见的机会,其他的大臣们就得在外面等着被传唤。结果王天师的谈话又臭又长,勾不起你的任何兴趣。正好小太监急匆匆跑来,在你耳边悄悄说:李贵妃生了个儿子!

这是让人振奋的事情,因为其他儿子都在宫斗中被KO了。于是你装模作样的对王天师说:我现在有点头痛,需要小憩一会儿。” 其实你已经偷偷去探望李贵妃了。

注意,这个时候,王天师只能唯唯诺诺的等着。对于“接见”这个主线来说,其他的大臣也只能在外面等着被传唤。它们都没有拿到“接见”这把锁,王天师也一直占用着这把锁,直到你看完了儿子归来。

这就是sleep不释放锁的意思,因为sleep后,在sleep那一瞬间的任何东西都没有改变。

wait

wait( ) 使线程进入阻塞状态,同时释放自己占有的锁资源,和notify( )搭配使用。

对于wait来说,就完全不一样了。

什么是阻塞

如图,每个监视器(Monitor)在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”。而其它线程都是 “Waiting  Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for  monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。

术语难以理解,还是以皇帝的身份来潇洒一下。

这个时候,你还打算接见大臣。不过,现在不想再one by  one了,因为这太低效太枯燥了。某个大臣在你的书房里待得长了些,就有可能有大臣怀疑你在搞gay,这种副作用让人心里不悦。

p2p不行,那就聚在一块谈谈心吧。

正在和你谈话的是王天师,因为这货话比较多,你也比较喜欢他。

王天师说:小太子出生在三伏天,就叫史三伏吧!。

你这才想起自己姓史。作为熟读文章的皇帝,你对此嗤之以鼻,听着这不入流的名字,还隐隐有点生气。

王爱卿,你还是先wait一下吧,听听别人意见。

这个时候,一大堆等着拍马屁的大臣开始举手,跃跃欲试。刘道长抢到了 谈话主线 这把锁。

刘道长: 天地长久,人有终时,北冥有鱼,其名为鲲,可活亿年。我看,就叫史鲲吧。

你听后微微颔首,果然仙人嘴下口水香,但总感觉有点怪异。

注意注意。等着发言的这群大臣,就叫做Entry Set,谁举手举得快,就可以回答这个问题。

像王天师这种被喊停的大臣,就属于Wait Set,只有你重新让他说话,他才有机会。

这整个过程,谈话是可以继续的,并不因为王天师被禁言了谈话就无法进行下去。我们就可以说,wait操作是释放了对象锁的。

计算机中各种所谓的阻塞,都是通过划分不同的队列资源进行处理。比如epoll就是围绕着工作队列和等待队列进行编程的。虽然底层的数据结构有些不同,但思想都是一样的。

线程如何获取时间片?

这个不容易回答,因为你需要知道一个事实:Java中的线程,在linux上本质是一个轻量级进程,它的调度都是操作系统来完成的。

什么是阻塞

可以看一下我们最上面那一副让人容易产生密集恐惧症的图片。我们的CPU时间,就划分为多个CPU时间片。你的程序虽然在执行while(true),但不代表它总能够得到CPU资源,所以其他的进程也有机会去执行。

JVM采用抢占式调度模型,指的是让优先级高的线程占用比较多的CPU,如果线程优先级相同,那么就随机选择一个线程,使其占用CPU。

注意“随机”这两个字,就非常的有魔性。它可以让你每天都中100万的彩票,也可能每天喝水都被呛着。

可怜的计算机系统,也参与到大千世界让人无奈的随机命运而来。

但有一种很霸道的任务,对CPU一抢一个准,那就是我们上面提到的硬中断--那些不得不优先处理的事情。

到此,相信大家对“什么是阻塞”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 什么是阻塞

本文链接: https://www.lsjlt.com/news/84729.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 什么是阻塞
    本篇内容主要讲解“什么是阻塞”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是阻塞”吧!1. 中断就是从中断掉不是让太监来帮你干活的,他没有那个能力。太监是用...
    99+
    2024-04-02
  • linux阻塞与非阻塞的概念是什么
    在Linux系统中,阻塞和非阻塞是指对于输入/输出(I/O)操作的处理方式。阻塞(Blocking)是指当程序发起一个I/O操作时,...
    99+
    2023-09-16
    linux
  • Python中的同步异步阻塞与非阻塞是什么
    今天小编给大家分享一下Python中的同步异步阻塞与非阻塞是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、状态介绍在...
    99+
    2023-07-05
  • 什么是异步非阻塞redis
    异步非阻塞redis又叫异步IO,在IO多路复用模型中,事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取数据、处理数据。而在异步IO模型中,当用户线程收到通知时,数据已被内核读取并存储于用户线程指定的缓冲区内,内核在IO完成后...
    99+
    2024-04-02
  • Node.js中非阻塞I/O是什么
    本篇文章为大家展示了Node.js中非阻塞I/O是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。先新建一个index.js,再打开我们前端人的vs-code,打...
    99+
    2024-04-02
  • NIO Socket非阻塞模式是什么
    本篇内容主要讲解“NIO Socket非阻塞模式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“NIO Socket非阻塞模式是什么”吧!NIO主要原理和适用NIO 有一个主要的类Selec...
    99+
    2023-06-17
  • socket阻塞和非阻塞怎么设置
    在使用socket进行网络通信时,可以设置socket为阻塞或非阻塞模式。阻塞模式下,当执行socket的读取和写入操作时,如果没有...
    99+
    2023-09-16
    socket
  • 同步异步,阻塞非阻塞
    众所周知JavaScript的执行环境是单线程的,当有多任务时,先执行前面的任务再按顺序狮子那个后面一个,如果前面一个任务耗时很长,那么多所有任务都将拖延,比如经常遇到的浏览器无响应其实就是因为某一段JavaScript代码长时间运行(死循...
    99+
    2023-06-03
  • redis订阅为什么阻塞
    redis订阅阻塞的原因: redis采用单线程处理请求。 reactor模型是同步IO,需要等待命令执行完成,才会返回结果,进入下一次执行过程。 一旦某个客户端的某个命令执行时间很长,就会阻塞其他客户端。...
    99+
    2024-04-02
  • Nodejs中的非阻塞异步IO是什么
    这篇文章主要讲解了“Nodejs中的非阻塞异步IO是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nodejs中的非阻塞异步IO是什么”吧!我们以网络请求IO为例,首先介绍服务端处理一次...
    99+
    2023-07-04
  • 同步、异步与阻塞、非阻塞
    1. 同步与异步   同步和异步关注的是消息通信机制。同步就是在发出一个【调用】时,在没有拿到结果之前,该【调用】就不返回,但是一旦调用返回,就得到返回值了。   换句话说,就是由【调用者】主动等待这个【调用】的结果。     而异步正好...
    99+
    2023-01-31
  • 怎么在java中实现阻塞和非阻塞
    这篇文章给大家介绍怎么在java中实现阻塞和非阻塞,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。1.概...
    99+
    2023-06-14
  • Linux怎么实现设备阻塞/非阻塞读写
    本篇内容介绍了“Linux怎么实现设备阻塞/非阻塞读写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!设备阻塞IO的实现当我们读写设备文件的I...
    99+
    2023-06-16
  • Java阻塞队列的实现原理是什么
    本篇文章给大家分享的是有关Java阻塞队列的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。BlockingQueue接口提供了3个添加元素方法:add:添加元素到...
    99+
    2023-06-17
  • Nodejs中阻塞和非阻塞的示例分析
    这篇文章主要介绍了Nodejs中阻塞和非阻塞的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。对于阻塞和非阻塞这两个概念大家应该都有一些自己的理解:再简单说一下,阻塞大...
    99+
    2023-06-15
  • Java中常用阻塞队列的问题是什么
    本篇内容主要讲解“Java中常用阻塞队列的问题是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中常用阻塞队列的问题是什么”吧!Java常用阻塞队列ArrayBlockingQueue...
    99+
    2023-06-29
  • JAVA NIO下I/O的阻塞与非阻塞实现
    本篇内容介绍了“JAVA NIO下I/O的阻塞与非阻塞实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!当前环境jdk == 1.8代码地址...
    99+
    2023-06-02
  • insert 产生阻塞
    描述:insert产生阻塞。 1,建立测试表。 SQL> create table lock1 (id1 int primary key); Table created. 2,打开2个会话顺序执行插...
    99+
    2024-04-02
  • golang会阻塞吗
    Golang是一个功能强大的开源编程语言,一直以来备受开发者们的喜爱。它具有高效的垃圾回收机制、简单易用的语言特性、支持多线程和并发编程等众多优点。然而,在使用Golang进行并发编程时,我们经常会遇到一个问题:是否会出现阻塞?在本文中,我...
    99+
    2023-05-14
  • golang携程会阻塞么
    golang携程本身不会发生阻塞,但如果不正确地使用,就会会发生阻塞。常见发生阻塞的原因:1、未正确处理通道阻塞,一个携程往一个已满的通道发送数据,或者从一个空的通道接收数据,会被阻塞,直到通道可用或有数据发送到通道;2、死锁,当多个携程相...
    99+
    2023-08-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作