操作系统实训报告.docx
- 文档编号:4164917
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:31
- 大小:639.97KB
操作系统实训报告.docx
《操作系统实训报告.docx》由会员分享,可在线阅读,更多相关《操作系统实训报告.docx(31页珍藏版)》请在冰豆网上搜索。
操作系统实训报告
河南工程学院
计算机学院
计算机操作系统
实训报告册
学期:
2012~2013第二学期
课程:
计算机操作系统实训
专业:
计算机科学与技术
班级:
班
学号:
************
姓名:
********
实训(习)报告评语
等级
评阅人:
职称
年月日
河南工程学院
实训(习)报告
实训目的(内容):
理解操作系统的地位作用,能利用操作系统提供的系统调用理解操作系统提供的各项功能。
实训时间:
7月1日至7月5日
实训地点:
校内机房3C406
实训单位:
计算机学院
指导教师:
张治国系主任:
曲宏山
实验一LINUX系统常用命令介绍
1实验目的
安装LINUX操作系统,熟练LINUX系统命令的格式,熟练常用的LINUX系统命令及参数能编写简单的shell程序,LINUX系统下编程的一般过程。
2实验环境
物理机环境下安装虚拟机VMwareWorkstation,linux操作系统
3实验时间
1天
4实验内容
4.1文件管理命令
ls命令使用权限:
所有使用者
使用方式:
ls[-alrtAFR][name...]
说明:
显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录)。
-a显示所有档案及目录(ls内定将档案名或目录名称开头为"."的视为隐藏档,不会列出)
-l除档案名称外,亦将档案型态,权限,拥有者,档案大小等资讯详细列出
-r将档案以相反次序显示(原定依英文字母次序)
-t将档案依建立时间之先后次序列出
cd命令使用权限:
所有使用者
使用方式:
cd[dirName]
说明:
变换工作目录至dirName。
其中dirName表示法可为绝对路径或相对路径。
若
目录名称省略,则变换至使用者的homedirectory(也就是刚login时所在的目录).另外,"~"也表示为homedirectory的意思,"."则是表示目前所在的目录,".."则表示目前目录位置的上一层目录。
pwd命令查看当前所在目录的绝对路经。
mkdir目录名创建一个目录
4.2磁盘管理指令
du-b/home查看目前/HOME目录的容量(k)及子目录的容量(k)。
fdisk-l查看系统分区信息
fdisk/dev/sdb为一块新的SCSI硬盘进行分区
Mkfs.ext3/dev/sdb1为第一块SCSI硬盘的第一主分区格式化成
Ext3的文件系统
mkfs.ext2Mkfs.ext2/dev/sdb2格式化成ext2文件系统
mount-t文件系统类型设备路经访问路经
#mount–tiso9660/dev/cdrom/mnt/cdrom挂载FAT
#mount–tvfat/dev/hda5/mnt/cdrom挂第一个ide的第五个逻辑分区
Umount/mnt/cdrom卸载/mnt/cdrom为空
4.3软件管理指令
mount-t文件系统类型设备路经访问路经挂载光驱
#mount–tiso9660/dev/cdrom/mnt/cdrom挂载FAT
#mount–tvfat/dev/hda5/mnt/cdrom挂第一个ide的第五个逻辑分区
Umount/mnt/cdrom卸载/mnt/cdrom为空
difffile1file2>补丁名.patch为新旧文件生成补丁文件
difffile1file2比较两个文件的区别
4.4进程管理指令
crontab命令
使用权限:
所有使用者
使用方式:
crontab[-uuser]filecrontab[-uuser]{-l|-r|-e}
-e:
执行文字编辑器来设定时程表,内定的文字编辑器是VI,如果你想用别的文字编辑器,则请先设定VISUAL环境变数来指定使用那个文字编辑器(比如说setenvVISUALjoe)
-r:
删除目前的时程表
-l:
列出目前的时程表
时程表的格式如下:
f1f2f3f4f5program
其中f1是表示分钟,f2表示小时,f3表示一个月份中的第几日,f4表示月份,f5表示一个星期中的第几天。
program表示要执行的程式。
当f1为*时表示每分钟都要执行program,f2为*时表示每小时都要执行程式,其余类推
当f1为a-b时表示从第a分钟到第b分钟这段时间内要执行,f2为a-b时表示从第a到第b小时都要执行,其余类推
当f1为*/n时表示每n分钟个时间间隔执行一次,f2为*/n表示每n小时个时间间隔执行一次,其余类推
当f1为a,b,c,...时表示第a,b,c,...分钟要执行,f2为a,b,c,...时表示第a,b,c...小时要执行,其余类推
使用者也可以将所有的设定先存放在档案file中,用crontabfile的方式来设定时程
kill命令
使用权限:
所有使用者
使用方式:
kill[-ssignal|-p][-a]pid...
kill-l[signal]
说明:
kill送出一个特定的信号(signal)给行程id为pid的行程根据该信号而做特定的动作,若没有指定,预设是送出终止(TERM)的信号
-s(signal):
其中可用的讯号有HUP
(1),KILL(9),TERM(15),分别代表着重跑,砍掉,结束;详细的信号可以用kill-l
-p:
印出pid,并不送出信号
-l(signal):
列出所有可用的信号名称
将pid为323的行程砍掉(kill):
kill-9323
将pid为456的行程重跑(restart):
kill-HUP456
top命令
使用权限:
所有使用者
使用方式:
top[-][ddelay][q][c][S][s][i][n][b]
说明:
即时显示process的动态
d:
改变显示的更新速度,或是在交谈式指令列(interactivecommand)按s
q:
没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行
c:
切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S:
累积模式,会将己完成或消失的子行程的CPUtime累积起来
s:
安全模式,将交谈式指令取消,避免潜在的危机
i:
不显示任何闲置(idle)或无用(zombie)的行程
n:
更新的次数,完成后将会退出top
b:
批次档模式,搭配"n"参数一起使用,可以用来将top的结果输出到档案内显示更新十次后退出;
ps命令
使用权限:
所有使用者
使用方式:
ps[options][--help]
说明:
显示瞬间行程(process)的动态
ps的参数非常多,在此仅列出几个常用的参数并大略介绍含义
-A列出所有的行程
-w显示加宽可以显示较多的资讯
-au显示较详细的资讯
-aux显示所有包含其他使用者的行程
au(x)输出格式:
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
USER:
行程拥有者
%CPU:
占用的CPU使用率
%MEM:
占用的记忆体使用率
VSZ:
占用的虚拟记忆体大小
RSS:
占用的记忆体大小
TTY:
终端的次要装置号码(minordevicenumberoftty)
STAT:
该行程的状态:
D:
不可中断的静止(通悸□□缜b进行I/O动作)
R:
正在执行中
S:
静止状态
T:
暂停执行
Z:
不存在但暂时无法消除
W:
没有足够的记忆体分页可分配
<:
高优先序的行程
N:
低优先序的行程
L:
有记忆体分页分配并锁在记忆体内(即时系统或捱AI/O)
START:
行程开始时间
TIME:
执行的时间
COMMAND:
所执行的指令
实验二父子间进程通信编程
1实验学时
1天
2实验目的
加深对进程概念的理解,尤其是进程的动态性、并发性了解进程如何被创建和终止。
查看进程的状态信息。
观察进程的家族关系。
3实验环境及条件
物理机环境下安装虚拟机VMwareWorkstation,linux操作系统。
4实验内容
利用fork()创建一个进程,实现两进程间通信,并分析这几个进程之间的关系;
4.1fork系统调用
fork调用创建一个新进程,新进程或子进程是调用进程或者说父进程的副本。
#include
pid_tfork(void)
如果fork执行成功,就向父进程返回子进程的PID,并向子进程返回0.这意味着既使只调用fork一次,它也会返回两次。
fork创建的新进程是和父进程(除了PID和PPID)一样的副本,包括真实和有效UID和GID、进程组和会话ID、环境、资源限制、打开的文件以及共享内存段。
父进程和子进程之间有一点区别。
子进程没有继承父进程的超时设置(使用alarm调用)、父进程创建的文件锁,或者未决信号。
要理解的关键概念是fork创建的新进程是父进程的一个标准副本。
4.2代码实现
#include
#include
#include
#include
#include
intmain()
{
intn;
intfd[2];
pid_tpid;
charline[100];
if(pipe(fd)==-1)
{
printf("pipeerror\n");
}
pid=fork();
if(pid==-1)
{
printf("forkerror\n");
}
if(pid>0)
{
close(fd[0]);
while
(1)
{
printf("---------------------------\n");
printf("parentprocess\n");
printf("processID=%d",getpid());
printf("\nwritethedatatopipe\n");
write(fd[1],"helloworld!
",12);
printf("---------------------------\n");
sleep(3);
exit(0);
}
}
else
{
close(fd[1]);
while
(1)
{
wait(0);
printf("chaildprocess\n");
printf("processID=%d",getpid());
printf("\nreadthedatafrompipe\n");
read(fd[0],line,12);
printf("%s",line);
printf("\n");
sleep(3);
exit(0);
}
}
return0;
}
4.3运行结果
用gcc–o11.c编译及用./1调试运行结果如下:
4.4结果分析
在gcc编译调试运行环境下,先顺序执行父进程关闭pipefd[0]并将hellworld!
写入管道中,之后父进程休眠3秒.接着执行子进程,子进程关闭pipefd[1]并从管道中读出数据然后输出到终端,此后子进程亦进入休眠期.
直接用./1(1为编译文件名)运行时,程序首先执行子进程,当进行到从管道读数据时,由于此时父进程尚未向管道写入数据故子进程阻塞.同时父进程执行,向管道中写入数据,当管道中有数据时父进程被抢占,子进程执行,从管道中数据读出数据.数据读取完毕执行sleep()后系进程休眠.此时父进程占有处理机继续执行向管道输入数据后的程序.当父进程执行到sleep()时由于子进程此时尚在休眠期故继续执行父进程,直到子进程被唤醒.如此循环通信.
实验三命名管道通信编程
1实验学时
1天
2实验目的
(1)掌握LINUX系统软中断通信的实现方法;
(2)掌握LINUX系统中进程通信的基本原理;
(3)学会使用LINUX系统中关于进程通信的一些系统调用
3实验环境及条件
物理机环境下安装虚拟机VMwareWorkstation,linux操作系统。
4实验内容
mkfifo()open()write()实现进程之间的通信
使用系统调用mkfifo()创建命名管道,通过一个进程向管道内写数据,另一个程序从管道内读出所写数据。
4.1分析及相应函数
命名管道:
由系统调用mkfifo()创建,的有名称的pipe,能够实现不同进程间的通信(不局限于父子进程)。
对命名管道的写访问可用open()和write()实现。
当打开成功时open()会返回一个大于负1的数,打开失败时返回负1。
读访问可用open()和read()实现。
4.2代码实现
4.2.1命名管道创建程序代码实现
#include
#include
#include
#include
intmain()
{
intres=mkfifo("/home/jsj/my_fifo",0777);
if(res==0)
{
printf("fifocreated/n");
}
else
{
printf("mkfifoerror!
/n");
}
exit(EXIT_SUCCESS);
}
通过系统调用创建一个名为my_fifo的命名管道。
如果创建成功返回fifocreated,否则返回mkfifoerror!
用gcc–o11.c调试运行编译后直接用./2运行结果如下:
出错时会出现下面的结果:
4.2.2生产者程序代码:
#include
#include
#include
#include
#include
#include
#include
#defineFIFO_NAME"my_fifo"
#defineBUFFER_SIZE10000
#defineTEN_MEG(1024*1024*10)
intmain()
{
intpipe_fd;
intres;
intbytes=0;
charbuffer[]="mkfifotest";
if(access(FIFO_NAME,F_OK)==-1)
{
res=mkfifo(FIFO_NAME,0777);
if(res!
=0)
{
fprintf(stderr,"couldnotcreatefifo%s\n",FIFO_NAME);
exit(EXIT_FAILURE);
}
}
printf("process%dopeningFIFO\n",getpid());
pipe_fd=open(FIFO_NAME,O_RDWR);
printf("process%dresult%d\n",getpid(),pipe_fd);
if(pipe_fd!
=-1)
{
while(bytes { res=write(pipe_fd,buffer,sizeof(buffer)); if(res==-1) { fprintf(stderr,"weiteerroronpipe\n"); exit(EXIT_FAILURE); } bytes+=res; } close(pipe_fd); } else { exit(EXIT_FAILURE); } printf("process%dfinish\n",getpid()); exit(EXIT_SUCCESS); } 检查管道的访问权限并向管道内写入数据。 4.2.3消费者进程: #include #include #include #include #include #include #include #defineFIFO_NAME"my_fifo" //#defineBUFFER_SIZEPIPE_BUF intmain() { intpipe_fd; intres; intopen_mode=O_RDONLY; intbytes=0; charbuffer[2000]; memset(buffer,'/0',sizeof(buffer)); printf("process%dopeiningFIFOO_RDONLY\n",getpid()); pipe_fd=open(FIFO_NAME,O_RDONLY); printf("process%dresult%d\n",getpid(),pipe_fd); if(pipe_fd! =-1) { do{ res=read(pipe_fd,buffer,sizeof(buffer)); bytes+=res; } while(res>0); close(pipe_fd); } else { exit(EXIT_FAILURE); } printf("process%dfinish\n%dbytesread\n",getpid(),bytes); exit(EXIT_SUCCESS); } 检查管道的访问权限,并从非空管道中读出数据并计算所读字节数。 4.3实验结果 先运行管道创建程序创建命名管道,再生产者进程向管道内写入数据,之后运行消费者进程从管道内读出所写数据并统计字节数。 Pid为2823的进程为生产者进程,pid为2826的进程是消费者进程。 消费者进程从管道中读出了10485768字节的数据。 实验四消息通信机制实现 1Linux操作系统systemV进程间通信简介 Linux下systeemV进程通信主要有三种: 1、消息队列; 2、信号量; 3、内存共享。 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。 2Linux消息队列管理 2.1创建消息队列 在使用一个消息队列前,需要使用msgget函数创建该消息队列,其函数声明: externintmagget(key_t_key,int_msgflg)_THROW; 第一个参数key由ftok创建的key值; 第二个参数_msgflg的低位用来确定消息队列的访问权限。 2.2发送消息到消息队列 externintmsgsnd(int_msqid,_constvoid*_msgq,size_t_msgsz,int_msgflg); 第一个参数msgid为指定的消息队列标识符(由msgget生成的消息队列标识符),即将消息添加到哪个消息队列中。 第二个参数msgq为指向的用户定义缓冲区。 第三个参数为接收消息的大小,其数据类型为: size_t,即unsignedint类型。 其大小为0到系统对消息队列的限制值。 第四个参数用来执行在达到系统为消息队列所定的界限(如达到字数限制)时应采取的操作。 2.3从消息队列接收信息 externintmsgrcv(int_msgid,void*_msgq,size_t_msgsz,longint_msgtyp,int_msgflg); 第一个参数为读的对象,即从哪个消息队列获取信息。 第二个参数为一个临时消息数据结构,用来保存读取的信息 3实现代码 #include #include #include #include #include #include #include #include #defineMAX_TEXT1024 structmsg_st { intmy_msg_type; charmsg_text[BUFSIZ]; }; intmain(intargc,char**argv) { pid_tpid; inti=1; intstatus; if((pid=fork())==-1) { perror("fork"); exit(EXIT_FAILURE); } elseif(pid==0) { structmsg_stsome_data; intmsgid; charbuffer[BUFSIZ]; if((msgid=msgget((key_t)12345,0666|IPC_CREAT))==-1) { perror("msgget"); exit(EXIT_FAILURE); } printf("Enterthemssagetosend: "); fgets(buffer,BUFSIZ,stdin); some_data.my_msg_type=1; strcpy(some_data.msg_text,buffer); if((msgsnd(msgid,(void*)&some_data,MAX_TEXT,0))==-1) { perror("msgsnd"); exit(EXIT_FAILURE); } return0; } else { intmsgid1; structmsg_stsome_data1; intmsg_to_recevie=0; if((msgid1=msgget((key_t)12345,0666|IPC_CREAT))==-1) { perror("msgget"); exit(EXIT_FAILURE); } if(msgrcv(msgid1,(void*)&some_data1,BUFSIZ,msg_to_recevie,0)==-1) { perror("msgrcv");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)