CUBRID 中的线程模型
来源:互联网 发布:oracle启动数据库监听 编辑:程序博客网 时间:2024/06/05 19:43
作者:于淼
本文旨在说明 CUBRID 这一数据库引擎中的线程模型。将分别从客户端和服务器端两个视角描述一个请求是被 CUBRID 响应的过程。
下图描述了整体的线程结构:
在描述请求处理过程之前有必要先说一下各个线程所扮演的角色(以下说明都是基于Linux平台,Windows下的表现会略有不同,文后将作以说明)。如图所示,CUBRID 服务器端共有2个进程: 1. Cub_master 对客户端来讲只有master是可见的。为了与cub_server 通信, 客户端首先与cub_mater建立连接。Cub_master将客户端socket传递给cub_server 并由其保存在css_Conn_array队列中。 2. Cub_server Cub_server以多线程的形式进行分工。 a) Master thread 处理来自master进程的请求。主要负责以下三件事情: (1) 检测cub_master进程的状态 (2) 处理新连接请求 (3) 处理shutdown请求 b) Worker thread 客户端请求的真正执行者。 c) Daemon thread CUBRID 中共有6个守护线程, 分别负责以下工作: (1) Dead lock detection (2) Checkpoint (3) Oob-handler (4) Page flush (5) Flush control (6) Log flush 下面以请求如何被处理的流程来说明各个进程线程之间是如何协同工作的。 1. 当一个新的客户端试图与server建立连接时,它需要首先与cub_master建立连接。 2. Cub_master将与客户端进行通信的套接字传递给cub_server中的master thread。 3. master_thread在接到新连接请求之后,首先从css_Conn_array空取出一个空闲的conn_entry将此套接字放入其中,生成一个完整的conn_entry(除套接字以外,还包括client_id, transaction_id, request_id等信息),并将其设置为active状态。 4. master_thread利用步骤3中生成的conn_entry 生成一个新的job_entry 放入 css_Job_queue当中, 并设定其handle_function 为connection_handler。完成之后唤醒一个正在等待的worker_thread 5. worker_thread被唤醒后取回job_entry, 开始执行connection_handler函数。此函数的功能就是利用conn_entry中套接字与客户端进行通信,接收它的request,生成新的job_entry,放入css_Job_queue,唤醒另外一个worker_thread。 此时job_entry的handle_function 为request_handler 6. 步骤5中被唤醒的worker_thread开始执行request_handler。至此,客户端的request得到响应。执行完成后,直接将结果reply给客户端。一个requesst完成。 7. 此客户端再次发送request时跳过步骤1~4,重复步骤5、6,直到客户端退出。 说明: 在Windows平台下,无法在进程间传递描述符,所以步骤2将改变为cub_master将master_thread的port号返回给client,client重新建立一个到此port口的连接。
参考资料:
1. CUBRID 数据库官方网站 - http://www.cubrid.org/
2. CUBRID on sourceforge - http://sourceforge.net/projects/cubrid/
- CUBRID 中的线程模型
- Android中的线程模型
- Android中的线程模型
- Android中的线程模型
- Android中的线程模型
- Android中的线程模型
- Android中的线程模型,
- X265中的线程模型
- [转载]Android中的线程模型
- [OpenStack] Nova中的线程模型
- Apartment之COM中的线程模型
- Universal-Image-Loader中的线程模型
- CUBRID自动化测试框架
- CUBRID Volume介绍
- CUBRID 有奖活动 (iPad)
- 线程模型
- 线程模型
- 线程模型
- Hibernate + Oracle + C3P0 连接池无没释放问题,暂用proxool配置替代
- 关于C中结构体存储的简介
- 什么是黑盒测试和白盒测试?
- 程序人生箴言(转)
- ASP.NET Google Maps Javascript API V3 实战基础篇一路况图层
- CUBRID 中的线程模型
- 『bvbook』与会SD2.0:有朋自远方来
- 基于java的通讯协议
- 『sunky』我在SD2.0大会上的视频教程
- 关于互联网的隐私
- 『tony1130』企业持续集成之成熟度模型---SD2.0 topic
- 三层架构model与DAOImpl实现
- Sql去掉重复行
- 『asaai』走进SD2.0大会,拜名师交朋友