服务器框架流程图
2020-04-16 10:06:05 0 举报
服务器通讯框架
作者其他创作
大纲/内容
sem_post
收到完整数据包的处理函数
ServerRecyConnectionThread延时回收队列中的连接如果达到规定时间关闭连接释放内存
①
for( ;; )
ngx_epoll_process_events
ngx_event_accept
设置子进程标题
通过epoll驱动写事件将数据发送完毕将写事件从epoll中移除
被唤醒的线程获取数据后的处理函数
_HandlerLogin
g_threadpool.inMsgRecvQueueAndSignal
子进程初始化函数
业务逻辑处理
调用函数发送数据
如果没有事件发生会阻塞在这里
g_threadpool.StopAllg_socket.Shutdown_subproc
②
ServerTimerQueueMonitorThread
所有线程通过 pthread_cond_wait在这里阻塞等待
SendNoBodyPkgToClient
为监听套接字添加读事件有读事件发生调用ngx_event_accept
recvproc
ngx_init_setproctitle
printInfo
数据没有发送或没有完全发送(发送缓冲区空间不足)将写事件添加到epoll中等待系统驱动
threadRecvProcFunc
pthread_mutex_init
已经accept连接的读事件
调用send函数发送数据
_HandlerRegister
为accept套接字添加读事件有读事件发生调用ngx_wait_request_handler
accept
sendproc
子进程工作函数
sigsuspend
绑定连接池
程序结束标记g_shutEvent = 1
创建单独线程管理发送数据
读取配置文件
ServerSendQueueThread
加入到心跳包检测队列
socket初始化
清理各种队列释放互斥锁信号量
先创建一定数量的连接池 后续有需要再创建
epoll_create
pthread_joindelete 线程内存
ngx_process_events_and_timers
监听端口 套接字放入监听队列
调用epoll_wait等待获取事件
ngx_open_listening_sockets
将收到的消息放入发送消息队列 并调用sem_post唤醒发送数据线程有数据要处理
创建epoll对象
g_socket.Initialize
数据发送成功调用sem_post函数提醒发送数据线程缓冲区有空间了如果有数据需要发送可以进行发送操作
initconnection
ServerSendQueueThread在sem_wait阻塞等待 有数据需要发送时 sem_post唤醒该线程发送数据
发送数据给客户端
处理接收到的数据并返回数据给客户端
子进程初始化线程
环境变量搬家 设置进程标题
判断是否要断开连接
子进程循环调用epoll_wait
ngx_start_worker_processes
接收到完整包头的处理函数
创建单独线程管理延时回收
子进程初始化epoll
程序结束标记g_shutEvent = 0
ReadConf
g_socket.ngx_epoll_init
设置主进程标题
g_socket.Initialize_subproc
等待线程结束 释放内存
清理队列 释放互斥量信号量
主进程
sigprocmask
循环调用创建worker进程
ngx_worker_process_cycle
调用recv函数读取数据
输出信息
ngx_master_process_cycle
创建worker进程
ngx_write_request_handler
创建守护进程
ThreadFunc
将获取的完整数据放入接收消息队列
AddToTimerQueue
从线程池中唤醒一个线程来处理数据
main
msgSend
HeartBeatTimeOutCheck
设置阻塞信号
ngx_epoll_oper_event
唤醒在阻塞等待的条件变量
触发写事件
ServerTimerQueueMonitorThread通过记录上次收到心跳包的时间与当前时间进行比较 将过期的连接都挑选出来进行再次判断
清空信号阻塞
监听套接字读事件
ngx_wait_request_handler_proc_p2
数据通过send发送成功 返回sem_wait
ServerRecyConnectionThread
创建线程池 数量为配置文件中的参数
数据没有发送成功在epoll中添加写事件
父进程fork后返回
ngx_worker_process_init
创建线程池
ngx_get_connection
进入工作流程
ngx_wait_request_handler
ngx_spawn_process
ngx_daemon
ngx_wait_request_handler_proc_p1
初始化全局\\局部变量装载配置文件日志初始化信号初始化
pthread_cond_signal
三次握手成功设置非阻塞套接字
Call
_HandlerHeartBeat
初始化互斥量信号量
捕捉信号
g_threadpool.Create
创建连接池
逻辑业务处理
创建单独线程管理心跳包
处理收到的心跳包
0 条评论
回复 删除
下一页