文档库 最新最全的文档下载
当前位置:文档库 › 山东大学操作系统实验五理发师问题报告

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

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

计算机科学与技术学院操作系统实验报告

实验题目:理发店问题

理发店问题:假设理发店的理发室中有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,分别保存沙发

和等候室的顾客数。

2、算法设计说明如下:

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

理发师程序(Barber)

建立一个互斥帐本信号量:s_account,初值=1;

建立一个同步顾客信号量:s_customer,初值=0;

建立沙发消息队列:q_sofa;

建立等候室消息队列:q_wait;

建立3个理发师进程:b1_pid, b2_pid, b3_pid;

每个理发师进程作:

while(1)

{

以阻塞方式从沙发队列接收一条消息,

如果有消息,则消息出沙发队列(模拟一顾客理发);

唤醒顾客进程(让下一顾客坐入沙发)。

用进程休眠一个随机时间模拟理发过程。

理完发,使用帐本信号量记账。

互斥的获取账本

记账

唤醒用账本理发师者

否则没有消息(沙发上无顾客)

则理发师进程在沙发队列上睡眠;

当沙发队列有消息时被唤醒(有顾客坐入沙发)。

顾客程序(customer)

{

while(1)

{

取沙发队列消息数(查沙发上顾客数) ;

如果消息数小于4(沙发没座满)

以非阻塞方式从等候室队列接收一条消息(查等候室有顾客否),

如果有消息将接收到的消息发送到沙发队列(等候室顾客坐入沙发);否则发送一条消息到沙发队列(新来的顾客直接坐入沙发);

否则(沙发坐满)

取等候室队列消息数(查等候室顾客数) ;

如果消息数小于13

发送一条消息到等候室队列(等候室没满,新顾客进等候室);

否则

在顾客同步信号量上睡眠(等候室满暂不接待新顾客);用进程休眠一个随机时间模拟顾客到达的时间间隔。}

3、开发调试过程:

在shell命令行下运行$ make barber customer

gcc -g -c barber.c ipc.c

gcc barber.o ipc.o -o barber

gcc -g -c customer.c ipc.c

gcc customer.o ipc.o -o customer

假设先运行理发师程序:

$ ./barber

2726号理发师睡眠

2728号理发师睡眠

2727号理发师睡眠

运行$./customer

1号新顾客坐入沙发

2号新顾客坐入沙发

3号新顾客坐入沙发

4号新顾客坐入沙发

5号新顾客坐入沙发

6号新顾客坐入沙发

7号新顾客坐入沙发

8号新顾客坐入沙发

9号新顾客坐入沙发

10号新顾客坐入沙发

11号新顾客坐入沙发

12号新顾客坐入沙发

沙发坐满13号顾客在等候室等候13号顾客从等候室坐入沙发

沙发坐满14号顾客在等候室等候14号顾客从等候室坐入沙发

沙发坐满15号顾客在等候室等候15号顾客从等候室坐入沙发

沙发坐满16号顾客在等候室等候16号顾客从等候室坐入沙发

17号新顾客坐入沙发

沙发坐满18号顾客在等候室等候18号顾客从等候室坐入沙发

沙发坐满19号顾客在等候室等候19号顾客从等候室坐入沙发

沙发坐满20号顾客在等候室等候

20号顾客从等候室坐入沙发

沙发坐满21号顾客在等候室等候21号顾客从等候室坐入沙发......

在理发师窗体理发师进程被唤醒:2726号理发师为1号顾客理发……2726号理发师收取1号顾客交费2726号理发师睡眠

2728号理发师为2号顾客理发……2728号理发师收取2号顾客交费2728号理发师睡眠

2727号理发师为3号顾客理发……2726号理发师为4号顾客理发……2727号理发师收取3号顾客交费2727号理发师睡眠

2726号理发师收取4号顾客交费2726号理发师睡眠

2728号理发师为5号顾客理发……2728号理发师收取5号顾客交费2728号理发师睡眠

2727号理发师为6号顾客理发……2726号理发师为7号顾客理发……

2727号理发师收取6号顾客交费2727号理发师睡眠

2726号理发师收取7号顾客交费2726号理发师睡眠

2728号理发师为8号顾客理发……2728号理发师收取8号顾客交费......

反之,如果先运行顾客程序:$ ./customer

1号新顾客坐入沙发

2号新顾客坐入沙发

3号新顾客坐入沙发

4号新顾客坐入沙发

沙发坐满5号顾客在等候室等候

沙发坐满6号顾客在等候室等候

沙发坐满7号顾客在等候室等候

沙发坐满8号顾客在等候室等候

沙发坐满9号顾客在等候室等候

沙发坐满10号顾客在等候室等候沙发坐满11号顾客在等候室等候沙发坐满12号顾客在等候室等候沙发坐满13号顾客在等候室等候

沙发坐满14号顾客在等候室等候

沙发坐满15号顾客在等候室等候

沙发坐满16号顾客在等候室等候

沙发坐满17号顾客在等候室等候

等候室满18号顾客没有进入理发店

当18号顾客到达时理发店20个位置已满,顾客进程阻塞(假设理发师进程没运行表示三个理发师正坐在3个理发椅上睡觉) 。

再运行理发师程序:

$ ./barber

运行截图如下:

附件:

4.7.分析与感悟:

首先运行顾客程序的话,顾客程序首先向沙发队列发送消息,然后向等候室队列发送消息,当两个队列都满了之后,该进程会暂停,及停止在顾客同步信号量上。而随着理发师程序的开始运行,理发师进程会唤醒顾客进程,及在顾客同步信号量上进行up操作,并且从消息队列中接受消息。反之,若理发师程序先运行,则三个理发师由于无法从沙发队列上接收到消息,而且由于是阻塞式接受,就会阻塞在这个消息队列上,只有当顾客程序运行时,向沙发队列发送消息后理发师进程才会继续。通过编写这个实验,是我更加熟练了信号量的使用,明白了消息队列的使用方法,进一步了解了Linux系统中IPC进程同步工具的用法。

附件:

Ipc.c

#include "ipc.h"

int get_ipc_id(char *proc_file,key_t key)

{

FILE *pf;

int i,j;

char line[BUFSZ],colum[BUFSZ];

if((pf = fopen(proc_file,"r")) == NULL){

perror("Proc file not open");

exit(EXIT_FAILURE);

}

fgets(line, BUFSZ, pf);

while(!feof(pf)){

i = j = 0;

fgets(line, BUFSZ,pf);

while(line[i] == ' ') i++;

while(line[i] !=' ') colum[j++] = line[i++]; colum[j] = '\0';

if(atoi(colum) != key) continue;

j=0;

while(line[i] == ' ') i++;

while(line[i] !=' ') colum[j++] = line[i++]; colum[j] = '\0';

i = atoi(colum);

fclose(pf);

return i;

}

fclose(pf);

return -1;

}

int down(int sem_id)

{

struct sembuf buf;

buf.sem_op = -1;

buf.sem_num = 0;

buf.sem_flg = SEM_UNDO;

if((semop(sem_id,&buf,1)) <0) { perror("down error ");

exit(EXIT_FAILURE);

}

return EXIT_SUCCESS;

}

int up(int sem_id)

{

struct sembuf buf;

buf.sem_op = 1;

buf.sem_num = 0;

buf.sem_flg = SEM_UNDO;

if((semop(sem_id,&buf,1)) <0) { perror("up error ");

exit(EXIT_FAILURE);

}

return EXIT_SUCCESS;

}

int set_sem(key_t sem_key,int sem_val,int sem_flg)

{

int sem_id;

Sem_uns sem_arg;

//测试由sem_key 标识的信号灯数组是否已经建立

if((sem_id = get_ipc_id("/proc/sysvipc/sem",sem_key)) < 0 ) {

//semget 新建一个信号灯,其标号返回到sem_id

if((sem_id = semget(sem_key,1,sem_flg)) < 0)

{

perror("semaphore create error");

exit(EXIT_FAILURE);

}

//设置信号灯的初值

sem_arg.val = sem_val;

if(semctl(sem_id,0,SETV AL,sem_arg) <0)

{

perror("semaphore set error");

exit(EXIT_FAILURE);

}

}

return sem_id;

}

char * set_shm(key_t shm_key,int shm_num,int shm_flg)

{

int i,shm_id;

char * shm_buf;

//测试由shm_key 标识的共享内存区是否已经建立

if((shm_id = get_ipc_id("/proc/sysvipc/shm",shm_key)) < 0 ) {

//shmget 新建一个长度为shm_num 字节的共享内存,其标号返回到shm_id

if((shm_id = shmget(shm_key,shm_num,shm_flg)) <0)

{

perror("shareMemory set error");

exit(EXIT_FAILURE);

}

//shmat 将由shm_id 标识的共享内存附加给指针shm_buf if((shm_buf = (char *)shmat(shm_id,0,0)) < (char *)0)

{

perror("get shareMemory error");

exit(EXIT_FAILURE);

}

for(i=0; i

}

//shm_key 标识的共享内存区已经建立,将由shm_id 标识的共享内存附加给指针shm_buf

if((shm_buf = (char *)shmat(shm_id,0,0)) < (char *)0)

{

perror("get shareMemory error");

exit(EXIT_FAILURE);

}

return shm_buf;

}

int set_msq(key_t msq_key,int msq_flg)

{

int msq_id;

//测试由msq_key 标识的消息队列是否已经建立

if((msq_id = get_ipc_id("/proc/sysvipc/msg",msq_key)) < 0 ) {

//msgget 新建一个消息队列,其标号返回到msq_id

if((msq_id = msgget(msq_key,msq_flg)) < 0) {

perror("messageQueue set error");

exit(EXIT_FAILURE);

}

}

return msq_id;

}

Ipc.h:

#include

#include

#include

#include

#include

#include

#include

#define BUFSZ 256

#define MAXV AL 100

#define STRSIZ 8

#define WRITERQUEST 1

#define READERQUEST 2

#define FINISHED 3

//写请求标识

//读请求标识

//读写完成标识

typedef union semuns { int val;

} Sem_uns;

typedef struct msgbuf { long mtype;

int mid;

} Msg_buf;

//信号量

key_t costomer_key; int costomer_sem;

key_t account_key;

int account_sem;

int sem_val;

int sem_flg;

//消息队列

int wait_quest_flg;

key_t wait_quest_key;

int wait_quest_id;

int wait_respond_flg;

key_t wait_respond_key;

int wait_respond_id;

int sofa_quest_flg;

key_t sofa_quest_key;

int sofa_quest_id;

int sofa_respond_flg;

key_t sofa_respond_key;

int sofa_respond_id;

int get_ipc_id(char *proc_file,key_t key);

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

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

int down(int sem_id);

int up(int sem_id);

Barber.c:

#include "ipc.h"

int main(int argc,char *argv[])

{

// int i;

int rate;

Msg_buf msg_arg;

//可在在命令行第一参数指定一个进程睡眠秒数,以调解进程执行速度

if(argv[1] != NULL) rate = atoi(argv[1]);

else rate = 3;

//联系一个请求消息队列

wait_quest_flg = IPC_CREAT| 0644;

wait_quest_key = 101;

wait_quest_id = set_msq(wait_quest_key,wait_quest_flg);

//联系一个响应消息队列

wait_respond_flg = IPC_CREAT| 0644;

wait_respond_key = 102;

wait_respond_id = set_msq(wait_respond_key,wait_respond_flg);

//联系一个请求消息队列

sofa_quest_flg = IPC_CREAT| 0644;

sofa_quest_key = 201;

sofa_quest_id = set_msq(sofa_quest_key,sofa_quest_flg);

//联系一个响应消息队列

sofa_respond_flg = IPC_CREAT| 0644;

sofa_respond_key = 202;

sofa_respond_id = set_msq(sofa_respond_key,sofa_respond_flg);

//信号量使用的变量

costomer_key = 301;//顾客同步信号灯键值

account_key = 302;//账簿互斥信号灯键值

sem_flg = IPC_CREAT | 0644;

//顾客同步信号灯初值设为0

sem_val = 0;

//获取顾客同步信号灯,引用标识存costomer_sem

costomer_sem = set_sem(costomer_key,sem_val,sem_flg);

//账簿互斥信号灯初值设为1

sem_val = 1;

//获取消费者同步信号灯,引用标识存cons_sem

account_sem = set_sem(account_key,sem_val,sem_flg);

int pid1, pid2;

pid1=fork();

生物化学实验六——酵母RNA的提取与含量测定 山东大学实验报告

实验六——酵母RNA的提取与含量测定 13生物基地 201300140059 刘洋 2015-05-10 同组者:张奕 一、实验目的 1.掌握稀碱法提取酵母RNA的原理和方法。 2.掌握紫外分光光度计的使用。 3.了解和掌握紫外吸收法测定RNA浓度的原理。 二、实验原理 酵母核酸中RNA含量较多,DNA则少于2%。RNA可溶于碱性溶液,当碱被中和后,可加乙醇使其沉淀,由此即可得到RNA制品。但是用碱液提取的RNA有不同的降解。 核酸及其衍生物,核苷酸、核苷、嘌呤和嘧啶有吸收紫外光的性质,其吸收高峰在260nm 左右,且一定浓度范围内其浓度与吸光度成正比(浓度为5μg/ml—45μg/ml吸光度与浓度成正比),利用此性质,可用RNA标准液绘制RNA吸光标准曲线(标准曲线的斜率为0.022-0.024左右),测定样品RNA浓度。由于蛋白质在280nm的光吸收,对核酸测定有一定的干扰作用,最大吸收峰在280nm处,原因是蛋白质组成中常含有酪氨酸和色氨酸等芳香族氨基酸。所以如果有蛋白质的干扰必须得先测260nm处的吸光度,再测280nm处的吸光度,通过计算消除其对核酸的影响。 三、实验器材 干酵母粉 电子天平 量筒 容量瓶100ml 磁力搅拌器 试管 100℃水浴锅pH试纸(pH1-14)烧杯 离心机 722型分光光度计锥形瓶 离心管 四、实验试剂 0.2%氢氧化钠溶液95%乙醇 无水乙醚酸性乙醇(5ml浓Hcl加入到500ml95%乙醇中混匀)RNA标准蛋白溶液(200μg/ml)

1.RNA的提取 (1)称取4g干酵母粉,放入200ml锥形瓶中,加入40ml0.2%的氢氧化钠溶液混匀,在沸水浴中煮沸30min中并冷却; (2)冷却后,把液体倒入离心管中,在4000r/min的条件下离心15min; (3)离心后留上清液加入95%的酸性乙醇40ml,边加边搅拌,静置5min左右,再4000r/min的条件下离心5min; (4)离心后保留沉淀,用20ml 95%乙醇分两次洗涤沉淀,每次洗后在3000r/min的条件下离心5min; (5)离心后的沉淀再用无水乙醇10ml洗涤两次,每次用3000r/min离心5min; (6)离心结束后,收集沉淀与滤纸上,称重备用。 2.RNA样液的配制 (1)取粗RNA0.2-0.25g与烧杯中,加入5mlNaOH溶液,搅拌,溶解,调成糊状。 (2)再加入蒸馏水40ml,搅拌混匀,调PH至7.0后,放入100ml容量瓶中定容。 (3)再分3-4次分别取2ml定容后溶液于100ml容量瓶中继续定容待测,并且把容量瓶依次编号为A、B、C。 3.RNA标准曲线的绘制 (1)取洁净的试管,依次标号为1-10、A、B、C后,按照下表分别往各试管中加所需液体,并用磁力搅拌器混匀。 (2)混匀后以0号试管为参比液,在260nm下测各试管的吸光度A,并根据0-9试管的吸光值绘制出RNA标准曲线,并最终得出样品的浓度。 六、注意事项 1.离心机的使用,使用前一定要将两离心液(包括外壳)在天平上调平,对称放置在离 心机上,防止力臂不对称而损坏离心机。 2.紫外分光光度计的使用,要先预热10分钟,往比色皿中到液体只需到三分之二即可, 防止液体溢出腐蚀仪器,爱护仪器。

操作系统实验报告--实验一--进程管理

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0;

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

实验五:管道通信 实验内容: 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进程同步实验

山东大学操作系统实验报告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的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。 运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310

指导老师:宋虹

目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12

课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

操作系统实验报告

操作系统教程 实 验 指 导 书 姓名: 学号: 班级:软124班 指导老师:郭玉华 2014年12月10日

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序: E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : 有可能是因为DOS下路径的问题 (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 因为程序是个死循环程序 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环: 屏蔽j循环: _______________________________________________________________________________调整循环变量i的循环次数:

山东大学信息安全实验报告

山东大学软件学院 信息安全导论课程实验报告 学号:201300301385 姓名:周强班级: 2013级八班 实验题目:缓冲区溢出实验 实验学时:日期: 实验目的: (1)了解缓冲区溢出的原理 (2)利用缓冲区溢出现象构造攻击场景 (3)进一步思考如何防范基于缓冲区溢出的攻击 硬件环境: 软件环境: WindowsXP操作系统 VS2008 实验步骤与内容: (1)了解缓冲区溢出的原理 缓冲区溢出简单来说就是计算机对接收的输入数据没有进行有效的检测(理情况下是程序检测数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。 看一个代码实例,程序如下: void function(char *str) { char buffer[16]; strcpy(buffer,str); } 上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。

(2)利用缓冲区溢出现象构造攻击场景 首先打开Microsoft Visual C++,新建工程和cpp文件,复制实验指导书的代码进行编译连接: 单击运行按钮,然后第1次输入“zhouqianga”,第2次输入2个“ga”,即可看到输出“correct”。

按F10开始进行逐步调试: 当第一次执行gets()函数之前,内存情况如下图所示

在最新的版本中gets被认为是不安全的,gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。现在都被要求改为get_s。来防止溢出。 如下图所示。 (3)学习例子程序2:数据被执行 在xp系统下,直接运行Exploit-1.1.exe,如下图所示:

实时操作系统报告

实时操作系统课程实验报告 专业:通信1001 学号:3100601025 姓名:陈治州 完成时间:2013年6月11日

实验简易电饭煲的模拟 一.实验目的: 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。 二.实验要求: 1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”; 2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择; 3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间; 4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式; 5.按“X”退出系统,时间区域不显示。 6.煮饭时长为30,煮粥时长为50,煮面时长为40. 三.实验设计: 1.设计思路: 以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。 本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。 2.模块划分图: (1)界面显示: Main() Taskstart() Taskstartdispinit() 在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。

(2)按键查询与响应: Main() Taskstart() 在TaskStart()函数中,用if (PC_GetKey(&key) == TRUE)判断是否有按键输入。然后根据key 的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。 (3)切换功能: l计数“C”按 键的次数 M=l%3 Switch(m) M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“”以“擦出”之前画下的“@”,注意l自增。 四.主要代码: #include "stdio.h" #include "includes.h" #include "time.h" #include "dos.h" #include "sys/types.h" #include "stdlib.h" #define TASK_STK_SIZE 512 #define N_TASKS 2 OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; OS_STK TaskStartStk[TASK_STK_SIZE]; INT8U TaskData[N_TASKS];

操作系统实验报告

《计算机操作系统》实验报告 教师: 学号: 姓名: 2012年3月6日 计算机学院

实验题目:请求页式存储管理(三) ----------------------------------------------------------------------------- 实验环境:VC6.0++ 实验目的:学生应独立地用高级语言编写几个常用的存储分配算法,并设计一个存储管理的模拟程序,对各种算法进行分析比较,评测其性能优劣,从而加深对这些算法的了解。实验内容: (1)编制和调试示例给出的请求页式存储管理程序,并使其投入运行。 (2)增加1~2种已学过的淘汰算法,计算它们的页面访问命中率。试用各种算法的命中率加以比较分析。(增加了FIFO) 操作过程: (1)产生随机数 (2)输入PageSize(页面大小1 /2/4/8 K) (pageno[i]=int(a[i]/1024)+1) (3)菜单选择

(4)OPT/ LRU/FIFO演示(pagesize=1K)

(5) 过程说明(PAGESIZE = 4K ) OPT :最佳置换算法(淘汰的页面是以后永不使用,或许是在最长时间内不再被访问的页面) //在Table 表中如果未找到,记录每个元素需要找的长度 //全部table 中元素找完长度,然后进行比较,找出最大的,进行淘汰 int max=0; int out; for(k=0;kmax){ max = table_time[k]; out = k; } }//找出最长时间,进行替换 table[out]=pageno[i]; page_out++;

操作系统实验报告心得体会

操作系统实验报告心得体会 每一次课程设计度让我学到了在平时课堂不可能学到的东西。所以我对每一次课程设计的机会都非常珍惜。不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。所以在这两周的课设中,熬了2个通宵,生物钟也严重错乱了。但是每完成一个任务我都兴奋不已。一开始任务是任务,到后面任务就成了自己的作品了。总体而言我的课设算是达到了老师的基本要求。总结一下有以下体会。 1、网络真的很强大,用在学习上将是一个非常高效的助手。几乎所有的资料都能够在网上找到。从linux虚拟机的安装,到linux的各种基本命令操作,再到gtk的图形函数,最后到文件系统的详细解析。这些都能在网上找到。也因为这样,整个课程设计下来,我浏览的相关网页已经超过了100个(不完全统计)。当然网上的东西很乱很杂,自己要能够学会筛选。 不能决定对或错的,有个很简单的方法就是去尝试。就拿第二个实验来说,编译内核有很多项小操作,这些小操作错了一项就可能会导致编译的失败,而这又是非常要花时间的,我用的虚拟机,编译一次接近3小时。所以要非常的谨慎,尽量少出差错,节省时间。多找个几个参照资料,相互比较,

慢慢研究,最后才能事半功倍。 2、同学间的讨论,这是很重要的。老师毕竟比较忙。对于课程设计最大的讨论伴侣应该是同学了。能和学长学姐讨论当然再好不过了,没有这个机会的话,和自己班上同学讨论也是能够受益匪浅的。大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。 3、敢于攻坚,越是难的问题,越是要有挑战的心理。这样就能够达到废寝忘食的境界。当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。 4、最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。比如当时我遇到我以前从未遇到的段错误的问题,让我都不知道从何下手。在经过大量的资料查阅之后,我对段错误有了一定的了解,并且能够用相应的办法来解决。 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的 1)访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址 2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域

山东大学-中间件实验报告

山东大学软件学院 中间件技术课程实验报告

onResize(); }, error : function(e) { alert('初始化数据错误!'); } }); }); 并从bootstrap上找一些已经写好的布局,作为参考。加入到网页的界面中。 一、数据库操作的封装 1、AutoCreateDB——自动创建数据库 (1)可以根据下列query的结果判断数据库是否存在: Object obj = dao.QueryOnly("SELECT COUNT(*) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME=?",new Object[] { DATABASE }); 不存在则创建数据库,则执行executeCreate方法。 (2)AutoCreateDB自动创建数据库的表 遍历表,对于数据库中的每一个表,都执行“检测、若不存在则创建”操作,可以根据该query的结果判断数据库的表是否存在,不存在则创建数据库表,则执行executeCreate方法。 2、JdbcDao数据库相关操作 (1)在JdbcDao 中定义应用与数据库建立连接,其相关参数从 config.properties中获取: /**获取Connection连接*/ public Connection getConnection(){ Connection conn = null; System.out.println(JDBC_URL); System.out.println(USER_NAME); System.out.println(USER_PWD); try { conn = DriverManager.getConnection(JDBC_URL,USER_NAME,USER_PWD);

操作系统实验报告

《操作系统》课程实验报告 专业:软件工程 班级:软件二班 学号: 2220111350 姓名:韩培培 序号: 14

目录: 实验一、进程的创建 实验二、进程控制 实验三、进程的管道通信 实验四、消息通信 实验五、进程调度 实验六、FIFO页面调度 实验七、LRU页面置换算法

实验一进程的创建 一.实验目的:进程的创建 二.实验内容:编写一段程序,使用系统调用 FORK( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“A”子进程分别显示字符“B”和“C”。试观察记录屏幕上的显示结果,并分析原因。 三.实验代码: #include <stdio.h> Main() { int p1,p2; While((p1=fork())==-1); If (p1==0) Putchar(ˊbˊ); else { While((p2=fork())==-1); If(p2==0) Putchar(ˊcˊ); else putchar(ˊaˊ); } } 四.实验运行结果

五.分析原因 程序首先调用Fork()函数创建一个子进程1.当创建进程不成功,循环创建进程,直至进程创建成功。如果Fork()返回值为0,表示当前进程是子进程1,显示字符B。如果Fork()返回值大于0,则表示当前进程是父进程,表示当前的程序代码是父进程所要执行的。父进程调用Fork()创建子进程2。当创建进程不成功时,循环创建进程直至成功。如果Fork()返回值为0,则表示当前进程是子进程2,显示字符C。如果Fork()返回值大于0,则表示当前进程 是父进程,输出字符A。

操作系统实验报告

操作系统实验报告 实验名称: 系统的引导 所在班级: 指导老师: 老师 实验日期: 2014年3 月29 日

一、实验目的 ◆熟悉hit-oslab实验环境; ◆建立对操作系统引导过程的深入认识; ◆掌握操作系统的基本开发过程; ◆能对操作系统代码进行简单的控制,揭开操作系统的神秘面纱。 二、实验容 1. 阅读《Linux核完全注释》的第6章引导启动程序,对计算机和Linux 0.11的引导过程进行初步的了解。 2. 按照下面的要求改写0.11的引导程序bootsect.s。 3. 有兴趣同学可以做做进入保护模式前的设置程序setup.s。 4. 修改build.c,以便可以使用make BootImage命令 5. 改写bootsect.s主要完成如下功能: bootsect.s能在屏幕上打印一段提示信息XXX is booting...,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等。 6. 改写setup.s主要完成如下功能: bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s 向屏幕输出一行"Now we are in SETUP"。setup.s能获取至少一个基本的硬件参数(如存参数、显卡参数、硬盘参数等),将其存放在存的特定地址,并输出到屏幕上。setup.s不再加载Linux核,保持上述信息显示在屏幕上即可。 三、实验环境

本实验使用的系统是windows系统或者是Linux系统,需要的材料是osexp。 四、实验步骤 1. 修改bootsect.s中的提示信息及相关代码; 到osexp\Linux-0.11\boot目录下会看到图1所示的三个文件夹,使用UtraEdit 打开该文件。将文档中的98行的mov cx,#24修改为mov cx,#80。同时修改文档中的第246行为图2所示的情形。 图1图2 图3 2. 在目录linux-0.11\boot下,分别用命令as86 -0 -a -o bootsect.obootsect.s和 ld86 -0 -s -obootsectbootsect.o编译和bootsect.s,生成bootsect文件; 在\osexp目录下点击MinGW32.bat依此输入下面的命令: cd linux-0.11 cd boot as86 -0 -a -o bootsect.obootsect.s ld86 -0 -s -o bootsectbootsect.o

山东大学软件测试实验报告

实验一。黑盒测试 一、等价类划分 电话号码问题某城市电话号码由三部分组成。它们的名称和内容分别是: (1)地区码:空白或三位数字; (2)前缀:非'0'或'1'的三位数字; (3)后缀:4 位数字。 假定被测程序能接受一切符合上述规定的电话号码,拒绝所有不符合规定的电话号码。根据该程序的规格说明,作等价类的划分,并设计测试方案。 根据题目,分别将地区码、前缀、后缀进行分类,分析结果如下: 输入有效等价类编号无效等价类编号 地区码空白 1 包含其他字符 3 三位数字 2 少于三位 4 多于三位 5 前缀非0或 非1的三位数6 包含其他字符8 包含0的三位数9 包含1的三位数10 少于三位数11 多于三位数12 后缀四位数字7 包含其他字符13 少于四位数14 多于四位数15 根据上图的分析,可的测试用例 测试数据预期结果覆盖类地区码前缀后缀 空白555 4344 接受(有效)1、6、7 232545 4343 接受(有效)2、6、7 A23 322 4343 拒绝(无效) 3 21322 4343 拒绝(无效) 4 2323322 4343 拒绝(无效) 5 232 32A4343 拒绝(无效)8 232 208 4343 拒绝(无效)9 232 1114343 拒绝(无效)10

232 32 4343 拒绝(无效)11 232 322224343 拒绝(无效)12 232 322 4AS2 拒绝(无效)13 232 322 434拒绝(无效)14 232 322 434311拒绝(无效)15 三角形问题根据下面给出的规格说明,利用等价类划分的方法,给出足够的测试用例。一个程序读入三个整数。把此三个数值看成是一个三角形的三个边。这个程序要打印出信息,说明不是三角形、三角形是三边不等的、是等腰的、还是等边的。 分析题目中给出和隐含的对输入条件的要求: (1)整数(2)三个数(3)非零数(4)正数 (5)两边之和大于第三边(6)等腰(7)等边 如果 a 、 b 、 c 满足条件( 1 ) ~ ( 4 ),则输出下列四种情况之一: 1)如果不满足条件(5),则程序输出为 " 非三角形 " 。 2)如果三条边相等即满足条件(7),则程序输出为 " 等边三角形 " 。 3)如果只有两条边相等、即满足条件(6),则程序输出为 " 等腰三角形 " 。 4)如果三条边都不相等,则程序输出为 " 一般三角形 " 。 列出等价类表并编号

