当前位置:文档之家› 操作系统实验报告——虚拟内存

操作系统实验报告——虚拟内存

操作系统实验报告——虚拟内存
操作系统实验报告——虚拟内存

北京邮电大学软件学院

2019-2020学年第1学期实验报告

课程名称:操作系统

实验名称:虚拟存储器管理

实验完成人:

日期:2019 年12 月21 日

一、实验目的

(说明通过本实验希望达到的目的)

1. 了解虚拟存储技术的特点;

2. 掌握请求页式管理的页面置换算法。

二、实验内容

(说明本实验的内容)

1. 通过随机数产生一个指令序列,共320 条指令。其地址按下述原则生成:

(1)50%的指令是顺序执行的;

(2)50%的指令是均匀分布在前地址部分;

(3)50%的指令是均匀分布在后地址部分;

具体的实施方法是:

A. 在[0,319]的指令地址之间随机选取一起点M;

B. 顺序执行一条指令,即执行地址为M+1 的指令;

C. 在前地址[0,M+1]中随机选取一条指令并执行,该指令的地址为M’;

D. 顺序执行一条指令,其地址为M’+1;

E. 在后地址[M’+2,319]中随机选取一条指令并执行;

F. 重复A—E,直到执行320 次指令。

2. 指令序列变换成页地址流

设:(1)页面大小为1K;(2)用户内存容量为4 页到32 页;(3)用户

虚存容量为32K。

在用户虚存中,按每K 存放10 条指令排列虚存地址,即320 条指令在虚存

中的存放方式为:第0 条—第9 条指令为第0 页(对应虚存地址为[0,9]);

第10 条—第19 条指令为第1 页(对应虚存地址为[10,19]);……………………

第310 条—第319 条指令为第31 页(对应虚存地址为[310,319]);按以上

方式,用户指令可组成32 页。

3. 计算并输出下述各种算法在不同内存容量下的命中率。

A. 先进先出(FIFO)页面置换算法

B. 最近最久未使用(LRU)页面置换算法--最近最少使用算法

C. 最少使用(LFR)页面置换算法

D. 最佳(Optimal)页面置换算法

三、实验环境

(说明本实验需要的环境)

Vscode+ubuntun

四、实验过程描述

本实验需要分几个步骤完成。

本实验所定义的数据结构:

#define I_NUM 320

#define CONST 1000

//页表

typedef struct pagetable {

int p_num; //页号

int access_time[32];//记录访问的时间

bool status[32];//状态位(是否写入内存) 写入1 未写入0

int m_num[32];//存入的内存块号

}PageTable;

//队列的结构

typedef struct {

int count; //计数

int front; //头指针

int rear; //尾指针

int *data; //数据域

int size; //大小

} CirQueue;

int ins[I_NUM]; //指令数组

int visit_times[32]; //每一个页面访问次数的数组

步骤一:按要求产生指令序列。

这部分按照指导书上做就ok了。具体实现:

void initIns()

{

for (int i = 0; i < I_NUM; i += 4)

{

int m = rand() % I_NUM; //0到319的随机数

ins[i] = (m + 1) % I_NUM; //执行地址为m+1的指令

int m1 = rand() % (m + 2); //随机选取一条指令并执行

ins[i + 1] = m1;

ins[i + 2] = (m1 + 1) % I_NUM; //执行地址为m1+1的指令

ins[i + 3] = rand() % (I_NUM - m1 - 2) + m1 + 2;

}

}

步骤二:指令序列变换成页地址流

只需将指令所在的位置整除10即可得到页号。

步骤三:实现各种算法

首先是FIFO算法。

相关原理:该算法总是淘汰最新进入内存的页面,即选择在内存中驻留时间最久的页面予

以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。

思路:先检查内存是否还有空间,如果还有则直接插入,否则调用此算法,将先出队再入队来完成页面置换。

实现:

void FIFO(int f_num, PageTable*pagetable)

{

int p_fault = 0;

CirQueue *queue = (CirQueue *)malloc(sizeof(CirQueue));

initPage(pagetable, f_num);

initQueue(queue, f_num);

int i;

for (int i_num = 0; i_num < 320; i_num++)

{

if (!isHitted(f_num, i_num, pagetable)) //没命中

{

p_fault++; //页表内没有查询到当前指令所属的页

for (i = 0; i < pagetable->p_num; i++)

{

if (pagetable->status[i] == 0)

break;

}

if (i < pagetable->p_num) //内存未满让新的页进来

{

pagetable->status[i] = true;

pagetable->m_num[i] = ins[i_num] / 10;

Enqueue(queue, (ins[i_num] / 10)); //同时此页进队

}

else //内存已满开始置换

{

int last_page = Dequeue(queue); //页号

for (i = 0; i < pagetable->p_num; i++)

{

if (pagetable->m_num[i] == last_page)

break;

}

pagetable->m_num[i] = ins[i_num] / 10;

Enqueue(queue, (ins[i_num] / 10)); //新的页号进队

}

}

}

double p_fault_r = (double)p_fault / I_NUM;

printf("%f\t", 1 - p_fault_r);

}

