前言

  这里话就是总结一下之前没讲过的一些东西

系统调用

  1. accept与accept4
      当我们调用accept接收一个新的fd的时候,往往需要在调用fcntl将这个fd变成非阻塞IO,那么有没有一个系统调用可以一次性做完这两件事呢,有的有的就是accept4.
// accept 函数原型
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);// accept4 函数原型
int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);int connfd = ::accept4(sockfd_, (sockaddr *)&addr, &len, SOCK_NONBLOCK | SOCK_CLOEXEC);

  accept4 可以通过 flags 参数设置以下 socket 选项:
  SOCK_NONBLOCK:将新 socket 设置为非阻塞模式。
  SOCK_CLOEXEC:将新 socket 设置为在执行 exec 时自动关闭(避免子进程继承)
2. epoll_create与epoll_create1
  epoll_create1 通过 flags 参数提供了额外的功能:
* EPOLL_CLOEXEC:设置文件描述符的 close-on-exec 标志,确保在执行 exec() 系统调用时自动关闭 epoll 实例。
* 0:如果 flags 为 0,则 epoll_create1 的行为与 epoll_create 相同
3. eventfd与epoll
  eventfd本质上是一个计数器,对它的read/write操作都是原子的,当我们通过write向eventfd写入的时候,此时epoll会监听到此fd可读,至于可写嘛…只要没到最大值就是可写,监听的意义不大。
4. timefd与epoll
  timefd在muduo库作为超时机制也使用的不少,当timefd对应的time超时的时候,也会触发epoll的可读事件,可以用来配合回调处理某些超时时间。
5. readv与writev
  readv系统调用用于把数据读取到不同的位置,这在有些场景下还是很好用的:(1) 把报文头和报文内容分开,读取到不同的位置;(2)一次性把所有数据都读出来,避免调用多次read

// read 函数原型
ssize_t read(int fd, void *buf, size_t count);// readv 函数原型
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
  1. mmap与sendFile
      sendFile避免了将数据的多次拷贝,直接就可以把数据发送出去
#include <sys/sendfile.h>ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
  1. IO多路复用与阻塞/非阻塞IO
      先说我个人的看法:无论是水平触发还是边缘触发,都应该使用非阻塞IO,当然边缘触发必须使用非阻塞IO。
      为什么呢?对于水平触发而言,epoll可读就意味着我们一定可以读出数据吗,答案是否定的,man手册对这块有解释:就算可读,数据在后期也可能被丢弃了,那如果是阻塞IO的话,这是非常危险的。
    非阻塞
      对于边缘触发呢,则要求我们一定得把所有数据一次性读出来,因为边缘触发一定是只有在状态发生变化的时候才会报道,那我们怎么一次性读出所有数据呢----当然是调用多次read啦,这也就意味着如果是阻塞IO,那就很难做到了因为读不到就阻塞了,而非阻塞IO就不同,利用非阻塞IO的返回值,就可以这么设计

/*水平触发和边缘触发都可以用这个逻辑*/
/*水平触发为了保证公平性,也可以只读一次*/
bool ET = true; /*表示边缘触发*/
do{ssize_t readLen =  read()if(readLen < 0) {if(errno != EAGAIN) {/*处理一下*/}break;}
}while(ET)
  1. epoll的边缘触发与水平触发
      对于水平触发,你可以每次只read一部分,然后如果没读完那么epoll还会触发可读的,但是对于边缘触发,必须要一次性把缓冲区内容都读出来,要不然它是不会再上报的。
      至于边缘触发是不是一定比水平触发性能好,我个人还是觉得要视场景分析:
      场景1:fd可读,但是读取的缓存区buf长度大于等于需要读取的长度。此时水平触发性能更好,因为我们可以一次性读完所有的数据,对于水平触发的代价就是一次epoll + 一次read即可。但是此时边缘触发呢,则是需要一次epoll + 两次read(第二次read返回负值break)
      场景2:fd可读,但是读取的缓存区buf长度小于需要读取的长度。此时边缘触发性能更好。边缘触发一次epoll + 多次read,而水平触发需要多次epoll + 多次read调用。
      场景3:公平性,水平触发很明显比边缘触发更公平,假设我们需要处理所有的活跃文件fd,如果有的fd需要读的内容过多,意味着边缘触发需要读取多次,这对其他文件描述符是不公平的。而水平触发嘛…看你怎么设计程序了,可以每个人都读一次保证公平,也可以使用上面伪代码介绍的方式(前提是非阻塞IO)

