当前位置:文档之家› 山东大学操作系统实验六

山东大学操作系统实验六

山东大学操作系统实验六
山东大学操作系统实验六

软件学院操作系统实验报告

实验题目:

实验六、死锁问题实验

学号:201100300124

日期:2013年05月23日

班级:5班姓名:韩俊晓

Email:

实验目的:

通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。从而进一步加深对于死锁问题的理解。掌握解决死锁问题的几种算法的编程和调试技术。练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。

实验要求:

在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行车,如果同时有相向的火车行驶将会撞车。请模拟实现两个方向行车,而不会出现撞车或长时间等待的情况。您能构造一个管程来解决这个问题吗?硬件环境:

实验室计算机

软件环境:

Ubuntu08.4-Linux操作系统

gcc version 4.1.2

gedit 2.18.2

OpenOffice 2.3

实验步骤:

1.实验说明:

管程-Monitor

管程是一种高级抽象数据类型,它支持在它的函数中隐含互斥操作。结合条件变量和其他一些低级通信原语,管程可以解决许多仅用低级原语不能解决的同步问题。利用管程可以提供一个不会发生死锁或饥饿现象的对象;哲学家就餐问题和Java语言中的synchronized对象都是很好的管程的例子.

管程封装了并发进程或线程要互斥执行的函数。为了让这些并发进程或线程在管程内互斥的执行,进入管程的进/线程必须获取到管程锁或二值信号量

条件变量Condition Variables

条件变量提供了一种对管程内并发协作进程的同步机制。如果没有条件变量,管程就不会有很有用。多数同步问题要求在管程中说明条件变量。条件变量代表了管程中一些并发进程或线程可能要等待的条件。一个条件变量管理着管程内的一个等待队列。如果管程内某个进程或线程发现其执行条件为假,则该进程或线程就会被条件变量挂入管程内等待该条件的队列。如果管程内另外的进程或线程满足了这个条件,则它会通过条件变量再次唤醒等待该条件的进程或线程,从而避免了死锁的产生。所以,一个条件变量C应具有两种操作C.wait()和C.signal()。

当管程内同时出现唤醒者和被唤醒者时,由于要求管程内的进程或线程必须互斥执行,因此就出现了两种样式的条件变量:

Mesa Style(signal-and-continue):唤醒者进程或线程继续执行,被唤醒者进程或线程等到唤醒者进程或线程阻塞或离开管程后再执行。

Hoare Style(signal-and-wait):被唤醒者进程或线程立即执行,唤醒者进程或线程阻塞,直道被唤醒者阻塞或离开管程后再执行。

实验6单行道(过桥)问题可以通过管程很好的解决。可以把单行道/桥封装为一个管程类,桥上通过的车辆是进入管程的进/线程,可以通过创建多个车辆进/线程并随机产生它们的行进方向,并指定桥上可同时行驶的车辆的个数来模拟该问题的各种现场随机情况。一个正确的实验结果应能实现在各种随机现场情况下车辆进程不会逆向上桥(死锁),也不会使车少方向上的车辆无机会上桥(饥饿).

在linux系统中可以利用进程间通信(interprocess communication )IPC中的3个对象:共享内存、信号灯数组、消息队列,来解决协作并发进程间的同步与互斥的问题。

1)共享内存是OS内核为并发进程间交换数据而提供的一块内存区(段)。如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映射到自己私有的地址空间中。如果一进程更新了段中数据,那么其他进程立即会看到这一更新。进程创建的段也可由另一进程读写。

linux中可用命令ipcs -m 观察共享内存情况。

$ ipcs -m

------SharedMemory Segments --------

key shmid owner perms bytes nattch

status

0x00000000 327682 student 600 393216 2

dest

0x00000000 360451 student 600 196608 2

dest

0x00000000 393220 student 600 196608 2

dest

key共享内存关键值

shmid共享内存标识

owner共享内存所由者(本例为student)

perm共享内存使用权限(本例为student可读可写)

byte共享内存字节数

nattch共享内存使用计数

status共享内存状态上例说明系统当前已由student建立了一些共享内存,每个都

有两个进程在共享。

2)信号灯数组是OS内核控制并发进程间共享资源的一种进程同步与互斥机制。linux中可用命令ipcs -s 观察信号灯数组的情况。

$ ipcs -s

------SemaphoreArrays --------

key semid owner perms nsems

0000000 163844 apache 600 1

0x4d00f259 294920 beagleind 600 8

0x00000159 425995 student 644 1

semid信号灯的标识号

nsems信号灯的个数

其他字段意义同以上共享内存所述。

上例说明当前系统中已经建立多个信号灯。其中最后一个标号为425996是由

student建立的,它的使用权限为644,信号灯数组中信号灯个数为1个。

3)消息队列是OS内核控制并发进程间共享资源的另一种进程同步机制。linux 中可用命令ipcs -q 观察消息队列的情况。

$ipcs -q

------Message Queues --------

key msqid owner perms used-bytes messages

0x000001c8 0 root 644 8 1

msgmid消息队列的标识号

used-bytes 消息的字节长度

messages 消息队列中的消息条数

其他字段意义与以上两种机制所述相同。

上例说明当前系统中有一条建立消息队列,标号为0,为root所建立,使用权限为644,每条消息8个字节,现有一条消息。

4) 在权限允许的情况下您可以使用ipcrm命令删除系统当前存在的IPC对象中的任一个对象。

ipcrm -m 21482删除标号为21482的共享内存。

ipcrm -s 32673删除标号为32673的信号灯数组。

ipcrm -q 18465删除标号为18465的消息队列。

5) 在linux的proc文件系统中有3个虚拟文件动态记录了由以上ipcs命令显示的当前IPC对象的信息,它们分别是:

/proc/sysvipc/shm共享内存

/proc/sysvipc/sem信号量

/proc/sysvipc/msg消息队列

我们可以利用它们在程序执行时获取有关IPC对象的当前信息。