其次是LRU算法。

相关原理:最近最久未使用(LRU)页面置换算法,是根据页面调入内存后的使用情况进行决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU 置换算法是选择最近最久未使用的页面予以淘汰。

该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当需淘汰一个页面时,选择现有页面中其t 值最大的,即最近最久未使用的页面予以淘汰。

思路:同样先判断内存是否为满。如果未满则直接插入,否则调用该算法。该算法需要一个记录访问时间的数组access_time[],当需要置换时,选择数组中元素最大的元素,将其置换出去,然后将新页面放进来。每次访问时将未访问的页面的access_time 加一。

实现:

//lru算法

void LRU(int f_num, PageTable*pagetable)

{

int p_fault = 0;

initPage(pagetable, f_num);

int k;

for (int i_num = 0; i_num < I_NUM; i_num++)

{

if (!isHitted(f_num, i_num, pagetable)) //没命中

{

p_fault++;

//页表内没有查询到当前指令所属的页

for (k = 0; k < pagetable->p_num; k++)

{

if (pagetable->status[k] == false)

{

break;

}

}

if (k < pagetable->p_num)

{

//内存未满让新的页进来

pagetable->status[k] = true;

pagetable->m_num[k] = ins[i_num] / 10;

//所有页的访问次数自增

incTime(pagetable, f_num);

}

else

{

//内存已满开始置换

int index = LeastUsed(pagetable, f_num);

pagetable->access_time[index] = 0;

pagetable->m_num[index] = ins[i_num] / 10;

//所有页的访问时间自增

incTime(pagetable, f_num);

}

}

}

double p_fault_r = (double)p_fault / I_NUM;

printf("%f\t", 1 - p_fault_r);

}

void incTime(PageTable*pagetable, int f_num)

{

for (int i = 0; i < f_num; i++)

{

if (pagetable->status[i] == true)

pagetable->access_time[i]++;

}

}

int LeastUsed(PageTable*pagetable, int f_num) //选择现有页面中其 t 值最大的,即用的最少的页

{

int k = pagetable->access_time[0];

int max = 0;

for (int i = 0; i < f_num; i++)

{

if (pagetable->access_time[i] > k)

{

k = pagetable->access_time[i];

max = i;

}

}

return max;

}

然后是LFR算法。

相关原理:在采用该算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录页面被访问的频率。该置换算法选择在最近使其使用最少的页面作为淘汰页。

思路:需要一个数组visit_times[]来记录每个页面访问的次数,即为频率。同样先判断内存是否为满。如果未满则直接插入,否则调用该算法。选择频率最低的页面,将其置换出去,然后将新页面放进来。

实现:

//lfr算法

void LFR(int f_num, PageTable*pagetable)

{

int p_fault = 0;

initPage(pagetable, f_num);

int i;

for (int i_num = 0; i_num < 320; i_num++)

{

if (!isHitted(f_num, i_num, pagetable)) //没命中

{

p_fault++;

//页表内没有查询到当前指令所属的页

for (i = 0; i< pagetable->p_num; i++)

{

if (pagetable->status[i] == false)

{

break;

}

}

if (i < pagetable->p_num) //内存未满让新的页进来

{

pagetable->status[i] = true;

pagetable->m_num[i] = ins[i_num] / 10;

visit_times[ins[i_num] / 10]++; //同时所有页的访问次数自增

}

else

{

//内存已满开始置换

int min_index = 0;

int min = CONST;

for (int k = 0; k < 32; k++)

{

if (pagetable->status[k] == true) //寻找在内存中的被访问次数最少的页面换出

if (visit_times[k] < min)

{

min = visit_times[k];

min_index = k;

}

}

pagetable->m_num[min_index] = ins[i_num] / 10;

visit_times[ins[i_num] / 10]++;

}

}

}

double p_fault_r = (double)p_fault / I_NUM;

printf("%f\t", 1 - p_fault_r);

}

最后是OPT算法。

相关原理:该算法选择的被淘汰页面,将是以后永远不使用的,或许是在最长(未来)时间内不再被访问的页面。采用该算法,通常可保证获得最低的缺页率。但由于人们目前

还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间

思路:由于本模拟实验已经知道将来会有那些序列被放进内存,所以该算法可以实现。同样先判断内存是否为满。如果未满则直接插入,否则调用该算法。该算法需要数组distance[]表示该页到未来最近一次的距离。需要置换时,选择距离被使用的页面将其置换,然后将新页面置换进来。

实现:

void OPT(int f_num, PageTable*pagetable)

