devi
服务器编程的注意事项
关注作者
前往小程序,Get
更优
阅读体验!
立即前往
腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
devi
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
社区首页
>
专栏
>
服务器编程的注意事项
服务器编程的注意事项
devi
关注
发布于 2021-08-18 10:12:46
426
0
发布于 2021-08-18 10:12:46
举报
文章被收录于专栏:
搬砖记录
setsockopt可以设置各类套接字的一些配置属性。 如: SO_REUSEADDR ——防止服务器重启受阻 SO_REUSEPORT – 开启端口重用,允许多个套接字bind/listen同一个端口 SO_KEEPALIVE – 心跳机制 TCP_NODELAY – 取消Nagle(取消小包合并)
CLOEXEC:fork之后写时复制,因此在未写时与父进程共享文件(指向相同)。但如果子进程此时采用exec替换进程,需要在替换之前关闭无用的fd。如果相应的fd非常多,这会很难做到。因此指定fd的flag=CLOEXEC,表示调用exec时关闭该fd。
一个进程的所有线程共享所有信号。 因此,多线程的时候,需要一个线程处理所有信号。 信号处理分散到多个线程中很容易出错。参考14-8-3(linux高性能服务器编程)
EPOLLONESHOT 即使使用ET,一个连接fd也可能被触发多次。比如在并发程序中,一个线程读取一次fd进行处理,而此时该fd又有读事件被触发,这时候该fd可能被另一个线程拿到,这就出现了多个线程同时操作同一个连接的情况。 采用EPOLLONESHOT可保证该fd只能被触发一次(因此执行完该事件后,需要重新设置该fd的EPOLLONESHOT,recv=0:对端关闭,recv>0:继续读,recv<0:如果errno==EAGIN,则重置EPOLLONESHOT状态,等待下一次该fd再被epollwait通知)
close仅仅让引用减一(因此fork的线程都需要各自进行close),使用shutdown可以真正关闭文件(的读或者写或者读写端)
时间轮,定期执行 时间堆,使用堆顶时间作为下次tick时间,能够实现较精准定时
reactor是同步IO,是否阻塞取决于用户配置。proactor是异步IO, 同步IO:用户注册fd,内核通知用户“事件就绪”,用户处理事件。 异步IO:用户注册事件以及对应的事件完成处理函数,内核执行事件,并调用完成处理函数。
统一事件源:IO处理(epollwait),信号处理(管道),定时任务(也是信号)等。 信号处理函数不做处理,而是向管道写入信号给主线程,主线程将管道注册到epoll中了,当该信号处理触发epoll时,由主线程执行相关逻辑。 (实际上根据一切皆文件的理念,任意代码都可与某个fd绑定,进而统一事件源进行处理)
std::promise与std::future: promise相当于生产者,future相当于消费者。 future.get()会阻塞等待直到promise.set_value()调用。 可用于并发时跨线程、跨时间传递数据。
本文参与
腾讯云自媒体同步曝光计划
,分享自作者个人站点/博客。
原始发表:2021/05/18 ,如有侵权请联系
cloudcommunity@tencent.com
删除
前往查看
linux
unix
c++
javascript
node.js
本文分享自
作者个人站点/博客
前往查看
如有侵权,请联系
cloudcommunity@tencent.com
删除。
本文参与
腾讯云自媒体同步曝光计划
,欢迎热爱写作的你一起参与!
linux
unix
c++
javascript
node.js
评论
登录
后参与评论
0 条评论
热度
最新
推荐阅读
LV.
文章
0
获赞
0
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档
0
0
0
推荐