暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅议Oracle与MySQL的进程与线程

数据老匠 2016-05-11
1433


前在前面

        Oracle后台服务及用户服务都是采用进程的形式存在,MySQL则是采用单进程多线程的形式,两种形式优势劣势在哪里?MySQL号称是基于磁盘数据库中CPU效率最高的数据库,这又为是为什么?这里为你揭晓。



关于线程与进程

        线程通常用Thread表示,进程通常用Process来表示。线程是指进程内的一个执行单元,也是进程内的可调度实体。

        线程与进程的主要区别:

        1、地址空间:进程是一个执行单元,它有自己独立的地址空间。进程内至少有一个线程,这些线程共享进程的地址空间。

        2、资源拥有:进程是资源分配和拥有的单位,每发起一个进程都需要为期单为分析系统资源,但同一个进程内的线程则共享进程的资源。

        3、线程是处理器调度的基本单位,不可再分。进程则还可以分发为多个线程。.

        4、二者均可并发执行.。


Oracle进程:

        在Oracle数据库启动时,系统就会为其分配大量的后台进程以提供专门的服务。如CKPT、PMON、SMON、DBWRn等,他们在数据库运行过程中,各负其责,通过内部机制进行通信,确保各自正常工作。在服务过程中,当监听器接收到外部的服务请求以后,由相关进程对其分析对应的服务进程。可以看到,在Oracle数据库中,最小的服务粒度就是进程。


InnoDB线程:

与Oracle有多个固定的后台进程不同,MySQL是单进程多线程数据库。在后台,可以看到MySQL一般有两个进程,一个是工作进程,一个是守护进程。

ps -ef | grep -i mysql

mysql     6676     1  0 04:25 pts/2    00:00:00 /bin/sh /u01/mysql/bin/mysqld_safe --datadir=/msdata/datas --pid-file=/msdata/datas/hidatas1.pid

mysql     6814  6676  0 04:25 pts/2    00:00:00 /u01/mysql/bin/mysqld --basedir=/u01/mysql --datadir=/msdata/datas --plugin-dir=/u01/mysql/lib/plugin --log-error=/msdata/datas/hidatas1.err --pid-file=/msdata/datas/hidatas1.pid --socket=/var/lib/mysql/mysql.sock

        守护进程的目的是在工作进程发生异常时,自动重新调用一个进程,以保证数据库可以持续的运行。当时,只运行一个工作进程数据库也可以正常运行。


进程与线程的效率之争:

        从效率来讲,MySQL因为是单进程多线程,其维护线程所需要的系统资源显然更低,线程之间进行上下文信息交换的效率也更高。而Oracle的进程之间虽然各司其责,但相互之间亦需要协调。与线程相比,进程之间的协调必定更耗资源。通过这一点,不难看出,MySQL在CPU的执行效率上更胜一筹,这也是MySQL号称是基于磁盘数据库中CPU效率最高的数据库的原因了。

        从稳定性上讲,如果因为操作系统或其它方面的原因,导致进程发生异常。如僵尸进程,则极容易使数据库也发生异常情况,在这种情况下,Oracle环境下,通常需要DBA通过Kill进程的方式重启进程,除CKPT、PMON等几个关键进程不能Kill以外,其它大部分进程被Kill掉,也不会对数据库造成什么影响。而对于MySQL来说,则于只有一个进程,显然Kill掉该进程会使数据库整体重启,则必然对系统的高可用性造成影响。目前的办法只能在数据库层面杀掉相关的会话以解决问题,但在极端情况下通过杀会话并不能解决问题。

       因此来讲,Oracle与MySQL关于进程与线程的优劣之争各有各有优势和缺点。重要的事,正确理解,把握解决问题之道才是关键。


文章转载自数据老匠,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论