{

int p_fault = 0;

initPage(pagetable, f_num);

int i;

for (int i_num = 0; i_num < 320; i_num++)

{

if (!isHitted(f_num, i_num, pagetable)) //没命中

{

p_fault++;

//页表内没有查询到当前指令所属的页

for (i = 0; i < pagetable->p_num; i++)

{

if (pagetable->status[i] == false)

break;

}

if (i < pagetable->p_num)

{

//内存未满让新的页进来

pagetable->status[i] = true;

pagetable->m_num[i] = ins[i_num] / 10;

}

else

{

//内存已满开始置换

//检查当前内存里的页哪个最久会被使用

int *distance = (int *)malloc(sizeof(int) * f_num); //暂存距离的数组 //初始化

for (i = 0; i < f_num; i++)

{

distance[i] = CONST;

}

for (int l = 0; l < f_num; l++)

{

i = pagetable->m_num[l];

for (int k = i_num; k < f_num; k++)

{

if (ins[k] == i)

{

distance[l] = k - l;

break;

}

}

}

//找出之后最远被使用的

i = distance[0];

int max = 0;

for (int j = 0; j < f_num; j++)

{

if (distance[j] > i)

{

i = distance[j];

max = j;

}

}

pagetable->m_num[max] = ins[i_num] / 10; }

}

}

double p_fault_r = (double)p_fault / I_NUM;

printf("%f\t", 1 - p_fault_r);

}

五、实验结果

运行结果如下:

随着物理内存的增加,命中率逐渐上升。

4种算法的命中率差别不大。

六、附件

6.1 附件1:源代码

Vm.h

#include

#include

#include

#define I_NUM 320

#define CONST 1000

//页表

typedef struct pagetable {

int p_num; //页号

int access_time[32];//记录访问的时间

bool status[32];//状态位(是否写入内存) 写入1 未写入0 int m_num[32];//存入的内存块号

}PageTable;

//队列的结构

typedef struct {

int count; //计数

int front; //头指针

int rear; //尾指针

int *data; //数据域

int size; //大小

} CirQueue;

int ins[I_NUM]; //指令数组

int visit_times[32]; //每一个页面访问次数的数组

void initQueue(CirQueue*queue,int i);

bool isEmpty(CirQueue*queue);

bool isFull(CirQueue*queue);

bool isHitted(int i,int j,PageTable*pt);

void Enqueue(CirQueue*queue, int temp);

int Dequeue(CirQueue*queue);

void FIFO(int i, PageTable*pt);

void LRU(int i, PageTable*pt);

void incTime(PageTable*pt,int i);

int LeastUsed(PageTable*pt, int i);

void LFR(int i, PageTable*pt);

void OPT(int i, PageTable*pt);

void initPage(PageTable*pt,int i);

void initIns();

Vm.cpp

#include"vm.h"

int main()

{

PageTable *pagetable = (PageTable *)malloc(sizeof(pagetable));

initIns(); //初始化指令流

printf("\t\t FIFO\t\t LRU\t\t LFR\t\t OPT\n");

for (int f_num = 4; f_num <= 32; f_num++)

{

printf("Frames:%d\t", f_num);

FIFO(f_num, pagetable);

LRU(f_num, pagetable);

LFR(f_num, pagetable);

OPT(f_num, pagetable);

printf("\n");

}

}

void initIns()

{

srand(time(NULL));

for (int f_num = 0; f_num < I_NUM; f_num += 4)

{

int m = rand() % I_NUM; //0到319的随机数

ins[f_num] = (m + 1) % I_NUM; //执行地址为m+1的指令

int m1 = rand() % (m + 2); //随机选取一条指令并执行

ins[f_num + 1] = m1;

ins[f_num + 2] = (m1 + 1) % I_NUM; //执行地址为m1+1的指令

ins[f_num + 3] = rand() % (I_NUM - m1 - 2) + m1 + 2;

}

}

void initPage(PageTable*pagetable, int f_num)

//初始化页表

{

int i_num;

pagetable->p_num = f_num;

for (i_num = 0; i_num < 32; i_num++)

{

pagetable->status[i_num] = false;

pagetable->m_num[i_num] = -1;

pagetable->access_time[i_num] = 0;

}

}

//初始化队列

void initQueue(CirQueue*queue, int f_num)

{

queue->data = (int *)malloc(sizeof(int) * f_num+1);

queue->size = f_num+1;

queue->count = 0;

queue->front = 0;

queue->rear = 0;

}

//队列判空

bool isEmpty(CirQueue*queue)

{

return queue->count == 0;

}

//入队

void Enqueue(CirQueue*queue, int temp)

{

queue->count++;

queue->rear = (queue->rear + 1) % queue->size;

queue->data[queue->rear] = temp;

}

//出队

int Dequeue(CirQueue*queue)