6) IPC对象有关的系统调用函数原型都声明在以下的头文件中:

#include

#include

创建一段共享内存系统调用语法:

#include

int shmget(key_t key,int size,int flags);

key 共享内存的键值,可以为IPC_PRIVATE,也可以用整数指定一个

size 共享内存字节长度

flags 共享内存权限位。

s hmget调用成功后,如果key用新整数指定,且flags中设置了IPC_CREAT位,则返回一个新建立的共享内存段标识符。如果指定的key已存在则返回与key

关联的标识符。不成功返回-1

令一段共享内存附加到调用进程中的系统调用语法:

#include

char *shmat(int shmid, char *shmaddr,int flags)

shmid 由shmget创建的共享内存的标识符

shmaddr 总为0,表示用调用者指定的指针指向共享段

flags 共享内存权限位

shmat调用成功后返回附加的共享内存首地址

令一段共享内存从到调用进程中分离出去的系统调用语法:

#include

int shmdt(char *shmadr);

shmadr进程中指向附加共享内存的指针

shmdt调用成功将递减附加计数,当计数为0,将删除共享内存。调用不成功返回-1。

创建一个信号灯数组的系统调用有语法:

#include

int semget(key_t key,int nsems, int flags);

key 信号灯数组的键值,可以为IPC_PRIVATE,也可以用整数指定一个

nsems 信号灯数组中信号灯的个数

flags 信号灯数组权限位。如果key用整数指定,应设置IPC_CREAT位。semget调用成功,如果key用新整数指定,且flags中设置了IPC_CREAT位,则返回一个新建立的信号等数组标识符。如果指定的整数key已存在则返回与key 关联的标识符。不成功返回-1

操作信号灯数组的系统调用语法:

#include

int semop(int semid,struct sembuf *semop, unsigned nops);

semid 由semget创建的信号灯数组的标识符

semop 指向sembuf数据结构的指针

nops 信号灯数组元素的个数。

semop调用成功返回0,不成功返回-1。

控制信号灯数组的系统调用语法:

#include

int semctl(int semid,int semnum,int cmd, union semun arg);

semid 由semget创建的信号灯数组的标识符

semnum 该信号灯数组中的第几个信号灯

cmd 对信号灯发出的控制命令。例如:

GETVAL 返回当前信号灯状态

SETVAL 设置信号灯状态

IPC_RMID删除标号为semid的信号灯

arg 保存信号灯状态的联合体,信号灯的值是其中一个基本成员

union semun {

int val; /* value for SETVAL */

......

};

semctl 执行不成功返回-1,否则返回指定的cmd的值。

创建消息队列的系统调用语法:

#include

int msgget(key_t key,int flags)

key 消息队列的键值,可以为IPC_PRIVATE,也可以用整数指定一个

flags 消息队列权限位。

msgget调用成功,如果key用新整数指定,且flags中设置了IPC_CREAT位,则返回一个新建立的消息队列标识符。如果指定的整数key已存在则返回与key 关联的标识符。成功返回-1。

追加一条新消息到消息队列的系统调用语法:

int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);

msqid由消息队列的标识符

msgp消息缓冲区指针。消息缓冲区结构为:

struct msgbuf {

long mtype;/* 消息类型,必须大于0*/

char mtext[1]; /* 消息数据,长度应于msgsz声明的一致*/

msgsz消息数据的长度

msgflg为0表示阻塞方式,设置IPC_NOWAIT表示非阻塞方式msgsnd调用成功返回0,不成功返回-1。

从到消息队列中读出一条新消息的系统调用语法:

int msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz,long msgtype, int msgflg);

msqid由消息队列的标识符

msgp消息缓冲区指针。消息缓冲区结构为:

struct msgbuf {

long mtype; /* 消息类型,必须大于0*/

char mtext[1]; /* 消息数据,长度应于msgsz声明的一致*/

msgsz消息数据的长度

msgtype决定从队列中返回哪条消息:

=0返回消息队列中第一条消息

>0返回消息队列中等于mtype类型的第一条消息。

<0返回mtype<=type绝对值最小值的第一条消息。

msgflg为0表示阻塞方式,设置IPC_NOWAIT表示非阻塞方式msgrcv调用成功返回0,不成功返回-1。

删除消息队列的系统调用语法:

#include

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

msqid由消息队列的标识符

cmd控制命令。常用的有:

IPC_RMID删除msgid标识的消息队列

IPC_STAT为非破坏性读,从队列中读出一个msgid_ds结构填充缓冲buf IPC_SET改变队列的UID,GID,访问模式和最大字节数。

msgctl调用成功返回0,不成功返回-1。

3.调试过程:

1)建立以下名为dp.h的头文件:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/*信号灯控制用的共同体*/

typedef union semuns {

int val;

} Sem_uns;

//管程中使用的信号量

