实验(操作系统)

更新时间:2024-04-28 11:56:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

操作系统实验

实验一:linux常用命令 一、 实验目的

1、 掌握linux常用命令的使用方法和任务操作能力;

2、 用超级用户与普通用户帐户登录linux系统,了解在linux系统中超级用户与普通用户将具有那些

本质上不同的权限;

3、 能描述在linux 系统启动过程中包含了哪些主要的阶段; 二、 实验内容和要求

1、 使用自己的帐户登录linux系统查看系统提示符确定自己使用的 shell程序类型。 2、 修改个人口令后重新登录。

3、 用who命令查看当前登录在系统中的用户列表、用户总数、系统启动时间等。 4、 查看当前用户的标志符及当前进程的状态。 5、 用 cal命令查看自己的生日是星期几。

6、 将 Windows下的C盘链入linux 系统的根目录下。

7、 将C盘上的一个文本传递到linux下的当前用户目录下,并进行浏览查看。 8、 使用mail进行电子邮件的传递与查看。 9、 在系统中与其他用户对话。

10、练习允许与拒绝其他用户向自己的终端上发送信息。 三、 实验结果:请同学们自己写出 上机执行参考序列:

1、 用户使用的shell可查阅/etc/passwd文件确定。 2、 修改口令的命令为:passwd 3、 who –h 4、 id

5、 cal –m 3 –y 1990 6、 mkdir/dosc

mount/dev/hda1/dosc 7、 cp /myexample.txt

vim ./myexample.txt 8、 % mail zhangming

subject:hello hi,my friend! How are you! [ctrl+d] Cc: %

查看信件只需要键入”mail” % mail 9、% talk zhangming

用户屏幕将分成两半,其显示:请同学们自己写 此时zhangming 回应: % talk wangyong@class

则zhangming 的屏幕就会分成两半,双方开始对话。 10、% mesg y允许其他用户向自己发送信息。 % mesg n拒绝其他用户向自己发送信息。 四、 小结、体会

1

实验二:shell编程 一、实验目的

1、 理解shell的基本功能和作用。

2、 了解shell命令解释原理及linux特殊命令的使用方法。

3、 根据需要设定自己的shell环境参数,构造一个具有特色的shell工作环境。 4、 掌握shell 基本程序设计方法,能够编写需要的 shell程序。 二、实验内容和要求(同学们可以任意选择2题)

1、 使用FOR循环语句编写一段B-shell程序,完成显示用户注册目录下a_bub、b_sub 子目录下的所有C

程序文件及其目标的列表。

2、 为了便于系统管理员对磁盘分配的管理,请编写一段B-shsell程序,当文件系统/home的占用空间量改

变时给出相应的提示。要求/home占用量在系统磁盘中为: (1) 小于50%时,提示“用户文件系统磁盘使用负荷量小”。

(2) 大于50%,小于90%时,提示“用户文件系统磁盘使用负荷正常”。 (3) 大于等于90%时,提示“用户文件系统磁盘使用负荷量偏大”。

3、 编写一段shell 程序完成:根据从键盘输入的学生成绩,显示相应的成绩标准(分出及格和优秀)。 三、参考代码 1、 # !/bin/sh

# showfile .sh

if test –d $HOME/ a_sub #测试目录a_sub是否存在 then

echo “---the .c and .obj files in $HOME /a_sub:---” for filename in ?ls $HOME / a_sub? do

case $ filename in #显示文件 *.c) echo $ filename; *.obj) echo $ filename; esac done else

echo “$HOME / a_sub dose not exist!!! ” fi

if test –d $HOME/ b_sub #测试目录b_sub是否存在 then

echo “---the .c and .obj files in $HOME /b_sub:---” for filename in ?ls $HOME / b_sub? do

case $ filename in #显示文件 *.c) echo $ filename; *.obj) echo $ filename; esac done else

echo “$HOME / b_sub dose not exist!!! ” fi

2

2、 cat diskusage.sh

# !/bin/sh # diskusage.sh echo

echo “---disk usage condition---” #获得用户已使用的磁盘空间数 used = ?du -s $HOME | cut -f1 ? echo -e “used blocks:\\t$used ” #获得磁盘空闲块数

free = ? df | tail –l | tr -s “[ ]” | cut –f4 –d “ ” ? echo –e “ free blocks : \\t$free”

#计算出用户可以使用的总的磁盘空间大小 total = $ ( echo ?expr $used + $free? ) echo –e “total blocks : \\ t$total ” echo

echo “---disk usage ratio---” #计算出用户的磁盘占用率

ratio = $( echo “scale=6 ; $used*100/$total ” | bc) echo –e “ usage ratio : \\t$ratio%” if [ ?expr “$ratio < 50 ” ? ] then