{

if (isEmpty(queue))

{

printf("队列为空!\n");

return -1;

}

else

{

queue->count--;

int i = queue->data[queue->front];

queue->front = (queue->front + 1) % queue->size;

return i;

}

}

//判断是否命中

bool isHitted(int f_num, int i_num, PageTable*pagetable) {

int p = ins[i_num] / 10; //所在页面

bool ishitted = false;

for (int i = 0; i < f_num; i++) //物理页号

{

if (pagetable->m_num[i] == p)

{

ishitted = true;

break;

}

}

return ishitted;

}

//fifo算法

void FIFO(int f_num, PageTable*pagetable)

{

int p_fault = 0;

CirQueue *queue = (CirQueue *)malloc(sizeof(CirQueue));

initPage(pagetable, f_num);

initQueue(queue, f_num);

int i;

for (int i_num = 0; i_num < 320; i_num++)

{

if (!isHitted(f_num, i_num, pagetable)) //没命中

{

p_fault++; //页表内没有查询到当前指令所属的页

for (i = 0; i < pagetable->p_num; i++)

{

if (pagetable->status[i] == 0)

break;

}

if (i < pagetable->p_num) //内存未满让新的页进来

{

pagetable->status[i] = true;

pagetable->m_num[i] = ins[i_num] / 10;

Enqueue(queue, (ins[i_num] / 10)); //同时此页进队 }

else //内存已满开始置换

{

int last_page = Dequeue(queue); //页号

for (i = 0; i < pagetable->p_num; i++)

{

if (pagetable->m_num[i] == last_page)

break;

}

pagetable->m_num[i] = ins[i_num] / 10;

Enqueue(queue, (ins[i_num] / 10)); //新的页号进队 }

}

}

double p_fault_r = (double)p_fault / I_NUM;

printf("%f\t", 1 - p_fault_r);

}

//lru算法

void LRU(int f_num, PageTable*pagetable)

{

int p_fault = 0;

initPage(pagetable, f_num);

int k;

for (int i_num = 0; i_num < I_NUM; i_num++)

{

if (!isHitted(f_num, i_num, pagetable)) //没命中

{

p_fault++;

//页表内没有查询到当前指令所属的页

for (k = 0; k < pagetable->p_num; k++)

{

if (pagetable->status[k] == false)

{

break;

}

}

if (k < pagetable->p_num)

{

//内存未满让新的页进来

pagetable->status[k] = true;

pagetable->m_num[k] = ins[i_num] / 10;

//所有页的访问次数自增

incTime(pagetable, f_num);

}

else

{

//内存已满开始置换

int index = LeastUsed(pagetable, f_num);

pagetable->access_time[index] = 0;

pagetable->m_num[index] = ins[i_num] / 10; //所有页的访问时间自增

incTime(pagetable, f_num);

}

}

}

double p_fault_r = (double)p_fault / I_NUM;

printf("%f\t", 1 - p_fault_r);

}

void incTime(PageTable*pagetable, int f_num)

{

for (int i = 0; i < f_num; i++)

{

if (pagetable->status[i] == true)

pagetable->access_time[i]++;

}

}

int LeastUsed(PageTable*pagetable, int f_num) //选择现有页面中其 t 值最大的,即用的最少的页

{

int k = pagetable->access_time[0];

int max = 0;

for (int i = 0; i < f_num; i++)

{

if (pagetable->access_time[i] > k)

{

k = pagetable->access_time[i];

max = i;

}

}

return max;

}

//lfr算法

void LFR(int f_num, PageTable*pagetable)

{

int p_fault = 0;

initPage(pagetable, f_num);

int i;

for (int i_num = 0; i_num < 320; i_num++)

{

if (!isHitted(f_num, i_num, pagetable)) //没命中

{

p_fault++;

//页表内没有查询到当前指令所属的页

for (i = 0; i< pagetable->p_num; i++)

{

if (pagetable->status[i] == false)

{

break;

}

}

if (i < pagetable->p_num) //内存未满让新的页进来

{

pagetable->status[i] = true;

pagetable->m_num[i] = ins[i_num] / 10;

visit_times[ins[i_num] / 10]++; //同时所有页的访问次数自增

}

else

{

//内存已满开始置换

int min_index = 0;

int min = CONST;

for (int k = 0; k < 32; k++)

{

if (pagetable->status[k] == true) //寻找在内存中的被访问次数最少的页面换出

if (visit_times[k] < min)

{

min = visit_times[k];

min_index = k;

}

}

pagetable->m_num[min_index] = ins[i_num] / 10;

visit_times[ins[i_num] / 10]++;

}

}

}

double p_fault_r = (double)p_fault / I_NUM;

printf("%f\t", 1 - p_fault_r);

}

void OPT(int f_num, PageTable*pagetable)

{

int p_fault = 0;

initPage(pagetable, f_num);

int i;

for (int i_num = 0; i_num < 320; i_num++)

{

if (!isHitted(f_num, i_num, pagetable)) //没命中

{

p_fault++;

//页表内没有查询到当前指令所属的页

for (i = 0; i < pagetable->p_num; i++)

{

if (pagetable->status[i] == false)

break;

}

if (i < pagetable->p_num)

{

//内存未满让新的页进来

pagetable->status[i] = true;

pagetable->m_num[i] = ins[i_num] / 10;

}

else

{

//内存已满开始置换

//检查当前内存里的页哪个最久会被使用

int *distance = (int *)malloc(sizeof(int) * f_num); //暂存距离的数组

//初始化

for (i = 0; i < f_num; i++)

{

distance[i] = CONST;

}

for (int l = 0; l < f_num; l++)

{

i = pagetable->m_num[l];

for (int k = i_num; k < f_num; k++)

{

if (ins[k] == i)

{

distance[l] = k - l;

break;

}

}

}

//找出之后最远被使用的

i = distance[0];

int max = 0;

for (int j = 0; j < f_num; j++)

{

if (distance[j] > i)

{

i = distance[j];

max = j;

}

}

pagetable->m_num[max] = ins[i_num] / 10; }

}

}

double p_fault_r = (double)p_fault / I_NUM;

printf("%f\t", 1 - p_fault_r);

}

网页设计实验报告

实验报告 课程名称网络技术基础实验项目TCP/IP协议配置实验仪器计算机 系别 专业 班级/学号 学生姓名 实验日期 成绩 指导教师

实验一 TCP/IP协议配置 一、实验目的(标题黑体小四) 1.熟练掌握模板的用法。 2.掌握CSS的用法。 3.掌握网站发布的方法。 二、实验内容 1. 创建和使用模板。 2. css的创建和使用。 3. 发布网站。 三、实验课时 4课时 四、实验步骤 创建网站 1、创建一个站点,并创建 images 文件夹存放图片。将示例图片拷贝至images 目录下 2、创建 CSS 文件,名称为 style.css,将其保存至 style文件夹。 3、创建模板文件 tpl.dwt,并保存。结果如下: (1) 给 tpl.dwt 附加样式表 style.css。 在 tpl.dwt 的空白处点击鼠标右键,选择“附加样式表”: 选择 style.css 文件: 完成后,在 tpl.dwt 的 head标签里有如下的代码: (2) 设置模板的背景颜色。打开 CSS 面板,为 style.css 新建一条 css 规则。过程如 下:

将背景颜色设为#ff1e70: 在 style.css 生成如下的代码: body { background-color: #ff1e70? } 3) 制作布局。插入一 2 行 2 列的表格。表格的宽度=316+634=950,其他的设置:让表格居中对齐。 (4) 消除表格两边的空隙。展开 CSS 样式表,双击 body: 双击 body后,打开“body的 CSS 规则定义”对话框,按照下面的方式设置:Style.css 的代码变为: body { background-color: #ff1e70? margin: 0px? }

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

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 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) 实验二 (2) 实验三 (7) 实验四 (10) 实验五 (15) 实验六 (18) 实验七 (22) \

实验一 UNIX/LINUX入门 一、实验目的 了解 UNIX/LINUX 运行环境,熟悉UNIX/LINUX 的常用基本命令,熟悉和掌握UNIX/LINUX 下c 语言程序的编写、编译、调试和运行方法。 二、实验内容 熟悉 UNIX/LINUX 的常用基本命令如ls、who、pwd、ps 等。 练习 UNIX/LINUX的文本行编辑器vi 的使用方法 熟悉 UNIX/LINUX 下c 语言编译器cc/gcc 的使用方法。用vi 编写一个简单的显示“Hello,World!”c 语言程序,用gcc 编译并观察编译后的结果,然后运行它。 三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。 四、实验程序 #include <> #include <> int main() { printf ("Hello World!\n"); return 0; } 五、实验感想 通过第一次室验,我了解 UNIX/LINUX 运行环境,熟悉了UNIX/LINUX 的常用基本命令,熟悉和掌握了UNIX/LINUX 下c 语言程序的编写、编译、调试和运行方法。

实验二进程管理 一、实验目的 加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。 二、实验内容 (1)进程创建 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。 (2)进程控制 修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。 (3)进程的管道通信 编写程序实现进程的管道通信。使用系统调用pipe()建立一个管道,二个子进程P1 和P2 分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)。 三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。 四、实验设计 1、功能设计 (1)进程创建 使用fork()创建两个子进程,父进程等待两个子进程执行完再运行。 (2)进程控制 使用fork()创建两个子进程,父进程等待两个子进程分别输出一句话再运行。 (3)进程的管道通信 先创建子进程1,向管道写入一句话,子进程1结束后创建子进程2,向管道写入一句话,最后父进程从管道中读出。 2、数据结构 子进程和管道。 3、程序框图