class Sema {

public:

Sema (int id);

~Sema();

//信号量加 1

int down();

int up(); //信号量减 1 private:

int sem_id; //信号量标识符};

//管程中使用的锁

class Lock {

public:

Lock(Sema *lock);

~Lock();

void close_lock();

void open_lock();

private:

Sema *sema; //锁使用的信号量};

class Condition {

public:

Condition(Sema *sema1, Sema *sema2);

~Condition();

void Wait(Lock *conditionLock, int direct); //过路条件不足时阻塞int Signal (int direc);

//唤醒相反方向阻塞车辆

private:

Sema* queue1; // 一个方向阻塞队列

Sema* queue2; // 另一方向阻塞队列

Lock* lock; // 进入管程时获取的锁

};

class OneWay {

public:

OneWay (int maxall, int maxcur);

~OneWay();

void Arrive (int direc);

// 车辆准备上单行道,direc 为行车方向

void Cross (int direc);

// 车辆正在单行道上

void Quit (int direc);

// 车辆通过了单行道

int *eastCount;

int *westCount;

int *eastWait;

int *westWait;

int *sumPassedCars;//已经通过的车辆总数

private:

//建立或获取 ipc 信号量的一组函数的原型说明

int get_ipc_id (char *proc_file, key_t key);

int set_sem(key_t sem_key, int sem_val, int sem_flag);

char *set_shm(key_t shm_key, int shm_num, int shm_flag);

int rate;

int *numCars;

int *currentDire;

Condition *condition;

Lock *lock;

};

2)建立https://www.doczj.com/doc/e97428088.html,程序。

参考解法伪代码:

以下是一个单行道管程类及其方法和属性的大致描述:

定义一个单行道管程类:class OneWay {

public:

OneWay();

~OneWay();

void Arrive(int direc); // 车辆准备上单行道,direc为行车方向

void Cross(int direc); // 车辆正在单行道上void Quit(int direc); // 车辆通过了单行道private:

int rate;//车速

int *maxCars; //最大同向车数

int *numCars; //当前正在通过的车辆数

int *currentDirec; //当前通过的车辆的方向

Condition *OneWayFull; //通过单行道的条件变量

Lock *lock;//单行道管程锁

};

定义一个进入管程的信号量Sema类和锁Lock类(可参考实验六的示例程序).定

义一个单行道管程的条件变量类:class Condition {

public:

Condition(Sema *sema1 , Sema *sema2);

~Condition();void Wait(Lock *conditionLock,int direc); //过路条件

不足时阻塞void Signal( int direc); //唤醒相反方向阻塞车辆

private:

Sema* queue1; // 一个方向阻塞队列Sema* queue2; // 另一方向阻塞队列

Lock* lock; // 进入管程时获取的锁};

Mesa型条件变量的Wait和Signal 方法:(也可设计成Haoro样式)

Condition::Wait( Lock *conditionLock,int direct)

{

保存当前条件锁;

释放锁;

进入所在方向等待队列睡眠;

被唤醒后重新获取锁;

Condition::Signal( Lock *conditionLock)

{

唤醒相反方向队列等待者

}

单行道管程的Arrive和Quit方法:

OneWay::Arrive(int direc)

{

获取管程锁;

如果当前方向不是我的方向或者单行道上有车且车辆数大于等于上限数在条件变量上等待;

单行道上车辆数加1;

当前方向为我的方向;

释放管程锁;

}

OneWay::Quit(int direc)

{

获取管程锁;

单行道上车辆数减1;

车辆数为0

唤醒相反方向队列中的等待者

释放管程锁

主程序

main()

建立单行道管程;

建立多个行车子进程(最好不少于5个),每个随机设定一个行车方向;每个子进程作:

while(1){

单行道管程->Arrive(direc);

单行道管程->Cross(direc);

单行道管程->Exit(direc);

}

}

3)建立以下项目管理文件Makefile

head = dp.h

srcs = https://www.doczj.com/doc/e97428088.html,

objs = dp.o

opts = -w -g -c

all: dp

dp: $(objs)

g++ $(objs) -o dp

dp.o: $(srcs) $(head)

g++ $(opts) $(srcs)

clean:

rm dp *.o

4)输入make命令编译连接生成可执行的程序

$ g make

g++-w -g -c https://www.doczj.com/doc/e97428088.html,

g++ dp.o -o dp

5)执行程序

./dp

其结果显示如下:

实验总结:

1.实验的过程中在编写代码的时候要仔细认真,定义变量的时候要看明白变

量的作用范围

2.实验时实验的步骤要记清楚,这样在执行实验的时候不会出差错

3.要善于将之前学过的知识用在后面的学习中,比如进程的创建这里就可以

用到

4.学会分析题意,转化为可实现代码

5.对于编译过程中出现的错误,要有耐心去解决

6.

操作系统实验实验1

广州大学学生实验报告 1、实验目的 1.1、掌握进程的概念,明确进程的含义 1.2、认识并了解并发执行的实质 2.1、掌握进程另外的创建方法 2.2、熟悉进程的睡眠、同步、撤消等进程控制方法 3.1、进一步认识并发执行的实质 3.2、分析进程竞争资源的现象,学习解决进程互斥的方法 4.1、了解守护进程 5.1、了解什么是信号 5.2、INUX系统中进程之间软中断通信的基本原理 6.1、了解什么是管道 6.2、熟悉UNIX/LINUX支持的管道通信方式 7.1、了解什么是消息 7.2、熟悉消息传送的机理 8.1、了解和熟悉共享存储机制 二、实验内容 1.1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统 中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 1.2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及 'son ……',父进程显示'parent ……',观察结果,分析原因。 2.1、用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容 2.2、利用wait( )来控制进程执行顺序 3.1、修改实验(一)中的程序2,用lockf( )来给每一个进程加锁,以实现进程之间的互斥 3.2、观察并分析出现的现象 4.1、写一个使用守护进程(daemon)的程序,来实现: 创建一个日志文件/var/log/Mydaemon.log ; 每分钟都向其中写入一个时间戳(使用time_t的格式) ; 5.1、用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 5.2、用软中断通信实现进程同步的机理

山东大学网络教育数据库系统原理期末考试试题及参考答案

