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

山大操作系统实验五

山大操作系统实验五
山大操作系统实验五

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

实验题目:进程互斥实验

实验目的:

进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。观察和体验非对称性互斥问题的并发控制方法。进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。

实验要求:

理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。

在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。

请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。

总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识为什么会出现进程饥饿现象本实验的饥饿现象是怎样表现的怎样解决并发进程间发生的饥饿现象您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识根据实验程序、调试过程和结果分析写出实验报告。

硬件环境:

CPU: P4/ 内存:256MB 硬盘: 10GB

软件环境:

-Linux 操作系统

Gnome 桌面 '

gcc version

vi

gedit

OpenOffice

实验步骤:

1.问题分析

假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。

在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。

2.算法设计说明

该解法利用消息队列的每条消息代表每个顾客,将进入等候室的顾客组织到一个队列,将坐入沙发的顾客组织到另一个队列。理发师从沙发队列请出顾客,空出的沙发位置再从等候室请入顾客进入沙发队列。三个理发师进程使用相同的程序段上下文,所有顾客使用同一个程序段上下文。这样可避免产生太多进程,以便节省系统资源。

int sem_p(int semid, int index, int ipc_nowait) { 程间的互斥2.理发师类似读者进程,顾客类似写者进程。最后,通过不断的调试,使我熟练了在Linux环境下编程的技巧,对进程的创建与控制更加熟悉。

附录 A:本实验全部程序源代码及注释

#ifndef CZW_IPC_H_INCLUDED

#define CZW_IPC_H_INCLUDED

#include<>

#include

#include

int sem_create(const char *pathname, int proj_id, int nsems, int init_value) { key_t keyid;

int semid, i;

if((keyid = ftok(pathname, proj_id)) == -1) {

perror("ftok error!");

return -1;

}

if((semid = semget(keyid, nsems, IPC_CREAT | 0666)) < 0) {

perror("semget error!");

return -1;

}

for(i = 0; i < nsems; i++) {

semctl(semid, i, SETVAL, init_value);

}

return semid;

}

int sem_delete(const char *pathname, int proj_id) {

key_t keyid;

int semid, i;

if((keyid = ftok(pathname, proj_id)) == -1) {

perror("ftok error!");

return -1;

}

if((semid = semget(keyid, 0, 0666)) < 0) {

perror("semget error!");

return -1;

}

if(semctl(semid, 0, IPC_RMID) < 0) {

perror("sem delete fail!");

return -1;

}

return 1;

}

int sem_set(int semid, int index, int value) {

if(index == -1) {

, 10);

sem_delete(".", 11);

msg_delete(".", 31);

sem_delete(".", 110);

exit(0);

}

int main() {

int wait_semid = sem_create(".", 10, 3, 0);

int wait_lock_semid = sem_create(".", 11, 4, 0);

int wait_msg = msg_create(".", 31);

int cash_semid = sem_create(".", 110, 1, 1);

debug && printf("\twait_semid is %d\n", wait_semid);

debug && printf("\twait_lock_semid is %d\n", wait_lock_semid);

debug && printf("\twait_msg is %d\n", wait_msg);

debug && printf("\tcash_semid is %d\n", cash_semid);

sem_set(wait_semid, 0, 3);

sem_set(wait_semid, 1, 4);

sem_set(wait_semid, 2, 13);

pid_t pid[3] = {0};

int i;

int barber_id, barber_status, barber_consumer;

struct ex5msgbuf msg;

for(i = 0; i < 3; i++){

if((pid[i] = fork()) < 0) {

perror("fork error!");

exit(EXIT_FAILURE);

}else if(pid[i] == 0){

barber_id = i + 1;

barber_status = 0;

debug && printf("\tI'm barber%d, my pid is %d\n",barber_id,getpid()); break;

}

}

if(pid[2] == 0) {

while(1) {

if(barber_status == 0) {

if(sem_p(wait_lock_semid, 0, 1) == -2) { , 10, 0, 0);

int wait_lock_semid = sem_create(".", 11, 0, 0);

int wait_msg = msg_create(".", 31);

debug && printf("\twait_semid is %d\n", wait_semid);

debug && printf("\twait_lock_semid is %d\n", wait_lock_semid);

debug && printf("\twait_msg is %d\n", wait_msg);

debug && printf("\twait_semid_0 is %d\n", sem_show(wait_semid, 0));

pid_t pid = 0;

struct ex5msgbuf msg;

int i;

int consumer_status;

if((pid = fork()) < 0) {

perror("fork error!");

exit(EXIT_FAILURE);

}else if(pid == 0) { //child process

while(1) {

sem_p(wait_lock_semid, 1, 0); //等待沙发上有人

sem_p(wait_semid, 0, 0); //等待理发师有空

if(msg_get(wait_msg, &msg, WAIT_ID_SOFA, 0) < 0) {

perror("message get error!");

exit(-1);

}

msg_send(wait_msg, WAIT_ID_CHAIR, , 0);

printf("the consumer %d ==> chair, wait %d seconds\n", , (time(NULL) - );

//sofa ==> chair

sem_v(wait_semid, 1, 0); //沙发上有空位了

sem_v(wait_lock_semid, 0, 0); //通知有人来理发了

}

return 0;

}

if((pid = fork()) < 0) {

perror("fork error!");

exit(EXIT_FAILURE);

}else if(pid == 0) { //child process

while(1) {

sem_p(wait_lock_semid, 2, 0); //等待室内有人

sem_p(wait_semid, 1, 0); //沙发上有空位

if(msg_get(wait_msg, &msg, WAIT_ID_ROOM, 0) < 0) {

perror("message get error!");

exit(-1);

}

msg_send(wait_msg, WAIT_ID_SOFA, , 0);

printf("the consumer %d ==> sofa, wait %d seconds\n", , (time(NULL) - ); //room ==> sofa

sem_v(wait_semid, 2, 0); //等待室空出1个位子

sem_v(wait_lock_semid, 1, 0); //通知沙发上有人了

}

return 0;

}

while(1){

if((pid = fork())< 0) {

perror("fork error!");

exit(EXIT_FAILURE);

}else if(pid == 0){ //

if((consumer_status = sem_p(wait_semid, 2, 1)) == -2) { //检查理发店(等待室)是否已满

printf("我是顾客%d,理发店满了,我走人了。。。\n", getpid()); //full }else if(consumer_status == 0){ //仍然有空间

printf("我是顾客%d,进入理发店\n", getpid());

printf("我是顾客%d,正在等待室等待\n", getpid());

msg_send(wait_msg, WAIT_ID_ROOM, getpid(), 0); //进入等待室

sem_v(wait_lock_semid, 2, 0); //通知等待室有人了

}

exit(0);

}

sleep(3); //

}

return 0; }

操作系统实验四存储管理

师学院计算机系 实验报告 (2014—2015学年第二学期) 课程名称操作系统 实验名称实验四存储管理 专业计算机科学与技术(非师)年级2012级 学号B2012102147 姓名秋指导教师远帆 实验日期2015-05-20

图1 word运行情况 “存使用”列显示了该应用程序的一个实例正在使用的存数量。 5) 启动应用程序的另一个实例并观察它的存需求。 请描述使用第二个实例占用的存与使用第一个实例时的存对比情况: 第二个实例占用存22772K,比第一个实例占用的存大很多 4:未分页合并存。 估算未分页合并存大小的最简单法是使用“任务管理器”。未分页合并存的估计值显示在“任务管理器”的“性能”选项卡的“核心存”部分。 总数(K) :________220___________ 分页数:_____________________ 未分页(K) :_________34__________ 图2核心存

C 简单基本NTFS 30G 良好(系 统) D 简单基本NTFS 90G 良好 E 简单基本NTFS 90G 良好 F 简单基本NTFS 88 G 良好 图3磁盘情况 6:计算分页文件的大小。 要想更改分页文件的位置或大小配置参数,可按以下步骤进行: 1) 右键单击桌面上的“我的电脑”图标并选定“属性”。 2) 在“高级”选项卡上单击“性能选项”按钮。 3) 单击对话框中的“虚拟存”区域中的“更改”按钮。 请记录: 所选驱动器的页面文件大小: 驱动器:______________F_____________________ 可用空间:___________9825_____________________ MB 初始大小(MB) :_____ 2048______________________ 最大值(MB) :________4092_____________________ 所有驱动器页面文件大小的总数: 允的最小值:________16____________________ MB

操作系统实验实验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

山东大学操作系统实验报告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。循环五次退出。

操作系统实验报告4

《操作系统》实验报告 实验序号: 4 实验项目名称:进程控制

Printf(“child Complete”); CloseHandle(pi.hProcess); CloseHandle(pi hThread); ﹜ 修改后: #include #include int main(VOID) { STARTUPINFO si; PROCESS_INFORMA TION pi; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi)); if(!CreateProcess(NULL, "c:\\WINDOWS\\system32\\mspaint.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si,&pi)) { fprintf(stderr,"Creat Process Failed"); return -1; } WaitForSingleObject(pi.hProcess,INFINITE); printf("child Complete"); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } 在“命令提示符”窗口运行CL命令产生可执行程序4-1.exe:C:\ >CL 4-1.cpp

实验任务:写出程序的运行结果。 4.正在运行的进程 (2)、编程二下面给出了一个使用进程和操作系统版本信息应用程序(文件名为4-5.cpp)。它利用进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用。确定运行进程的操作系统版本号。阅读该程序并完成实验任务。 #include #include

操作系统实验五

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

一、实验概述 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

操作系统实验四

青岛理工大学课程实验报告

算法描述及实验步骤 功能:共享存储区的附接。从逻辑上将一个共享存储区附接到进程的虚拟地址空间上。用于建立调用进程与由标识符shmid指定的共享内存对象之间的连接。 系统调用格式:virtaddr=shmat(shmid,addr,flag) 该函数使用头文件如下: #include #include #include (8)shmdt( ) 功能:用于断开调用进程与共享内存对象之间的连接,成功时返回0,失败返回-1。 系统调用格式: int shmdt(shmaddr) char *shmaddr;/*采用shmat函数的返回值*/ (9)shmctl( ) 功能:共享存储区的控制,对其状态信息进行读取和修改。用于对已创建的共享内存对象进行查询、设置、删除等操作。 系统调用格式:shmctl(shmid,cmd,buf) 该函数使用头文件如下: #include #include #include 2、步骤: (1)定义进程变量(2)定义两个字符数组 (3)创建管道(4)如果进程创建不成功,则空循环(5)如果子进程创建成功,pid为进程号(6)锁定管道 (7)给Outpipe赋值(8)向管道写入数据 (9)等待读进程读出数据(10)解除管道的锁定 (11)结束进程等待子进程结束(12)从管道中读出数据 (13)显示读出的数据(14)父进程结束 创建jincheng.c 插入文字

调 试 过 程 及 实 验 结 果 运行: 运行后: 总 结 (对实验结果进行分析,问题回答,实验心得体会及改进意见) 虽然对pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、 shmdt()、shmctl()的功能和实现过程有所了解,但是运用还是不熟练,过去没 见过,所以运行了一个简单的程序。 利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信,加深了对 其了解。 (1)管道通信机制,同步的实现过程:当写进程把一定数量的数据写入pipe, 便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程读一空pipe 时,也应睡眠等待,直到写进程将数据写入管道后,才将之唤醒,从而实现进 程的同步。 管道通信的特点:A管道是半双工的,数据只能向一个方向流动;需要双方通 信时,需要建立起两个管道;B. 只能用于父子进程或者兄弟进程之间(具有亲 缘关系的进程);C.单独构成一种独立的文件系统:管道对于管道两端的进程而

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

操作系统实验指导及实验五个 前言 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的镜像文件,如图所示:

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