首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

调用Select()是只阻塞线程还是阻塞整个程序?

调用Select()是阻塞线程的,而不是阻塞整个程序。

Select()是一种多路复用的机制,用于在一个线程中同时监听多个文件描述符的状态变化。它可以同时监测多个文件描述符是否可读、可写或出现异常等事件。当有文件描述符就绪时,Select()会返回,告知哪些文件描述符已经就绪,然后程序可以对这些就绪的文件描述符进行相应的操作。

在调用Select()时,如果没有任何文件描述符就绪,那么线程会被阻塞,等待直到有文件描述符就绪或超时。这意味着调用Select()的线程会暂停执行,但其他线程仍然可以继续执行。因此,调用Select()只会阻塞当前线程,而不会阻塞整个程序的执行。

需要注意的是,Select()是一种同步的阻塞调用,它会一直等待直到有文件描述符就绪或超时。如果需要非阻塞地监听文件描述符的状态变化,可以使用非阻塞I/O或使用异步I/O模型,如epoll、kqueue等。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云云数据库MySQL版(CDB):https://cloud.tencent.com/product/cdb
  • 腾讯云云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动应用托管):https://cloud.tencent.com/product/baas
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

搞懂IO多路复用及其技术

前言 高性能每个程序员的追求,无论写一行代码还是做一个系统,都希望能够达到高性能的效果。...阻塞和非阻塞的概念描述的用户线程调用内核IO操作的方式,阻塞时指IO操作需要彻底完成后才能返回用户空间,非阻塞时指IO操作被调用后立即返回给用户一个状态值,无需等待IO操作彻底完成。...同步阻塞IO 同步阻塞IO最简单的IO模型,用户线程在内核进行IO操作时被阻塞。用户线程通过调用系统调用read发起IO读操作,由用户空间转到内核空间。...IO多路复用 不管同步阻塞还是同步非阻塞,对系统性能的提升都是很小的。而通过复用可以使一个或一组线程线程池)处理多个TCP连接。...IO多路复用使用两个系统调用select/poll/epoll和recvfrom),blocking IO调用了recvfrom。

52720

Java NIO之理解IO模型(二)

