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

为什么在同一个ARM64 Linux上调用select时,两个不同大小的结构timeval都可以工作?

在同一个ARM64 Linux上调用select时,两个不同大小的结构timeval都可以工作的原因是因为select函数的参数中的timeval结构体是用来设置超时时间的,而不是用来传递实际的时间值的。

select函数是一个多路复用的系统调用,用于监视一组文件描述符的状态变化。它可以同时监视多个文件描述符,当其中任意一个文件描述符就绪(可读、可写或异常)时,select函数就会返回。在调用select函数时,我们可以通过设置timeval结构体来指定超时时间,即在指定时间内如果没有任何文件描述符就绪,select函数会超时返回。

在ARM64 Linux上,select函数的参数中的timeval结构体有两个字段:tv_sec和tv_usec。tv_sec表示超时时间的秒数,tv_usec表示超时时间的微秒数。这两个字段的类型分别是long和long,所以不同大小的timeval结构体在ARM64 Linux上都可以工作。

无论是使用较小的timeval结构体还是较大的timeval结构体,select函数都会根据tv_sec和tv_usec字段的值来计算超时时间,并在超时时间到达或有文件描述符就绪时返回。因此,选择使用哪个大小的timeval结构体取决于具体的需求和编程习惯。

在腾讯云的产品中,与云计算相关的推荐产品是云服务器(ECS),它提供了基于ARM架构的云服务器实例,可以满足不同规模和需求的应用场景。您可以通过以下链接了解更多关于腾讯云服务器的信息:https://cloud.tencent.com/product/cvm

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

IO多路复用的三种机制Select,Poll,Epoll