数据库系统原理—线上 一、选择题 1、数据是以()的方式存储于操作系统(OS)之中的。 A、数据文件 B、日志文件 C、存储类型 D、并行 正确答案:A 2、()是指对数据进行分类、组织、编码、存储、检索和维护,它是数据处理的中心问题。 A、数据管理 B、数据处理 C、数据加工 D、数据收集 正确答案:A 3、数据库管理系统简称() A、DDA B、DB C、DBA D、DBMS 正确答案:D 4、Oracle数据库特点说法正确的是:() 1支持单用户、大事务量的事务处理 2数据安全性和完整性控制 3提供对于数据库操作的接口 4支持集中式数据处理 5可移植性、可兼容性和可连接性 A、12 B、235 C、35 D、25 正确答案:B 5、()是位于用户与操作系统之间的一层数据管理软件。 A、数据库管理系统 B、数据库 C、数据库系统 D、数据库管理员 正确答案:A 6、一般来说,数据库用户账号总是与某一登录账号相关联,但有一个例外那就是()用户 A、sa B、system C、guest D、admin 正确答案:C 7、()以自由软件为主。 A、MySQL B、SQL Server C、Dreanwaver D、Oracle 正确答案:A 8、数据库的简称()A、DAB、DBC、BDD、DD 正确答案:B 9、()是自由软件,因此不属于厂商产品,所以归属于应用中间件软件。 A、MSSQL B、MySQL C、oracle D、linux正确答案:B10、MS SQL Server 能在那两种安全模式下运行A、数据库认证模式 B、WINDOWS认证模式 C、混合模式 D、安全认证模式 正确答案:BC

山东大学操作系统实验五理发师问题报告

计算机科学与技术学院操作系统实验报告 实验题目:理发店问题 理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。 在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。 请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。 实验目的: 进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。观察和体验非对称性互斥问题的并发控制方法。进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。 硬件环境: Inter(R)Core(TM)i5-3210M CPU @ 2.50GHz 内存:4GB 硬盘:500G 软件环境: XUbuntu-Linux 操作系统 Gnome 桌面 2.18.3 BASH_VERSION='3.2.33(1)-release gcc version 4.1.2

gedit 2.18.2 OpenOffice 2.3 实验步骤: 1、问题分析: 为了解决本实验的同步问题,采用共享内存,信号量,消 息队列三种IPC 同步对象处理。 客户程序思想: 每一个客户把自己的请求当做一条消息发送到相应的消息 队列中去,并通过阻塞等待接收消息的方式来等待理发师 最终帮自己理发。每一个客户先判断sofa 是不是坐满了,如 果没有就坐在沙发上等,否者就判断waitroom 是不是坐满 了,如果没有,就坐在waitroom 等,只要有一个坐在sofa 的客户离开sofa 理发,理发师就会到waitroom 找最先来的 客户,让他进入sofa 等待。 理发师程序思想: 理发师查看sofa 上有没有人,没有就睡3 秒,然后再一次 看有没有人,如果有人,就到沙发请最先来的客户来理发。 账本互斥的实现: Semaphore mutex=1 ; Sofa 队列的长度和wait 队列的长度的实现: 在顾客进程中设置两个变量sofa_count,wait_count,分别保存沙发

山东大学操作系统实验报告4进程同步实验

山东大学操作系统实验报告4进程同步实验

计算机科学与技术学院实验报告 实验题目:实验四、进程同步实验学号: 日期:20120409 班级:计基地12 姓名: 实验目的: 加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥 操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。了解 Linux 系统中 IPC 进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。 实验内容: 抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个有纸,另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一过程重复进行。请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。 硬件环境: 处理器:Intel? Core?i3-2350M CPU @ 2.30GHz ×4 图形:Intel? Sandybridge Mobile x86/MMX/SSE2 内存:4G 操作系统:32位 磁盘:20.1 GB 软件环境: ubuntu13.04 实验步骤: (1)新建定义了producer和consumer共用的IPC函数原型和变量的ipc.h文件。

(2)新建ipc.c文件,编写producer和consumer 共用的IPC的具体相应函数。 (3)新建Producer文件,首先定义producer 的一些行为,利用系统调用,建立共享内存区域,设定其长度并获取共享内存的首地址。然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。 (4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。 运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。

操作系统实验报告_实验五

实验五:管道通信 实验内容: 1.阅读以下程序: #include #include #include main() { int filedes[2]; char buffer[80]; if(pipe(filedes)<0) //建立管道,filedes[0]为管道里的读取端,filedes[1]则为管道的写入端 //成功则返回零,否则返回-1,错误原因存于errno中 err_quit(“pipe error”); if(fork()>0){ char s[ ] = “hello!\n”; close(filedes[0]); //关闭filedes[0]文件 write(filedes[1],s,sizeof(s)); //s所指的内存写入到filedes[1]文件内 close(filedes[1]); //关闭filedes[0]文件 }else{ close(filedes[1]); read(filedes[0],buffer,80); //把filedes[0]文件传送80个字节到buffer缓冲区内 printf(“%s”,buffer); close(filedes[0]); } } 编译并运行程序,分析程序执行过程和结果,注释程序主要语句。

2.阅读以下程序: #include #include #include main() { char buffer[80]; int fd; unlink(FIFO); //删除FIFO文件 mkfifo(FIFO,0666); //FIFO是管道名,0666是权限 if(fork()>0){ char s[ ] = “hello!\n”;

山东大学数据库第四次实验实验报告

實驗4 視圖操作 實驗目の:掌握創建、刪除視圖のSQL語句の用法,掌握使用企業管理器創建、視圖の方法。 實驗准備: 1)了解創建視圖方法。 2)了解修改視圖のSQL 語句の語法格式。 實驗內容: 1)使用企業管理器創建視圖 a)在pubs數據庫中以authors表為基礎,建立一個名為CA_authorの視圖, 使用該視圖時,將顯示所有state為CAの作者の基本信息。 2)使用SQL語句創建視圖 a)在查詢分析器中利用author表建立一個每個作者のID,lname,fname, phone,addressの視圖S_author。 b)建立一個employee_date視圖,利用employee表中信息,顯示1991年 1月1日之後雇傭の雇員のid,name,minit,job_id。 3)刪除視圖 a)使用企業管理器S_author視圖 b)使用SQL語句刪除CA_author、employee_date視圖 實驗要求: 用不同の方法創建視圖。 實驗步驟如下: 一、使用企業管理器創建視圖 a )在pubs數據庫中以authors表為基礎,建立一個名為CA_author の視圖,使用該視圖時,將顯示所有state為CAの作者の基本信息。