Web网页设计实验报告

WEB系统开发 综合实验报告 题目红尘客栈网上订房页面 专业计算机科学与技术(信息技术及应用) 班级计信2班 学生蒋波涛 重庆交通大学 2013年

目录 一、设计目的 (3) 二、设计题目 (3) 三、结构设计 (3) 四、技术分析 (4) 五、设计过程 (7) 六、实验心得 (10) 七、实验总结 (11)

一、设计目的 在Internet飞速发展的今天,互联网成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用。因此网站建设在Internet 应用上的地位显而易见,它已成为政府、企事业单位信息化建设中的重要组成部分,从而倍受人们的重视。我们当代大学生更是离不开网络给我们带来的好处与便利.但是,我们成天浏览的网站网页到底是如何制作的呢?我想这一点很多同学都没有去深究过.所以,这学期我选择了”web网页设计”这门课, 本课程的设计目的是通过实践使同学们经历网页制作的全过程. 通过设计达到掌握网页设计、制作的技巧。 了解和熟悉网页设计的基础知识和实现技巧。根据题目的要求,给出网页设计方案,可以按要求,利用合适图文素材设计制作符合要求的网页设计作品。 熟练掌握Photoshop cs3、Dreamweaver cs等软件的的操作和应用。增强动手实践能力,进一步加强自身综合素质。学会和团队配合,逐渐培养做一个完整项目的能力。 二、设计题目 《红尘客栈》 三、结构设计 选定主题,确定题目之后,在做整个网站之前对网站进行需求分析。首先,做好需求调研。调研方式主要是上网查阅资料,在图书馆里翻阅相关书籍。 然后,调研结束之后对整个网站进行功能描述,并对网站进行总体规划,接着逐步细化。 我们选做的主题是个人主页,并且选定题目为“红尘客栈”,其目的是做一个简单的网站,介绍酒店概况,提供一定的资讯信息。 四、技术分析 (一)建立布局 在这次的网页设计中用到大量的布局,所以怎么样建立布局是关键。Dreamweaver cs3是大多数人设计网页的称手兵器,也是众多入门者的捷径。特别是其在布局方面的出色表现,更受青睐。大家都知道,没有表格的帮助,很难组织出一个协调合理的页面。 1.点击“ALT+F6”键,进入布局模式,插入布局表格。建立一个大概的布局。 2.使用背景图片:选中该项,按浏览可以插入一幅准备好的图片作为表格的背景,因为图片是以平铺的形式作为表格背景,所以表格大小和图片尺寸都要控制好。 (二)网页中的图像

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科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个部分。如下图:

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