const struct timeval *timeout timeout告知内核等待所指定文件描述符集合中的任何一个就绪可花多少时间。其timeval结构用于指定这段时间的秒数和微秒数。...(不管是Socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一...用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。...其中,结构体的events域是监视该文件描述符的事件掩码,由用户来设置这个域,结构体的revents域是文件描述符的操作结果事件掩码,内核在调用返回时设置这个域 nfds_t nfds 记录数组fds中描述符的总数量...---- 既然select,poll,epoll都是I/O多路复用的具体的实现,之所以现在同时存在,其实他们也是不同历史时期的产物 select出现是1984年在BSD里面实现的 14年之后也就是1997

1.1K20
  • select,poll,epoll区别

    select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。...例如,假设有两个文件描述符,值分别是7和9,被放在readfds中。当select()返回时,如果7仍然在set中,则这个文件描述符已经准备好被读取而不会阻塞。...当select()返回时,timeout参数的状态在不同的系统中是未定义的,因此每次调用select()之前必须重新初始化timeout和文件描述符set。...每个结构体的events域是监视该文件描述符的事件掩码,由用户来设置这个域。revents域是文件描述符的操作结果事件掩码。内核在调用返回时设置这个域。...更甚至在一个数据包面数目巨大但同时每个数据包本身大小却很小的特殊系统上尝试最新的NAPI网卡驱动架构。

    1.4K21

    Redis 和 IO 多路复用

    Redis为什么这么快 完全基于内存,绝大部分请求是基于内存的操作,而 Redis 的数据结构是类似于HashMap,而 HashMap 的操作时间复杂度是O(1) Redis 数据结构设计简单,方便操作...在 I/O 多路复用模型中,最重要的函数调用就是 select,该方法的能够同时监控多个文件描述符的可读可写情况,当其中的某些文件描述符可读或者可写时,select 方法就会返回可读以及可写的文件描述符个数...FD; 使用 FD_SET 将 fd 加入 rfds; 调用 select 方法监控 rfds 中的 FD 是否可读; 当 select 返回时,检查 FD 的状态并完成对应的操作。...子模块中最重要的函数就是 aeApiPoll,它是实际调用 select 函数的部分,其作用就是在 I/O 多路复用函数返回时,将对应的 FD 加入 aeEventLoop 的 fired 数组中,并返回事件的个数..." #endif #endif #endif 因为 select 函数是作为 POSIX 标准中的系统调用,在不同版本的操作系统上都会实现,所以将其作为保底方案: ?

    68110

    Linux阅码场 - Linux内核月报(2020年07月)

    它允许客户在EC2实例[1]内部再分割出一块隔离的计算环境。 例如,一个在虚拟机中运行的用于处理敏感数据的应用程序,可以和运行在同一个虚拟机中的其它应用程序分离开。...为了支持虚拟机客户系统使用更大的页面,我们需要在hypervisor-guest通信中正确地在这两个不同的页面大小间进行转换。这基本就是这个PATCH系列所做的工作。...同时也提供了 Kconfig 上的配置,只用模块参数和 Kconfig 上的配置同时使能时,debugfs才能正常工作。 总的来说,此补丁为用户提供了一个动态开关 debugfs 的功能。...实际上连带的元数据改动都可以由新添加extent的记录推导出来。如果日志只记录原始数据和相关关系,在日志应用 时再根据信息推导和还原,就能大量减少日志的体量。...2.5 Mount notifications 此系列补丁为挂载拓扑事件做了个主动上报的机制,例如挂载、卸载、挂载重新配置等事件触发时向用户空间上报事件。 为什么需要内核主动上报呢?

    1.6K20

    万字图解| 深入揭秘IO多路复用

    epoll边缘触发、水平触发的区别、适合场景 为什么在 Linux 网络编程中最好用非阻塞式 IO?...里面,文件描述符的个数已经随着 fd_set 的实现而固定,没有办法对此进行配置;而在 poll 函数里,我们可以自由控制 pollfd 结构的数组大小,从而突破select中面临的文件描述符个数的限制...《The Linux Programming Interface》中用了一张图直观的展示了 select、poll、epoll在不同数量的文件描述符下的性能。...rbr:用户调用epoll_ctl增加的文件描述都存储在这,其本质是一颗红黑树。 其工作流程主要如图所示: epoll 相比select、poll为什么高效?...为什么在 Linux 网络编程中最好用非阻塞式 IO?     前面提到过,如果使用阻塞IO,假如某个文件描述符长期不可读,那么对应的线程就会长期阻塞,导致资源被浪费。

    3.7K24

    使用epoll时需要将socket设为非阻塞吗?

    函数的 timeout 参数的类型是一个结构体指针,这个结构的定义如下: struct timeval  {     long    tv_sec;         /* seconds */     ...select 函数的 timeout 参数含义有三种: 当 timeout 为 NULL 时,select 函数将一直阻塞下去,直到出错或者绑定其上的 socket 有事件; 当 timeout->tv_sec...282 4.1 学习网络编程时应该掌握的socket函数 282 4.1.1 在Linux上查看socket函数的帮助信息 283 4.1.2 在Windows上查看socket函数的帮助信息 285...4.2 TCP网络通信的基本流程 286 4.3 设计跨平台网络通信库时的一些socket函数用法 290 4.3.1 socket数据类型 290 4.3.2 在Windows上调用socket函数...4.5 select函数的用法和原理 302 4.5.1 Linux上的select函数 302 4.5.2 Windows上的select函数 317 4.6 socket的阻塞模式和非阻塞模式 318

    2.4K10

    详解IO多路转接模型:select & poll & epoll

    那么在输出时,假设这些文件描述符1,5都已经就绪,输出回来时,这个合集中的1,5比特位的位置上的内容为1,而3由于没有就绪,就为0。需要注意的是,输入输出的都是同一个位图,是同一个!...每次调用poll都需要把大量的pollfd结构从用户态拷贝到内核中。 同时连接的大量客户端在一时刻可能只有很少的处于就绪状态, 因此随着监视的描述符数量的增长, 其效率也会线性下降。...int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 它不同于select()是在监听事件时告诉内核要监听什么类型的事件...在使用epoll_create的时候,会创建出一个eventpoll这个结构体,这个结构体里面有两个指针成员,一个指向就绪队列,一个指向红黑树。...总结它们三者之前的优缺点: 在可以等待的文件描述符的数量上:select是有上限的,取决于它的位图的类型fd_set的大小。poll跟poll是没有上限的。

    65640

    Linux阅码场 - Linux内核月报(2020年08月)

    in BPF subprograms 目前BPF对BPF程序本身的调用和尾部调用是互斥的,但是该补丁成功让他们可以同时工作,即让尾部调用可以和BPF子程序同时工作。...在Arm64架构的Hyper-V虚拟机中运行Linux客户机需要的工作还有一些地方还在进行中:Arm64架构的Hyper-V目前运行时的页面大小为4K字节,但允许客户机使用16K或者64K字节大小的页面...然而,在Hyper-V虚拟设备的Linux驱动程序中,客户机系统使用的页面大小被假设为4K字节。这个补丁集为客户机系统使用更大的页面先做一些基础工作,后续会有跟多的补丁来更新这些驱动程序。...这个驱动将在晚些时候被修复用以使能Arm64上的vPCI设备。*在一些情况下,来自x86/x64的术语也被带到了Arm64的代码中(“MSR”、“TSC”)。...(译注:不同于Arm,Xen在x86上支持以下3种类型的客户机:PV Guest,HVM和PVH。下图是这三种类型的客户机推出时间线。

    1.5K92

    linux环境下的时间编程

    +8小时,这是为什么呢?...而我们知道地球上根据经度不同对于各地区的人来说时间也是不同,因此为了正常生活需要划分出时区;各时区的时间不同,但某些事物会在不同的时区同时发生,因此又需要一个统一的标准时来确定时间,这句是协调世界时(UTC...所以我们在Linux上处理时间时一定要注意上下文中时间值附带的时区信息。...在看过这些常用接口之后,我觉得你现在一定陷入混乱了,因为每个函数对时区的假设都不同,甚至一个函数的参数和返回值的时区也不相同!这就是为什么在Linux上处理时间问题会成为噩梦的原因之一。...使用timeval结构的函数也少的可怜,只有select和pselect。

    3.4K30

    PostgreSQL 如果放在 X86 或 ARM 上“摩擦” 到底哪个性能好?(翻译)

    ARM架构不怎么熟悉,甚至我都不知道什么是ARM,实际上PG已经有一阵有基于ARM64的安装包了,对于ARM 的信心来自我对不同场景下的测试结果。...这里我的测试方式是基于pgbench 测试的方式通过比较X86 64 VS ARM64 ,但这并不是目标,实际上我就想找到ARM结构的PG 在什么场景下,比X86的性能好。...这里还有一个事情要提到,PGBENCH 和我们的数据库是安装在一起,这个程序本身要占用20%的CPU 资源,另外有一点我也没有能明白就是在6-8时上升的速度这可能与LINUX 系统的参数有关,从测试的图中我们很明显的可以看到在...结论: 从上面的测试中可以看出在ARM64上工作情况还是良好的,虽然在两个平台上进行性能比较的工作其实也没有那么容易,我们实际上可以看到在不同模式下,两个平台各自的不同。...翻译结束 —————————————————————————————— 个人观点,测试时并不是很严谨,仅仅通过pgbench来进行测试,这里只能说明一些简单的语句在PG上的工作情况,但值得注意的是,ARM

    2.2K40

    聊聊BIO,NIO和AIO (1)到底什么是“IO Block”BIONIOIO多路复用用epoll实现的IO多路复用epoll的优势水平触发和边沿触发再来思考一下什么是“Block”总结

    考虑下面两种情况: 用系统调用read从socket里读取一段数据 用系统调用read从一个磁盘文件读取一段数据到内存 如果你的直觉告诉你,这两种都算“Block”,那么很遗憾,你的理解与Linux不同...Linux认为: 对于第一种情况,算作block,因为Linux无法知道网络上对方是否会发数据。如果没数据发过来,对于调用read的程序来说,就只能“等”。 对于第二种情况,不算做block。...多个数据流共享同一个TCP连接的场景的确是有,比如Http2 Multiplexing就是指Http2通讯中中多个逻辑的数据流共享同一个TCP连接。但这与IO多路复用是完全不同的问题。...如果是追求性能的话,在BSD/macOS上提供了kqueue api;在Salorias中提供了/dev/poll(可惜该操作系统已经凉凉);而在Linux上提供了epoll api。...在时刻t2时,两个fd都到了100bytes数据,于是在时刻t3, epoll_wait返回了两个fd进行处理。在t4,我们故意不读取所有的数据出来,只各自读50bytes。

    1.9K80

    Linux内核时钟系统和定时器实现

    HZ表示1秒种产生多少个时钟硬件中断,tick就表示连续两个中断的间隔时间。在我电脑上,HZ=250, 一个tick = 1/HZ, 所以默认一个tick为4ms。...上图1是Linux 2.6.16以来内核定时器实现的结构, 新内核对相关的时间硬件设备进行了统一的封装,定义了主要有下面两个结构: 时钟源设备(closk source device):抽象那些能够提供计时功能的系统硬件...那么sleep是如何实现的?Glibc的sleep实现如下:可见其实调用alarm实现的,在alarm的基础上注册了SIGALRM信号处理函数,用于在定时器到期时,捕获到信号,回到睡眠的地方。...函数setitimer 设置的定时器则不同,它们不但可以计时到微妙(理论上),还能自动循环定时。在一个Unix进程中,不能同时使用alarm和ITIMER_REAL类定时器。...需要自己完成一些辅助工作,因为内核无法在 Timer 到期时启动一个新的线程。

    3.7K30

    UNPv1第六章:IO复用select&poll

    5种基本I/O模型 阻塞式I/O 非阻塞式I/O I/O复用(select和poll) 信号驱动式I/O(SIGIO) 异步I/O 一个输入操作通常包括两个不同的阶段 (1)等待数据准备 (2...(3)IO复用模型 有了I/O复用,我们就可以调用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞真正的I/O系统之上 我们阻塞于select调用,等待数据报套接字变为可读...,当select返回套接字可读这一条件时,调用recvfrom把所读的数据复制到应用程序缓冲区内。...另外使用select的优势在于我们可以等待多个描述符就绪 ? (4)信号驱动IO模型 可以用信号让内核在描述符就绪时发送SIGIO信号通知我们 ?...3 shutdown函数 终止网络连接的正常方法是调用close,但close有两个限制可由函数shutdown来避免: 1). close将描述字的访问计数减1,仅在此计数为0时才关闭套接口。

    58130

    【Linux】IO多路复用-SELECTPOLLEPOLL

    ---- select select-函数 在一段指定时间内,监听用户感兴趣的文件描述符上的可读、可写和异常等事件。...---- timeval-结构体 结构体定义 struct timeval{ long tv_sec; // 秒 long tv_usec; // 微秒 }; 如果结构体 timeval 的两个域都为...可能产生的情景: 一个线程(或进程)在读取完某个socket上的数据并开始处理时,在处理的过程中该socket上又有新的数据可读(EPOLLIN被再次触发),此时唤醒另一个线程来读取这些新的数据。...于是就出现了两个线程操作一个socket的局面。 使用: 使用epoll_ctrl函数在该socket(文件描述符)上注册EPOLLONESHOT事件。...工作模式: select与poll都只能工作在相对低效的LT模式,而epoll可以工作在高效的ET模式。

    1K30

    (六)关于网络编程的一些实用技巧和细节

    那么如何利用connect()函数编写非阻塞的连接代码呢? 无论在windows还是linux平台都可以采取以下思路来实现: 1....接着调用select()函数在指定的时间内检测socket是否可写,如果可写表明connect()连接成功。...一般的做法是先收取一个固定大小的包头信息,接着根据包头里面指定的包体大小来收取包体大小(这里“收取”既可以从socket上收取,也可以在已经收取的数据缓冲区里面拿取)。...但是windows上和linux上实现稍有差别,windows上是一个socket回收后,在MSL期间内,其使用的地址和端口号组合其他进程不可以使用,但本进程可以继续重复利用;而linux实现是所有进程在...但是有人说,在x86机器上gettimeofday不是系统调用,所以libevent没必要这么做。有没有必要,我们借鉴一下这个减少系统调用的思想而已。

    1.2K70

    IO多路复用模型

    为什么需要IO复用 3. 三种IO复用方法 3.1. select 3.2. poll 3.3. epoll 4....前置知识 了解socket编程 了解五种IO模型 (红黑树) 为什么需要IO复用 一个简单地服务端可能是这样的: 调用socket()创建套接字 bind()绑定地址和端口 listen()监听套接字...while(1){ 调用accept()连接客户端 fork()创建进程B来处理客户端的需求/使用新的线程来执行任务 } 释放资源 当使用上面这种方式来处理客户端的请求时,如果客户端数量特别多,服务端就会创建很多进程或线程来执行任务...timeval结构体,但其中的值为0 等待一段时间:在规定时间内如果发生IO活动就马上返回,如果一直没有就等超时后再返回。...只有活跃的客户端才会调用回调函数,所以epoll会因为活跃的连接数过多而性能下降) Linux平台专用。 超时精度为毫秒。

    44220

    聊聊BIO,NIO和AIO (1)

    考虑下面两种情况: 用系统调用read从socket里读取一段数据 用系统调用read从一个磁盘文件读取一段数据到内存 如果你的直觉告诉你,这两种都算“Block”,那么很遗憾,你的理解与Linux不同...Linux认为: 对于第一种情况,算作block,因为Linux无法知道网络上对方是否会发数据。如果没数据发过来,对于调用read的程序来说,就只能“等”。...多个数据流共享同一个TCP连接的场景的确是有,比如Http2 Multiplexing就是指Http2通讯中中多个逻辑的数据流共享同一个TCP连接。但这与IO多路复用是完全不同的问题。...如果是追求性能的话,在BSD/macOS上提供了kqueue api;在Salorias中提供了/dev/poll(可惜该操作系统已经凉凉);而在Linux上提供了epoll api。...在时刻t2时,两个fd都到了100bytes数据,于是在时刻t3, epoll_wait返回了两个fd进行处理。在t4,我们故意不读取所有的数据出来,只各自读50bytes。

    77730

    (六)关于网络编程的一些实用技巧和细节

    无论在windows还是linux平台都可以采取以下思路来实现: 创建socket时,将socket设置成非阻塞模式,具体如何设置可参考我这个系列的文章《服务器编程心得(四)—— 如何将socket设置为非阻塞模式...接着调用select()函数在指定的时间内检测socket是否可写,如果可写表明connect()连接成功。...一般的做法是先收取一个固定大小的包头信息,接着根据包头里面指定的包体大小来收取包体大小(这里“收取”既可以从socket上收取,也可以在已经收取的数据缓冲区里面拿取)。...但是windows上和linux上实现稍有差别,windows上是一个socket回收后,在MSL期间内,其使用的地址和端口号组合其他进程不可以使用,但本进程可以继续重复利用;而linux实现是所有进程在...但是有人说,在x86机器上gettimeofday不是系统调用,所以libevent没必要这么做。有没有必要,我们借鉴一下这个减少系统调用的思想而已。

    1.9K51
    领券