①右鍵點擊pubs數據庫文件下の視圖,選擇“新建視圖”,在彈出來の“添加表”中添加表authors。 ②在“添加表”一欄中添加表authors後點擊“關閉”,並全選author表中所有項目。 ③點擊保存,從彈出來の“選擇名稱”框中輸入視圖名稱“CA_author”。

④添加名為CA_author の視圖成功。 ⑤顯示所有state為CAの作者の基本信息。

山大操作系统实验2

操作系统实验报告 ——线程和进/线程管道通信实验 张咪软件四班一、实验要求 设有二元函数f(x,y) = f(x) + f(y) 其中: f(x) = f(x-1) * x (x >1) f(x)=1 (x=1) f(y) = f(y-1) + f(y-2) (y> 2) f(y)=1 (y=1,2) 请编程建立3个并发协作进程,它们分别完成f(x,y)、f(x)、f(y) 。 二、实验目的 通过 Linux 系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进/线程间的通信和协作的效果 ,练习利用无名管道进行进/线程间通信的编程和调试技术。 三、实验环境 实验环境均为Linux操作系统,开发工具为gcc和g++。 四、实验思路 要实现三个函数,要创建三个进程,两个子进程和一个父进程。一个子进程实现f(x),另一个实现f(y)。因为f(x,y)=f(x)+f(y),所以在父进程和子进程间建立通信,子进程将当前值传给父进程,父进程进行计算。而且由于父进程的f(x,y)中的x和f(x)中的x一一对应,所以这些进程应该同步的并发向前走,否则f(x,y)的值就是错的。 五、算法设计 1.创建进程,每个子进程的执行代码段实现对应函数功能。 2.建立父进程和子进程间的通信。由于管道的读写默认的通信方式为同步读写方式,即如果管道读端无数据则读命令阻塞直到数据到达,反之如果管道写端有数据则写命令阻塞直到数据被读走。所以同步并发的问题可以通过管道实现。建立两个管道,pipe1和pipe2,f(x)通过pipe1向父进程写入f(x)的值。同理f(y)通过pipe2向父进程写入f(y)的值。父进程根据这两个值实现函数f(x,y)功能。 六、实验过程: 新建一个文件夹,在该文件夹中建立以下名为ppipe.c的C语言程序。 编写代码,保存。 输入gcc ppipe.c命令, 生成默认的可执行文件a.out。 执行a.out:。 执行并调试ppipe程序。

操作系统实验二

操作系统实验 实验二进程管理 学号 1215108019 姓名李克帆 学院信息学院 班级 12电子 2

实验目的 1、理解进程的概念,明确进程和程序的区别。 2、理解并发执行的实质。 3、掌握进程的创建、睡眠、撤销等进程控制方法。 实验内容与要求 基本要求:用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。 实验报告内容 1、进程、进程控制块等的基本原理。 进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。 进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下: I/完时间片 进程调 I/请

由于多个程序并发执行,各程序需要轮流使用CPU,当某程序不在CPU上运行时,必须保留其被中断的程序的现场,包括:断点地址、程序状态字、通用寄存器的内容、堆栈内容、程序当前状态、程序的大小、运行时间等信息,以便程序再次获得CPU时,能够正确执行。为了保存这些内容,需要建立—个专用数据结构,我们称这个数据结构为进程控制块PCB (Process Control Block)。 进程控制块是进程存在的惟一标志,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。当创建一个进程时,实际上就是为其建立一个进程控制块。 在通常的操作系统中,PCB应包含如下一些信息: ①进程标识信息。为了标识系统中的各个进程,每个进程必须有惟一的标识名或标识数。 ②位置信息。指出进程的程序和数据部分在内存或外存中的物理位置。 ③状态信息。指出进程当前所处的状态,作为进程调度、分配CPU的依据。 ④进程的优先级。一般根据进程的轻重缓急其它信息。 这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。就 执行阻塞 程度为进程指定一个优先级,优先级用优先数表示。 ⑤进程现场保护区。当进程状态变化时(例如一个进程放弃使用CPU),它需要将当时的CPU现场保护到内存中,以便再次占用CPU时恢复正常运行,有的系统把要保护的CPU 现场放在进程的工作区中,而PCB中仅给出CPU现场保护区起始地址。 ⑥资源清单。每个进程在运行时,除了需要内存外,还需要其它资源,如I/O设备、外存、数据区等。这一部分指出资源需求、分配和控制信息。 ⑦队列指针或链接字。它用于将处于同一状态的进程链接成一个队列,在该单元中存放下一进程PCB首址。 ⑧其它信息。 这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。 2、程序流程图。

山东大学数据库实验答案2—8

山东大学数据库实验答案2—8 CREATE TABLE test2_01 AS SELECT SID, NAME FROM pub.STUDENT WHERE sid NOT IN ( SELECT sid FROM pub.STUDENT_COURSE ) CREATE TABLE test2_02 AS SELECT SID, NAME FROM PUB.STUDENT WHERE SID IN ( SELECT DISTINCT SID FROM PUB.STUDENT_COURSE WHERE CID IN ( SELECT CID FROM PUB.STUDENT_COURSE WHERE SID='200900130417' ) ) CREATE TABLE test2_03 AS

select SID,NAME from PUB.STUDENT where SID in ( select distinct SID from PUB.STUDENT_COURSE where CID in (select CID from PUB.COURSE where FCID='300002') ) CREATE TABLE test2_04 AS select SID,NAME from PUB.STUDENT where SID in ( select distinct SID from PUB.STUDENT_COURSE where CID in (select CID from PUB.COURSE where NAME='操作系统') intersect select distinct SID from PUB.STUDENT_COURSE where CID in (select CID from PUB.COURSE where NAME='数据结构') ) create table test2_05 as with valid_stu(sid,name) as ( select SID,NAME from PUB.STUDENT where AGE=20 and SID in (select SID from PUB.STUDENT_COURSE) ) select sid,name as name,ROUND(avg(score)) as avg_score,sum(score) as sum_score from PUB.STUDENT_COURSE natural join valid_stu where SID in (select SID from valid_stu) group by SID,NAME create table test2_06 as