简单网页制作实验总结报告

《大学计算机基础》 实验报告 专业名称: 电子商务2班 学号: xxxxxxxxxxx 姓名: x x 指导教师: x x 2011年12月24日

目录 第一章网站主题设计说明 (1) 1.1 主题内容 (1) 1.2 设计思路 (1) 第二章网站内容设计 (2) 1.1 链接1标题 (2) 1.2 链接2标题 (2) 1.3 flash制作说明 (2) 第三章网站技术难点 (3) 第四章心得体会..................................... ..... ......................... (4)

第一章网站主题设计说明 1.1 主题内容 (1) 网站主题为“四季の花”,包括春夏秋冬四个季节的比较典型的花朵及有关花的诗句,色彩缤纷,十分艳丽夺目。 1.2 设计思路 (2) 大多网站都设计的关于音乐,影视,购物等非常热门的东西,本站设计的主题是花,能让人们在闲下来的时候看看花,品品诗歌,所以做有关花的网页是个不错的选择。同时,让人们分清楚春夏秋冬都各有什么典型的花。

第二章网站内容设计 1.1链接1标题:春の花 春天是生命的季节,在这个季节里,万物复苏。所以就找了虞美人,桃花,牡丹,以及海棠花来作为春天的代表。同时配有与这些花有关的诗句。 1.2 链接2标题:夏の花 夏天充满了激情与阳光,我找了兰花,荷花,百合花等来代表这个季节,色彩艳丽,十分醒目夺人。 1.3 链接3标题:秋の花 大丽花,菊花,月季和牡丹花都竞相出现在本网页,色彩缤纷,赏心悦目。 1.4 链接4标题:冬の花 蝴蝶兰,水仙,迎春花,梅花是冬季的代表,他们刻画了一副傲立冬天的坚强的姿态。

实时操作系统报告

实时操作系统课程实验报告 专业:通信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];

操作系统实验报告

操作系统实验报告 集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

实验二进程调度1.目的和要求 通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。 2.实验内容 阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。 编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。 程序要求如下: 1)输出系统中进程的调度次序; 2)计算CPU利用率。 3.实验环境 Windows操作系统、VC++6.0 C语言 4设计思想: (1)程序中进程可用PCB表示,其类型描述如下:

structPCB_type { intpid;//进程名 intstate;//进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态 intcpu_time;//运行需要的CPU时间(需运行的时间片个数) } 用PCB来模拟进程; (2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。队列类型描述如下: structQueueNode{ structPCB_typePCB; StructQueueNode*next; } 并设全程量: structQueueNode*ready_head=NULL,//ready队列队首指针 *ready_tail=NULL,//ready队列队尾指 针

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

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

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

网页制作实验报告

网页制作实验报告 页制作实验报告 实验一:站点设置 一、实验目的及要求 本实例是经过“站点定义为”对话框中的“高级”选项卡创建一具新站点。 二、仪器用具 1、生均一台多媒体电脑,组建内部局域,同时接入国际互联。 2、安装windows xp操作系统;建立iis服务器环境,支持asp。 3、安装页三剑客(dreamweaver mx;flash mx;fireworks mx)等页设计软件; 三、实验原理 经过“站点定义为”对话框中的“高级”选项卡创建一具新站点。 四、实验办法与步骤 1)执行“站点\治理站点”命令,在弹出的“治理站点”对话框中单击“新建”按钮,在弹出的快捷菜单中挑选“站点”命令。 2)在弹出的“站点定义为”对话框中单击“高级”选项卡。 3)在“站点名称”文本框中输入站点名称,在“默认文件夹”文本框中挑选所创建的站点文件夹。在“默认图象文件夹”文本框中挑选存放图象的文件夹,完成后单击“确定”按钮,返回“治理站点”对话框。 4)在“治理站点”对话框中单击“完成”按钮,站点创建完毕。 五、实验结果 六、讨论与结论 实验开始之前要先建立一具根文件夹,在实验的过程中把站点存在自己建的文件夹里,如此才干使实验条理化,别至于在实验后寻别到自己的站点。在实验过程中会浮现一些选项,计算机普通会有默认的挑选,最后别要去更改,假如要更改要先充分了解清晰该选项的含义,以及它会造成的效果,否则会使实验的结果失真。实验前先熟悉好操作软件是做好该实验的关键。 实验二:页面图像设置 一、实验目的及要求: 本实例的目的是设置页面的背景图像,并创建鼠标经过图像。 二、仪器用具 1、生均一台多媒体电脑,组建内部局域,同时接入国际互联。 2、安装windows xp操作系统;建立iis服务器环境,支持asp。 3、安装页三剑客(dreamweaver mx;flash mx;fireworks mx)等页设计软件; 4、安装acdsee、photoshop等图形处理与制作软件; 5、其他一些动画与图形处理或制作软件。 三、实验原理 设置页面的背景图像,并创建鼠标经过图像。 四、实验办法与步骤 1) 在“页面属性”对话框中设置页面的背景图像。 2) 在页面文档中单击“”插入鼠标经过图像。 五、实验结果

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

操作系统实验报告

操作系统实验报告 实验名称: 系统的引导 所在班级: 指导老师: 老师 实验日期: 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

网页制作实验报告

北京理工大学珠海学院课程设计说明书 _2013_—_2014_学年第_1_学期 题目: 《Web应用开发课程设计》 学院:计算机学院 专业班级: 11级软件工程3班 学号: 110202031031 学生姓名:蒋征 指导教师:魏志军 成绩: 时间: 2014/1/5 2014年 1 月 5 日

摘要 本次作品是一个IT技术交流论坛,实现论坛的基本功能,注册、登录、发帖、浏览和回帖。 论坛分三个分板块,网页、C#和JA V A,纵向层次也是三层,主页、板块页和帖子页。网站使用JavaScript实现动态页面。 关键词:计算机技术交流社区JavaScript 网页 I

目录 摘要 ............................................. I 目录 ............................................. II 1 网站结构和布局 (1) 1.1 网站结构 (1) 1.1.1 总体结构 (1) 1.1.2 横向链接结构 (2) 1.2 页面布局 (3) 1.2.1 主页 (3) 1.2.2 分版页面 (6) 1.2.3 帖子页面 (6) 2 技术应用 (8) 2.1 逻辑设计 (8) 2.1.1 HTML和CSS设计 (8) 2.1.2 JavaScript设计 (10) 参考文献 (13) 心得体会 (14) I

教师评语 (15) 成绩评定表 (16) 课程设计答辩记录表 (17) II

1 网站结构 1.1主体结构 1.1.1总结构 网站是以技术交流社区为主题的论坛型网站。 这个网站是按树形结构设计如图1-1-1,页面种类共分三层,分别是主页,分主题页还有就是内容页。 主页连向三个分主题分区页面,分别是MTHL板块,C#板块还有就是JAVA 板块。 主题分区页面下面是内容帖子。 图1-1-1网页关系 1

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

