linux 几种服务类型
采集来自于
https://blog.csdn.net/hguisu/article/details/7453390
https://blog.csdn.net/limo120621/article/details/52757390
https://blog.csdn.net/tennysonsky/article/details/45671215
综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。
1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。
2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善
同步/异步与阻塞/非阻塞经常看到是成对出现:
同步阻塞,异步非阻塞,同步非阻塞
同步与异步
同步和异步的关注点在于消息通信机制:对于同步而言,是调用者主动等待调用结果,不得到结果不返回。而对于异步,调用在发出后不等结果便返回了,而后被调用者通过状态、通知来告知调用者,或通过回调函数进行处理。
《Unix网络编程:卷一》6.2.7节中如此描述同步和异步IO:
- 同步I/O操作 (synchronous I/O operation) :导致请求进程阻塞,直到I/O操作完成;
- 异步I/O操作 (asynchronous I/O operation):不导致请求进程阻塞。
根据这个定义,阻塞式IO,非阻塞IO和IO复用这三个模型均属于同步IO,因为在内核数据准备好时,进程调用的IO操作(read、recv)会将数据拷贝至用户空间,此时应用进程将被阻塞。而对比此时的异步IO,当进程发起IO操作调用后直接返回,直到1.数据准备就绪 2.数据由内核拷贝至用户空间 这两个操作完成后被告知IO操作已经完成,在此过程中应用进程完全没有被阻塞。所以,阻塞和非阻塞是针对同步IO而言,对于异步IO而言没有所谓阻塞和非阻塞之分。
总的而言,在处理IO操作时,阻塞和非阻塞都是同步IO,只有使用特殊 API 时才属于异步IO。
补充:对于IO复用模型中的epoll调用,因为epoll函数采用 mmap的机制, 使得内核的套接字缓冲区和用户空间中的缓冲区共享了,从而省去了将数据拷贝至用户空间这一步骤,这也意味着, 当epoll回调上层的回调函数来处理套接字数据时, 数据已经从内核层 “自动” 到了用户空间,所以epoll通知应用进程时,数据已经到达了用户空间,这时的read/recv等调用只用读取用户空间中的缓冲区了,而不用进行拷贝操作了。所以epoll这个调用很多时候会被误理解为异步IO,但是epoll在告知应用进程前还是被阻塞了,只不过将阻塞点由IO系统调用转移到了epoll这个系统调用上,所以IO复用模型中的epoll虽然在业务逻辑上有异步,但是从IO操作层面上而言还是属于同步IO的。
而poll与select的主要区别在于,select需要为读、写、异常事件分配创建一个描述符集合,最后轮询的时候,需要分别轮询这三个集合。而poll只需要一个集合,在每个描述符对应的结构上分别设置读、写、异常事件,最后轮询的时候,可以同时检查三种事件。poll与select在处理思想上是同一个层次,当然poll相对于select又优化,而epoll,则是完全不同的机制,有本质上的区别。
对于select模型,大多都是说他的缺点,实际上我的观点有点不一样,select模型的跨平台性是比较好的,开发也比较简单,只有当个进程连接数的限制,以及其性能随着连接数增长下降的问题,实际上都得根据项目的实际情况而定的。在内部分布式通讯中,几乎所有的连接都是活跃的情况下,select模型并不比epoll的性能差,只是在一些应用中大部分连接都不活跃的情况,epoll的使用效果要高,可以使单台服务器的承载量大大增加,实际上游戏服务器中玩家绝大部发是活跃的,因此实际性能也还不错。
与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。
设置为非阻塞的方法有:
(1)创建socket的时候,指定socket是异步的,在type的参数中设置SOCK_NONBLOCK标志即可。
- int socket(int domain, int type, int protocol);
- int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
(2)使用fcntl函数:
- fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK);
(3)使用ioctl函数:
- ioctl(sockfd, FIONBIO, 1); //1:非阻塞 0:阻塞
linux 几种服务类型的更多相关文章
- java gRPC四种服务类型简单示例
一.gRPC 简介 gRPC 是Go实现的:一个高性能,开源,将移动和HTTP/2放在首位通用的RPC框架.使用gRPC可以在客户端调用不同机器上的服务端的方法,而客户端和服务端的开发语言和 运行环境 ...
- Linux几种服务用处介绍
rexec--Remote Execute,远程命令执行,允许远程机器在本机上远程执行命令,监听端口512. nfs--Network File System,网络文件系统,用于将本机文件夹共享到别的 ...
- angular五种服务详解
在这之前angular学习笔记(十五)-module里的'服务'这篇文章里,已经大致讲解了ng中的'服务',在之后的很多地方也用到了服务,但是,所有的服务都是使用app.factory来创建的.但其实 ...
- 用一个例子说说gRPC的四种服务方法
本文通过一个简单的例子来演示这4种类型的使用方法 案例代码:https://github.com/codeAB/grpc-sample-example 目录结构说明 ├── calculator.pr ...
- linux安装mysql服务分两种安装方法:
linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点是安装速度 ...
- 【Linux】七种文件类型
Linux中的七种文件类型 d 目录文件. l 符号链接(指向另一个文件). s 套接字文件. b 块设备文件,二进制文件. c 字符设备文件. p 命名管道文件. - 普通文件
- Linux 下的7种文件类型
普通文件类型 (-)Linux中最多的一种文件类型, 包括 纯文本文件(ASCII):二进制文件(binary):数据格式的文件(data);各种压缩文件.第一个属性为 [-] ,这些文件一般是用一些 ...
- linux文件的3个时间和7种文件类型
linux文件的三个时间: atime: access time --最近访问时间. ctime: change time --最近改变时间. mtime:modify time --最近修改时间. ...
- 5 个在 Linux 中管理文件类型和系统时间的有用命令
对于想学习 Linux 的初学者来说要适应使用命令行或者终端可能非常困难.由于终端比图形用户界面程序更能帮助用户控制 Linux 系统,我们必须习惯在终端中运行命令.因此为了有效记忆 Linux 不同 ...
随机推荐
- hdu 5183
hdu 5183(Hash处理区间问题) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183 题意:给出一个n个元素的数组,现在要求判断 a1-a2 ...
- .net core web api 与httpclient发送和接收文件及数据
客户端 HttpClient var url = $"https://localhost:44323/api/values/posttest?resource_source=yangwwme ...
- install mysql on centos7
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了 MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的 ...
- 【Android】自动测试工具 Monkey
前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框架.CTS.Monkey.Monkeyrunner.benchmark.其 ...
- Vue前端利用qrcode生成二维码
<div id="qrcode" style="width: 560px;height: 560px;background-color: white;"& ...
- Selenium的webdriver的常用方法,鼠标事件
就来认识 WebDriver 中最常用的几个方法: get():跳转到的地址clear(): 清除文本. send_keys (value): 模拟按键输入. click(): 单击元素. 示例: f ...
- 2018-2019-1 20189201 《LInux内核原理与分析》第六周作业
希望是美好的 但仅仅是所想 一.书本第五章知识总结[系统调用的三层机制(下)] 深入理解系统调用的过程 system_call并不是一个普通的函数,只是一段汇编代码的起点,且内部没有严格遵守函数调用堆 ...
- NEL程序员专用轻钱包 进入0.01状态了
这个轻钱包能干什么,现在就能在测试网看个余额,转个帐,调用个合约. 而且功能非常程序员化 你会说是不是没啥用 但是他有非常有用,因为他可以很容易的拼出NEOGUI拼不出来的交易 比如参与ICO交易 ...
- Spring Cloud微服务笔记(一)微服务概念
微服务概念 一.什么是微服务架构 微服务,是一个小的.松耦合的分布式服务. 为什么需要微服务: 1)单体系统部署在一个进程中,修改了一个小功能,为了部署上线就会影响其他功能. 2)单体应用各个功能模块 ...
- [PA2014]Matryca
[PA2014]Matryca 题目大意: 有一堵长度为\(n(n\le10^6)\)的墙需要刷漆,你有一把长度为\(k\)的刷子.墙和刷子都被均匀划分成单位长度的小格,刷子的每一格中都沾有某种颜色的 ...