山大操作系统实验-1

操作系统原理实验报告——实验一 张咪软件工程四班 一、实验目的 加深对于进程并发执行概念的理解。实践并发进/线程 的创建和控制方法。观察和体验进程的动态特性。进 一步理解进程生命期期间创建、变换、撤销状态变换 的过程。掌握进程控制的方法,了解父子进程间的控 制和协作关系。练习Linux系统中进/线程创建与控制 有关的系统调用的编程和调试技术。 二、实验要求 编写一个多进程并发执行程序。父进程每隔3秒重复建立两个子进程,首先创建的让其执行ls命令,之后创建执行让其执行ps命令,并控制ps命令总在ls命令之前执行。 三、实验软硬件环境 实验环境均为Linux操作系统,开发工具为gcc和g++。 四、实验思路 调用fock()创建子进程。创建键盘中断信号后,使用pause()可以暂停子进程执行,继续创建新的子进程。子进程并发执行子进程可以首先通过键盘中断信号唤醒子进程。通过exec()调用族装入一个新的执行程序。在建立子进程2并且唤醒子进程1后子进程sleep(seconds = 5)。这样就可以先执行ps后执行ls。。最后就是父进程的结束,程序结束。 五、实验模型 六、调试排错

1、首先遇到的问题是,对linux的操作不熟悉,不太明白makefile怎么使用,直接用了gcc 2、在创建多个子进程上遇到了问题,在fock()后又直接跟了一个fork(),这样创建的子进程是子进程的子进程,而不是父进程创建的第二个子进程。所以应该在else语句块后面,也就是主进程执行段继续创建。一般情况下,fork()按如下规则编程: main() { pid_t pid; pid=fork(); if(pid<0) { // 建立子进程失败 { printf("Create Process fail!\n"); exit(EXIT_FAILURE); } if (pid = = 0) //子进程代码; //如果需要创建子进程,可以按该方法嵌套 else //父进程代码 //如果需要创建子进程,可以按该方法嵌套 } 3、后来父进程与子进程无法重复建立,执行一次就结束了,又加了一个while循环实现重复建立,但无法退出,一直执行。又加了一个count计数变量,执行五次后停止。 七、实验结果 父进程首先创建了子进程a,子进程1暂停。父进程继续创建子进程b。子进程b唤醒了子进程a,子进程a进入sleep()。子进程2执行ps退出,子进程1执行ls。循环五次退出。

操作系统实验五

操作系统 实验报告 哈尔滨工程大学

一、实验概述 1. 实验名称 进程的同步 2. 实验目的 1.使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。 2.调试跟踪EOS信号量的工作过程,理解进程同步的原理。 3.修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。 3. 实验类型 验证 二、实验环境 OS Lab 三、实验过程 3.1 准备实验 按照下面的步骤准备本次实验: 1. 启动OS Lab。 2. 新建一个EOS Kernel项目。 3. 生成EOS Kernel项目,从而在该项目文件夹中生成SDK文件夹。 4. 新建一个EOS应用程序项目。 5. 使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。 3.2 使用EOS的信号量解决生产者-消费者问题 按照下面的步骤查看生产者-消费者同步执行的过程: 1. 使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内的源代码。 2. 按F7生成修改后的EOS应用程序项目。 3. 按F5启动调试。OS Lab会首先弹出一个调试异常对话框。 4. 在调试异常对话框中选择“否”,继续执行。 5. 立即激活虚拟机窗口查看生产者-消费者同步执行的过程。 6. 待应用程序执行完毕后,结束此次调试。 3.3 调试EOS信号量的工作过程 3.3.1 创建信号量 按照下面的步骤调试信号量创建的过程:

1. 按F5启动调试EOS应用项目。OS Lab会首先弹出一个调试异常对话框。 2. 在调试异常对话框中选择"是",调试会中断。 3. 在main函数中创建Empty信号量的代码行(第77行) EmptySemaphoreHandle=CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE, NULL); 添加一个断点。 4. 按F5继续调试,到此断点处中断。 5. 按F11调试进入CreateSemaphore函数。可以看到此API函数只是调用了EOS内核中的PsCreateSemaphoreObject函数来创建信号量对象。 6. 按F11调试进入semaphore.c文件中的PsCreateSemaphoreObject函数。在此函数中,会在EOS内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个成员的操作是在PsInitializeSemaphore函数中完成的。 7. 在semaphore.c文件的顶部查找到PsInitializeSemaphore函数的定义(第19行),在此函数的第一行(第39行)代码处添加一个断点。 8. 按F5继续调试,到断点处中断。观察PsInitializeSemaphore函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的。 9. 按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开"调用堆栈"窗口,查看函数的调用层次。 3.3.2 等待、释放信号量 等待信号量(不阻塞) 生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。按照下面的步骤调试: 1. 删除所有的断点(防止有些断点影响后面的调试)。 2. 在eosapp.c文件的Producer函数中,等待Empty信号量的代码行 (144)WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 添加一个断点。 3. 按F5继续调试,到断点处中断。 4. WaitForSingleObject 函数最终会调用内核中的PsWaitForSemaphore函数完成等待操作。所以,在semaphore.c文件中PsWaitForSemaphore函数的第一行(第68行)添加一个断点。 5. 按F5继续调试,到断点处中断。 6. 按F10单步调试,直到完成PsWaitForSemaphore函数中的所有操作。可以看到此次执行并没有进行等待,只是将Empty信号量的计数减少了1(由10变为了9)就返回了。 如图所示,empty的初始值为10。 在完成PsWaitForSemaphore函数中的所有操作后empty的值变成了9。 释放信号量(不唤醒) 1. 删除所有的断点(防止有些断点影响后面的调试)。

山东大学人工智能复习参考(2017春)(带答案)

山东大学人工智能复习参考(2017春)(带答案)

复习参考题2016秋 一、填空 1.构成产生式系统的基本元素有综合数据库、规则库、控制系统,控制策略按执行规则的方式分类,分为正向、逆向、双向三类。 2.归结过程中控制策略的作用是给出控制策略,以使仅对选择合适的子句间方可做归结,避免多余的、不必要的归结式出现或者说,少做些归结仍能导出空子句。常见的控制策略有线性归结策略、支持集策略、单元归结、输入归结。 3.公式G和公式的子句集并不等值,但它们在不可满足的意义下是一致的。 4.与或图的启发式搜索算法(AO*算法)的两个过程分别是图生成过程即扩展节点和计算耗散值的过程。 5.人工智能的研究途径主要有两种不同的观点,一种观点称为符号主义,认为人类智能基本单元是符号。另一种观点称为连接主义(仿生主义),认为职能的基本单元是神经元。 6.集合{P(a, x, f (g(y)), P(z, f(z),f(u)))的mgu(最一般合一置换)为{z/a, f(x)/x, u/g(y)}。 7.语义网络是对知识的有向图表示方法,一个最简单的语义网络是一个形如节点1、弧、节点2的三元组,语义网络可以描述事物间多种复杂的语义关系、常用ISA、AKO弧表示节点间具有类属的分类关系。语义网络下的推理是通过继承和匹配实现的。 8.当前人工智能研究的热点之一就是机器学习。常见的机器学习方法可分为连接学习、归纳学习、分析学习和遗传算法与分类器系统等。一个机器学习系统应有环境、知识库、学习环节和执行环节四个基本部分组成。 9.常用的知识表示法有逻辑表示法、产生式规则表示法、语义网络表示法、框架理论表示法、过程表示法等。 10.有两个A*算法A1和A2,若A1比A2有较多的启发信息,则 h1(n)>h2(n)。 11.关于A算法与A*算法,若规定h(n)≥0,并且定义启发函数:f*(n)=g*(n)+h*(n) 表示初始状态S0经点n到目标状态S g最优路径的费用。其中g*(n)为S0到n的最小费用, h*(n)为到S g的实际最小费用。若令h(n)≡0,则A算法相当于宽度优先搜索,因为上一层节点的搜索费用一般比下一层的小。若g(n)≡h(n)≡0则相当于随机算法。若g(n)≡0,则相当于最佳优先算法。特别是当要求h(n)≤h*(n)就称这种A算法为A*算法。

山大操作系统实验5

进程同步实验 张咪 软件四班一、实验目的 总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?根据实验程序、调试过程和结果分析写出实验报告。 二、实验要求 理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。 三、实验环境 实验环境均为Linux操作系统,开发工具为gcc和g++。 四、实验思路 约束: 1.设置一个count变量来对顾客进行计数,该变量将被多个顾客进程互斥地访问并修改,通过一个互斥信号量mutext来实现。 count>20时,就不进入理发店。 7

操作系统实验指导及实验五个

操作系统实验指导及实验五个 前言 1.实验总体目标 通过学生自己动手设计实验验证理论知识,使学生掌握操作系统特征和功能,掌握不同调度算法下进程的调度、进程控制、进程调度与死锁,并必须掌握作业管理、存储器管理、设备管理和文件管理的主要原理。加深对操作系统基本原理理解。 ⒉适用专业 计算机科学与技术 ⒊先修课程 C语言程序设计、计算机组成原理、数据结构 ⒋实验课时分配

⒌ 有70台中等配置的计算机组成的小型局域网的实验室环境。计算机的具体要求:(1)Pentium 133Hz以上的CPU;(2)建议至少256MB的内存;(3)建议硬盘至少2GB,并有1GB空闲空间。(4)安装Windows操作系统及C语言编译程序或Linux虚拟环境。 ⒍实验总体要求 培养计算机专业的学生的系统程序设计能力,是操作系统课程的一个非常重要的环节。通过操作系统上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。使学生更好地掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能力。 实验要求做到: 1)详细描述实验设计思想、程序结构及各模块设计思路; 2)详细描述程序所用数据结构及算法; 3)明确给出测试用例和实验结果; 4)为增加程序可读性,在程序中进行适当注释说明; 5)认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;

