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

操作系统实验

操作系统实验
操作系统实验

哈尔滨学院

实验报告

课程名称:操作系统

专业:软件工程

班级:11—6

学号:11031622

姓名:薛滔瀚

教务处制

实验一进程管理

【实验目的与要求】

1. 加深对进程概念的理解,明确进程与程序的区别。

2. 掌握Linux进程创建及撤销的方法,进一步认识并发执行的实质。

3. 掌握Linux系统下守护进程的创建方法。

【实验原理】

1. Linux进程管理命令

(1)进程查看

(2)进程终止

(3)进程优先级设置

2. Linux进程控制函数

(1)创建和修改进程

(2)设置进程属性

(3)获取进程属性

(4)进程的退出

3. Linux守护进程

(1)独立启动守护进程

(2)超级守护进程

(3)守护进程的编写流程

守护进程的编写遵循特定的流程,主要包括五个步骤:

Step 1. 创建子进程,退出父进程

Step 2. 在子进程中创建新会话

Step 3. 改变当前目录为根目录

Step 4. 重设文件权限掩码

Step 5. 关闭文件描述符

【实验主要仪器与材料】

1. 带Linux操作系统的PC机

2. GCC编译器

【实验内容】

1. 获取进程信息

通过管理命令,获取系统当前执行进程的信息,包括进程名称与ID、PID和PGID等。

2. 创建进程

编程程序,实现父进程创建一个子进程,返回后父子进程都分别循环输出字符串“I am

parent.”或“I am child.”5次,每输出一次延时1秒(sleep(1)),然后进入下一次循环。观察

并分析运行结果。然后将程序改为父子进程同步执行:子进程循环输出字符串“I am child.”

5次,然后父进程再循环输出字符串“I am parent.”5次。再次观察并分析运行结果。

【实验步骤及实验结果分析】

实验内容1:获取进程信息

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

0 S 0 6597 6594 0 75 0 - 1121 wait pts/0 00:00:00 bash

4 R 0 7826 6597 0 77 0 - 1042 - pts/0 00:00:00 ps

实验内容2:创建进程

#include

#include

#include

#include

#include

int main( )

{

int i = 0, j = 0;

int p = fork();

if(p)

{

while(i++<5)

{

sleep(1);

printf("I am a child\tPid:%d\n",(int)getpid());

}

}

else

{

while(j++<5)

{

sleep(1);

printf("I am a farther\tPid:%d\n",(int)getpid());

}

}

return 0;

}

【思考题】

1.程序和进程的区别

1.进程是程序的执行,进程属于动态概念,而程序是一组指令的有序集合,是静态

概念。

2.进程既然是程序的执行,或者说是“一次运行活动”,因而它是有生命过程的。

进程的存在是暂时的,而程序的存在是永久的。

3.进程是程序的执行。因此进程的组成应包括程序和数据。除此以外,进程还由

记录进程状态信息的进程控制块PCB组成。

4.一个程序可能对应多个进程。

5.一个进程可以包含多个程序。

6.进程是一个程序及其数据在处理机上顺序执行时所发生的活动。

2.Linux操作系统下有哪些进程类型

交互进程

批处理进程

守护进程

3.进程创建函数fork和vfork的区别

1、fork()用于创建一个新进程。由fork()创建的子进程是父进程的副本。即子进程

获取父进程数据空间,堆和栈的副本。父子进程之间不共享这些存储空间的部分。

而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec (或exit)于是也就不会存放该地址空间。相反,在子进程调用exec或exit 之前,它在父进程的空间进行。

2、vfork()与fork()另一个区别就是:vfork保证子进程先运行,在调用exec或exit

之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。

3/vfork和fork之间的还有一个区别是:vfork保证子进程先运行,在她调用exec 或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

4.进程的退出函数有哪些?有何区别?C程序是如何被启动终止的?

exit函数、return函数、abort函数和_exit()函数

exit和return的区别:exit是一个函数,有参数;而return是函数执行完后的返回。

exit把控制权交给系统,而return将控制权交给调用函数。

exit和abort的区别:exit 是正常终止进程,而abort 是异常终止。

exit和_exit()的区别:exit()在头文件stdlib.h中声明,而_exit()声明在头文件unistd.h 中。两个函数均能正常终止进程,但_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核。

