【sylar服务器】IO资源管理调度
目录
IO资源管理调度
[1]sylar服务器 https://github.com/sylar-yin/sylar
IO资源管理调度
- 基于TCP/UDO实现服务器与客户端之间的连接,后台需要时刻接收来自客户端的连接信息,在高并发的环境,如何去实现对各个套接字的监控,sylar服务器使用的epoll方法,在网络套接字管理类,则是对epoll进行的一个封装。
1、IO管理调度
- soceket管理类基于epoll实现对网络连接的管理,整个类分为三部分,事件枚举,socket事件上下文类,IO管理函数。
1.1、事件枚举
```c enum Event { // 无事件 NONE = 0x0, // 读事件(EPOLLIN) READ = 0x1, // 写事件(EPOLLOUT) WRITE = 0x4, }; ``` - Event这里实现对对IO事件属性的设置,在套接字登记和消息返回时,evnent可以用来指明消息属性1.2、socket事件上下文类
struct FdContext {//socket上下文类
typedef Mutex MutexType;
struct EventContext {//事件上线文类
Scheduler* scheduler = nullptr;
Fiber::ptr fiber;
std::function<void()> cb;
};
EventContext& getContext(Event event);//获取事件上下文类
void resetContext(EventContext& ctx);//重置事件上下文
void triggerEvent(Event event);//触发事件
EventContext read;//读事件上下文
EventContext write;//写事件上下文
int fd = 0;//套接字句柄
Event events = NONE;//当前事件
MutexType mutex;//事件的mutex
};
- sokcet用于配置一个套接字使用的相关信息(回调函数,读写类型)。io类基于epoll方法实现,当一个套接进入io类进行注册时,socket则将该套接字进行封装为类,并提供对事件的处理方法。
- EventContext类
- 这个结构体中,封装关于回调函数的相关信息。每个套接字会配套一个回调函数,事件响应后调用回调函数,EventConetxt则指定该函数设置的协程和调度器信息(默认IO调度)
- 附:这个sylar服务器底层是基于协程实现的调度器
1.3、IO管理的函数
//threads:底层调度器需要的线程数量,user_calller:是否立即调度,name:调度器名称
IOManager(size_t threads = 1, bool use_caller = true, const std::string& name = "");
//fd:套接字,event:事件类型,cb:套接字对应的回调函数
int addEvent(int fd, Event event, std::function<void()> cb = nullptr);
//fd:删除的套接字句柄,event:事件类型
bool delEvent(int fd, Event event);
bool cancelEvent(int fd, Event event);
bool cancelAll(int fd);
static IOManager* GetThis();
protected:
//io类继承于schedule类,io类用来重写,使得在首次调度时就启动监听套接字函数
void idle() override;
//扩张调度器容纳的数量。
void contextResize(size_t size);
bool stopping(uint64_t& timeout);
1.4、类中私有成员
//epoll句柄
int m_epfd = 0;
//原子量,用来记录其中的事件总数
std::atomic<size_t> m_pendingEventCount = {0};
/// IOManager的Mutex
RWMutexType m_mutex;
/// socket事件上下文的容器
std::vector<FdContext*> m_fdContexts;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律