6)实验报告撰写要求结构清晰、描述准确逻辑性强; 7)实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。 ⒎本实验的重点、难点及教学方法建议 重点:理解进程调度中PCB的设计,以实现对进程的调度。 难点:进程调度程序的设计,设备管理程序的设计。 教学方法建议:力争在本指导书的帮助下,独立设计程序以加深理解。

山东大学《数据库系统》上机实验答案 详细整理 2013最新版

数据库实验(一) 熟悉环境、建立/删除表、插入数据 Drop table 表名 update dbtest set test=1 select * from dbscore 1.教师信息(教师编号、姓名、性别、年龄、院系名称) test1_teacher:tid char 6 not null、name varchar 10 not null、sex char 2、age int、dname varchar 10。 根据教师名称建立一个索引。 1、create table test1_teacher( tid char(6) primary key, name varchar(10) not null, sex char(2), age int, dname varchar(10) ) 2.学生信息(学生编号、姓名、性别、年龄、出生日期、院系名称、班级)test1_student:sid char 12 not null、name varchar 10 not null、sex char 2、age int、birthday date(oracle的date类型是包含时间信息的,时间信息全部为零)、dname varchar 10、class varchar(10)。 根据姓名建立一个索引。 2、create table test1_student(

sid char(12) primary key, name varchar(10) not null, sex char(2), age int, birthday date, dname varchar(10), class varchar(10) ) 3.课程信息(课程编号、课程名称、先行课编号、学分) test1_course:cid char 6 not null、name varchar 10 not null、fcid char 6、credit numeric 2,1(其中2代表总长度,1代表小数点后面长度)。 根据课程名建立一个索引。 3、create table test1_course( cid char(6) primary key, name varchar(10) not null, fcid char(6), credit numeric(2,1) ) 4.学生选课信息(学号、课程号、成绩、教师编号) test1_student_course:sid char 12 not null、cid char 6 not null、 score numeric 5,1(其中5代表总长度,1代表小数点后面长度)、tid char 6。 4、 create table test1_student_course( sid char(12) , cid char(6) , score numeric(5,1), tid char(6), primary key(sid,cid),

操作系统实验报告

操作系统实验报告 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT

许昌学院 《操作系统》实验报告书学号: 姓名:闫金科 班级:14物联网工程 成绩: 2016年02月

实验一Linux的安装与配置 一、实验目的 1.熟悉Linux系统的基本概念,比如Linux发行版、宏内核、微内核等。 2.掌握Linux系统的安装和配置过程,初步掌握Linux系统的启动和退出方 法。 3.熟悉Linux系统的文件系统结构,了解Linux常用文件夹的作用。 二、实验内容 1.从网络上下载VMware软件和两个不同Linux发行版镜像文件。 2.安装VMware虚拟机软件。 3.在VMware中利用第一个镜像文件完成第一个Linux的安装,期间完成网络 信息、用户信息、文件系统和硬盘分区等配置。 4.在VMware中利用第二个镜像文件完成第二个Linux的安装,并通过LILO或 者GRUB解决两个操作系统选择启动的问题。 5.启动Linux系统,打开文件浏览器查看Linux系统的文件结构,并列举出 Linux常用目录的作用。 三、实验过程及结果 1、启动VMware,点击新建Linux虚拟机,如图所示: 2、点击下一步,选择经典型,点击下一步在选择客户机页面选择 Linux,版本选择RedHatEnterpriseLinux5,如图所示: 3、点击下一步创建虚拟机名称以及所要安装的位置,如图所示: 4、点击下一步,磁盘容量填一个合适大小,此处选择默认值大小 10GB,如图所示: 5、点击完成,点击编辑虚拟机设置,选择硬件选项中的CD-ROM (IDE...)选项,在右侧连接中选择“使用ISO镜像(I)”选项,点 击“浏览”,找到Linux的镜像文件,如图所示:

操作系统实验

《操作系统》 实验指导书 班级:0 9专升本(2)班学号:20091105 姓名: 宿州学院计算机科学与技术系 2010-06

目录 实验一进程调度 (1) 实验二银行家算法 (3) 实验三虚拟存储管理 (5) 实验四磁盘调度算法 (6) 要求:(说明,看后删除!) 1、四个实验均需要写; 2、“实验目的”—“实验结论”的格式均已经 写好,可以进行增删及修改。学生需要根据 “实验内容”独立完成相应的“算法设计” 部分,并将代码粘贴在这部分;其中“测试 实例”部分,学生自己进行测试实例的选取, 程序运行的结果需要附上相应的窗口截图, 以验证结果。 3、实验报告书,写好之后自行打印装订,于17 周前(这周为13周)交给学习委员,学习委 员统一上交。 实验一进程调度

实验目的 进程调度是处理机管理的核心内容。本实验要求用C语言编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转两种调度算法结合使用的具体实施办法。本实验的设计思想是,先从就绪队列里选择最高优先数的进程投入运行,运行一个时间片,若执行完毕,进入完成状态;否则重新在就绪队列中选择新进程。 实验设备 ⑴ PC兼容机 ⑵ Windows、DOS系统 ⑶TC语言 实验内容和要求 ⑴设计进程控制块PCB表结构,每个进程有一个进程控制块(PCB)表示。考虑到本实验仅演示优先数调度算法和时间片轮转调度算法,进程控制块作简单化处理,只包含如下信息:进程标识(ID)、优先数(PRIORITY)、需要运行时间(ALLTIME)、已用CPU时间 ⑵进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。 ⑶每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。 输出内容参照格式: 输出运行进程和就绪队列 RUNNING PROG: ID0 READY_QUEUE:->id1->id2 输出各PCBi,格式为 ID:Idi(0≤i≤4) PRIORITY:xx CPUTIME:xx ALLTIME:xx STATE:xx ⑷重复以上过程,直到所要进程都完成为止。

山大数据库简答题整理

1、事务的定义及其特性 答:事务是由一系列操作序列构成的程序执行单元,这些操作要么都做,要么都不做,是一个不可分割的工作单位。 事务的ACID特性: 原子性(Atomicity) 事务中包含的所有操作要么全做,要么全不做 一致性(Consistency) 事务的隔离执行必须保证数据库的一致性 隔离性(Isolation) 系统必须保证事务不受其它并发执行事务的影响 持久性(Durability) 一个事务一旦提交之后,它对数据库的影响必须是永久的。 2、完整性约束: 数据库完整性(Database Integrity)是指数据库中数据的正确性、有效性和相容性。数据库完整性由各种各样的完整性约束来保证,因此可以说数据库完整性设计就是数据库完整性约束的设计。 1、实体完整性:要求每个关系模式有且仅有一个主码,每个主码的值必须唯一, 而且不能为空。 2、域完整性:数据库表中的列必须满足某种特定的数据类型或约束。其 中约束又包括取值范围、精度等规定。表中的CHECK、FOREIGN KEY 约 束和DEFAULT、 NOT NULL定义都属于域完整性的范畴。 3、参照完整性:参照的完整性要求关系中不允许引用不存在的实体。当更新、 删除、插入一个表中的数据时,通过参照引用相互关联的另一个表 中的数据,来检查对表的数据操作是否正确。 3.DBMS 数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操 作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。 4.什么是数据独立性?数据库系统如何实现数据独立性? 答:数据独立性是指应用程序和数据之间相互独立、互不影响,及数据结构的修改不会引起

相关主题
文本预览
相关文档 最新文档