实验二进程通信

【实验目的与要求】

1、了解基于信号的进程通信机制

2、熟悉LINUX系统中进程之间软中断通信的基本原理

【实验原理】

一、信号

1、信号的基本概念

2、信号的发送

3、对信号的处理

二、所涉及的中断调用

1、kill( )

2、signal( )

3、wait()

4、waitpid()

5、lockf()

【实验主要仪器与材料】

1、带Linux操作系统的PC机

2、GCC编译器

【实验内容】

1、编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:

Child process1 is killed by parent!

Child process2 is killed by parent!

父进程等待两个子进程终止后,输出如下的信息后终止:

Parent process is killed!

2、分析利用软中断通信实现进程同步的机理

【实验步骤及实验结果分析】

#include

#include

#include

#include

#include

void waiting( ),stop( );

int wait_mark;

int main( )

{

int p1,p2,stdout=1;

while((p1=fork( ))==-1); /*创建子进程p1*/

if(p1>0)

{

while((p2=fork( ))==-1); /*创建子进程p2*/

if(p2>0)

{

wait_mark=1;

signal(SIGINT,stop); /*接收到^c信号,转stop*/

waiting( );

kill(p1,16); /*向p1发软中断信号16*/

kill(p2,17); /*向p2发软中断信号17*/

wait(0); /*同步*/

wait(0);

printf("Parent process is killed!\n");

exit(0);

}

else

{

wait_mark=1;

signal(SIGINT,SIG_IGN);

signal(17,stop); /*接收到软中断信号17,转stop*/

waiting( );

lockf(stdout,1,0);

printf("Child process 2 is killed by parent!\n");

lockf(stdout,0,0);

exit(0);

}

}

else

{

wait_mark=1;

signal(SIGINT,SIG_IGN);

signal(16,stop); /*接收到软中断信号16,转stop*/

waiting( );

lockf(stdout,1,0);

printf("Child process 1 is killed by parent!\n");

lockf(stdout,0,0);

exit(0);

}

return 0;

}

void waiting( )

{

while(wait_mark!=0);

}

void stop( )

{

wait_mark=0;

}

运行结果:

Child process 2 is killed by parent!

Child process 1 is killed by parent!

Parent process is killed!

【思考题】

实验内容的参考程序如下,请仔细阅读、调试、分析,回答下述问题:#include

#include

#include

#include

#include

void waiting( ),stop( );

int wait_mark;

int main( )

{

int p1,p2,stdout=1;

while((p1=fork( ))==-1); /*创建子进程p1*/

if (p1>0)

{

while((p2=fork( ))==-1); /*创建子进程p2*/

if(p2>0)

{

wait_mark=1;

signal(SIGINT,stop); /*接收到^c信号,转stop*/

waiting( );

kill(p1,16); /*向p1发软中断信号16*/

kill(p2,17); /*向p2发软中断信号17*/

wait(0); /*同步*/

wait(0);

printf("Parent process is killed!\n");

exit(0);

}

else

{

wait_mark=1;

signal(17,stop); /*接收到软中断信号17,转stop*/

waiting( );

lockf(stdout,1,0);

printf("Child process 2 is killed by parent!\n");

lockf(stdout,0,0);

exit(0);

}

}

else

{

wait_mark=1;

signal(16,stop); /*接收到软中断信号16,转stop*/

waiting( );

lockf(stdout,1,0);

printf("Child process 1 is killed by parent!\n");

lockf(stdout,0,0);

exit(0);

}

return 0;

}

void waiting( )

{

while(wait_mark!=0);

}

void stop( )

{

wait_mark=0;

}

1. 参考程序段前面部分用了两个wait(0),它们起什么作用?

用了两个wait(0)的作用是使p1和p2两个子程序同时发出软中断信号不用等待。2. 参考程序段中每个进程退出时都用了语句exit(0),为什么?

都用了exit(0)的作用是让子进程自我终止,正常退出,返回操作系统。

3、参考程序的运行结果是什么?

Parent process is killed!

4、参考程序是否符合实验要求?为什么?

否、按^C键,直接输出“Parent process is killed!”

不符合上面的要求。

5、参考程序该如何修改才能得到正确结果?