嵌入式实时操作系统实验报告 任务间通信机制的建立 系别计算机与电子系 专业班级***** 学生姓名****** 指导教师 ****** 提交日期 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 才能支持信号量。

操作系统实验报告

《操作系统原理》实验报告 实验项目名称:模拟使用银行家算法判断系统的状态 一、实验目的 银行家算法是操作系统中避免死锁的算法,本实验通过对银行家算法的模拟,加强对操作系统中死锁的认识,以及如何寻找到一个安全序列解除死锁。 二、实验环境 1、硬件:笔记本。 2、软件:Windows 7 , Eclipse。 三、实验内容 1.把输入资源初始化,形成资源分配表; 2.设计银行家算法,输入一个进程的资源请求,按银行家算法步骤进行检查; 3.设计安全性算法,检查某时刻系统是否安全; 4.设计显示函数,显示资源分配表,安全分配序列。 四、数据处理与实验结果 1.资源分配表由进程数组,Max,Allocation,Need,Available 5个数组组成; 实验采用数据为下表: 2.系统总体结构,即菜单选项,如下图

实验的流程图。如下图 3.实验过程及结果如下图所示

1.首先输入进程数和资源类型及各进程的最大需求量 2.输入各进程的占有量及目前系统的可用资源数量 3.初始化后,系统资源的需求和分配表 4.判断线程是否安全

5.对线程进行死锁判断 五、实验过程分析 在实验过程中,遇到了不少问题,比如算法无法回滚操作,程序一旦执行,必须直接运行到单个任务结束为止,即使产生了错误,也必须等到该项任务结束才可以去选择别的操作。但总之,实验还是完满的完成了。 六、实验总结 通过实验使我对以前所学过的基础知识加以巩固,也对操作系统中抽象理论知识加以理解,例如使用Java语言来实现银行家算法,在这个过程中更进一步了解了银行家算法,通过清晰字符界面能进行操作。不过不足之处就是界面略显简洁,对于一个没有操作过计算机的人来说,用起来可能还是有些难懂。所以,以后会对界面以及功能进行完善,做到人人都可以看懂的算法。

操作系统实验报告

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

Dreamweaver网页制作实训报告

广西科技大学鹿山学院 课程设计报告 课程名称:网页制作课程设计 课题名称:我的梦幻网 指导教师:韦灵 班级:计软141班 姓名:邓康言 学号: 20141409 成绩评定:

指导教师签字: 2015 年 07 月 07 日 目录 一. 网页制作课程设计目的 (3) 二. 1.实训意义: (3) 2.实训目的: (3) 二、课程设计内容 (5) 1.网站主题《我的梦幻网》 (5) 2.网站材料 (5) 3.网站规划 (5) 三、课程设计步骤 (6) 四、网站各模块实现 (7) 1.我的梦幻网模块功能: (7) 2.背景故事模块功能: (8) 3.宠物介绍模块功能: (9) 4.门派介绍模块功能 (10) 5.装备模块功能介绍: (11) 6.人物模块功能介绍: (12)

7.地图介绍模块功能: (14) 7.我的梦幻模块功能: (15) 五、总结及心得体会 (17) 一.网页制作课程设计目的 1.实训意义: 本次网页设计与制作实训是网页教学过程中重要的实践性教学环节.它是根据网页教学计划的要求.在教师的指导下进行网页制作专业技能的训练,培养学生综合运用理论知识分析和解决实际问题的能力,实现由理论知识向操作技能的培养过程.因此加强实践教学环节,搞好实训教学,对实现本专业的培养目标,提高学生的综合素质有着重要的作用. 2.实训目的: 通过综合实训进一步巩固,深化和加强我的理论知识 (1) 掌握规划网站的内容结构,目录结构,链接结构的方法。 (2) 熟练掌握网页制作软件Dreamweaver8和基本操作和使

用。 (3) 掌握页面的整体控制和头部内容设置的方法。 (4) 熟练掌握网页页面布局的各种方法。 (5) 熟练掌握在网页中输入,设置标题和正文文字的方法。 (6) 熟练掌握在网页中插入图像,Flash动画和背景音乐的方法。 (7) 熟练建立各种形式的超级链接的方法。 (8) 掌握表单网页制作方法。 (9) 掌握网页特效制作方法。 (10) 掌握网站测试的方法。 2. 训练和培养我获取信息和处理信息的能力,充分培养和提高动手能力,学会通过网站、书籍、素材等方式收集所需的文字资料、图像资料、Flash动画和网页特效等。 3. 培养我运用所学的理论知识和技能解决网站开发过程中所遇到的实际问题的能力及基本工作素质。 4. 培养我的理论联系实际的工作作风,严肃认真的科学态度以及独立工作的能力,树立自信心。

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