C++这一块

  正好给我这个c with class的人开开眼(>.<),不过我感觉c++的回调虽然很强大,但是用的挺难受的,什么bind move啦,也许是我不适应吧

  1. 智能指针
    unique_ptr与share_ptr与weak_ptr
    unique_ptr没啥好讲的,主要是这里的share_ptr与weak_ptr和交叉引用问题,如果交叉引用则这两对象的析构函数将都不能调用。结合项目来说吧,这里的channel里用到了weak_ptr:
      假设由于某些意外,需要我们关闭掉Clientfd对应的连接,此时可能尚有可读事件还没有处理,为了防止出问题,我们可以看看Clientfd对应的对象是否存在。
    std::weak_ptr<void> tie_;       /*观察对象是否存在*/bool tied_;// Channel本身是fd的封装 是绑定到某个连接了的
void Channel::handleEvent(Timestamp receiveTime)
{if(tied_)   /*如果绑定了对象 weak_prt的作用就体现出来了 */{std::shared_ptr<void> guard = tie_.lock();if(guard){handleEventWithGuard(receiveTime);}/*如果对象都不存在了,就没必要处理对应事件了,要不还可能会报错,毕竟回调函数里可是要访问对象的资源的*/}else /*监听Socket的fd是不存在绑定的*/{handleEventWithGuard(receiveTime);}}

后期补充一下啦
3. unique_lock与lock_gurad
4. 虚函数
5. move
7. bind函数与函数指针相比,好在哪里
8. 右值引用与forward

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85682.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85682.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85682.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 虚拟dom

JSX创建出ReactElement对象 最终形成一个JS树 将React.createElement对象转为真实DOM的方法使用render函数 为什么要虚拟 dom 状态难以跟踪 ## 操作真实dom开销大 &#xff0c;并且操作会引起频繁的回流和重绘&#xff0c;并且不涉及批处理 声明式编程 从虚拟dom向真实dom去…

Spring MVC异常处理机制