在“signal(16,stop)”和“signal(17,stop)”前加“signal(SIGINT, SIG_IGN)”,就可以运行上面的要求了。

实验三内存管理

【实验目的与要求】

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

2、掌握请求页式存储管理的页面置换算法

3、了解页面大小和内存实际容量对命中率的影响

【实验原理】

分页存储管理将一个进程的逻辑地址空间分成若干大小相等的片,成为页面或页。

在进程运行过程中,若其所要访问的页面不在内存而需要把他们调入内存,但内存已无空闲时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。但应将哪个页面调出,须根据一定的算法来确定。通常,把选择换出页面的算法称为页面置换算法(Page Replacement Algorithm)。

一个好的页面置换算法,应具有较低的页面更换频率。从理论上讲,应将那些以后不再会访问的页面换出,或将那些在较长时间内不会再访问的页面调出。

1.最佳置换算法OPT(Optimal)

2.先进先出页面置换算法FIFO

3.最近最久未使用置换算法LRU

【实验主要仪器与材料】

1、带Linux操作系统的PC机

2、GCC编译器

【实验内容】

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

●50%的指令是顺序执行的

●25%的指令是均匀分布在前地址部分

●25%的指令是均匀分布在后地址部分

具体的实施方法是:

●在【0,319】的指令地址之间随机选取一起点m;

●顺序执行一条指令,即执行地址为m+1的指令;

●在前地址【0,m+1】中随机选取一条指令并执行,该指令的地址为m’;

●顺序执行一条指令,其地址为m’+1;

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

●重复上述步骤,直到执行320次指令。

2、将指令序列变换成为页地址流

设:

●页面大小为1K;

●用户内存容量为4页到32页;

●用户虚拟容量为32K。

在用户虚存中,按每K存放10条指令排列虚拟地址,即320条指令在虚存中的存放方式为:

第0条~第9条指令为第0页(对应虚存地址为【0,9】);

第10条~第19条指令为第1页(对应虚存地址为【10,19】);

第310条~第319条指令为第31页(对应虚存地址为【310,319】)。

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

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

●先进先出的算法(FIFO);

●最近最少使用算法(LRU);

●最佳淘汰算法(OPT):先淘汰最不常用的页地址;

其中OPT为选作内容。

命中率= 1 –页面时效次数/页地址流长度

在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。

【实验步骤及实验结果分析】

首先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。

#include

#include

#include

#include

#define OP_SIZE 320 // 指令数

#define ME_MIN 4 // 用户可以使用的最少内存页数

#define ME_MAX 32 // 用户可以使用的最多内存页数

//int op[20] = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};

int op[OP_SIZE];

int me[ME_MAX];

int t_c[ME_MAX];

void Do_op()

{

srand((unsigned)time(NULL));

int m1, m2;

int i = 0;

while(i < OP_SIZE)

{

m1 = rand()%OP_SIZE;

op[i++] = m1+1;

m2 = rand()%(m1+2);

op[i++] = m2;

op[i++] = m2+1;

op[i++] = rand()%(OP_SIZE-m2-2)+m2+2;

}

}

// 查找内存中是否有需要的页数,找到返回页数地址,否则返回-1

int find(int add, int n)

{

int i = 0;

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

{

if((add/10) == me[i])

{

return i;

}

}

return -1;

}

// 先进先出内存页数分配算法

double FIFO(int n)

{

memset(me,-1,sizeof(me));

int i = 0, FIFO_f = 0;

int top = 0;

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

{

if(find(op[i],n)==-1)

{

FIFO_f++;

me[top%n] = op[i]/10;

top++;

}

}

return (double)FIFO_f/OP_SIZE;

}

// 查找内存中的页数块最近最久未使用的块地址int max_i(int n)

{

int max = 0, i;

for(i = 1; i < n; i++)

{

if(t_c[max] < t_c[i])

{

max = i;

}

}

return max;

}

// 最近最久未使用算法

double LRU(int n)

{

memset(me,-1,sizeof(me));

memset(t_c,0,sizeof(t_c));

int i = 0, LRU_f = 0;

int f = 0, j = 0;

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

{

f = find(op[i],n);

if(f == -1)

{

LRU_f++;

f = max_i(n);

me[f] = op[i]/10;

}

for(j = 0; j < n; j++)

{

j==f?t_c[j] = 0:t_c[j]++;

}

}

return (double)LRU_f/OP_SIZE;

}

