进程调度实验讲解

2024-04-15

进程调度实验讲解(通用5篇)

篇1:进程调度实验讲解

天津大学仁爱学院

实验类型:实验名称:实验地点:

学生姓名:班 级:

操作系统 实验报告

必 修 实验日期:2014年4月18日进程调度 二实验楼504 李帅帅 指导教师:张 磊 计科一班 计算机科学与技术系

天津大学仁爱学院——计算机科学与技术系——李帅帅

实验报告内容:

1)实验目的

用c语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

2)实验器材和设备

硬 件: 二实验楼504计算机

开发工具: Microsoft Visual C++ 6.0

3)实验任务

本实验模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解。用c语言编写和调试一个进程调度的算法程序,有一些简单的界面,能够运行,仿真操作系统中进程调度的原理和过程。通过对调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度

4)实验原理

无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。

基本状态:1.等待态:等待某个事件的完成;

2.就绪态:等待系统分配处理器以便运行; 3.运行态:占有处理器正在运行。

运行态→等待态 往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。

等待态→就绪态 则是等待的条件已满足,只需分配到处理器后就能运行。运行态→就绪态 不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。

就绪态→运行态 系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态

5)实验过程描述

a)打开Microsoft Visual C++ 6.0,创建工程。

b)根据要求用 c语言代码实现应用程序,并调试完成。c)运行程序,根据提示输入相应的字符。

d)输入实验测试内容,并观察执行窗口显示的过程。

天津大学仁爱学院——计算机科学与技术系——李帅帅

q=(struct pcb *)malloc(sizeof(pcb));

cin>>q->name;

cin>>q->needtime;

q->cputime=0;

q->priority=P_TIME-q->needtime;

q->process=ready;

q->next=NULL;

if(i==0)

{

p=q;

t->next=q;

}

else

{

q->next=t->next;

t=q;

q=p;

}

i++;} return p;}