Spring MVC提供了多种异常处理机制,以下是核心处理方式及实现方法: 一、局部异常处理(Controller级别) @ExceptionHandler注解 在Controller内部定义异常处理方法,捕获当前控制器抛出的指定异常。@Controller public class UserController {@GetMapping("/test"…

MySQL 8.x配置MGR高可用+ProxySQL读写分离(一):MGR构建MySQL高可用

#作者&#xff1a;stackofumbrella 文章目录 简介MGR优点MGR缺点MGR适用场景单主模式和多主模式组复制介绍组复制插件架构图单主模式多主模式配置主机名解析安装MGR插件 MGR故障转移恢复MGR集群 简介 MGR&#xff08;MySQL Group Replication&#xff09;是MySQL 5.7.17版本诞…

保安员证考试的理论知识部分,重点考查的法律法规具体有哪些?

保安员证考试理论知识部分&#xff0c;重点考查的法律法规主要有以下几种&#xff1a; 《保安服务管理条例》&#xff1a;作为保安行业的专门法规&#xff0c;是考试核心。重点考查保安服务活动规范&#xff0c;如保安服务的范围、资质要求等&#xff1b;保安员的权利与义务&am…

【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记(附 异常处理)

&#x1f680; 将所有 WSL 发行版从 C 盘迁移到 I 盘的完整教程&#xff08;含 Podman / NVIDIA Workbench / Ubuntu 等&#xff09; 【无标题】使用 Chocolatey 安装 WSL 管理工具 LxRunOffline-CSDN博客 免责声明 重要提示 在执行 WSL 迁移操作前&#xff0c;请务必仔细阅读…

Oracle APEX 通过rtf模板下载PDF文件(BIP)

1. 上传模板文件 共享组件 > 报表布局 2. 编写SQL文 共享组件 > 报表查询 报表布局中选择1中设置完的报表布局&#xff0c;然后编写SQL文提供数据 3. 添加下载按钮 在页中添加一个下载按钮&#xff0c;添加动态操作&#xff0c;选择打印报告 4. 下载PDF文件 点击Pri…

Web Seach 搜索 MCP 启动!

&#x1f680; 开启你的 AI 助手搜索能力&#xff01;开源 Web 搜索 MCP 服务器上线&#xff01; 在 ChatGPT、Claude 等 AI 工具成为生产力新核心的今天&#xff0c;我们往往面临一个尴尬的问题&#xff1a;模型不知道最新的网络信息。虽然 GPT-4o 和 Claude 支持联网功能&am…

005微信小程序npm包_全局数据共享和分包

npm包_全局数据共享和分包 1. 使用npm包1.1 Vant Weapp1.2 API Promise化 2. 全局数据共享3. 分包3.1 分包的加载规则3.2 分包的体积限制3.3 使用分包3.3 独立分包3.4 分包预下载 1. 使用npm包 小程序对npm进行了支持与限制&#xff0c;限制如下&#xff1a; 不支持依赖于 No…

DPO直接偏好函数的学习解读

DPO, Direct Preference Optimization&#xff0c;采用直接优化策略满足人类偏好&#xff0c;使得LLM对于给定输入&#xff0c;生成能用输出的概率高于生成不能用输出的概率。 1&#xff09;DPO优化目标 在DPO训练过程中&#xff0c;模型通过最大化可用回答相对于不可用回答的…

【开源初探】基于 Qwen2.5VL的文档解析工具:docext

源码地址&#xff1a; https://github.com/NanoNets/docext 概述 docext 是一个由视觉语言模型&#xff08;vlm&#xff09;提供支持的全面的本地文档智能工具包。vlm 使用的是基于 Qwen2.5VL-3B 的模型&#xff0c;应该是在此模型基础上进行的微调。 它提供了三个核心功能&…

Python 正确重载运算符(增量赋值运算符)

增量赋值运算符 Vector 类已经支持增量赋值运算符 和 * 了&#xff0c;如示例 13-15 所示。 示例 13-15 增量赋值不会修改不可变目标&#xff0c;而是新建实例&#xff0c;然后 重新绑定 >>> v1 Vector([1, 2, 3]) >>> v1_alias v1 # ➊ >>> …

XCUITest + Objective-C 详细示例

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】

redis分布式锁 Redisson在电商平台开发中的实际应用

目录 概述 Redis分布式锁的实现方式 1. 基于SETNX命令&#xff08;String类型&#xff09; 2. 使用SET命令的NX和EX参数&#xff08;推荐方式&#xff09; 3. 基于Lua脚本实现复杂逻辑 4. RedLock算法&#xff08;多节点Redis实现&#xff09; Redisson的分布式锁 Redis…

joomla 使用nginx服务器只能打开首页,其他页面404的解决方案

最近一个客户将Joomla4网站从原先的Apache服务器改为Nginx服务器&#xff0c;整个过程一切顺利&#xff0c;但还原网站后发现只能打开首页&#xff0c;其他页面都是404。这个问题需要修改nginx的配置文件来解决。 伪静态 在Apache中使用.htaccess来完成伪静态路由的转发&…

湖北理元理律师事务所企业债务纾困路径:司法重整中的再生之道

中小企业债务危机常呈现“担保链扩散”特征&#xff0c;单一债务可能引发企业崩盘。湖北理元理律师事务所通过预重整制度与企业债务重组技术&#xff0c;探索出“司法保护商业谈判”的纾困模式。 一、企业债务风险处置四步法 紧急止血 申请司法保护&#xff1a;通过诉前调解…

利用DeepWiki高效阅读项目源码

想获取更多高质量的Java技术文章&#xff1f;欢迎访问Java技术小馆官网&#xff0c;持续更新优质内容&#xff0c;助力技术成长 技术小馆官网 DeepWiki 是一个强大的工具&#xff0c;专为程序员提供开源项目源码的结构化文档和 AI 驱动的问答功能&#xff0c;帮助快速理解复杂…

django rest_framework 前端网页实现Token认证

rest_framework提供了几种认证方式&#xff1a;Session、Token等。Session是最简单的&#xff0c;几乎不用写任何代码就可以是实现&#xff0c;Token方式其实也不复杂&#xff0c;网上的教程一大把&#xff0c;但是最后都是用Postman这类工具来实现API调用的&#xff0c;通过这…

面试题-函数类型的重载是啥意思

在 TypeScript 中&#xff0c;函数重载&#xff08;Function Overload&#xff09; 是指为同一个函数提供多个不同的调用签名&#xff08;参数类型和返回值类型的组合&#xff09;&#xff0c;但函数体只有一个实现。这样可以让函数在不同的输入下表现出不同的行为&#xff0c;…

磐基PaaS平台MongoDB组件SSPL许可证风险与合规性分析(上)

#作者&#xff1a;任少近 文章目录 1.背景与问题1.1.背景1.2.问题 3.SSPL条款解读分析3.1.条款0&#xff1a;定义条款3.2.条款一&#xff1a;源代码条款3.3.条款二&#xff1a;基本授权条款3.4.条款三&#xff1a;反规避保护条款3.5.条款四&#xff1a;逐字传播条款3.6.条款五…

「Linux文件及目录管理」输入输出重定向与管道

知识点解析 输入/输出重定向 标准输入(stdin):默认从键盘读取,文件描述符为0。标准输出(stdout):默认输出到终端,文件描述符为1。标准错误(stderr):默认输出到终端,文件描述符为2。重定向符号: >:覆盖输出到文件(如command > file)。>>:追加输出…