int main()

{

int i = 0;

Do_op();

printf("ME:FIFO\tLRU\n");

for(i = ME_MIN; i <= ME_MAX; i++)

{

printf("%d:%.5lf\t%.5lf\n", i, 1-FIFO(i), 1-LRU(i));

}

return 0;

}

运行结果:

【思考题】

1、在内存页面较少(4~5个)的情况时,各种页面置换算法的命中率有何差别?

FIFO < LRU,但有时LRU还不如FIFO置换算法。

2、在内存页面为7~12个页面时,各种页面置换算法的命中率有何差异?

LRU>FIFO,差别开始扩大,但也有一定的波动。

3、在内存页面为25~32个页面时,各种页面置换算法的命中率有何差异?

LRU>FIFO,差别扩大。

4、综上实验现象,总结各种页面置换算法命中率的高低。

理论上,四种替换算法的命中率由高到底排列应该是OPT>LRU>CLOCK>FIFO

推测与指令流的产生方式有关系。因为指令流的产生方式要能体现局部性原理,所以该指令流产生设计为:50%的指令是顺序执的,25%的指令是均匀分布在前地址部分,25%的指令是均匀分布在后地址部分。但是这样的指令流设计方式能否最佳地体现局部性原理,这还有待验证。

实验四文件系统

【实验目的与要求】

1、熟悉Linux文件系统的文件和目录结构,掌握Linux文件系统的基本特征。

2、掌握命令行方式下文件操作命令和程序中文件操作函数的使用方法。

3.、掌握Linux文件系统的加载和卸载方法。

【实验原理】

1. 文件系统生成和加载

在使用文件系统之前,需要对硬盘执行分区、格式化、挂载文件系统等操作。

(1)查看硬盘状态

(2)硬盘分区和格式化

(3)文件系统的挂载和扫描

2. 文件系统操作命令

下面列出常用的文件系统操作命令,具体使用方法和参数的意义请查询该命令的帮助文档。

cat:显示文件的内容(经常和more搭配使用),或将多个文件合并成一个文件。

chgrp:改变文件或目录所属的用户组

chown:改变文件的属权

clear:清楚终端屏幕

cp:将文件或目录复制到其他目录中

cut:移除文件的部分内容

diff:找出两个文件的不同之处

file:显示文件类型

find:在目录中搜索文件,并执行指定的操作。

head:只查看文件的头几行内容,而不必浏览整个文件。

ln:在文件之间创建链接,实际上是给某个文件指定一个访问它的别名。

less:查看超过一屏的文件内容,可按空格键向下显示文件,利用方向键滚动显示文件。

locate:查找文件,且比find命令的搜索速度快。

ls:显示当前目录中的文件和子目录列表

mkdir:建立子目录

more:显示超过一屏的文件,让文件显示满一屏时暂停,按任意键时显示下一屏内容。

rmdir:删除“空”的子目录或无用的目录文件

mv:将文件以及目录移到其他位置,或更改文件以及目录的名称。

pico:可指定文本的编辑方式

pwd:显示用户当前所在的目录

rm:删除系统中过时或无用的文件,可删除目录中的文件或目录本身。对于链接文件,原有文件保持不变。

sort:将文本文件自动分类

stat:显示文件或文件系统的状态

strings:显示文件中要打印的字符串

tail:输出文件的结尾

touch:改变文件的时间戳

uniq:移除已分类文件中的重复文本行

wc:显示文件中字节、词组合文本行的数目。

whereis:查找特定目录下的原始程序,二进制程序或用户手册等文件的位置。

man:详细了解某个命令

dd:复制一个文件

edquoat:设置用户与用户组的磁盘空间限制,即Windows系统中的配额。

quota:限制和显示用户可用的磁盘空间

quotaon,quotaoff:启用或取消quota限制

3. 文件操作函数

Linux系统对文件操作有系统调用(system call)和库函数调用(Library functions)两种方式。

● 系统调用

系统调用通常用于底层文件访问(low-level file access),例如在驱动程序中对设备文件的直接访问,包括open、close、read、write、ioctl等,需包含头文件unistd.h。

(1) write系统调用

size_t write(int filedes, const void *buf, size_t nbytes);

