1.1 动态服务器的系统结构
图1-1 动态服务器体系结构
如图3-1 所示。 INFORMIX 动态服务器采用的是一种多线程体系结构。这就意味着一个进程利用自己的多个线程可以同时完成多个任务,因而整个系统只需较少的进程就足以完成 DBMS 任务。
动态服务器系统由三个主要组件构成: 共享内存 、 进程 和 磁盘 。
共享内存包括三个段:驻留段、虚拟段和消息段。驻留段主要用做磁盘数据的缓存。虚拟段主要用做内存池以支持进程及相关的会话(session )和线程。当客户与服务器利用共享内存进行通讯时,消息段将用做两者之间的消息缓冲区。
系统中还包括若干构成数据库服务器的UNIX 进程,称为 oninit 。这些进程被称为虚处理器( VP , Virtual Processors )。每一个 VP 隶属于某一虚处理器类。而每一虚处理器类都负责完成一类特定的任务。
系统的磁盘组件由多个原始磁盘空间组成,称为chunk 。Chunk 以页( page )为基本单位。多个 chunk 集合逻辑上构成了数据空间( dbspace )。数据空间用于存储数据库、表、根以及物理日志和逻辑日志。一个数据空间至少包括一个 chunk 。
1.2 共享内存段
图1-1 动态服务器共享内存
如图3-2 所示,动态服务器的共享内存由 三个段构成 :
l 驻留段主要用做缓冲池,内含逻辑日志和物理日志的缓冲区以及其它系统数据结构。驻留段的大小主要由系统参数BUFFERS 决定。
l 虚拟段主要用做内存池以支持会话和线程。根据用途的不同,内存池可以进一步分为:会话池、多线程池、字典池、存储过程池、排序池、大缓冲区池以及全局池。内存池的分配和释放是动态进行的。内存池的大小为8k 。如果已有虚拟段耗尽,动态服务器可以根据 onconfig 参数再次动态申请。虚拟内存段的初始大小由参数 SHMVIRTSIZE 决定,其增量由参数 SHMADD 决定,但整个共享内存段的大小不能超过 SHMTOTAL 。
l 如果客户与服务器利用共享内存进行通讯,消息段将用做通讯缓冲区。每一用户连接(利用共享内存进行通讯)大致占用12K 的空间。用户连接的数量在参数 NETTYPE 中定义。
用户可以利用ipcs 或 onstat -g seg 命令监控共享内存段的状态 。
1.3 虚拟处理器( Virtual Processors )
数据库系统服务器由若干称为oninit 的 UNIX 进程组成,在系统中这些进程被称为虚拟处理器( VP ),如 图3 - 3 所示。所有VP 都是可执行程序 oninit 的实体。每一 VP 属于一种特定的虚拟处理器类,而不同的虚拟处理器类分别完成不同的任务。每一虚拟处理器类可创建的 VP 数量由下列参数决定:
CPU | NUMCPUVPS |
AIO | NUMAIOVPS |
PIO | 自动启动一个VP 。如果物理日志被镜像,将启动两个 VP |
LIO | 自动启动一个VP 。如果逻辑日志被镜像,将启动两个 VP |
SHM | NETTYPE |
TLI | NETTYPE |
SOC | NETTYPE |
MSC | 自动启动一个VP |
ADM | 自动启动一个VP |
OPT | STAGEBLOB被设置,然后自动启动一个 VP |
ADT | ADTMODE被设置,然后自动启动一个 VP |
用户可以利用 ps 或 onstat -g glo 命令监控 VP 的状态。
1.4 线程
在动态服务器中,线程是在oninit 中的一段被执行的指令流。如 图3-4 所示,通过多线程机制,可以让一个进程同时为多个任务服务而不必生成多个OS 级进程。进程 oninit 可以启动多个线程,各线程顺序执行,并在适当的时候将控制权转移给其它线程。在多线程进程中每一线程都有自己的执行环境,包括自己的代码空间和自己的局部变量。一个多线程进程负责多个线程间的正文切换。
在系统中,线程只能有两种存在状态:要么正在某个VP 上运行,要么在某一队列中排队等待。在就绪队列中保存了所有已准备就绪只待执行的线程的正文。一旦出现空闲 VP ,该 VP 就从就绪队列中选取一个线程执行,而选取的标准由内部的优先机制决定。
在特定的时候,当前运行的线程会把对VP 的控制权转移给其它线程。有如下几种可能导致控制权的转移:
l 等待磁盘读写操作
l 等待应用进程的请求
l 等待获得锁或其它资源
l 将运行机会转给其它线程
一旦线程交出控制权,该线程的context 就将被列入等待或睡眠队列中。所有等待某种操作的线程进入等待队列,而所有需要稍后被唤醒的线程进入睡眠队列。
1.5 磁盘组件
如 图3-5 所示。在动态服务器中以页(page )作为基本存储和 I/O 单位。页大小因机器和操作系统的不同而不同,一般为 2k ,也可能为 4k 。用户无法改变页大小。
l 分配给系统使用的连续磁盘空间的单位称为 chunk 。 chunk 由多个页构成。它是一个典型的 UNIX 原始设备。 chunk 的大小由管理员设定。
l 数据空间( dbspace )是多个 chunk 的逻辑集合。每一数据空间至少包括一个 chunk 。数据库和表创建在指定的数据空间上。系统必须至少包括一个数据空间: root dbspace 。在该空间中存储着所有关于系统的信息。
l 物理日志( physical log )由连续的磁盘空间构成,其存储着共享内存缓冲区中所有已修改的数据页的(但尚未写入磁盘中)被修改前的映象。因而物理日志主要用于快速恢复。只有当数据页在首次被修改时,系统才会将其映象写入物理日志。
l 逻辑日志(logical logs ) 也时由连续的磁盘空间构成,其存储着事务记录、 DDL 语句和 checkpoint 记录。由管理员设定逻辑日志的数目。系统循环使用逻辑日志文件。在系统初启时,物理日志和逻辑日志都自动建立在 root dbspace 上。
小 结
动态服务器系统由三个主要组件构成:共享内存、进程和磁盘。
动态服务器的共享内存由三个段构成:驻留段、虚拟段和消息段。
虚拟处理器都是可执行可执行程序oninit 的实体。
线程是在oninit 中的一段被执行的指令流。
页是在动态服务器中磁盘组件的基本存储和I/O 单位。
习 题
3-1 在动态服务器中,线程是 ___________________________ 。
3-2 动态服务器的共享内存由哪几个段组成?