echo “用户文件系统磁盘使用负荷量小” else if [ ?expr “$ratio > 90 ” ? ] then

echo “用户文件系统磁盘使用负荷量偏大” else

echo “用户文件系统磁盘使用负荷正常”fi echo

3、 cat score.sh # !/bin/sh #score.sh

echo –e “ please enter the score: \\c”

while read SCORE do

case $SCORE in ? | [ 1-5 ?] echo “Failed !”

echo –e “please enter the score: \\c” ;; 6?) echo “ passed! ”

echo –e “please enter the score: \\c” ;;

7 ? ) echo “ Medium!”

echo –e “please enter the score: \\c” ;;

3

8 ? ) echo “Good !”

echo –e “please enter the score: \\c” ;; 9 ? | 100 ) echo “excellent!”

echo –e “please enter the score: \\c” ;; * ) exit ;; esac done

四、实验结果

请同学们写出shell 程序执行结果和小结、体会。 五 思考问题

1、 shell程序的主要功能有哪些?

2、 请说明使用shell编程时,如何将编写完成的 shell程序提交给系统运行?

4

实验三:文件操作命令 一、实验目的

熟悉和理解文件的概念和文件系统的类型,了解linux系统中文件系统的管理机制,掌握文件系统的装载方法,掌握linux操作系统中文件的基本操作方法。 二、实验环境及工具

装有linux系统的计算机,光盘、优盘各一个。 三、实验内容和要求

1、安装linux操作系统,在linux 操作系统环境下建立一个用户帐户号,为每个用户建立两个文件:test1;test2 .

2、以自己的用户名登录linux操作系统后完成下面的操作: (1) 文件操作 *查看文件与目录 ls ls -l ls /usr/bin dir

*显示文件test1内容(cat、less)

一页一页地显示文件的内容:cat test | more

列出当前目录下的文件,确定包括两个文件test1 、test2,通过下列命令,观察结果,归纳cat命令的功能: cat test1

cat test1 test2>test3 cat test3 | more *文件复制命令(CP)