(2)read系统调用

size_t read(int filedes, void *buf, size_t nbytes)

(3)open系统调用

int open(const char *path, int oflags);

int open(const char *path, int oflags, mode_t mode);

(4)close系统调用

int close(int filedes);

(5)lseek系统调用

off_t lseek(int filedes, off_t offset, int whence);

(6)fstat, stat和lstat系统调用

int fstat(int filedes, struct stat *buf);

int stat(const char* path, struct stat *buf);

int lstat(const char *path, struct stat *buf)fstat;

(7)dup和dup2的系统调用

int dup(int filedes);int dup2(int filedes, int filedes2);

● 库函数调用

标准C库函数提供的文件操作函数如fopen, fread, fwrite, fclose, fflush, fseek等需包含头文件stdio.h。

1)fopen函数:FILE *fopen(const char *filename,const char *mode);

2)fread 函数:size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);

3)fwrite函数:size_t fwrite (const void *ptr, size_t size, size_t nitems, FILE *stream);

4)fclose函数:int fclose (FILE *stream);

5)fflush函数:int fflush(FILE *stream);

6)fseek函数。int fseek(FILE *stream, long int offset, int whence);

7)fgetc,getc,getchar函数:

8)fputc,putc,putchar函数

int putc(int c, FILE *stream);——相当于fputc,但可以实现为一个宏。

int putchar(int c);——相当putc(stdout)。

9)fgets,gets函数

char* fgets(char *s,int n, FILE *stream);

char* gets(char *s);

【实验主要仪器与材料】

1、带Linux操作系统的PC机

2、GCC编译器

【实验内容】

1. 熟悉Linux下的文件操作命令,如查看文件系统的分区和设备文件、查看文件系统目录结构、创建文件夹、复制文件、更改文件权限等,观察Linux文件系统的特点。

2. 对比实验一的文件拷贝代码,利用不同的文件操作函数实现文件的输出和拷贝。

3. 实现对光盘的加载和访问,然后卸载设备。

4. 加载Windows文件系统,实现对Windows数据的访问和共享。

【【实验步骤及实验结果分析】

1.

查看文件系统的分区和设备文件

[root@bogon ~]# df -a

文件系统1K-块已用可用已用% 挂载点

/dev/mapper/V olGroup00-LogV ol00

38533760 3305160 33239584 10% /

proc 0 0 0 - /proc

sysfs 0 0 0 - /sys

devpts 0 0 0 - /dev/pts

/dev/sda1 101086 10907 84960 12% /boot

tmpfs 517700 0 517700 0% /dev/shm

none 0 0 0 - /proc/sys/fs/binfmt_misc

sunrpc 0 0 0 - /var/lib/nfs/rpc_pipefs

none 0 0 0 - /proc/fs/vmblock/mountPoint

查看文件系统目录结构

[root@bogon ~]# du

327528 ./vmware-tools-distrib/lib

600 ./vmware-tools-distrib/bin

8 ./vmware-tools-distrib/etc/vmware-tools

144 ./vmware-tools-distrib/etc

48 ./vmware-tools-distrib/installer

40 ./vmware-tools-distrib/doc/vmware-vmci/samples

48 ./vmware-tools-distrib/doc/vmware-vmci

232 ./vmware-tools-distrib/doc

329028 ./vmware-tools-distrib

创建文件夹

[root@bogon ymy]# mkdir hcl

[root@bogon ymy]# ls

hcl hclqq

复制文件

[root@bogon ymy]# cp t>>q

[root@bogon ymy]# ls

q t

更改文件权限

[root@bogon h]# ls -l

总计8

-rw-r--r-- 1 root root 19 07-01 18:28 a.txt [root@bogon h]# chmod 777 a.txt

[root@bogon h]# ls -l

总计8

-rwxrwxrwx 1 root root 19 07-01 18:28 a.txt [root@bogon h]#

2.

int main()

{

FILE *in, *out;

if((in = fopen("a.txt","r"))==NULL)

{

printf("Error!!!\n");

}

if((out = fopen("b.txt","w"))==NULL)

{

printf("Error!!!\n");

}

char ch;

while((ch=fgetc(in))!=EOF)

{

printf("%c",ch);

fputc(ch,out);

}

return 0;

}

结果

