浅析DM线程并发控制机制.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅析DM线程并发控制机制

浅析DM线程并发控制机制 摘要:在大型商业数据库的系统中,多线程机制是一种常用的提高系统并发吞吐能力的手段之一,但随之也会带来很多的问题:线程的切换、资源的竞争,如果处理的不得当,将导致系统资源的大量浪费,严重的将会产生死锁,而这些问题将最终导致系统执行效率的严重降低。本文将针对这些问题探讨DM是如何处理线程的调度及如何进行并发同步控制。 ?  DM和其他主流商业数据库:Oracle,? Microsoft SQL Server,? Sybase都采用多线程机制。采用多线程的模式,能用较少的线程管理大量的用户进程;并且,线程是动态可调整的,当用户数增加时, 线程也会阶段性地自动增加;当用户数减少时,线程也会自动减少。多线程结构,大大降低了数据库对系统资源的占用,提高了系统资源的利用率。   但与Oracle采用多进程多线程多进程体系结构不同的是,DM采用单进程多线程体系结构,用户请求都由一个进程来进行总的调度和管理,并以多线程方式执行用户的请求。这种架构比多进程多线程架构所需内存开销较少,系统资源占用也要少的多,其对系统资源的利用率比采用多进程方式要高。 1. DM多线程简介   DM利用操作系统提供的机制建立了多种线程,部分线程的数目还可以根据配置文件设置。DM的线程主要有:控制台线程、工作线程、I/O 线程、会话线程、日志线程、连接监听线程、日志线程、检查点线程、死锁监控线程等。其中工作线程和I/O 线程的个数可以在配置文件中设置。各线程之间相互配合、协同工作,共同完成客户的请求,如图1所示。 图1? DM 总体结构 2. DM线程同步机制   在DM数据库内部有许多资源:系统缓冲区、全局变量、内存、文件系统、部分内存对象 数据字典、B树 等,它们为多个线程所共享,为了实现数据的最大共享。DM采用适当的编程手段等技术实现多线程协同工作,保证系统效率。   对于线程同步问题常用的方法是利用操作系统提供的同步机制,例如在Windwos平台下的Critical Section、Mutex、Semaphore、Event Object等,DM通过自己实现的线程读写锁及线程等待数组等方法来解决线程同步问题,而不是完全依靠操作系统提供的同步机制。这样做的好处就是能够最大限度的提高速度,减少因同步机制带来的性能损失。 下面就介绍下DM实现线程并发控制的常用技术方法:  (1)?封装操作系统的临界区 /** os_mutex_struct: WIN32平台下多线程操作的互斥结构 */ struct os_mutex_struct os_thread_id_t? owner;???/** owner: 拥有资源的当前线程ID */ ulint level;???/** level: 互斥量的级别 */ dmbool???type;??/** type: 互斥量的类型*/ ulint???lock_word;??/** lock_word: 锁的类型 */ dmbool???waiting;??/** waiting: 等待标志 */ ?CRITICAL_SECTION? cs;??/** cs: 临界区对象 */ ; DM对单个对象的互斥访问权是通过结构体os_mutex_struct来实现,对于每一个共享的系统资源均有一个os_mutex_struct变量,对该资源的读写访问都必须放在os_mutex_enter和os_mutex_exit两个函数之间,这样就能保证资源在同一时间内只能够被一个线程处理。   os_mutex_struct结构体封装了操作系统的临界区对象,而不是互斥对象,临界区的行为特性与互斥对象相同,但是临界区属于用户方式对象,而互斥对象则属于内核对象。这意味着临界区的运行速度要比互斥对象要快,不需要进行调用方式的转换。同时,使用临界区的问题也是显而易见的,尤其在对多个对象进行同步控制时,很容易陷入死锁状态。 (2) 实现线程读写锁和线程等待队列 /**rw_lock_struct:定义rw锁结构*/ struct rw_lock_struct os_mutex_t??? mutex; /**保护该结构的互斥量*/ ?? ulint n_readers;?? /**读线程个数*/ ?? dmbool writer_waiting; /**是否有写线程在等待*/ ?? ulint lock_mode;?? /**锁模式,X_LATCH, S_LATCH, N_LATCH*/ ulint n_writers;?? /**写线程拥有该锁的次数*/ ?? os_thread_id_t writer; /**写线程ID*/ DM_LIST_NODE_T rw_lock_t list; /**rw锁链表*/ DM_LIST

文档评论(0)

kabudou + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档