《操作系统实验一Linux基本环境及进程管理.doc》由会员分享,可在线阅读,更多相关《操作系统实验一Linux基本环境及进程管理.doc(14页珍藏版)》请在金锄头文库上搜索。
1、实验一 Linux基本环境一、实验目的(1)熟悉Linux下的基本操作,学会使用各种Shell命令去操作Linux,对Linux有一个感性认识。 (2)学会使用vi编辑器编辑简单的C语言程序,并能对其编译和调试。 二、实验学时1学时三、实验内容(1) 以root用户身份登陆,并使用“ls”,“cat”“cd”等命令来实现基本的文件操作并观察Linux文件系统的特点; (2) 使用vi编辑器编写一C程序,并用gcc命令进行编译和链接,并用a.out来进行输出结果。 四、背景知识常用命令练习: 用root账号(超级用户)注册,注册成功出现#号(超级用户系统提示符,普通用户的系统提示符为$)。1 注
2、销(退出)系统:logout 或exit 2练习使用命令ls(注意Linux命令区分大小写。) 使用ls 按字母顺序列出当前目录中所有非隐藏文件;使用ls a按字母顺序列出当前目录中所有文件,包括隐藏文件使用ls l 查看当前目录所有文件包括当前目录和父目录,包括长度、拥有者和权限;使用dir 查看当前目录内容 3使用cd改变当前目录cd . 回到上层目录;cd /home/mj 移动到用户mj的主目录;cd 移动到自己的主目录,适用于任何用户4pwd 显示当前目录绝对路径5建立目录mkdirmkdir 目录名; mkdir /home/s2001/newdir 6删除目录:rmdir; 7复
3、制文件cp: cp file1 file2 将file1内容复制到目标文件file2中,目标文件得到新的生成日期和inode编号;(在linux里每个文件都有一个唯一的inode号)8移动文件或目录: mv mv file1 file2 将文件名从file1变成file2。9删除文件rm rm file1 删除file1而不提示确认;rm i file1 提示用户确认之后删除file110. 显示文件内容:more (分页显示); 11. 显示文件:cat 文件名 12. 建立文件:cat 文件名,ctrl+d结束输入使用编辑器vi 编辑文件1. 进入linux的文本模式之后,在命令行键入vi
4、 filename.c 然后回车。下面作一些简单的解释:首先vi命令是打开vi编辑器。后面的filename.c是用户即将编辑的c文件名字,注意扩展名字是.c;当然,vi编辑器功能很强,可以用它来编辑其它格式的文件,比如汇编文件,其扩展名字是.s;也可以直接用vi打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。2. 最基本的命令I :当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I键(insert),插入的意思,就可以进入编辑模式了。3. a与i是相同的用法4. 当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键盘上的Esc 键;2)键入冒号(:
5、),紧跟在冒号后面是wq(意思是保存并退出)。如果不想保存退出,则在第二步键入冒号之后,键入q !(不带w,机尾部保存)5. 退出vi编辑器的编辑模式之后,要对刚才编写的程序进行编译。编译的命令是:gcc -o outputfilename.out filename.c,其中gcc是c的编译器。参数:filename.c 是要编译的源文件的名称,outputfilename表示输出文件名称,中括号表示括号内部的内容可输入也可以不输入(中括号本身不再命令行中出现)。如果不输入outputfilename.out,默认的输出文件是a.out 。6. 最后一步是运行程序,方法如下:./outputf
6、ilename.out 实验二 进程管理一、实验目的1. 加深对进程概念的理解,明确进程和程序的区别。2. 进一步认识并发执行的实质。3. 分析进程争用资源的现象,学习解决进程互斥的方法4. 了解Linux系统中进程通信的基本原理二、实验学时3学时三、实验内容1.进程的创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。实验指导:一、进程UNIX中,进程既是一个独立拥有资源的基本单位,又是一个独立调度的
7、基本单位。一个进程实体由若干个区(段)组成,包括程序区、数据区、栈区、共享存储区等。每个区又分为若干页,每个进程配置有唯一的进程控制块PCB,用于控制和管理进程。PCB的数据结构如下:1、进程表项(ProcessTableEntry)。包括一些最常用的核心数据:进程标识符PID、用户标识符UID、进程状态、事件描述符、进程和U区在内存或外存的地址、软中断信号、计时域、进程的大小、偏置值nice、指向就绪队列中下一个PCB的指针P_Link、指向U区进程正文、数据及栈在内存区域的指针。2、U区(U Area)。用于存放进程表项的一些扩充信息。每一个进程都有一个私用的U区,其中含有:进程表项指针、
8、真正用户标识符u-ruid(readuserID)、有效用户标识符u-euid(effectiveuserID)、用户文件描述符表、计时器、内部I/O参数、限制字段、差错字段、返回值、信号处理数组。由于UNIX系统采用段页式存储管理,为了把段的起始虚地址变换为段在系统中的物理地址,便于实现区的共享,所以还有:3、系统区表项。以存放各个段在物理存储器中的位置等信息。系统把一个进程的虚地址空间划分为若干个连续的逻辑区,有正文区、数据区、栈区等。这些区是可被共享和保护的独立实体,多个进程可共享一个区。为了对区进行管理,核心中设置一个系统区表,各表项中记录了以下有关描述活动区的信息:区的类型和大小、区
9、的状态、区在物理存储器中的位置、引用计数、指向文件索引结点的指针。4、进程区表系统为每个进程配置了一张进程区表。表中,每一项记录一个区的起始虚地址及指向系统区表中对应的区表项。核心通过查找进程区表和系统区表,便可将区的逻辑地址变换为物理地址。二、进程映像UNIX系统中,进程是进程映像的执行过程,也就是正在执行的进程实体。它由三部分组成:1、用户级上、下文。主要成分是用户程序;2、寄存器上、下文。由CPU中的一些寄存器的内容组成,如PC,PSW,SP及通用寄存器等;3、系统级上、下文。包括OS为管理进程所用的信息,有静态和动态之分。三、所涉及的系统调用fork()创建一个新进程。系统调用格式:p
10、id=fork( )参数定义:intfork()fork()返回值意义如下:0:在子进程中,pid变量保存的fork()返回值为0,表示当前进程是子进程。0:在父进程中,pid变量保存的fork()返回值为子进程的id值(进程唯一标识符)。-1:创建失败。如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(parent process)的副本,称为子进程(child process)。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。父进
11、程与子进程并发执行。核心为fork( )完成以下操作:(1)为新进程分配一进程表项和进程标识符进入fork( )后,核心检查系统是否有足够的资源来建立一个新进程。若资源不足,则fork( )系统调用失败;否则,核心为新进程分配一进程表项和唯一的进程标识符。(2)检查同时运行的进程数目超过预先规定的最大数目时,fork( )系统调用失败。(3)拷贝进程表项中的数据将父进程的当前目录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建”状态。(4)子进程继承父进程的所有文件对父进程当前目录和所有已打开的文件表项中的引用计数加1。(5)为子进程创建进程上、下文进程创建结束,设子进程状态为“内
12、存中就绪”并返回子进程的标识符。(6)子进程执行虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器PC(注意子进程的PC开始位置),然后根据pid变量保存的fork()返回值的不同,执行了不同的分支语句。四、参考程序#include main( )int p1,p2;while(p1=fork( )= = -1);/*创建子进程p1*/if (p1= =0)putchar(b);elsewhile(p2=fork( )= = -1);/*创建子进程p2*/if(p2= =0)putchar(c);else putchar(a);bca(有时会出现abc的任意的排列)分析:从进程执行
13、并发来看,输出abc的排列都是有可能的。原因:fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出abc的排列都是有可能的。2.进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。实验指导:一、所涉及的系统调用lockf()lockf(files,function,size):用作锁定文件的某些段或者整个文件,本函数适用的头文件为:#include参数定义:int
14、 lockf(files,function,size)int files,function;long size;其中:files是文件描述符:function是锁定和解锁;1表示锁定,0表示解锁。size是锁定和解锁的字节数,若用0,表示从文件的当前位置到文件尾。二、参考程序程序1#include main( )int p1,p2,i;while(p1=fork( )= = -1);/*创建子进程p1*/if (p1= =0)for(i=0;i100;i+)printf(daughter%d/n,i);elsewhile(p2=fork( )= = -1);/*创建子进程p2*/if(p2= =0)for(i=0;i100;i+)printf(son%d/n,i);elsefor(i=0;i100;i+)printf(parent%d/n,i);运行结果2、parentsondaughter.daughter.或parentsonparentdaughter等分析:由于函数printf()输出的字符串之间不会被中断,因此,每个字符串内部的字符顺序输出时不变。但