[root@bogon h]# gcc Test.c -o t

[root@bogon h]# ./t

wdfsdfdsfsdfs

:

q

[root@bogon h]# ls

a.txt

b.txt t Test.c

[root@bogon h]# cat b.txt

wdfsdfdsfsdfs

:

q

3.

1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。

#cp /dev/cdrom /home/sunky/mydisk.iso或

#dd if=/dev/cdrom f=/home/sunky/mydisk.iso

注:执行上面的任何一条命令都可将当前光驱里的光盘制作成光盘镜像文件/home/sunky/mydisk.iso

2、将文件和目录制作成光盘镜像文件,执行下面的命令。

#mkisofs -r -J -V mydisk -o /home/sunky/mydisk.iso /home/sunky/ mydir

注:这条命令将/home/sunky/mydir目录下所有的目录和文件制作成光盘镜像文件/home/sunky/mydisk.iso,光盘卷标为:mydisk

3、光盘镜像文件的挂接(mount)

#mkdir /mnt/vcdrom

注:建立一个目录用来作挂接点(mount point)

#mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom

注:使用/mnt/vcdrom就可以访问盘镜像文件mydisk.iso里的所有文件了。

4.

1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。

#cp /dev/cdrom /home/sunky/mydisk.iso或

#dd if=/dev/cdrom f=/home/sunky/mydisk.iso

注:执行上面的任何一条命令都可将当前光驱里的光盘制作成光盘镜像文件/home/sunky/mydisk.iso

2、将文件和目录制作成光盘镜像文件,执行下面的命令。

#mkisofs -r -J -V mydisk -o /home/sunky/mydisk.iso /home/sunky/ mydir

注:这条命令将/home/sunky/mydir目录下所有的目录和文件制作成光盘镜像文件/home/sunky/mydisk.iso,光盘卷标为:mydisk

3、光盘镜像文件的挂接(mount)

#mkdir /mnt/vcdrom

注:建立一个目录用来作挂接点(mount point)

#mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom

注:使用/mnt/vcdrom就可以访问盘镜像文件mydisk.iso里的所有文件了。

嵌入式操作系统实验报告

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

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

#include "stdio.h" #include #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 struct pcb { /* 定义进程控制块PCB */ char name[10]; char state; int ntime; int rtime; struct pcb* link; }*ready=NULL,*p; typedef struct pcb PCB; void sort() /* 建立对进程进行优先级排列函数*/ { PCB *first, *second; int insert=0; if((ready==NULL)||((p->ntime)<(ready->ntime))) /*运行时间最短者,插入队首*/ { p->link=ready; ready=p; } else /* 进程比较运行时间优先级,插入适当的位置中*/ { first=ready; second=first->link; while(second!=NULL) { if((p->ntime)<(second->ntime)) /*若插入进程比当前进程所需运行时间短,*/ { /*插入到当前进程前面*/ p->link=second; first->link=p; second=NULL; insert=1; } else /* 插入进程运行时间最长,则插入到队尾*/ { first=first->link; second=second->link; } } if(insert==0) first->link=p; } }

实时操作系统报告

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

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

实验五:管道通信 实验内容: 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”;

操作系统实验二

操作系统实验 实验二进程管理 学号 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、程序流程图。

操作系统实验_实验1

广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室 2015年11月11日 实验课 操作系统成绩 程名称 实验项 进程管理与进程通信指导老师陈康民目名称 (***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***) 进程管理 (一)进程的创建实验 一、实验目的 1、掌握进程的概念,明确进程的含义 2、认识并了解并发执行的实质 二、实验内容 1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一 个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……', 父进程显示'parent ……',观察结果,分析原因。 三、实验步骤 1、编写一段程序,使用系统调用fork( )创建两个子进程。 代码: #include main( ) { int p1,p2; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) putchar('b'); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) putchar('c'); else putchar('a'); } } 运行结果:

bca,bac, abc ,……都有可能。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。 代码:#include main( ) { int p1,p2,i; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) for(i=0;i<10;i++) printf("daughter %d\n",i); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) for(i=0;i<10;i++) printf("son %d\n",i); else for(i=0;i<10;i++) printf("parent %d\n",i); } } 结果:

嵌入式实时操作系统vxworks实验教程[1]

