操作系统实验报告-Linux操作、使用、编程)

实 验 报 告

( 2012/ 20## 学年 第二学期)


实 验 报 告

实 验 报 告

实 验 报 告

实 验 报 告

实 验 报 告

 

第二篇:Linux系统的熟悉与使用操作系统实验报告

实验一      Linux系统熟悉与使用

Linux有两种不同的含义。从严格的技术定义讲,Linux指的是开放源代码的Unix类操作系统的内核。然而,目前大多数人用它来表示以Linux内核为基础的整个操作系统。从这种意义讲,Linux指的是开放源代码的,包含内核、系统工具、完整的开发环境和应用的Unix类操作系统。

    它是一个支持多用户, 多进程,实时性好的功能强大而稳定的操作系统。它可以运行在x86 PC,Sun Sparc,Digital Alpha,680x0,PowerPC, MIPS等平台上,可以说Linux是目前运行硬件平台最多的操作系统.,但是它主要还是面向Intel PC硬件平台。 所以也可以这样的说:Linux是Unix在Pc机上的完整实现。

一、    进入系统和注销系统

1.1 远程登录

【指令】telnet,rlogin

【格式】

telnet hostname(远程主机名)

telnet ip-address(远程主机的IP地址)

rlogin hostname [-1 username]

【示例】

% telnet hostname

% telnet 192.9.200.11

% rlogin hostnam 远程登录到主机 hostname上

% rlogin hostname -l user 使用user帐号进入主机hostname(可利用指令arp hostname 或 arp domain_name 查询远程主机的IP地址)

【附注】

登录步骤

login : _______ 输入用户名

password : _______ 输入用户密码

1.2 更改帐号密码

【指令】passwd

【格式】passwd [user]

【示例】修改root口令

# passwd 执行后将显示以下信息:

New UNIX password: ______ 输入新密码

Retype new password: ______ 再输入一次新密码

1.3 注销系统

【指令】logout,exit和 <CTRL><D>

【示例】

% logout

% exit

% <CTRL><D>

二、 目录、文件常用指令

2.1 列出目录内容

【指令】ls

【格式】ls [-atFlgR] [name] (name可为文件名或目录名)

【示例】

% ls 列出当前目录下的文件名

% ls -a 列出包含以.起始的隐藏文件所有文件名

% ls -t 依照文件修改的时间顺序,依序列出文件名

% ls -F 列出当前目录下的文件名及其类型。"/" 结尾表示为目录名称,"*" 结尾表示为执行文件,"@" 结尾表示为 symblic link

% ls -l 列出目录下所有文件之许可权、拥有者、文件大小、修改时间及名称

% ls -lg 同上,并显示出文件的拥有者群组名称

% ls -R 显示出目录下、及其所有子目录的文件名

【附注】

可使用通配符'*'和'?'来代替文件名或部分名称。 '*'可以代替一个字符串,'?'只能代替一个字符。

2.2 显示当前的工作目录

【指令】pwd

【示例】

% pwd

2.3 阅读文件内容

阅读文件内容

【指令】cat,more

【格式】

cat filename

more filename

cat filename | more

【示例】

% cat file1 以连续显示方式查看文件file1的内容

% more file1  以分页方式查看文件名 file1 的内容

% cat file1 | more 同上

2.4 改变工作目录

【指令】cd

【格式】cd [name] (name可为目录名、路径或目录缩写)

【示例】

% cd 改变目录位置,至用户 login 时的起始目录

% cd dir1 改变目录位置,至目录 dir1下

% cd ~user 改变目录位置,至用户的起始目录

% cd .. 改变目录位置,至当前目录的上层

% cd ../user 改变目录位置,至相对路径 user的目录位置下

% cd /../.. 改变目录位置,至绝对路径的目录位置下

【附注】目录的缩写含义

~     用户 login 时的起始目录

~ username 指定某位 user 的起始目录 . 当前的工作目录 .. 当前目录的上一层目录

2.5 拷贝文件

【指令】cp

【格式】cp [-firP] source destination

【示例】

% cp file1 file2 将文件file1 复制成 file2

% cp file1 dir1 将文件file1 复制到目录 dir1 下的 file1 文件

% cp /tmp/file1 . 将目录 /tmp 下的文件file1 复制到当前目录下

% cp /tmp/file1 file2 将/tmp 下的文件file1 复制成当前目录下的 file2

% cp -r dir1 dir2 将目录dir1整个复制给目录dir2

【附注】其它选项

-r 如果拷贝源是一个目录,则该目录下的子目录与文件都会被复制

-f 在有可能覆盖原有文件时不发出警告(默认)

-i 复制过程会覆盖原有文件时,提示要求用户确认

-P 副本文件会保留源文件的属性、权限和最新被存取/修改的时间

2.6 链接文件

【指令】ln

【格式】ln oldname newname

【示例】

% ln file1 file2 将名称 file2,连结至文件 file1

% ln -s file3 file4 将名称file4连结至文件file3

【附注】-s选项表示要建立符号链接

2.7 移动文件/文件重新命名

【指令】mv

【格式】mv [-fi] source destination

【示例】

% mv file1 file2 将文件file1,更名为 file2

% mv file1 dir1 将文件file1移到目录dir1下,文件名不变

% mv dir1 dir2 将目录 dir1整个移到目录 dir2 下

【附注】其它选项

-f 在有可能覆盖原有文件时不发出警告(默认)

-i 在有可能覆盖原有文件时发出警告,要求用户确认

2.8 建立新目录

【指令】mkdir

【格式】mkdir directory-name

【示例】

% mkdir dir1 建立一新目录 dir1。

2.9 删除目录或文件

【指令】rmdir,rm

【格式】

rmdir directory-name

rm [-fir] filename|directory-name

【示例】

% rmdir dir1 删除目录dir1(dir1必须为空目录)

% rm -r dir1 删除目录 dir1及其下所有文件及子目录

% rm file1 删除文件file1

% rm file? 删除文件名为五个字符且前四个字符为file 的所有文件

% rm f* 删除文件名以 f打头的所有文件

【附注】其它选项

-r 用于删除目录

-i 删除文件时显示详细的提示

-f 删除文件时不作任何提示

三、 常用系统命令

3.1 联机使用手册查询

【指令】man

【格式】man [-t] [-M path] [-K keyword] command-name

【示例】 % man ls

【附注】其它选项

-t 用troff编排手册内容

-M path 如果联机帮助不在/usr/man目录下,则必须指定路径path

-K keyword 用于查找相关指令

3.2 显示和设定系统时间

【指令】date

【格式】date [ mmddhhmm [ yy ] ] [ +format ]

【示例】

% date 显示当前的日期与时间

% date 10080045 系统时间被定为Oct8,12:45AM

% date +DATE: %m/%d/%N; date +TIME: %H:%M:%S 屏幕显示如下信息: DATE: 08/06/99 TIME: 14:45:05

3.3 查看系统中的用户

【指令】who,finger

【格式】who finger [username]

3.4 用户切换

【指令】su

【格式】su username

【示例】

% su user 进入用户 user 的帐号

passwrod: 输入用户 user 的密码

3.5 查看用户名

【指令】whoami

【格式】

who am i (查看登录时,自己的用户名)

whoami (查看当前用户名,若已执行过 "su"命令则显示此用户的用户名)

3.6 查看登录到当前系统的所有网络用户

【指令】rusers

【格式】

rusers

<CTRL><C>(结束)

3.7 显示文件或目录占用的磁盘空间

【指令】du

【格式】du [-s] [-a] directory

【示例】

% du dir1 显示dir1目录及其子目录的容量(以 K byte 为单位)

【附注】其它选项

-s 只显示设定文件的容量

-a 可一一显示多个文件的磁盘量

3.8 查询文件系统可用空间

【指令】df

【格式】df [-i] [-t type] [filesystem]

【示例】

% df 显示当前所有文件系统的使用情况: Filesystem kbytes userd avail capacity Mounted on /dev/ipOa 7445 4714 1986 70% / /dev/ipOg 42277 35291 2758 93% /usr ...

【附注】其它选项

-k 文件空间以K-bytes为单位

-i 显示可使用的inode的统计数目

-t 仅打印所指定文件系统的统计数目

3.9 设定文件读写权限

【指令】chmod

【格式】chmod [-R] mode name

【示例】

% chmod 755 dir1 将目录dir1设为任何人都可读取、执行,但只有拥有者可修改

% chmod 700 file1 将文件file1设为只有拥有者可以读、写和执行

% chmod o+x file2 为文件file2的拥有者增加可执行的权限

% chmod g+x file3 为文件file3的所属群组用户增加可执行权限

% chmod o-r file4 除去其它用户对文件file4的可读取权限

【附注】 name 可为文件名或目录名 mode 可为 3 个 8 位元之数字,或利用ls -l 命令,列出文件或目录的读、写、执行允许权限的文字缩写 mode : rwx rwx rwx r:read w:write x:execute user group other 缩写:(u) (g) (o)

3.10 设定文件或目录的所有权

【指令】chown

【格式】chown [-R] username name

【示例】

% chown user file1 将文件 file1改为user用户所有

% chown -R user dir1 将目录dir1及下属所有文件和子目录改为user用户所有

3.11 检查自己所属群组的名称

【指令】groups

【格式】groups [user]

【示例】 % groups

3.12 设定文件的组属关系

【指令】chgrp

【格式】chgrp [-R] groupname name

【示例】

% chgrp group1 file1 将文件file1的群组拥有权改为 gourp1 群组

% chgrp -R group1 dir1 将目录dir1及其下所有文件和子目录,改为group1群组

3.13 文件中字符串查寻

【指令】grep

【格式】grep "string-name" file

【示例】 % grep "abc" file1 查找文件file1中字串 abc 所在行的内容

3.14 查寻文件或命令的路径

【指令】whereis,which,whatis,find

【格式】

whereis command (显示给出命令的路径)

which command (显示给出命令的路径及用户定义的别名)

find search-path -name filename -print (从给定路径下查找文件,并显示路径 )

【示例】

% whereis date 显示指令date的路径

% find / -name file1 -print 从根目录下开始查找文件file1

3.15 比较文件或目录的内容

【指令】diff

【格式】diff [-r] name1 name2 (name1 name2可为文件名或目录名)

【示例】

% diff file1 file2 比较文件file1与file2内各行的不同处

% diff -r dir1 dir2 比较目录 dir1 与 dir2 下各文件的不同处

3.16 更新文件或目录的最后修改时间

【指令】touch

【格式】touch name (name可为文件或目录名称)

【示例】 % touch filname

3.17 检查网络是否正常

【指令】ping

【格式】ping hostname 或 ping IP-Address

【示例】 % ping hostname (hostname为远程主机名)

3.18 文件传输

【指令】rcp

【格式】

rcp [-r] source hostname:destination (source为文件名、目录名或路径,hostname为主机名,destination为路径)

rcp [-r] hostname:source destinatio ( hostname为主机名,source 为路径,destination为文件名、目录名或路径 )

【示例】

% rcp file1 hostname:/home/user 将文件file1拷贝到主机hostname的/home/user目录下

% rcp -r dir1 hostname:/home/user 将目录 dir1拷贝到主机hostname的/home/user目录下

% rcp hostname:/home/user/file1 file2 将主机 hostname的/home/user/file1文件拷贝到当前主 机的当前路径下,文件名改为file2

% rcp -r hostname:/home/user/dir1 . 将主机hostname的目录/home/user/dir1拷贝到当前主机的当前目录下,目录名不变

3.19 文件传输协议

【指令】ftp

【格式】ftp hostname or ftp ip_address

【示例】

% ftp hostname 与远程主机 hostname进行文件传输 Name (hostname:user-name) : 输入帐号 Password (hostname:user-name): 输入密码

ftp> hel 列出 ftp 文件传输可使用的所有命令

ftp> !ls 列出本地主机当前目录下的所有文件

ftp> !pwd 列出本地主机当前路径

ftp> ls 列出远程主机当前目录下的所有文件名

ftp> pwd 列出远程主机当前路径

ftp> cd dir1 将远程主机的工作目录位置改至 dir1目录之下

ftp> get file1 将远程主机当前目录的文件 file1拷贝到本地主机当前目录中 ftp> put file2 将本地主机当前目录的文件 file2拷贝到远程主机当前目录中 ftp> mget *.c 将远程主机当前目录所有的*.c文件拷贝到本地主机当前目录中 ftp> mput *.txt 将本地主机当前目录所有的*.txt 文件拷贝到远程主机当前目录中

ftp> prompt 切换交谈式指令 ftp> quit 结束 ftp 工作 ftp> bye 同上

3.20 与其它系统的用户对话

【指令】talk

【格式】

talk username@hostname

talk username@Ip_address

【示例】

1. 可先利用 rusers 指令查看网上的现有用户

2. 假设主机 indian 上的用户 u84987要与 hostname 上的用户 u84123 对话:

% talk u84123@hostname 此时屏幕上将会出现等待画面 在对方(u84123)屏幕上将会出现下列讯息 Message from Talk_Daemon@Local_host_name at xx:xx talk: connection requested by u84987@indian talk: respond with: talk84987@indian 此时对方(u84123) 必须执行 talk u84987@indian 即可互相对话

3.最后可按结束

四、 文件编辑器 vi 的使用方法简介

【介绍】 在系统提示符下运行vi命令,此时屏幕会出现 vi编辑屏幕,同时在缓冲区中复制文件。 Vi 编辑的是缓冲区中的副本文件,当编辑完成后,用户有权决定是否要取代原有文件。

vi 的操作模式有两种,输入模式和指令模式。

【进入vi】

% vi [filename] 直接编辑文件

% vi file1 file2 . . . 同时编辑多个文件

% vi -r filename 恢复编辑时被中断的文件

【离开vi】

按ESC键进入指令模式后,选用下列指令离开vi编辑窗:

:q! 不存盘,立即退出vi编辑窗

:wq 存盘,退出vi编辑窗

:ZZ 同wq

:x 同wq

:w 存盘,但并不退出vi

:q 退出vi编辑窗,若文件被修改过,则会自动提示是否存盘

【进入输入模式】

a 把内容附加在光标之后

A 把内容附加在行末

i 把内容附加在光标之前

I 把内容附加在行首

o 在光标所在行之下新增一行

O 在光标所在行之上新增一行

【退出输入模式】 按ESC键退出输入模式

【光标的移动指令】

指令如下:

h 向左移一个字符

j 向下移一行

k 向上移一行

l 向右移一个字符

0 移至该行之首

$ 移至该行之末

^ 移至行头

H 移至屏幕最上端

M 移至屏幕的中间

L 移至屏幕底端

G 移至文件未

+ 移至下一行首

- 移至上一行首

( 移至上一句首

) 移至下一句首

{ 移至上一段首

} 移至下一段首

nG 移至文件的第 n 行

【屏幕移动指令】

<Ctrl><f>屏幕下翻一页

<Ctrl><b>屏幕上翻一页

<Ctrl><d>屏幕下翻半页

<Ctrl><u>屏幕上翻半页

【删除指令】

dO 删除到光标所在行首

dw 删除到光标所在单词结尾

d3w 删除到第三个单词末

dW 删除到下一空格处

db 删除到上一空格处

dd 删除当前行

ndd 删除从当前行开始n行(向后删除)

dL 删除到屏幕上的最后一行

dH 删除到屏幕上的第一行

dG 从光标所在处删除至文件尾

x 删除光标所在该字符

X 删除光标所在的前一字符

【修改指令】

cc 修改当前行

cw 修改到字末

【搜索指令】

/字串 从光标所在处向后查找字符串

字串 从光标所在处向前查找字符串

n 向下继续查找

N 向上继续查找

【移动、复制和撤消指令】

y 将文本复制到缓冲区

nyy 把n行文本复制到缓冲区内

p 把删除或复制的缓冲区内容放置在光标的下方

r 把光标所在字符替换成另一字符

u 取消上一个执行命令

U 取消对本行所有的修改

J 将两行合并

【环境的设定】

:set nu 显示行数

:set nonu 不显示行数

:set ic 查找时不考虑大小写因素

:set noic 查找时考虑大小写因素

【执行指令】

:e filename 编辑另一个文件

:r filename 从光标所在处载入另一文件

:n 将光标移到第n行

:s 字符串替换(例如:起始行号,终止行号s/被替换串/替换串/g)

:w 写入文件

:q 退出vi

:q! 强制退出vi(修改部分会遗失)

:x 写入文件并退出vi

:wq 同上

:wq! 强制写入文件并退出vi

五、 linux常见问题

5.1 安装linux的分区问题:

在硬盘的剩余空间中装载linux分区,最好删除dos分区的最后一个分区,对于linux操作系统,一个交换分区(swap)和一个根分区是必须的。

5.2 安装和卸载LILO:

安装:首先遇到LILO(LInux LOader)启动管理程序,估计应该在你安装Linux的时候,你会被要求选择LILO 的安装处,是硬盘主引导记录MBR还是Linux 的根分区。如果你有其他的启动管理程序例如Boot Magic 或者 System Commander 等,并且想使用他们,那么你应该把LILO安装到Linux的根分区。如果你选择使用LILO作为启动管理程序,就可以选择MBR。如果你想在启动时传递参数给内核,也应该使用MBR。计算机启动时,BIOS会执行位于硬盘主引导记录(MBR)。

卸载:在dos下:用DOS启动,执行FDISK /MBR就可以重写主引导记录,覆盖LILO。在linux下:执行命令lilo –u。

5.3 如何在LINUX下看dos分区的文件

确定核心支持VFAT文件系统,然后改/etc/fstab中的选项,例如:mount –t vfat /dev/hda1 /dos这样就可以看dos文件名了。

5.4 复制子目录及子目录下的所有文件

在用cp时加上-r参数,如"cp -r /mnt/floppy/* /usr/local/"要参考的重要参数是-f –s。

5.5 文件/目录改名

简单地用move命令移到新名字下即可。例如"mv /usr/oldname /usr/newname"。

5.6 怎样删除一个目录下的所有文件和子目录及子目录下的所有文件

rm -rf /tmp/example

5.7 查找命令文件的路径

比如你要查找mount命令的具体路径,可以用type mount 、whereis mount,这个命令还可以找出与这个命令文件相关的文件如manuals page。

5.8 查找文件

使用find命令,比如: find /usr -name XF86* 在/usr目录下(包含子目录)查找名字前四个字母为XF86的文件

find . -name netscape –print 在当前目录下(包含子目录)查找名为netscape的文件
find /home –nouser 在/home目录下查找没有用户属主的文件(用户帐号被删除但有遗留文件)
find /var -newer test 在/var目录下查找比test文件日期更新的文件

更快速的查找文件是使用locate,第一次使用locate之前用updatedb来更新文件/目录名数据库。它把文件/目录信息写到数据库中,以后查找起来就特别的快。updatedb放在crontab中而且缺省配置是在半夜自动执行。locate存在轻微的安全性问题,因为普通用户可以用它来取得自己不能访问的目录/文件的部分信息。

5.9 快速调出历史命令

可以用上下光标键来调出历史命令,然后用左右光标键移动并可编辑命令行。

5.10 命令补齐(TAB键的妙用)

很多shell都有这个功能:
  1. 只需输入文件或目录名的前几个字符, 然后按TAB键,如无相重的,完整的文件名立即自动在命令行出现;如有相重的,再按一下TAB键,系统会列出当前目录下所有以这几个字符开头的名字.例如cd /mnt/cd 自动补齐为 cd /mnt/cdrom。

  2. 在命令行下,只需输入例如"m",再连续按两次TAB键,系统将列出所有以"m"开头的命令,(包括自定义的Bshell命令函数),对查找某些记不清楚的命令特有用.例如输入"ftp",将查到ftp, ftpcount, ftpwho, ftpshut等本不熟悉的命令。

5.11 怎样使linux启动进入时不直接进入X-WINDOWS界面?

改/etc/inittab文件,将有“id:5:initdefault:”这一行中的,把数字5改成3 即可

5.12 在Linux下如何使用软盘、光盘以及DOS等非Linux分区

因为Linux下没有A盘D盘的概念。你需要把软盘/光盘设备上的文件系统安装到Linux目录树上的一个点上,称之为安装点(mount point),通常是一个目录。安装Linux后会有个缺省的安装点/mnt,在它下面还有/mnt/floppy和/mnt/cdrom。你可以用mount -t ext2 /dev/fd0 /mnt/floppy <--把Linux文件系统格式的软盘安装上来  

1. 装载软盘

  首先用mkdir /mnt/floppy 在/mnt目录下建立一个空的floppy目录,然后输入mount -t msdos /dev/fd0 /mnt/floppy 将DOS文件格式的一张软盘装载进来,以后就可以在/mnt/floppy目录下找到这张软盘的所有内容。

2. 装载Windows所在的C盘

  mkdir /mnt/c 在/mnt目录下建立一个空的c目录;
  mount -t vfat /dev/hda1 /mnt/c 将Windows的C盘按长文件名格式装载到/mnt/c目录下,以后在该目录下就能读写C盘根目录中的内容。

3.装载光盘

  mkdir /mnt/cdrom 在/mnt目录下建立一个空的cdrom目录;
  mount -t iso9660 /dev/hdc /mnt/cdrom 将光盘载入到文件系统中来,将在/mnt/cdrom目录下找到光盘内容。有的Linux版本允许用mount /dev/cdrom或mount /mnt/cdrom命令装载光盘。
  要注意的是,用mount命令装入的是软盘、光盘,而不是软驱、光驱。有些初学者容易犯一个毛病,以为用上面命令后,软驱就成了/mnt/floppy,光驱就成了/mnt/cdrom,其实不然,当你要换一张光盘或软盘时,一定要先卸载,再对新盘重新装载。

4.卸载
  卸载的命令格式是:umonut 目录名,例如要卸载软盘,可输入命令umonut /mnt/floppy。要注意的是,在卸载光盘之前,直接按光驱面板上的弹出键是不会起作用的。

5.13 自动装载Windows下的分区

编辑/etc/fstab就可实现启动后自动装载windows下的分区,具体操作如下:
  用vi编辑fstab文件,然后加入要启动时装载的Windows分区,如:
  /dev/hdc1 /mnt/c vfat defaults 0 0
  /dev/hdc5 /mnt/d vfat defaults 0 0
  保存后就完成了对c,d盘的自动装载,重启后生效,其它盘依此类推。
  fstab栏位说明:
  第一栏(fs_spec):实际的device 名称
  第二栏(fs_file):对应到的目录结构(mount point)
  第三栏(fs_vfstype):该 partition 的档案系统,常见的有:minix、ext、ext2、msdos、iso9660、nfs、swap(vfat指的是fat32格式)
  第四栏(fs_mntops):在mount时的参数
  第五栏(fs_freq):在使用dump时是否记录,不需要则输入0
  第六栏(fs_passno):决定在开机时执行fsck的先后顺序

5.14 掌握Linux的目录结构

  Linux的目录结构与Windows不同,而且在Windows下看不到Linux的目录,反过来,Linux也看不到Windows下的目录。Linux下各目录的含义如下:

5.15 如果找不到网卡,如何配置网卡?

LINUX如果不能自动检测网卡,需要手工设置。修改/etc/conf.modules(如果没有就创建一个),并添加如下内容:
alias eth0 ne
options ne io=0x300
或者在lilo.conf中添加如下内容:
append="ether=10,0x300,eth0"

5.16 如何卸载linux分区:

Win2000中可直接用磁盘管理器删除linux分区!

在win98和winme中,通过软件来删除linux分区,如pqmagic,diskman等磁盘工具软件!

在linux中可通过安装时的定制分区和linux自带得fdisk来删除!

5.17 软件安装与卸载:

安装:rpm –i

卸载:rpm-e

5.18 X窗口的设置:

以root用户身份进入系统并运行下面的命令:

~# Xconfigurator <回车>

手工启动X:输入startx

5.19 配置声卡:

以root用户身份进入系统并运行下面的命令:

~# /usr/sbin/sndconfig。

5.20 设置ip地址:

命令:ifconfig eth0 192.168.1.1 netmask 255.255.255.0

查看:ifconfig

卸载:ifconfig down eth0

实验二  作业/进程调度算法设计与实现

一、        实验目的

调度是操作系统的主要功能,本实验通过自行设计实现的调度程序,使同学们加深对作业/进程调度功能的理解,从而掌握操作系统的基本原理。同时还可以提高同学们的编程能力。

二、        实验总要求

用C语言编制按优先级调度三个进程的调度程序,其中要求进程的优先级随着运行时间的延长而降低,但却随着等待时间的延长而升高。

三、        实验的具体要求

1、  设计进程控制块为以下结构:

struct  PRO

char id;  /*进程的id号,可以表示为a, b, c */

int pri;   /*进程的初始优先级*/

int p;    /*等待进程可以动态增加的优先级量*/

int s;    /*运行进程应该动态减少的优先级量*/

int status; /*表示进程的状态,0为等待,1为运行*/

﹜A={‘a’,2,1,1,0},B={‘b’,1,1,1,0}, C={‘c’,0,1,1,0};

  

2、  要求接管时钟中断:INT  1Ch

使用到的C语言函数为:

getvect(intno)      /*获得intno的中断向量*/(要求保存在一个全局变量中)

setvect(intno,time)  /*设置intno的中断向量为函数time的入口地址*/

   

3、  在自己编制的新的时钟中断处理程序中,完成进程优先级的修改;并记录被中断的次数。

Void interrupt time( )

 {

if(A.status==1) A.pri=A.pri-A.s;

else          A.pri=A.pri+A.p;

……..

…….

xx++;

        }

 

4、  编制函数select( ),其功能是从三个进程中选择优先级最高的进程,并将其状态设置为运行,其余设置为等待。并返回运行进程的序号供主程序选择运行。

5、  编制函数int prime (int n),功能是判断n是否为素数,如果是素数,返回n;否则返回0。该函数是三个进程的执行过程。

6、  主程序框架如下:

main ( )

{ int a[3]={100,100,100};

 int I, j, k, u, v, w=0, x=0, y=0;

 char c;

  /*获得时钟中断向量*/

  /*设置新的中断向量*/

     ………..

while(xx<300)   /*xx是全局变量,用于记录时钟中断的次数;用循环来模拟三个进程的运行过程*/

  {u=select ( );  /*调度一次*/

switch (u)

{case0: a[0]++; if(a[0]>10000) a[0]=100; v=prime(a[0]);

      if(v) {gotoxy(2,4); printf(“a    %6d     %6d”, v, w++);} break;

case1:…………………..

case2:…………………..

}

}

/*恢复时钟中断*/

}

四、实验运行结果:

        

         THE  PROCESSES  ARE  PLAYING:

Process id        prime           times

  A              3559            473

  B              3541            470

  C              3529            467

  TIME  INTERRUPT:    300

Prime 记录的是各进程终止时的素数值。

Times 记录的是三个进程各执行了多少次。

五、所有的源程序清单。

六、写出实验小结。

实验三  内存管理设计

一、实验目的

内存管理是操作系统的主要功能之一,而内存管理的主要工作是进行内存的分配与回收,本实验通过自行设计实现的动态分区管理程序(按照首次适应算法FF),使同学们加深对内存管理功能的理解,从而掌握操作系统的基本原理。同时还可以进一步提高同学们的编程能力。

二、实验总要求

用C语言按照首次适应算法FF编制以动态分区管理方式进行内存分配和回收的程序,并测试通过。

三、实验的具体要求

1、设计三种结构:

A. 已分配分区说明表;(包括序号、大小、起始地址、状态、作业号)

B.      空闲分区说明表; (包括序号、大小、起始地址、状态、作业号)

C.      作业表。

struct JOB  /*作业表的定义*/

{   int m_req; /*作业请求存储器的大小*/

int no;    /*作业号*/

int status;  /*状态位:未分配或已释放为0,已分配为1*/

struct JOB *next;

}*C,*P,*Q;

struct TAB  /*已分配分区说明表和空闲分区说明表的定义*/

{int xh; int dx; int qz; char zt[10]; int no;

struct TAB *next;

}*A,*B,*this,*next, *new;

2、设计两个主要函数:

A. 为I号作业分配存储区的函数fen();

void fen()

{ char ok='n'; int k1,k2,i=1;

  seek(7);P=C;

  while(P->no!=I && P!=NULL) P=P->next;

  if(P==NULL|| P->status==1) goto OUT1;

  k1=P->m_req;this=next=B;

  while(this!=NULL && this->dx<k1){ next=this;this=this->next;}

  if(this==NULL) goto OUT1;

…………………………………….(学生完成

OUT1: if(ok=='n') printf("Falied");

      else printf("OK!!");

      getch();

}

B.      回收I号作业分配存储区的函数huan();

void huan()

{char ok='n';   int k1,k2,k3,i=1;

seek(7); P=C;

while(P->no!=I && P!=NULL) P=P->next;

if (P==NULL) goto OUT;

this=next=A;P->status=0;

while(this!=NULL && this->no!=I){next=this;this=this->next;}

if(this==NULL) goto OUT;

k1=this->dx;k2=this->qz;

…………………………………..(学生完成

this=B;

while(this!=NULL){ this->xh=i;i++;this=this->next; }

OUT: if(ok=='n')printf("Falied");

       else printf("OK!!");

getch();

}

3、设计人-机交互界面:

要求一:完成欲分配(回收)存储器的作业序号的输入;

要求二:适时显示A、B、C三表当时的情况;

4、主程序:

供用户选择分配及回收存储器的作业号,每输入一个,立即显示分配、回收及作业表的变化情况,并等待下一次操作。

void seek(int),show(),fen(),creat(),huan();

char a;int I,J;

main()

{new=(struct TAB*)malloc(sizeof(struct TAB));

new->xh=1;new->dx=1024;new->qz=0; /*定义内存可分配空间最大为1024*/

strcpy(new->zt,"idlesse");

new->next=NULL;B=new;C=NULL;

START:seek(1); scanf("%c",&a);

if(a!='1' && a!='2' && a!='3' && a!='4') goto START;

switch(a)

{  case '1':{creat(); show(); goto START;}

case '2':{fen(); show(); goto START;}

case '3':{huan(); show(); goto START;}

case '4': break;  /*用户操作界面,1-生成作业表,2-分配内存空间,3-回收内存空间,4-退出程序。(选1、2、3后每次都显示三个表)*/

}

textbackground(0);textcolor(15);window(1,1,80,25);clrscr();

}

5、create( )函数及seek( )函数:

void creat()

{int i;seek(6);

P=(struct JOB *)malloc(sizeof(struct JOB));

P->m_req=J;P->next=NULL; P->status=0;i=2;Q=C;

…………………………(学生完成

}

void seek(int c1)

{  switch(c1)

   {  case 1:window(1,1,80,25);textbackground(0);clrscr();

             window(20,4,60,22);textbackground(1);

            textcolor(14); clrscr();gotoxy(6,2);

             printf("******* EXPERIMENT No.3 *******");

             gotoxy(14,3); printf("memory manage");

             gotoxy(13,5); printf("1--creat job");

             gotoxy(13,7); printf("2--assign task");

             gotoxy(13,9); printf("3--reclaim task");

             gotoxy(13,11); printf("4--quit");

            gotoxy(13,13); printf("INPUT YOUR CHOICE:");

             break;   /*主菜单*/

      case 2:textbackground(5); textcolor(14);

             window(1,2,30,24); clrscr();

            printf(" NO. SIZE ADDRESS STATUS(A)"); break;/*已分配分区说明表表头*/

      case 3:textbackground(7); textcolor(4);

             window(31,2,60,24); clrscr();

            printf("NO. SIZE ADDRESS STATUS(B)"); break;/*空闲分区说明表表头*/

      case 4:textbackground(12);textcolor(14);

             window(61,2,80,24);clrscr();

            printf("NO. M_REQ STATUS(C)"); break;     /*作业表表头*/

      case 5:textbackground(0);textcolor(15);

             window(1,25,80,25);clrscr();gotoxy(30,1);

             printf("PRESS ANY KEY TO BACK"); break;

      case 6:textbackground(15);textcolor(0);window(30,10,50,14);

            clrscr();gotoxy(4,2);printf("   SIZE:");

             scanf("%d",&J);gotoxy(4,4);printf(" CREAT OK!!");

             getch();break;

      case 7:textbackground(15);textcolor(0);window(30,10,50,14);

            clrscr();gotoxy(4,2);printf("INPUT NO:");

            scanf("%d",&I);gotoxy(4.4),printf(" RESULT:");break;

     }

}

四、实验运行结果:(仅供参考)

PRESS ANY KEY TO BACK

五、所有的源程序清单。

六、写出实验小结。

相关推荐