所谓阻塞型的接口指系统调用(一般IO接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回。...但是这种模型专门提供某种功能的系统才有。 大致过程如下: ? 多路I/O复用模型  在介绍多路复用I/O时就要先简单说明一下,select函数和poll函数。...select函数 select函数允许进程指示内核等待多个事件中的任何一个事件发生,并且在有一个或多个事件发生或经历一段指定的时间后才唤醒它。...多路IO复用模型就是调用select或poll函数,并且此模型的阻塞过程就是发生在调用这两个函数中的,而不是发生在真正的的I/O系统调用上的,使用select或poll的好处在于可以用单个线程或进程,处理多个网络连接的...整个过程就是select或poll函数会不断的轮询所负责的socket,当某个socket有数据到达了,就通知用户线程或进程。 大概调用如下: ?

45240

Python入门之并发编程IO模型

#函数只有在得到结果之后才会将阻塞线程激活。 #有人也许会把阻塞调用和同步调用等同起来,实际上他不同的。 #对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。...该方案的问题: #开启多进程或都线程的方式,在遇到要同时响应成百上千路的连接请求, #则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率, #而且线程与进程本身也更容易进入假死状态。...需要注意,拷贝数据整个过程,进程仍然属于阻塞的状态。     所以,在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。...wait data #等数据的这个阶段阻塞的 copy data #这个阶段还是阻塞的 # 服务端 #这种程序虽说解决了单线程并发,但是大大的占用了cpu from socket import...因为这里需要使用两个系统调用(select和recvfrom),而blocking IO调用了一个系统调用(recvfrom)。

58070

IO 多路复用

阻塞 IO 为了解决上面的问题,其关键在于改造这个 read 函数。 有一种聪明的办法,每次都创建一个新的进程或线程,去调用 read 函数,并做业务处理。...但这和我们用多线程去将阻塞 IO 改造成看起来是非阻塞 IO 一样,这种遍历方式也只是我们用户自己想出的小把戏,每次遍历遇到 read 返回 -1 时仍然一次浪费资源的系统调用。...(可优化为返回给用户就绪的文件描述符,无需用户做无效的遍历) 整个 select 的流程图如下。 ?...一切的开始,都起源于这个 read 函数操作系统提供的,而且阻塞的,我们叫它 阻塞 IO。 为了破这个局,程序员在用户态通过多线程来防止主线程卡死。...后来操作系统发现这个需求比较大,于是在操作系统层面提供了非阻塞的 read 函数,这样程序员就可以在一个线程内完成多个文件描述符的读取,这就是 非阻塞 IO。

89520

IO多路复用

函数只有在得到结果之后才会 将阻塞线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他不同的。对于同步调用来说, 很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。...该方案的问题: #开启多进程或都线程的方式,在遇到要同时响应成百上千路的连接请求, 则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率, 而且线程与进程本身也更容易进入假死状态。...需要注意,拷贝数据整个过程,进程仍然属于阻塞的状态。 所以,在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。...wait data 等数据的这个阶段阻塞的 copy data 这个阶段还是阻塞的 服务端 1 #这种程序虽说解决了单线程并发,但是大大的占用了cpu 2 from socket import...因为这里需要使用两个系统调用(select和recvfrom),而blocking IO调用了一个系统调用(recvfrom)。

51330

聊聊同步与异步、阻塞与非阻塞、IO模型

阻塞型 ? 同步阻塞IO模型 描述: 同步阻塞IO模型最简单的IO模型,用户线程在内核进行IO操作时被阻塞 用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。...整个IO请求的过程中,用户线程阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够 举栗: 同步阻塞IO模型 :小明一直盯着下载进度条,到 100% 的时候就完成。...即”轮询”机制 整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源 比较浪费CPU的方式,一般很少直接使用这种模型...IO多路复用模型 描述: 多个连接共用一个等待机制,本模型会阻塞进程,但是进程阻塞select或者poll这两个系统调用上,而不是阻塞在真正的IO操作上 用户首先将需要进行IO操作添加到select...而不像阻塞IO那种,一次只能监控一个IO 虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。

1.1K10

IO模型

函数只有在得到结果之后才会将阻塞线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。...阻塞IO和非阻塞IO的区别就在于:应用程序调用是否立即返回!...如下图     ps:所谓阻塞型接口指系统调用(一般IO接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回。 ?...该方案的问题: #开启多进程或都线程的方式,在遇到要同时响应成百上千路的连接请求,则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率,而且线程与进程本身也更容易进入假死状态。    ...因为这里需要使用两个系统调用(select和recvfrom),而blocking IO调用了一个系统调用(recvfrom)。

68250

缪斯小卡片——IO多路复用

IO多路复用 IO多路复用,很多中间件会采用的IO方式,由于它具备非阻塞,高吞吐的优点,而广泛被采用。那么介绍IO多路复用之前,我们还是从IO和NIO说起吧。...也就是说,既然read会阻塞整个流程那么我们可不可以把read函数读取数据的这块逻辑,单独拉到一个子线程中进行处理。...可以看出如下三个细节: • select调用需要传入fd数组,需要拷贝一份数组到内核,高并发场景下这样的拷贝消耗的资源惊人的(可优化为不复制); • select在内核层仍然通过遍历的方式检查文件描述符的就绪状态...,个同步过程,只不过无系统调用切换上下文的开销(内核层可优化为异步事件通知); • select仅仅返回可读文件描述符的个数,具体哪个可读还是要用户自己遍历(可优化为返回给用户就绪的文件描述符,无需用户做无效的遍历...); 整个select的流程图如下: poll 它和select的主要区别就是,去掉了select只能监听1024个文件描述符的限制。

17530

一文读懂五大 IO 模型的前世今生( select、epoll、epoll)

序言计算机编程中,IO模型描述程序与输入/输出操作之间交互方式的抽象概念。不同的IO模型可以影响程序的性能、可扩展性和资源利用效率。...,但是第二阶段的数据读取还是阻塞的,非阻塞 read 最重要的提供了我们在一个线程内管理多个文件描述符的能力。...doSomeThing(buf); // 处理数据 close(connfd); // 关闭连接 }从上面我们可以看出 select 运行的整个流程:减少大量系统调用但也存在一些问题每次调用需要在用户态和内核态之间拷贝文件描述符数组...边缘触发使用边缘触发模式时,当被监控的 Socket 描述符上有可读事件发生时,服务器端只会从 epoll_wait 中苏醒一次,即使进程没有调用 read 函数从内核读取数据,也依然苏醒一次,因此我们程序要保证一次性将内核缓冲区的数据读取完...IO 模型发展从阻塞 read 函数开始,它整个过程都是阻塞的,为了解决这个问题,我们在用户态通过异步线程实现主线程的非阻塞,但是子线程的 read 过程还是阻塞的,但是线程资源有限的,且等待读就绪的过程耗时最多的环节

52930

框架篇:linux网络IO+Reactor模型

所有的操作都是顺序执行的 阻塞IO模型中,用户空间的应用程序执行一个系统调用(recvform),会导致应用程序阻塞,直到内核缓冲区的数据准备好,并且将数据从内核复制到用户进程。...这就是“I/O多路复用”,多路指多个socket套接字,复用是指复用同一个进程 linux提供了select、poll、epoll等多路复用I/O的实现方式 select或poll、epoll阻塞调用...答案:交给了系统系统处理吧 进程在R1、R2阶段也是阻塞;不过在R1阶段有个技巧,在多进程、多线程编程的环境下,我们可以分配一个进程(线程)去阻塞调用select,其他线程不就可以解放了吗 信号驱动式...把数据从内核读取到用户空间,再处理数据 可以看出用户进程不会阻塞在R1阶段,但R2还是阻塞等待 异步IO (POSIX的aio_系列函数) ?...线程要访问的数据是否就绪,进程/线程是否需要等待 异步IO的概念要求无阻塞I/O调用

1K10

高性能IO模型浅析

阻塞和非阻塞的概念描述的用户线程调用内核IO操作的方式:阻塞指IO操作需要彻底完成后才返回到用户空间;而非阻塞指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。...一、同步阻塞IO 同步阻塞IO模型最简单的IO模型,用户线程在内核进行IO操作时被阻塞。 ? 图1 同步阻塞IO 如图1所示,用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。...整个IO请求的过程中,用户线程阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。...然而,使用select函数的优点并不仅限于此。虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。...由于select函数阻塞的,因此多路IO复用模型也被称为异步阻塞IO模型。注意,这里的所说的阻塞select函数执行时线程阻塞,而不是指socket。

1.1K110

【云原生进阶之PaaS中间件】第一章Redis-2.2Redis IO模型

同步、异步一般发生在不同的线程/进程之间,如Thread1和Thread2同步执行还是异步执行的。 1.3 阻塞和非阻塞 阻塞和非阻塞关注的程序在等待调用结果时的状态。...缺点select、poll或者epoll 管理的连接数过少时,这种模型将退化成阻塞IO 模型。并且还多了一次系统调用:一次select、poll或者epoll 一次recvfrom。...2.3.2 select模式 用户应用线程调用select函数去监听多个FD文件描述符,如果没有数据,还是要等待,如果有就绪的文件FD,说明有数据,那就去读对应的FD就绪的文件数据,此时内核会将文件FD...,用户缓冲区拿到的已经就绪的事件,无需遍历整个红黑树,性能再次提升。...如果简单从图上看IO多路复用相比阻塞IO似乎并没有什么高明之处,假设服务处理少量的连接,那么相比阻塞IO确实没有太大的提升,但如果连接数非常多,差距就会立竿见影。

24130

Operating System 02 - IO复用

I/O 模型 阻塞(Blocking) 非阻塞(Non-blocking) 同步(Synchronous) 异步(Asynchronous) 阻塞阻塞等待 I/O 完成的方式, 阻塞要求用户程序停止执行...同步-阻塞 这是最常见的一种模型, 用户程序在使用read()时会执行系统调用从而陷入内核, 之后就被阻塞直到系统调用完成....应该注意到, 在阻塞的过程中, 其他程序还可以执行, 因此阻塞不意味着整个操作系统都被阻塞, 因为其他程序还可以执行, 因此不消耗CPU时间, 这种模型的执行效率会比较高. ?...为了获得 I/O 完成时间, 用户程序必须调用多次系统调用去询问内核, 甚至忙等, 也就是在一个循环里面一直询问并等待....于是就会出现两个线程同时操作一个socket的局面. 而我们期望的一个socket连接在任意时刻都被一个线程处理, 因此我们可以使用epoll的EPOLLONESHOT事件来实现.

33320

高性能IO模型浅析

阻塞和非阻塞的概念描述的用户线程调用内核IO操作的方式:阻塞指IO操作需要彻底完成后才返回到用户空间;而非阻塞指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。...一、同步阻塞IO 同步阻塞IO模型最简单的IO模型,用户线程在内核进行IO操作时被阻塞。 ? 图1 同步阻塞IO 如图1所示,用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。...整个IO请求的过程中,用户线程阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。...然而,使用select函数的优点并不仅限于此。虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。...由于select函数阻塞的,因此多路IO复用模型也被称为异步阻塞IO模型。注意,这里的所说的阻塞select函数执行时线程阻塞,而不是指socket。

80170

趣谈IO多路复用的本质

(至少两个线程) 异步执行如下图所示,除非不需要知道结果,否则一般会有一个回调方法。 IO多路复用的本质 为了彻底理解IO多路复用是同步还是异步,咱们探究一下IO多路复用的本质。...只不过processselect这个函数阻塞,而不是被socket IO给阻塞。...I/O多路复用的流程如上图所示: (1)当用户进程调用select,那么整个进程会被阻塞; (2)而同时,内核会“监视”所有select负责的socket; (3)当任何一个socket中的数据准备好了...事实上,I/O 多路复用有时候性能比同步阻塞IO还更差一些。因为这里需要使用两个系统调用(select 和 recvfrom),而同步阻塞IO调用了一个系统调用(recvfrom)。...如果这个暗探偷一袋粮食,那效率最高的是不是他看到敌军守备松懈就直接进去偷粮(同步阻塞IO)?但是他要偷的十万大军的粮食,那他就要先回去汇报一声:“守备松懈啦”。

1.3K11

Java网络编程和NIO详解3:IO模型与Java网络编程模型

这个过程需要等待,也就是说数据被拷贝到操作系统内核的缓冲区中需要一个过程的。而在用户进程这边,整个进程会被阻塞(当然,进程自己选择的阻塞)。...因为这里需要使用两个system call (select 和 recvfrom),而blocking IO调用了一个system call (recvfrom)。...所以, IO多路复用,本质上不会有并发的功能,因为任何时候还是只有一个进程或线程进行工作,它之所以能提高效率是因为select\epoll 把进来的socket放到他们的 '监视' 列表里面,当任何socket...阻塞IO,非阻塞IO 与 同步IO, 异步IO的区别和联系 阻塞IO VS 非阻塞IO: 概念:阻塞和非阻塞关注的程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起...调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

72810

python3--IO模型,阻塞,非阻塞,多路复用,异步,selectors模块

线程(或多进程)的目的让每个连接都拥有独立的线程(或进程),这样任何一 个连接的阻塞都不会影响其他的连接。...该方案的问题: 开启多进程或都线程的方式,在遇到要同时响应成百上千路的连接请求,则无论多线程还是多进程都会严重占据系统资源, 降低系统对外界响应效率,而且线程与进程本身也更容易进入假死状态。...改进方案: 很多程序员可能会考虑使用“线程池”或“连接池”。“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的 线程,并让空闲的线程重新承担新的执行任务。...阻塞IO比较低效的 所有的阻塞都用不上cpu 总结: 协程能解决的事情,不要用线程 在其它语言里面 多进程 数据隔离 可以利用多核 多线程 数据不隔离 可以利用多核 协程 数据不隔离 不能利用多核 CPython...如果超过一定的超时时间(schedule_timeout 指定),还是没人唤醒,则调用select的进程会重新被唤醒获得CPU,进而重新遍历fd,判断有没有就绪的fd。

1.1K20

Python之IO模型

如下图     ps:所谓阻塞型接口指系统调用(一般IO接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回。 ?...该方案的问题: #开启多进程或都线程的方式,在遇到要同时响应成百上千路的连接请求,则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率,而且线程与进程本身也更容易进入假死状态。   ...改进方案:     #很多程序员可能会考虑使用“线程池”或“连接池”。“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲的线程重新承担新的执行任务。...需要注意,拷贝数据整个过程,进程仍然属于阻塞的状态。     所以,在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。...因为这里需要使用两个系统调用(select和recvfrom),而blocking IO调用了一个系统调用(recvfrom)。

963110

一口气说出 5 种 IO 模型,懵逼了

select select系统调用允许程序同时在多个底层文件描述符上,等待输入的到达或输出的完成。以数组形式存储文件描述符,64位机器默认2048个。...KFC营业员小姐姐打小票出号次的动作相当于操作系统多开了个线程,专门接收客户端的连接。我关注叫到的是不是我的号,因此程序还需在服务端注册我想监听的事件类型。...对于客户端来说,一般感受不到阻塞,因为请求来了,可以用放到线程池里执行;但对于执行select的操作系统而言,阻塞的,需要阻塞地等待某个套接字变为可读。...IO多路复用其实是阻塞select,poll,epoll这类系统调用上的,复用的执行select,poll,epoll的线程。...客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理 7.3 AIO--异步非阻塞编程方式 进行读写操作时,须直接调用api的read或write方法即可

70630

一口气说出 5 种 IO 模型,蒙圈了!

select select系统调用允许程序同时在多个底层文件描述符上,等待输入的到达或输出的完成。以数组形式存储文件描述符,64位机器默认2048个。...KFC营业员小姐姐打小票出号次的动作相当于操作系统多开了个线程,专门接收客户端的连接。我关注叫到的是不是我的号,因此程序还需在服务端注册我想监听的事件类型。...对于客户端来说,一般感受不到阻塞,因为请求来了,可以用放到线程池里执行;但对于执行select的操作系统而言,阻塞的,需要阻塞地等待某个套接字变为可读。...IO多路复用其实是阻塞select,poll,epoll这类系统调用上的,复用的执行select,poll,epoll的线程。...客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理 7.3 AIO--异步非阻塞编程方式 进行读写操作时,须直接调用api的read或write方法即可

76420
领券