???VxWorks 偠 ? Laboratory Tutorial for Embedded Real ˉtime Operating System VxWorks ?? ? ? ? ? ? ? 2003 10

???VxWorks 偠 ? ? 1 ???? (1) 1.1 ?? (1) 1.2 ??? (7) 2 ? MPC860 (16) 3 ???VxWorks ? ? Tornado (25) 3.1 ???VxWorks (25) 3.2 Tornado? ? (43) 4 VxWorks?BootRom (48) 5 偠 (55) 5.1 偠??Tornado??? (55) 5.2 偠?? ??? ? ? (74) 5.3 偠?? ? ? ?? (78) 5.4 偠 ?? ??? (101) 5.5 偠?? ?????? ?? (110) 5.6 偠 ? ?????? ?? (116) ? A hwa-xpc860 偠 (120)

1 ???? ?? ?? 催? ?? ??? ?? ? ? ?? ??Ё?????? ? ?? ?? ? ? ?? ?? (Embebdded computer) Ё??? ?? ? ??? ⑤?20??60 ?? ????? ? ????? ? 1.1.1 ???? ??? ?? ? Н? ??? ????? ?? ?? ???? ???? ?? ?? ?? ?? ???? ??? ????? ? ?????BIOS? ? ? ???? ?催 ? ? ? ㄝ???? ? ??? ? ? ? ?????????? ???? ?? ? ? ? ? ???? ?? ? ? ???? ?ㄝ???? ???? ??? ? ? ??? ? ???? ? ? ?? ㄝ ?? ? ??? ? ?? ? (control)???Mointer) ??(Managemet)ㄝ ?? 1.1.2 ? ?????? ? ? 1.1. 2.1 ? ?? ? ?? ??4?? ? 1? ? ? ? ?? ? ? ???Ё ????? ???? ?? ? ? ?? ?2? ? ??? ?? ?????? ? ????? ??? П? ??? ??????? ? ?? ???? ? 3? ? ? ? ????? ?? ? 催 ? ? ? 4? ? 乏 ? ?? ?? ? ? ? ??? ? ? Ё??∴??? ?? ?? ?? ? mW??uW??1.1.2.2 ? ???? ???? ?? ?? ? ? ?? ? ??? ?? ? ? ? ? ???1000 ??????? 30 ?? ?

操作系统实验五

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

一、实验概述 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. 删除所有的断点(防止有些断点影响后面的调试)。

操作系统实验全(五个)

操作系统试验指导 —. 课程的性质、目的和任务 操作系统在整个计算机系统软件中占有中心地位。其作用是对计算机系统进行统一的调度和管理,提供各种强有力的系统服务,为用户创造既灵活又方便的使用环境。本课程是计算机及应用专业的一门专业主干课和必修课。通过本课程的学习,使学生掌握操作系统的基本概念、设计原理及实施技术,具有分析操作系统和设计、实现、开发实际操作系统的能力。 二. 实验的意义和目的 操作系统是计算机专业学生的一门重要的专业课程。操作系统质量对整个计算机系统的性能和用户对计算机的使用有重大的影响。一个优良的操作系统能极大地扩充计算机系统的功能,充分发挥系统中各种设备的使用效率,提高系统工作的可靠性。由于操作系统涉及计算机系统中各种软硬件资源的管理,内容比较繁琐,具有很强的实践性。要学好这门课程,必须把理论与实践紧密结合,才能取得较好的学习效果。培养计算机专业的学生的系统程序设计能力,是操作系统课程的一个非常重要的环节。通过操作系统上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。使学生更好地掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能力。 三.实验运行环境及上机前的准备 实验运行环境: C语言编程环境 上机前的准备工作包括: ●按实验指导书要求事先编好程序; ●准备好需要输入的中间数据; ●估计可能出现的问题; ●预计可能得到的运行结果。 四. 实验内容及安排 实验内容包括进程调度、银行家算法、页式地址重定位模拟,LRU算法模拟和先来先服务算法五个实验。每个实验介绍了实习的目的要求、内容和方法。

操作系统实验心得(精选多篇)

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

