mysql为什么用多线程_为什么Mysql使用多线程,而Oracle使用多进程

为什么Mysql使用多线程,而Oracle使用多进程

菜鸟不明白,于是搜索了一下,现在大致整理出来如下:

传统的unix系统,早期没有提供多线程,只有多进程。linux是最近的版本才加入多线程支持,以前一直都是多进程。windows很早就支持多线程,本地应用大部分也是多线程。因此oracle在windows上一直都是多线程,在unix上才是多进程。多进程的好处是,一个进程崩溃不会影响其他进程,多线程的好处是不需要__共享内存__这样的手段来访问数据库缓冲区

诸如Oracle这种商业数据库,基本都支持多种Process Models, Oracle默认是多进程。

根据Understanding MySQL Internals所说, MySQL一开始是Solaris上的 :

Thus in May of 1996 MySQL version 1.0 was released to a limited group, followed by a public release in October 1996 of version 3.11.1. The initial public release provided only a binary distribution for Solaris. A month later, the source and the Linux binary were released.

这本书也提及了,为什么MySQL用多线程:

Just as a good rider becomes one with the horse, Monty(MySQL author) had become one with the computer. It pained him to see system resources wasted. He felt confident enough to be able to write virtually bug-free code, deal with the concurrency issues presented by threads, and even work with s small stack. What an exciting challenge! Needless to say, he chose threads.

Postgres的原因可以在The design of Postgres中找到:

However, this approach requires that a fairly complete special-purpose operating system be built. In contrast, the process-per-user model is simpler to implement but will not perform as well on most conventional operating systems. We decided after much soul searching to implement POSTGRES using a process-per-user model architecture because of our limited programming resources.

总而言之,最根本的原因就如方圆说的,主要是当年操作系统对线程支持不给力,而MySQL是特例,因为开发者喜欢挑战(不过事实上,那个时候的线程支持已经基本完善了。MySQL后于Oracle和POSTGRES)

至于如果要了解不同model间的优劣,强烈推荐Anatomy of a Database System第二章Process Models.

在一书中有如下内容

每个 DBMS 工作者拥有一个进程

每个 DBMS 工作者拥有一个进程的模型(如下图),早期被用于 DBMS 开发,并且今天仍被一些商业系统所采用。这个模型由于 DBMS 工作者被直接映射到系统进程,因而相对容易实现。系统调度管理 DBMS 工作者的运行时间,而 DBMS 编程人员也可以利用系统的一些保护措施来排除标准错误,如内存溢出。而且,不同的编程工具,比如调试器和存储检测器,都与这种进程模型相适应。使这个模型变复杂的是 DBMS 连接所需要的内存中的数据结构,包括锁机制和缓冲池。这些共享的数据结构必须分配在所有 DBMS 进程都可以访问的 共享内存 中。这需要系统支持(一般系统均支持)和 DBMS 相关的代码。实际中,由于这种模型需要广泛使用共享内存,使得地址空间分离的优势被削弱了。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

如果把“扩展到大量并发连接”作为衡量标准,那么,每个 DBMS 工作者拥有一个进程

的模型并不十分有效。这是因为, 进程相对于线程而言,拥有更多的环境变量并且消耗更多的存储空间。进程切换需要切换安全的上下文环境、存储空间变量、文件和网络句柄列表以 及其他一些进程上下文。这在线程切换时是不需要的。 尽管如此,每个 DBMS 工作者拥有一 个进程的模型,还是比较受欢迎的,并得到 IBM DB2、PostgreSQL 和 Oracle 的支持。

每个 DBMS 工作者拥有一个线程

在每个 DBMS 工作者拥有一个线程的模型(如下图)中,一个多线程进程负责所有的 DBMS 工作者的工作。一个调度线程监听新的 DBMS 客户端连接。每个连接都被分配一个新的线程。 当每个客户端提交 SQL 请求时,该请求都由对应的 DBMS 工作者线程来执行。这个线程在 DBMS 进程中运行,一旦运行结束,结果将返回给客户端,然后该线程等待来着这个客户端 的下一个请求。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

多线程编程在这种架构下有以下困难:操作系统对线程不提供溢出和指针的保护;调试困难,尤其是在运行情况下更是如此;由于不同操作系统在线程接口和多线程扩展性方面的 不同,使得软件可移植性较差。 “每个 DBMS 工作者拥有一个线程模型”中的很多编程问题, 同样存在于每个 DBMS 工作者拥有一个进程模型中,因为它们都需要共享内存的使用。 尽管不同操作系统在线程 API 的多样性方面,近年来不断缩小,但不同平台之间微小的差别还是不断带来调试上的麻烦。如果不考虑实现上的困难,那么,每个 DBMS 工作者拥有一个 线程的模型,还是可以很好地扩展到高并发系统中的 ,并且这种模型在一些现代 DBMS 产品 中也被使用了,如 IBM DB2、微软 SQL Server、MySql、Informix 和 Sybase。

为什么Oracle在Windows上是多线程,而在Linux上是多进程的?

估计这个问题抛出来,会难到一大片数据库爱好者,这个改怎么解释呢,而且感觉也确实是无从说起,同一个数据库的两种看似截然不同的实现。

这个答案在知乎上没有看到满意的答案,我在asktom上看到了,因为有人在上面问了tom同样的问题,他的回答有两个,第一个很委婉,第二个很直接。

委婉的回答:

other then linux is a much cooler OS – no differnce.

That is the key fundemental thing about Oracle – we are the same on all platforms. Write to us and you are portable.

Write OS specific code and you are not.

Your client application, whatever it is, will not know if you are on linux or windows or a mainframe.

大体的意思是:两者没什么差别,平台的差异对应用是透明的,只是技术的实现差异。

当然不久还有网友问了类似的问题,tom就回答的更直白了。我喜欢这种直白。

直接的回答:

windoze is an os that prefers threads.    linux is not.    we do threads on windows.    we do processes on unix    we do whatever the underlying os "likes"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值