void display(pcb * p){ cout<<“name”<<“ ”<<“cputime”<<“needtime”<<“ ”<<“priority”<<“ ”

<<“state”<

cout<

name;

cout<<“ ”;

cout<

cputime;

cout<<“ ”;

cout<

needtime;

cout<<“ ”;

cout<

priority;

cout<<“ ”;

switch(p->process)

{

case ready:cout<<“ready”<

case execute:cout<<“execute”<

case block:cout<<“block”<

case finish:cout<<“finish”<

}

天津大学仁爱学院——计算机科学与技术系——李帅帅

void priority_cal(){ pcb * p;system(“cls”);p=get_process();int cpu=0;system(“cls”);while(!process_finish(p)){

cpu++;

cout<<“cuptime:”<

cpuexe(p);

display(p);

Sleep(1000);} printf(“All processes have finished,press any key to exit”);getch();}

void display_menu(){ cout<<“nCHOOSE THE ALGORITHM:”<

pcb *get_process_round(){ pcb *q;pcb *t;pcb *p;int i=0;t=(struct pcb *)malloc(sizeof(pcb));p=(struct pcb *)malloc(sizeof(pcb));cout<<“input name and time”<q=(struct pcb *)malloc(sizeof(pcb));

cin>>q->name;

cin>>q->needtime;

q->cputime=0;

天津大学仁爱学院——计算机科学与技术系——李帅帅

{

} } return t;}

void set_state(pcb *p){ while(p){

if(p->needtime==0)

{

p->process=finish;//如果所需执行时间为0,则设置运行状态为结束

}

if(p->process==execute)

{

p->process=ready;//如果未执行状态则设置为就绪

}

p->next;} }//设置队列中进程执行状态 void display_round(pcb *p){ cout<<“NAME”<<“ ”<<“CPUTIME”<<“ ”<<“NEEDTIME”<<“ ”<<“COUNT”<<“ ”<<“ROUND”

<<“ ”<<“STATE”<

cout<

name;

cout<<“ ”;

cout<

cputime;

cout<<“ ”;

cout<

needtime;

cout<<“ ”;

cout<

count;

cout<<“ ”;

cout<

round;

cout<<“ ”;

switch(p->process)

{

case ready:cout<<“ready”<

case execute:cout<<“execute”<

case finish:cout<<“finish”<

天津大学仁爱学院——计算机科学与技术系——李帅帅

7)实验结果截图

篇2:进程调度实验讲解

尊敬的各位领导、各位来宾:

大家好!欢迎来到唐山市交通运输局交通应急指挥调度中心。唐山市交通应急指挥调度中心始建于2009年,建筑面积680平方米,内设应急指挥调度大厅、监控室、会商室、应急指挥调度室、中心机房等。中心定位于服务社会、服务群众,按照平战结合、经济实用的建设理念,运用电子、信息、通信等技术,搭建覆盖市县两级交通局及业务管理部门的交通应急调度指挥平台。目前,交通应急指挥平调度台系统已经进入到平稳运行阶段。

中心接入了高速公路、客运站、机场、治超点、等场所的视频监控信息,实现了覆盖全市交通行业的日常值守、预警处理,辅助决策、后期处置、预案资源管理等功能。

大家请看大屏幕,我的右手边显示的是高度公路的实时视频监控。目前我们接入的高速有唐港,唐曹、西外环三条高速公路。可以看到收费站广场、收费亭、以及高度公路的实时路况。我的左手边显示的是客运站的监控信息,其中包括唐山西站和唐山东站,通过监控可以看到这里是……唐山三女河机场的建成为群众的出行提供了更多的便利,我们还接入了机场的监控信息。另外,我们指挥中心还安装了唐山港引航站船舶引航调度监控系统,我们可以看到港口情况以及船舶进出停靠等信息。

除了治超点监控采取与路网监控相同的摄像头定点监控外,还引入了移动监控方式,为执法车辆安装移动视频传输设备及卫星定位系统,监控图像直接传送到指挥中心,既能掌握执法车辆运行方位,又

能记录执法人员的执法行为。

下面重点为大家介绍一下GPS卫星定位系统和公众信息服务

中心运行的卫星定位系统以出租车、客运车辆、物流车辆为服务对象,系统能够容纳10万台设备的运行,现在网用户为6000余辆,通过GPS卫星定位系统,可以实现对车辆的定位跟踪、轨迹回放、车内监听、图像抓拍、反劫防盗、信息发布、电话约车等功能。

各位请看这幅图像就是抓拍的…车辆的实时路线信息,我们可以看到它的运行轨迹,对车内图像的抓拍。这样做可以增强车辆与场站指挥中心的沟通联系,便于加强日常管理和安全监管,还可以震慑盗窃抢劫,有效保障车辆在行驶过程中的安全性,保证公众出行安全。

中心整合了唐山市交通系统已有的、分散的公众信息,建立了一个面向社会公众的交通信息服务中心,心设立23个坐席,开通了24小时运行的交通热线,热线电话是2202222。自热线开通以来共受理热线电话9000余个,我们都做到了热情服务,及时回复,满意度达到了100%。为了给公众提供更优质的服务,我们多渠道采集信息,添加了沿海、京沈、承唐、唐曹、唐港等高速公路的动态路况咨询,通过共享气象台,客运站,出租车公司的信息,为群众提供客运班次,发车时间,行车路线,天气状况电话约车等咨询服务。为更好的服务公众提供坚实的保障。

篇3:进程调度实验讲解

1 Linux进程调度原理

1.1 进程调度时机

在Linux中, 进程调度时机与进程的调度方式和引起进程调度的原因有关。在linux中进程被调度发生切换一般分两步完成:一是通过时钟中断触发更新检查机制, 看是否需要发生进程切换;二是利用schedule () 函数来完成进程的切换。

利用schedule () 完成进程切换有两种情况:一是当前进程因缺乏资源而被阻塞, 主动调用schedule () ;二是当前进程用完了它的时间片, 或者被唤醒的进程的优先权比当前进程的优先权高, 再或者是系统调用sched_setscheduler () 函数, 就会被动调用schedule () 。

1.2 进程调度依据

进程一旦被创建, 其所有相关信息被放在进程对应的数据结构task_struct中, 当调度程序运行时, 会根据task_struct结构中的policy、priority、counter和rt_priority四个成员[2]来确定要调度的进程。

policy表示进程的调度策略, 目前主要有以下五种[3]:SCHED_NORMAL、SCHED_FIFO、SCHED_RR、SCHED_BATCH和SCHED_IDLE。SCHED_NORMAL用于普通进程, SCHED_FIFO是用于实时调度的先入先出调度算法, SCHED_RR是实时调度的轮流调度算法, SCHED_BATCH用于非交互的处理器消耗型进程, SCHED_IDLE是在系统负载很低时使用。

priority设置进程的静态优先级。

counter用来记录当前时间片内该进程还允许运行的时钟数, 它是进程调度的主要依据, 其值在不断的减少, 被当做是动态优先级。

rt_priority表示实时进程的优先级, 它的取值范围1-99, 对普通进程而言, 它的值是0。

Linux用goodness () 函数计算处于就绪状态的进程的优先级[4], 该函数根据以上四项, 结合其他一些因素, 给每个进程赋予一个权值, 调度程序把这个权值作为选择进程的唯一依据。

2 Linux进程调度算法

2.1 进程调度相关的主要数据结构

2.2 结构体task_struct

Linux内核是通过进程描述符即结构体task_struct来管理进程的, 该结构体包含了进程所需要的所要信息, 进程的调度信息也包含其中, 主要有以下几个。

(1) state。结构体成员变量state表示进程的状态。一个进程可能有7种状态:TASK-RUNNING, TASK-INTERRUPTIBLE, TASK-UNINTERRUPTIBLE, TASK-STOPPED, TASK-TRACED, EXIT-ZOMBIE和EXIT-DEAD。在进程调度的过程中, 进程的状态是发生变化的。

(2) prio、static-prio和policy。这三个变量分别表示进程的静态优先级、动态优先级和调度策略, 系统根据三个变量值和counter成员值计算进程的优先级。

(3) sleep-avg。该变量表示进程的平均等待时间。它是进程动态优先级计算分关键因子, 它的值越大, 计算出来的优先级越高, 其值在0到NS_MAX_SLEEP_AVG之间变化。

(4) s l ee p-cr e d it。该变量表示进程的交互程度。其值在-CREDIT_LIMIT和CREDIT_LIMIT+1之间变化, 初值是0, 而后根据不同的条件发生变换, 其值加1或减1, 该值一旦超过CREDIT_LIMIT, 表示该进程是交互进程, 所以, 它是区别CPU繁忙型和I/O繁忙型作业的重要因素。

(5) array。该变量指向当前处理器的active就绪进程序列。

3 就绪队列struct-runqueue

在linux2.6支持多核cpu, 系统为每个CPU分配了一个就绪队列, 每个CPU就绪队列由结构体struct-runqueue来描述, 该结构体有一个prio_array结构体数组, 该数组中有个两个prio_array结构体, 分别对应active和expired两个就绪数组。active指向时间片没有用完, 还可以被调度的就绪进程;expired指向时间片已经用完的就绪进程, 当active中的task为空时, 交换两个数组的指针值。

prio_array结构体的定义如下[5]。

其中, nr-active表示该prio-array机构体上挂着多少个任务;bitmap表示优先级位图, 用于快速定位优先级最高的进程, 其初始值为0, 当一个优先级为N的进程变为运行态时, bitmap中的第N为变1;queue是一个指针数据, 每个数组标记一个链表头, 每个链表挂一串具有相同优先级的进程。

进程调度时, 系统首先找到bitmap成员第一个为1的位置, 假设bitmap第6位是1, 然后访问struct list_head queue[MAX_PRIO]数组的第6个成员, 找到优先级为6的task链表的表头, 最后, 取下该表头的第一个task, 将其调度。

3.1 调度函数schedule () 的作用

Linux系统中, 进程的调度主要是由schedule () 函数实现的, 它的主要作用是选择一个优先级最高的进程代替当前的进程运行。Schedule () 函数的工作流程大概包括:清理当前运行的进程、修改内核中的某些数据结构、选择下一个要运行的进程、设置新进程运行的环境、完成进程的切换。

schedule () 函数先执行以下代码:

代码执行时, 调用sched-find-first-bit () 函数, 找到当前处理器就绪队列的active进程数组中优先级最高的非空就绪进程链表, 选择链表中的第一个进程为将要运行的进程, 如果当前进程和将要运行的进程不是同一个进程, schedule () 函数调用context_switch () 完成进程的切换。

3.2 算法存在的问题

在多处理器系统中, 存在多个就绪进程队列runqueue, 每个处理器对应一个。系统调度过程中, 每个处理器上的任务不是固定不变的, 随着时间的变化, 每个处理器上的负载发生变化, 可能会出现有些处理器超载运行而有些处理器闲置的情况。为提升系统的整体性能, 在Linux中会把负载较重CPU上的任务转移到相对较空闲的CPU上, 进行负载平衡。

在Linux中, 由于处理器负载不均衡而进行的负载平衡操作, 会使预取到重载处理器高速缓存 (cache) 中的指令和数据失效[6], 造成缓存效率下降, 进而影响整个计算机系统的性能。本文针对缓存失效问题提出了改进的方法。

3.3 调度算法的改进

(1) 负载转移目标的选择。先利用Linux系统支持的用户锁定机制futex[7], 把共享资源多的进程关联起来, 利用转移函数确定任务的目标端时, 利用该锁将关联的进程分配到同一个处理器执行。

(2) 修改task_struct结构。在task_struct中添加一个整型的字段cpuid, 表示对一个进程来说, 最适合运行的cpu。task_struct结构如下。

(3) 修改Futex内容。系统利用futex将共享资源多的进程关联起来, 利用该锁在唤醒某一进程时, 需要将CPU的编号一起发给被阻塞的进程。修改后的函数futex_wake核心代码[8]如下。

负载平衡时, 利用move-task () 函数进行任务转移, 在该函数中, 增加判断cpuid的操作, 作为任务转移时选择需平衡操作的cpu特征值。

通过上述的改进方法, 使共享资源多的进程尽量被分配到同一处理器上运行, 从而在一定程度上提高了缓存的利用率。

4 结语

本文分析了Linux系统的调度原理和调度策略, 详细分析和阐述了结构体task_struct中同调度密切相关的成员的作用、调度函数schedule () 的调度过程。并针对系统调度过程中出现的缓存失效问题给出解决的办法和改进的算法。

参考文献

[1]贺炎, 刘曙霞.Linux的进程调度策略[J].电子科技, 2004, 5:31-34.

[2]陈佳闻.Linux进程调度策略的分析[J].山东农业大学学报 (自然科学版) , 2012, 43 (2) :279-282.

[3]Linux进程管理之task_struct结构体 (上) [EB/OL], http://blog.csdn.net/npy_lp/article/details/7292568 2014, 9, 10.

[4]张立, 王茜竹, 王朝霞, 练有品.Linux内核的进程调度原理及改进算法研究[J].后勤工程学院学报, 2006, 3:44-48.

[5]Linux如何实现 (1) 调度[EB/OL]http://www.linuxidc.com/Linux/2013-03/81434.htm 2014, 9, 9.

[6]Youhui Zhang, Ziqiang Qian, Weimin Zheng.A Software-Controlled Cache Coherence Optimization for Snoopy-based SMP System[J].Computational Intelligence and Natural Computing, 2009.CINC&apos;09.International Conference, 2009:155-157.

[7]H.Franke, R.Russell, and M.Kirkwood.Fuss, Futexes and Furwocks:Fast User level Locking[J].In Proceedings of the Ottawa Linux Symposium, Ottawa, Canada, 2002:479-495.

篇4:进程调度实验讲解

关键词:分布式系统;多任务调度;进程;线程;负载均衡

中图分类号:TP316.4文献标识码:A文章编号:1007-9599 (2011) 06-0000-02

Multi-task Assignment and Process/Thread Adjustment in Distribution System

Yao Dong

(Beijing University of Posts and Telecommunications,BeiJing100083,China)

Abstract:Distributed multi-task operating system distribution and task scheduling,load balancing is difficult to achieve,which processes and threads to achieve the task execution and distribution of one of the most important concepts.How to implement a distributed system processes and threads created,and the interaction between the information is a vital part of distributed system design.On the traditional operating system processes and threads and to compare the realization of the mechanism,further discussed in the distributed operating system,how to multi-task allocation,how the different distribution among the host of the process as well as load balancing.

Keywords:Distributed system;Multi-task scheduling;Process;

Thread;Load balancing

一、引言

分布式系统是计算机发展的一个大趋势,目前云计算、云存储的概念已经逐渐落地,实际上云计算就是分布式系统的一种实现。在分布式系统中,进程(在很多操作系统中也称为任务)是十分重要的概念,是实现任务调度与执行的关键,而线程是轻量级的进程,在响应速度与执行效率上相比进程有很大的改进。在分布式系统中如何实现多任务执行,如何在分布的主机以及CPU上进行创建和分配,涉及到调度策略。另外,如何实现分布式系统中进程间以及线程间的通信,也是需要重点考虑的问题。并且关乎分布式系统执行的效率和效果。

我在对分布式操作系统的研究和学习中发现,许多传统单机操作系统的概念实际上是可以沿用的,但是由于分布式系统自身的特性决定了,这些概念的复用是需要根据分布式系统进行调整和完善的。希望通过本文对传统进程与线程的简单分析和比较,从而探讨如何在分布式环境中进行进程与线程的创建与调度,如何在分布式环境中对多任务进行负载均衡。

二、进程与线程

现代操作系统最基本的构件就是进程。进程是进行系统资源分配、调度和管理的最小独立运行单位,操作系统的各种活动都与进程有关。每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。

传统的UNIX进程概念在开发分布式系统应用时已力不从心,这些问题的最好解决之道就是线程,线程推广了进程的概念使一个进程可以包含多个活动。如今,由于线程概念的普及,在UNIX系统中已经普遍实现了线程机制,开发并发应用的程序员现在也可以广泛接触到线程的函数库了。

在传统的Unix模型中,当一个进程需要由另一个实体来执行某件事情时,它就fork一个子进程,让子进程去进行处理。尽管这种模式已经成功使用了很多年,但是仍然暴露出以下问题:

fork开销很大。内存映像需要从父进程拷贝到子进程,所有描述字要在子进程中复制一份,等等。当前的系统实现使用一种称为写时拷贝(copy-on-write)的技术,可以避免父进程数据一开始就向子进程拷贝,直到子进程确实需要自己的拷贝为止。尽管有这种优化技术,但fork的开销仍然很大。

Fork子进程后,需要用进程间通信(IPC)在父子进程间传递信息。Fork之前由父进程准备好的数据很容易传递,因为子进程是从父进程的数据空间及所有描述字的一个拷贝开始的,但是从子进程返回信息给父进程却颇费周折。

线程有助于解决这两个问题。线程有时称为轻权进程,因为线程比进程“权轻”。也就是说,创建线程可能比创建进程快10-100倍:

在一个已存在的进程中创建一个线程比创建一个新进程开销更小。创建新的进程需要进行内存的拷贝操作,这就额外的增加了系统负担,而线程则不需要这个拷贝过程。不过由于现在的操作系统的实现是仅仅当内存需要改变的时候才拷贝改动的部分,所以这里的影响相对还是比较小的。

线程通常用在需要比较好的同步操作的场合。例如,某个问题可以分解为多个几乎对等同步处理的任务的话,则是用线程是很好的选择。进程则适合应用在不需要严格的同步的场合。

线程之间共享数据很方便,因为不同的线程本来就是共享同样的存储空间。而不同进程之间共享数据则需要使用一些IPC机制,例如管道、共享内存、套接字等等。

三、分布式操作系统中进程与线程的创建与调度

事实上,当前使用的操作系统都是把任务分割为进程和线程,分时运行在一个处理器中。这种类似的任务处理方式也可以在很多高性能的应用程序中可以看到,例如数据库引擎、科学计算程序、工作站的工程工具和多媒体程序等。

为了增加处理能力,多数操作系统、应用程序都设计为可以在双处理器和多处理器环境中运行,这样可以利用对称多处理器(SMP)结构将进程和线程放到处理器池中进行运算。通过在一个单芯片中执行两个逻辑CPU,超级线程技术在当前的操作系统和高性能应用中进行进程和线程级的并行处理。多CPU之间进行进程分配的思路与分布式操作系统中进程与线程的创建和调度类似。

在分布式操作系统中,一个新进程的创建分为三个步骤:

1.选择一个目标主机。

2.创建一个执行环境。

3.在执行环境中创建线程。

这三个步骤,除选择目标主机以外,其他两项都与传统的操作系统实现机制相同。需要注意的是,不论分布式操作系统的控制权是如何实现的,作为服务器的主机,必须存放各主机中进程的信息,或者在每个主机上有备份。各目标主机间的通信,以进程级的通信为基础,不同进程间的线程通信,也是通过其主线程进行的。

四、分布式操作系统中进程、线程与多任务分配

一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU的时间,优先级高的线程优先运行,优先级低的线程则继续等待。

在分布式操作系统中,多个应用程序同时运行可以采用两种方式进行:

1.协作式多任务方式。协作这个用语意味着多个应用程序之间必须相互协调,依次实现对操作系统的控制。它们并不是真正的多任务执行,因为其中还有多任务共享系统资源的问题。为了让操作系统把控制权从一个程序转换到另一个程序,当前活动的程序就必须周期地检查一个消息队列。

2.带优先权的多任务方式,称为抢先式多任务。在这种方式下,操作系统可以在需要时中断当前的任务,再按照任务队列中各个任务的优先级别来进行任务的调度。

抢先式多任务执行实际上就是抢先式多线程执行,每个线程有一个优先级值。优先级最低的保留给系统使用。其余的分成四类:空闲、正常、高、和实时。注意这些范围是有重叠的。这样做可使调度更灵活,例如,允许某些后台任务比某些前台任务更重要,尽管在通常情况下,前台任务的优先级应该更高。使用实时优先级时要非常当心。如果你把一个任务的优先级设得太高,也可能无法实现多任务执行功能。这是因为一个任务的优先级太高了,它就完全不允许系统中有其他任务运行。

VMM(虚拟机管理程序)负责在分时抢先的环境里调度各个进程和线程,具体包括以下服务:生成线程、管理线程、撤消线程和线程调度。VMM中有两个调度程序:主调度程序和时间片调度程序。主调度程序负责确定最高优先级的线程。只有最高优先级的线程才会运行,其他优先级较低的都被封锁;时间片调度程序负责为所有具有最高优先级的可运行任务分配时间片。

系统运行过程中,线程的优先级可由系统或设备驱动程序改变。例如,一旦中断产生,则处理这个中断的线程优先级临时提高,以便它立即得到时间来处理该中断。完成后,优先级可以再降低。

五、结束语

在分布式操作系统中,实现多任务分配与传统操作系统的实现机制类似,不同的是,需要在不同主机的进程间进行分配,同时还涉及到多线程的情况。但是,基本的思路是以进程为基础,进程的负荷平衡就能够保证线程负荷均衡。具体进程内部的任务分担可以由进程自己实现,机制可以参考传统操作系统的实现。

参考文献:

[1]W.Richard Stevens.Stephen A.Rago.UNIX环境高级编程[M].北京:人民邮电出版社,2006:242-504

[2]W.Richard Stevens.UNIX网络编程:第2卷,进程间通信[M].北京:人民邮电出版社,2010:141-241

[3]W.Richard Stevens.UNIX网络编程.卷1,套接字联网API[M].北京:人民邮电出版社,2010:423-611

[4]何炎祥.分布式操作系统[M].北京:高等教育出版社,2005:343-436

[5]何炎祥,熊前兴.操作系统原理[M].北京:华中科技大学出版社,2001:125-244

[6]佚名.Windows系统进程全解剖[EB/OL].[2009-12-29].http://www.qqread.com/meetwindows/j486113.html

篇5:进程调度实验讲解

Database buffer cache主要用于存储数据文件中的数据块

数据库高速缓存的数据块是高速缓存与数据文件进行信息交换的基本单位,在Oracle数据库8i以前,数据块大小只有一种,而Oracle数据库9i以后支持2K,4K,8KB,16KB及32KB五种。

用命令SQL>SHOW PARAMETER DB可以显示当前数据库的BUFFER CACHE

数据库缓存和特点如下:

<1>.根据最近最少使用LRU.

<2>. 由DB_BLOCK_SIZE来指定大小。

<3>.ORACLE使用时是以块大小为单位进行数据存取的。

还包含以下一些独立的子缓存:

<1>.DB_CACHE_SIZE.

<2>.DB_KEEP_CACHE_SIZE.

<3>.DB_RECYCLE_CACHE_SIZE.

注:可以用Alter system set db_cache_advice=on;设置成根据系统的建议来指定大小。

REDO LOG FILE主要是用于重做日志

用命令SQL>SHOW PARAMETER LOG_BUFFER。

SQL>ALTER SYSTEM SET LOG_BUFFER_SIZE=60M。

用来显示或修改重做日志缓冲区的一些信息。

命令SQL>achive log list 可以查看数据库当前的归档模式。

LARGE POOL:

与JAVA POOL一样,都是作为系统可选的内存结构,由SGA来配置。

JAVA POOL:

当安装或使用JAVA时才用到。

ORACLE内存进程包括两个,一个是SGA,一个是PGA.

(1)。SGA在ORACLE实例启动时分配,是ORACLE实例的一个基本组件。

(2)。PGA是在当服务器进程启动时分配的。

进程结构:

<1>.USER PROCESS.用于用户与ORACLE SERVER交互的进程。

USER PROCESS必须与ORACLE建立连接后才可使用,不可与ORACLE SERVER交互。

<2>.SERVER PROCESS.

SERVER PROCESS在用户与服务之间建立连接后,为执行用户命令的一个进程。

<3>.BACKGROUND PROCESS.

后台进程:DATABASE WRITER (DBWn)用来把DATA BUFFER CACHE中的脏数据写回到数据库中。

(注:脏数据是被改变的数据。)

在以下情况下它会写数据库:

<1>.在发生CHECKPOINT同步。

<2>.脏数据达到阀值。

<3>.DATABASE BUFFER CACHE 自由空间太少了。

<4>.TIMEOUT (3秒钟。)

<5>.RAC PING REQUEST.

<6>.TABLESPACE OFFLINE.

<7>.TABLESPACE READONLY.

<8>.TABLE DROP OR TABLE TRUNCATE (表数据清空或表结构删除)。

<9>.TABLESPACE BEGIN BACKUP.

由SGA (包含DATABASE BUFFER CACHE,BACKGROUND PROCESS)-----> [ DBWn ]----> {data files,

control files, redo log file} ---->由此过程改变数据库中的数据。

LOG WRITER (LGWR) 日志写进程

在Oracle环境中

<1>.当COMMIT的时候。

<2>.当三分之一空间满时。

<3>.当日志有1MB需要重做时。

<4>.每3秒

<5>.BEFORE DBWn WRITES.(写数据前先写日志),

REDO LOG BUFFER----->LGWR--->DBWn

|--------------------------------------> REDO LOG FILES

SYSTEM MONITOR (SMON)系统监控进程

主要任务:

(1)。启动过程(假定DATABASE重启时)如果需要RECOVERY,则此进程会负责打开数据库,及回滚没有

提交的事务;以及rolls forward changes in the redo logs这些统称为:instance recovery.

(2)。对每3秒就对系统自由空间的整理。(COALESCES FREE SPACE EVER 3 SEC.)

(3)。清空临时段空间(DEALLOCATES TEMPORARY SEGMENTS)。

这个过程也是在系统启动过程中完成的。

PROCESS MONITOR (PMON) 进程监控进程

主要用于回滚异常终止的或被用户强制终止的事务。

<1>.rolling back the transaction.

<2>.releasing locks.释放锁。

<3>.releasing other resources.

<4>.restarts dead dispatchers.重启死掉的调度器。(在共享服务器中用)。

PMON (:Include in SGA)----------------------->PGA

CHECKPOINT (CKPT) 检查点进程

用来在数据库里实现同步,实现之前会强制将脏数据从内在里写到物理文件里。

<1>.会启动DBWn来写脏数据(SIGNALLING DBWn at CKPT.)

<2>.完后会更新DATAFILE的HEADER和控制文件的HEADER.而HEADER中有同步所需要的信息,即

CHECKPOINT的信息。

<3>.在ORACLE中,正常情况下,所有文件必须同期性地同步;靠CHECKPOINT来完成。

CKPT(作为后台进程包含在实例中)------------------DATABASE

(data files,control files,redo log files.)

| |______DBWn

|________LGWR

Archive PROCESS (ARCn) :归档进程(可选进程),当设置归档模式后,可用来自动备份在线日志,(归档日志是重做日志的备份。)

<1>.Automatically archives online redo logs when archiverlog mode is set.

(设置归档模式后,将自动备份在线日志)

在处理SQL语句时,注意以下过程:

<1>.用以下进程连接到实例。

用户进程(USER PROCESS)。

服务器进程(SERVER PROCESS)。

<2>.Oracle服务器进程组件的使用依赖于SQL语句的种类。

[1].查询语句会返回行。

[2].DML语句会记录这种改变。

[3].COMMIT保证了事务的RECOVERY.

<3>.并不是所有的SQL语句中所有的后台进程都会参与。

结论:

Oracle Server. Oracle服务器进程包含一些文件,进程和内存,在执行一条SQL语句时,并非所有这些都会用上,有些进程用于提高数据库的性能;一些用于当发生软件或硬件异常时恢复数据库;或应用于完成其他一些维护数据库的任务。ORACLE服务器包含ORACLE实例和ORACLE数据库。Oracle Instance: Oracle实例是用于联系后台进程和内在之间的活动,对数据库进行数据存取前必须先启动实例,每当实例启动时,SGA就被分配给它并启动了一些后台进程。后台进程执行10秒操作并监控有些进程以提供更好的性能。和可靠性。Oracle Database: 数据库包含了系统文件,也称数据库文件,其提供了用以存储数据库信息的实际物理存储区域,用数据文件保证了数据一致性,并在当实例发生失败时恢复数据库。

上一篇:拿地法律风险防范指引下一篇:六类监察对象具体包括哪些人监察法释义