大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。 3、敢于攻坚,越是难的问题,越是要有挑战的心理。这样就能够达到废寝忘食的境界。当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。 4、最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。比如当时我遇到我以前从未遇到的段错误的问题,让我都不知道从何下手。在经过大量的资料查阅之后,我对段错误有了一定的了解,并且能够用相应的办法来解决。 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的 1)访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址 2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域 3)其他 例如: <1>定义了指针后记得初始化,在使用的时候记得判断是否为 null <2>在使用数组的时候是否被初始化,数组下标是否越界,数组元素是否存在等 <3>在变量处理的时候变量的格式控制是否合理等

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

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

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

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

操作系统实验一

本科实验报告 课程名称:操作系统 学号: 姓名: 专业: 班级: 指导教师: 课内实验目录及成绩 信息技术学院

实验(实验一) 1 实验名称:基本shell命令及用户管理 2 实验目的 2.1 掌握安装Linux操作系统的方法。 2.2 掌握Linux操作系统的基本配置。 2.3 了解GNOME桌面环境。 2.4 掌握基本shell命令的使用。 3 实验准备 3.1 下载VMware Workstation虚拟机软件(版本不限)。 3.2 准备Linux操作系统的安装源(内核版本和发行版本均不限)。 注:实验准备、实验内容4.1和4.2作为回家作业布置,同学们利用课余时间可在私人计算机上完成。 4 实验要求、步骤及结果 4.1 安装虚拟机软件。 【操作要求】安装VMware Workstation虚拟机软件,并填写以下4.1.1和4.1.2的内容。 4.1.1【VMware Workstation虚拟机版本号】 4.1.2【主要配置参数】 4.2 安装Linux操作系统。 【操作要求】安装Linux操作系统,版本不限。 Linux发行版本: Linux内核版本:

【主要操作步骤:包括分区情况】 1、创建一台虚拟机安装操作系统时客户机操作系统选择Linux 2、修改虚拟机的安装路径。 3、建一个新的虚拟磁盘,磁盘的空间20GB,并且将单个文件存储虚拟磁盘。 4、设置分区完毕,安装虚拟机 4.3 了解Linux操作系统的桌面环境之一GNOME。 【操作要求】查看桌面图标,查看主菜单,查看个人用户主目录等个人使用环境。【操作步骤1】桌面图标

【操作步骤2】主菜单 【操作步骤3】个人用户主目录 【操作步骤4】启动字符终端

操作系统实验

《操作系统》 实验指导书 班级: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 ⑷重复以上过程,直到所要进程都完成为止。

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

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

操作系统实验五

《操作系统》实验指导(五) Linux文件操作与命令接口(综合性 2学时) 1、实验目的: 1)熟悉LINUX文件系统; 2)通过编写文件操作的程序,进一步掌握操作系统的文件管理机制。 3)掌握简单的用户接口(字符菜单)的设计方法。 2、实验内容: (1)编写程序p.c,其功能是从键盘输入两个实数,输出这两个实数的平方和,生成可执行文件为pow。记录编译的命令和结果。 #include main() { double a,b; scanf("%lf%lf",&a,&b); printf("%lf",a*a+b*b); } (2)在LINUX下编写显示文件内容的程序mycat.c,要求在运行时能提示输入文件名,当完成文件名输入后,在屏幕上显示文件内容。 #include main() { FILE *fp; char buff[50]; printf("请输入文件名:"); scanf("%s",buff); fp=fopen(buff,"r"); char ch; while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp);

} 显示pow.c的内容 (3)设计一个字符菜单的接口界面,其功能是能根据用户的选择,运行相应的程序模块,实现诸如改名文件、删除文件、显示文件等功能。(提示:要先将各模块分别命名成各函数,以便于主程序(main.c)调用。可参考程序中的命名方法,各函数名可以自定。) 参考程序main.c: #include void create_f() { char filename[20]; FILE*fp; printf("请输入创建的文件名:"); scanf("%s",filename); if((fp=fopen(filename,"wb"))==NULL) { printf("创建文件失败!\n"); getchar(); return; } printf("%s:创建完成\n",filename); } void copy_f() { char filename1[20]; char filename2[20]; int c; printf("请输入要复制的文件名:"); scanf("%s",filename1); printf("请输入复制成的文件名:"); scanf("%s",filename2); FILE *fp1, *fp2;

操作系统实验报告

操作系统教程 实 验 指 导 书 姓名: 学号: 班级:软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的循环次数:

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