使用CP命令可将指定的文件复制到指定目录下,并保持文件名不变。 cp /root/* /temp cp test1 text1 cp – r /root / * /temp cp /root / .[a-z] * /temp *删除文件命令(rm)

*移动文件和重新命名文件命令(mv) (2)目录操作命令 *改变当前命令(pew) *建立子目录命令(mkdir) *删除子目录(rmdir) (3)文件系统装卸操作 *CDROM的安装与卸载

使用mount命令把CDROM中的所有目录和文件加入到linux 目录树。挂装CDROM的命令需要以 root身份执行: mkdir / mnt / cdrom

mount –t auto /dev/cdrom /mnt/cdrom

要卸载一个已经安装上的CD-ROM需要退出 /mnt/cdrom目录并以root身份输入如下命令:umount /mnt/cdrom

*优盘的安装与卸载

在计算机的USB口中插入优盘,然后使用如下方法安装与卸载优盘:

5

mkdir /mnt/usb

mount /dev/sda /mnt/usb或mount /dev/sda1 /mnt/usb

使用完优盘后,使用umount /mnt/usb命令卸载优盘,最后才能拔出优盘。 五、实验结果

认真写出实验结果、小结、体会。 六、思考问题

1、用户建立的一个子目录应该具有什么样的权限?

2、如果将子目录X的权限修改成文件主、同组用户和其他用户都具有读写和执行的权限,该用什么样的命令完成?此时文件主是否能删除自己所建立的子目录X?

6

实验四:文件系统实验---系统调用

一、实验目的

1、 掌握文件系统的分层结构中包括哪些层,各层主要解决哪些问题。 2、 掌握文件系统的存储结构包括哪几部分内容,主要由哪些数据结构构成。 3、 文件系统中的动态数据结构的主要作用是什么。 4、 文件的多重索引结构是如何构成的,有哪些特点。 5、 linux的文件索引节点和目录文件的主要作用是什么。

6、 能使用文件管理中的系统调用,编写一些C语言程序解决简单的实际问题。 二、实验内容和要求

1、 编写一段C语言程序使其完成:对用户输入的文件名的内容进行拷贝。 例如:% EXE aFile bFile 则将文件aFile 的内容拷贝到文件bFile中。

2、 编写一段C语言程序使其完成:创建一个新文件,输入一段数据,然后随机移动指针,接着插入一段

数据。完成后,查看文件大小和内容。 三、参考代码 1、#include #include main(int argc,char *argv[ ]) {int fd1,fd2 ,n;

if (argc<3){printf(“Usage:mycopy sourceFilename destinationFilename\\n”);exit(1);} if(fd1=open(argv[1],0)<0){printf(“open error .\\n”);exit(1);} if(fd2=creat(argv[2],0644)<0){printf(“create error .\\n”);exit(1);} while((n=read(fd1,buf,512))>0)write(fd2,buf,n); close(fd1);close(fd2); }

2、#include #include

char buf1[ ]=”abcde”;char buf2=”12345”; main( ) {int fid;

if((fid=creat(“test”,0664))<0){printf(“creat file error\\n”);exit(0);} else {if(write(fid,buf1,5)!=5){printf(“buf1 write error.\\n”);exit(1);}

if(lseek(fid,30,SEEK_SET)==-1){printf(“lessk error.\\n”);exit(2);} if(write(fid,buf2,5)!=5){priintf(“buf2 write error.\\\\n”);exit(3);} close(fid); } exit(0);

}

四、实验结果

请同学们写出程序执行结果和小结、体会。 五、 思考问题

1、 在linux的文件系统中包含几种大的分类?请简述这些分类的含义。

2、 linux的目录文件中主要包含哪些信息项?将I/O设备作为文件统一处理,在系统管理中有哪些优

势?

3、 linux的文件系统是由哪几部分构成?请描述这些组成部分中包括的主要内容。

7

实验五:进程管理----进程创建 一、 实验目的

1、加深对进程概念的理解,明确进程和程序的区别;

2、进一步认识并发执行的实质;分析进程争用资源的现象,学习解决进程互斥的方法; 3、了解linux 系统中进程通信的基本原理。 二 实验准备

1、装有linux系统的计算机

2、阅读 linux的ched.h原代码文件,加深对进程管理概念的理解;阅读linux的fork.c原代码文件,分析对进程的创建过程。 三、实验内容和要求

1、编写一段C语言程序使其完成:父进程创建一个子进程,子进程运行中显示当前系统的记录时钟;父进程运行时完成将1—100循环显示到标准输出流上,同时注意程序运行时控制其执行顺序是,子程序先运行,父进程再运行。 四、参考代码 1、#include #include #include #include void print_systime(void); main( ) {pid_t pid; int iIndex; pid=fork( ) ;

if(pid<0){printf(―Fail when creating new process!\\n‖); exit(1);}

else if(pid==0)print_systime( ); else {wait(NULL);

for(iIndex=1; iIndex<=100; iIndex++) printf(―%d‖, iIndex); printf(―\\n‖); } }

void print_systime(void) {time_t t;

if(time(&t)==((time_t)-1))

{printf(―Error when getting time!\\n‖);exit(1);} else {char *pszTime; pszTime=ctime(&t);

printf(―Now is %s\\n‖, pszTime); } }

五.实验结果 1.写出运行结果

2.按要求认真书写实验报告

8

实验六:进程管理----进程间通信(一) 一、 实验目的

linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉linux支持的消息通信机制及共享存储区机制。 二 实验准备

1、装有linux系统的计算机

2、阅读 linux系统的msg.c 、sem.c和 shm.c等原代码文件,熟悉linux的三种通信机制。 三、实验内容和要求

1、编写一段C语言程序使其完成:父子进程通过无名管道传递三条消息: *管道文件的测试程序开始。 *管道文件测试正在进行。 *管道文件测试结束。

接收进程收到信息后将它们送到标准输出文件上。

2、用 pipe( )创建一个管道文件,然后用fork( )创建两个生产进程和两个消费进程,它们之间通过pipe( )传递信息。 四、部分参考代码 1、#include #include #include #include main( ) {int i,f_des[2];

char message[3][BUFFSIZ]={―Start the test of pipe file‖,‖Test is going‖, ―Test ends‖}; if(pipe(f_des)==-1){printf(―pipe‖);exit(2);} switch(fork( ))

{case -1:printf(―Fork‖);exit(3); case 0:close(f_des[1]); for(i=0;i<3;i++)

{if(read(f_des[0],message[i],BUFSIZ)!=-1)

printf(―message received by child:[%s]\\n‖,message[i]); fflush(stdout);}

else {printf(―Read Failed‖);exit(4);} } break; default; close(f_des[0]); for(i=0;i<3;i++)

{if(write(f_des[1],message[i],BUFSIZ)!=-1)

{ printf(―message sent by parent:[%s]\\n‖,message[i]); fflush(stdout);}

else {printf(―write Failed‖);exit(5);} } }

9

exit(0); }

五、 实验结果 1、写出运行结果

2、按要求认真书写实验报告 六、思考问题

1、在linux系统中定义了几种通信方式?这些通信方式的主要功能是什么? 2、linux的PIC的主要功能,并说明IPC中包含的通信机制有哪些?

10

实验七:进程管理----进程间通信(二) 一、 实验目的

linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉linux支持的消息通信机制及共享存储区机制。 二 实验准备

1、装有liunx系统的计算机

2、阅读 liunx系统的msg.c 、sem.c和 shm.c等原代码文件,熟悉linux的三种通信机制。 三、实验内容和要求

1.编写一段C语言程序使其完成:两段程序 test1和test2通过一个共享内存进行通信,其中test1 向共享内存中写数据,test2从共享内存中读出数据或信息并将数据或信息送入标准输出上。

2.用clone( )创建四个轻进程(线程),用参数指明共享内存等资源,通过共享内存模拟生产者—消费者问题,利用pthread_mutex_lock( ),

pthread_mutex_unlock( )等函数实现对共享存储区访问的互斥。 四、部分参考代码 1. #include #include #include #include

#define SHM_MODE (SHM_R | SHM_W) #define SHW_SIZE 2048 int main( )

{int segment_id,segment_size; char *shared_memory; pit_t pid;

if((segment_id=shmget(IPC_PRIVATE,SHM_SIZE,SHM_MODE))<0) printf(―shmget error !\\n‖);

if((shared_memory=shmat(segment_id,0,0))==(void*)-1) printf(―shmat error !\\n‖);

printf(―test1 send a message to shar memory. \\n‖); sprintf(shared_memory,‖Hello test2!\\n‖); shmdt(shared_memory); pid=fork( );

if(pid<0)printf(―Creating process error!\\n‖); else if(pid<0){wait(NULL);

shmctl(segment_id,IPC-RMID,0); exit(0);} else

{ if((shared_memory=shmat(segment_id,0,0))==(void*)-1) printf(―shmat error !\\n‖);

printf(―test2 get a message from share memory:%s ‖, shared_memory); shmdt(shared_memory); } }

11

五、 实验结果 1、写出运行结果

2、按要求认真书写实验报告

12

实验八:存储器管理----动态不等长存储资源分配算法 一、 实验目的

理解动态异长存储分区资源管理,掌握所需数据结构和管理程序了解各种存储分配算法的优点和缺点。 二、实验内容和要求

1 、分析Linux最先适应(First Fit,FF) 存储分配算法,即map数据结构、存储分配函数 malloc()和存储释放函数 mfree( ),找出与算法有关的成分。

2、修改上述与算法有关的成分,使其分别体现BF(Best Fit,最佳适应)分配原则和WF(Worst Fit, 最坏适应)分配原则。 三、实验设计

1、按内容要求编写最佳适应和最坏适应存储分配算法。

2、编写测试程序,对存储分配表进行初始化。然后对用户输入的请求和释放,按算法动态更新存储分配表,并将每次更新之后的存储分配表在屏幕上显示出来。 四、参考代码

#ifdef HAVE_CONFIG_H #include #endif

#include #include #define MAPSIZE 100 struct map{ int m_addr; int m_size; };

struct map map[MAPSIZE];

int BF_malloc(struct map *map,int size) {register int a,s;

register struct map *bp,*bpp; for(bp=mp;bp->m_size;bp++) {if(bp->m_size>=size){a=bp->m_addr; s=bp->m_size;

for(bpp=bp;bpp->m_size;bpp++) {if(bpp->m_size>=size&&bpp->m_sizem_addr; s=bpp->m_size; bp=bpp;} }

bp->m_addr+=size; if((bp->m_size - =size)==0) do{bp++;

(bp-1)->m_addr=bp->m_addr; }while((bp-1)->m_size=bp->m_size; return (a); } }

13

return (-1); }

int WF_malloc (struct map *map,int size) {register int a,s;

register struct map *bp,*bpp; for(bp=mp;bp->m_size;bp++) {if(bp->m_size>=size){a=bp->m_addr; s=bp->m_size;

for(bpp=bp;bpp->m_size;bpp++) {if(bpp->m_size>s ) { a=bpp->m_addr; s=bpp->m_size; bp=bpp;} }

bp->m_addr+=size; if((bp->m_size - =size)==0) do{bp++;

(bp-1)->m_addr=bp->m_addr; }while((bp-1)->m_size=bp->m_size;

return (a);

} } return (-1); }

void mfree(struct map *map,int aa,int size) { register struct map *bp; register int a; register int t; a=aa;

for(bp=mp;bp=m_addr<=a&&bp->m_sizeq!=0;bp++) if(bp>mp&&(bp-1)->m_addr+(bp-1)->m_size==a) {(bp-1)->m_size+=size;

if(a+size==bp->m_addr){ (bp-1)->m_size+= bp->m_size; while(bp->m_size) {bp++;

(bp-1)->m_addr=bp->m_addr; (bp-1)->m_size=bp->m_size; } } }

else{ if(a+size==bp->m_addr&& bp->m_size) { bp->m_addr - = size; bp->m_size+=size;} else if(size)

do{t=bp->m_addr;

14

本文来源:https://www.bwwdw.com/article/1szg.html

Top