嵌入式实时操作系统实验报告

嵌入式实时操作系统实验报告 任务间通信机制的建立 系别计算机与电子系 专业班级***** 学生姓名****** 指导教师 ****** 提交日期 2012 年 4 月 1 日

一、实验目的 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。 二、实验内容 1.建立并熟悉Borland C 编译及调试环境。 2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。 3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。观察程序运行结果并记录。 4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。 5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。 三、实验原理 1. 信号量 μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样μC/OS-II 才能支持信号量。

操作系统实验报告

操作系统实验报告 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的镜像文件,如图所示:

小鼠脾脏细胞原代培养及观察计数实验报告-山东大学

小鼠脾脏细胞原代培养及观察计数 【实验目的】 1.学习掌握细胞培养的基本原理以及具体方法,并对小鼠脾细胞进行原代培养; 2.掌握无菌操作的具体过程及无菌操作台的使用; 3.学习掌握染色法鉴别细胞的生死状态的原理及方法; 4.学习使用血球计数板对细胞总数及活细胞数进行计数; 【实验原理】 1.细胞培养 细胞培养指的是在无菌条件下,把动、植物细胞从组织中取出,在体外模拟体的生理环境,使离体的细胞在体外生长和繁殖,并且维持其结构和功能的一种培养技术。动物细胞培养可分为原代培养和传代培养。从供体获得组织细胞,在无菌条件下,用胰蛋白酶消化或机械分散等方法,将动物组织分散成单个细胞开始首次培养长出单层细胞的方法称为细胞的原代培养。当培养的动物细胞生长增殖达到一定密度,形成致密的单层细胞时,用胰蛋白酶将细胞消化分散成单细胞,从一个容器中以1:2或其他比例转移到另一个容器中扩大培养的方法,称为细胞的传代培养。传代培养的累计次数就是细胞的培养代数。 高等生物是由多细胞构成的整体,在整体条件下要研究单个细胞或某一群细胞在体的功能活动是十分困难的。但如果把活细胞拿到体外培养、增殖并进行观察和研究,则要方便和简单得多。被培养的动物细胞是非常好的实验对象和实验研究材料,对体外培养的活细胞进行研究可以帮助人类揭开生、老、病、死的规律,探索优生、抗衰老和防治各种疾病的途径和机制,也可以人为地诱导和改变细胞的遗传性状和特性,使其向有利于人类健康长寿的方向发展。因此动物细胞体外培养技术是研究细胞分子机制非常重要的实验手段,被广泛应用于医学、生物技术、基因工程等研究领域。 细胞培养的意义:具有其他生物技术无可比拟的优点;培养条件易改变和控制,便于单因子分析;便于人们直接对细胞结构、细胞生长及发育等过程的观察;在生物学的各个领域(如分子生物学、细胞生物学、遗传学、免疫学、肿瘤学及病毒学等)已被广泛应用。 细胞培养的局限性:在脱离机体复杂环境下,细胞培养条件与躯体环境有一定距离;观察到的结果有时难以正确反映机体的状况;细胞培养得到的产物少。 培养细胞的条件有水的质量、无菌环境,最适温度、渗透压、气体条件、最适PH、营养条件和培养基质等。 2.细胞死活鉴定 细胞生死状态的鉴别方法主要是化学染色法和荧光染色法。 活细胞和死亡细胞在生理技能和性质上主要存在一下差异: ①细胞膜通透性的差异:活细胞的细胞膜是一种选择性膜,对细胞起保护和屏障作用,只允许物质选择性地通过;而细胞死后,细胞膜受损,其通透性增加。基于此,发展出了以台盼蓝、伊红、苯胺黑、赤藓红、甲基蓝以及荧光染料碘化丙啶或溴化乙啶等为染料鉴别细胞生死状态的方法,上述染料能使死亡细胞着色,而活细胞不被着色。此外,应用植物质壁分离的性质也可鉴定植物细胞的生死状态。活细胞的原生质具有选择透过性,死细胞因其原生质的选择透过性已遭破坏,故与高渗透压溶液接触时不产生质壁分离。 ②代上的差异:活细胞中新代作用强,细胞的酶具有较强的活性和还原能力。基于此,发展处了以荧光素二乙酸酯(FDA)、荧光素二丙酸酯、荧光素二丁酸酯或荧光素二苯甲酰酯等酯化的荧光素鉴别细胞生死状态的方法,上述酯化的荧光素亲脂性提高,容易被细胞吸收进入,活细胞的酯酶具有较强的活性,可将酯化的荧光素分解而释放出能发荧光的荧光素,该物质不能自由透过活的细胞膜,积累在细胞,荧光显微镜下显示有明亮的绿色或黄绿色荧光;而死亡细胞的酯酶因失去活性,不能分解酯化的荧光素,荧光显微镜下显示不发光。另外,可用亚甲基蓝为染料鉴定酵母细胞的生死状态。亚甲基蓝是一无毒染料,氧化型为蓝色,还原型为无色。活细胞因具有较强的还原能力,能使亚甲蓝从蓝色的氧化型变成无色的还原型,故活的酵母细胞在用亚甲基蓝染色后显示无色;死亡酵母细胞或代缓慢的衰老酵母细胞,因无还原能力或还原能力极弱,使亚甲蓝仍处于氧化态,故呈现蓝色或淡蓝色。 3.血球计数板的使用

相关文档
相关文档 最新文档