操作系统上机实验

操作系统上机实验
操作系统上机实验

计算机操作系统实验指导

实验一进程管理

1.目的和要求

加强对进程概念的理解。

2.实验内容

至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。

3.实验环境

①PC兼容机

②Windows、DOS系统

③TC语言

4.实验提示

PCB结构通常包括以下信息:进程名,进程优先数,轮转时间片,进程所

占用的CPU时间,进程的状态,当前队列指针等。可根据实验的不同,PCB结

构的内容可以作适当的增删。

主体程序

#include "conio.h"

#include "stdio.h"

#include "stdlib.h"

struct jincheng_type

{ int pid;

int youxian;

int daxiao;……… };

struct jincheng_type neicun[20];

int shumu=0,pid_l;

main()

{

int n,m,i;

char a;

n=1;

while(n==1)

{

clrscr();

printf("\n********************************************"); printf("\n* 进程演示系统*"); printf("\n********************************************"); printf("\n 1.创建新的进程 2.查看运行进程"); printf("\n 3.换出某个进程 4.杀死运行进程"); printf("\n 5.进程之间通信 6.退出系统"); printf("\n********************************************"); printf("\n请选择(1~6)");

a=getche();

switch(a)

{ case'1':

create( );

break;

case'2':

run( );

break;

case'3':

huanchu();

break;

case'4':

kill( );

break;

case'5':

tongxun( );

break;

case'6': exit(0);

default: n=0;

}

}

}

create( ) /* 创建一个进程的示例(不完整的程序)*/ {

if(shumu>=20)

{

printf("\n内存已满,请先结束或换出进程\n");

}

else

{

printf("\n请输入新进程的pid\n");

scanf("%d",&neicun[shumu-1].pid);

printf("\n请输入新进程的优先级\n");

scanf("%d",&neicun[shumu-1].youxian);

printf("\n请输入新进程的大小\n");

scanf("%d",&neicun[shumu-1].daxiao);

shumu++;

}

}

5.实验运行结果

********************************************

* 进程演示系统*

********************************************

1.创建新的进程

2.查看运行进程

3.换出某个进程

4.杀死运行进程

5.进程之间通信

6.退出系统

********************************************

请选择(1~6)

然后根据你选择的不同,出现不同的结果。

实验二进程调度

1.目的和要求

进程调度是处理机管理的核心内容。本实验要求用C语言编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法。

2.实验内容

①设计进程控制块PCB表结构(与实验一的结构相同),分别适用于优先数调度算法和循环轮转调度算法。

②建立进程就绪队列。对两种不同算法编制入链子程序。

③编制两种进程调度算法:1)优先数调度;2)循环轮转调度

3.实验环境

同实验一

4.实验提示

①本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。

②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。

③在优先数算法中,优先数可以先取值为98,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。

④对于遇到优先数一致的情况,采用FIFO策略解决。

5.实验运行结果

TYPE THE ALGORITHM (PRIORITY/ROUNDROBIN):

若选择了PRIORITY(优先数算法),则进一步显示:

INPUT NAME AND NEEDTIME

A1 2

A2 3

A3 4

A4 2

A5 4

OUTPUT OF PRIORITY:

CPUTIME:1

NAME CPUTIME NEEDTIME PRIORITY STATE

A1 1 1 45 working

A2 0 3 47 ready

A3 0 4 46 ready

A4 0 2 48 ready

A5 0 4 46 ready

CPUTIME:2

NAME CPUTIME NEEDTIME PRIORITY STATE

A1 2 1 45 ready

A2 0 3 47 ready

A3 0 4 46 ready

A4 1 1 45 working

A5 0 4 46 ready

CPUTIME:3

NAME CPUTIME NEEDTIME PRIORITY STATE

A1 3 1 45 ready

A2 1 2 44 working

A3 0 4 46 ready

A4 2 2 45 ready

A5 0 4 46 ready

CPUTIME:4

NAME CPUTIME NEEDTIME PRIORITY STATE A1 4 1 45 working A2 2 2 44 ready

A3 0 4 46 ready

A4 3 2 45 ready

A5 0 4 46 ready

CPUTIME:5

NAME CPUTIME NEEDTIME PRIORITY STATE A1 5 1 45 ready

A2 3 2 44 ready

A3 1 3 43 working A4 4 2 45 ready

A5 0 4 46 ready

CPUTIME:6

NAME CPUTIME NEEDTIME PRIORITY STATE A1 6 1 45 ready

A2 4 2 44 ready

A3 2 3 43 ready

A4 5 2 45 ready

A5 1 3 43 working

CPUTIME:7

NAME CPUTIME NEEDTIME PRIORITY STATE A1 7 0 42 finish A2 5 2 44 ready

A3 3 3 43 ready

A4 6 2 45 ready

A5 2 3 43 ready

CPUTIME:8

NAME CPUTIME NEEDTIME PRIORITY STATE A1 7 0 42 finish A2 6 2 44 ready

A3 4 3 43 ready

A4 7 1 42 working A5 3 3 43 ready

CPUTIME:9

NAME CPUTIME NEEDTIME PRIORITY STATE A1 7 0 42 finish A2 7 1 41 working A3 5 3 43 ready

A4 8 1 42 ready

A5 4 3 43 ready

CPUTIME:10

NAME CPUTIME NEEDTIME PRIORITY STATE A1 7 0 42 finish A2 9 1 41 ready

A3 7 2 40 working A4 9 1 42 ready

A5 5 3 43 ready

CPUTIME:11

NAME CPUTIME NEEDTIME PRIORITY STATE A1 7 0 42 finish A2 10 1 41 ready

A3 8 2 40 ready

A4 10 1 42 ready

A5 6 2 40 working

CPUTIME:12

NAME CPUTIME NEEDTIME PRIORITY STATE A1 7 0 42 finish A2 11 1 41 ready

A3 9 2 40 ready

A4 11 0 39 finish

A5 7 2 40 ready

CPUTIME:13

NAME CPUTIME NEEDTIME PRIORITY STATE A1 7 0 42 finish A2 12 0 38 finish A3 9 2 40 ready

A4 11 0 42 finish

A5 7 2 40 ready

CPUTIME:13

NAME CPUTIME NEEDTIME PRIORITY STATE A1 7 0 42 finish A2 12 0 38 finish A3 10 1 37 working A4 11 0 42 finish

A5 8 2 40 ready CPUTIME:14

NAME CPUTIME NEEDTIME PRIORITY STATE

A1 7 0 42 finish

A2 12 0 38 finish

A3 11 1 37 ready

A4 11 0 42 finish

A5 9 1 37 working

CPUTIME:15

NAME CPUTIME NEEDTIME PRIORITY STATE

A1 7 0 42 finish

A2 12 0 38 finish

A3 12 0 34 finish

A4 11 0 42 finish

A5 10 1 37 ready

CPUTIME:16

NAME CPUTIME NEEDTIME PRIORITY STATE

A1 7 0 42 finish

A2 12 0 38 finish

A3 12 0 34 finish

A4 11 0 42 finish

A5 11 0 34 finish

若选择了ROUNDROBIN(时间片轮转算法),则进一步显示:

INPUT NAME AND NEEDTIME

A1 2

A2 3

A3 4

A4 2

A5 4

OUTPUT OF ROUNDROBIN:

NAME CPUTIME NEEDTIME COUNT STATE

……………

NAME CPUTIME NEEDTIME COUNT STATE

……………

时间片轮转调度算法输出与上大致相同,但要将PRIORITY项换为COUNT项。

有关实验的改进意见:

在实验操作过程中,发现用户输入的数据量太大且每次用户输入的大多数数据为重复数据,因此考虑采用文件输入方式,用户只需指定特定的输入文件的文件名来输入数据。另一方面,程序的输出量较大,可以考虑采用文件输出的方式来储存程序的运行结果。也可以用实时的输出界面来输出程序结果。

实验二的示例程序如下:

#include

#include

#include

#include

#include

#define P_NUM 5

#define P_TIME 50

enum state{

ready,

execute,

block,

finish

};

struct pcb{

char name[4];

int priority;

int cputime;

int needtime;

int count;

int round;

state process;

pcb * next;

};

pcb * get_process();

pcb * get_process(){

pcb *q;

pcb *t;

pcb *p;

int i=0;

cout<<"input name and time"<

while (i

q=(struct pcb *)malloc(sizeof(pcb));

cin>>q->name;

cin>>q->needtime;

q->cputime=0;

q->priority=P_TIME-q->needtime;

q->process=ready;

q->next=NULL;

if (i==0){

p=q;

t=q;

}

else{

t->next=q;

t=q;

}

i++;

} //while

return p;

}

void display(pcb *p){

cout<<"name"<<" "<<"cputime"<<" "<<"needtime"<<" "<<"priority"<<" "<<"state"<

while(p){

cout<name;

cout<<" ";

cout<cputime;

cout<<" ";

cout<needtime;

cout<<" ";

cout<priority;

cout<<" ";

switch(p->process){

case ready:cout<<"ready"<

case execute:cout<<"execute"<

case block:cout<<"block"<

case finish:cout<<"finish"<

}

p=p->next;

}

}

int process_finish(pcb *q){

int bl=1;

while(bl&&q){

bl=bl&&q->needtime==0;

q=q->next;

}

return bl;

}

void cpuexe(pcb *q){

pcb *t=q;

int tp=0;

while(q){

if (q->process!=finish){

q->process=ready;

if(q->needtime==0){

q->process=finish;

}

}

if(tppriority&&q->process!=finish){

tp=q->priority;

t=q;

}

q=q->next;

}

if(t->needtime!=0){

t->priority-=3;

t->needtime--;

t->process=execute;

t->cputime++;

}

}

void priority_cal(){

pcb * p;

clrscr();

p=get_process();

int cpu=0;

clrscr();

while(!process_finish(p)){

cpu++;

cout<<"cputime:"<

cpuexe(p);

display(p);

sleep(2);

clrscr();

}

printf("All processes have finished,press any key to exit");

getch();

}

void display_menu(){

cout<<"CHOOSE THE ALGORITHM:"<

cout<<"1 PRIORITY"<

cout<<"2 ROUNDROBIN"<

cout<<"3 EXIT"<

}

pcb * get_process_round(){

pcb *q;

pcb *t;

pcb *p;

int i=0;

cout<<"input name and time"<

while (i

q=(struct pcb *)malloc(sizeof(pcb));

cin>>q->name;

cin>>q->needtime;

q->cputime=0;

q->round=0;

q->count=0;

q->process=ready;

q->next=NULL;

if (i==0){

p=q;

t=q;

}

else{

t->next=q;

t=q;

}

i++;

} //while

return p;

}

void cpu_round(pcb *q){

q->cputime+=2;

q->needtime-=2;

if(q->needtime<0) {

q->needtime=0;

}

q->count++;

q->round++;

q->process=execute;

}

pcb * get_next(pcb * k,pcb * head){

pcb * t;

t=k;

do{

t=t->next;

}

while (t && t->process==finish);

if(t==NULL){

t=head;

while (t->next!=k && t->process==finish){

t=t->next;

}

}

return t;

}

void set_state(pcb *p){

while(p){

if (p->needtime==0){

p->process=finish;

}

if (p->process==execute){

p->process=ready;

}

p=p->next;

}

}

void display_round(pcb *p){

cout<<"NAME"<<" "<<"CPUTIME"<<" "<<"NEEDTIME"<<" "<<"COUNT"<<" "<<"ROUND"<<" "<<"STA TE"<

while(p){

cout<name;

cout<<" ";

cout<cputime;

cout<<" ";

cout<needtime;

cout<<" ";

cout<count;

cout<<" ";

cout<round;

cout<<" ";

switch(p->process){

case ready:cout<<"ready"<

case execute:cout<<"execute"<

case finish:cout<<"finish"<

}

p=p->next;

}

}

void round_cal(){

pcb * p;

pcb * r;

clrscr();

p=get_process_round();

int cpu=0;

clrscr();

r=p;

while(!process_finish(p)){

cpu+=2;

cpu_round(r);

r=get_next(r,p);

cout<<"cpu "<

display_round(p);

set_state(p);

sleep(5);

clrscr();

}

}

void main(){

display_menu();

int k;

scanf("%d",&k);

switch(k){

case 1:priority_cal();break;

case 2:round_cal();break;

case 3:break;

display_menu();

scanf("%d",&k);

}

}

操作系统上机实验报告(西电)

操作系统上机题目 一、题目 实验1:LINUX/UNIX Shell部分 (一)系统基本命令 1.登陆系统,输入whoami 和pwd ,确定自己的登录名和当前目录; 登录名yuanye ,当前目录/home/yuanye 2.显示自己的注册目录?命令在哪里? a.键入echo $HOME,确认自己的主目录;主目录为/home/yuanye b.键入echo $PA TH,记下自己看到的目录表;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games c.键入which abcd,看看得到的错误信息; 再键入which ls 和which vi,对比刚刚得到的结果的目录是否在a.、b. 两题看到的目录表中; /bin/ls /usr/bin/vi 3.ls 和cd 的使用: a.键入ls,ls -l ,ls -a ,ls -al 四条命令,观察输出,说明四种不同使用方式的区别。 1. examples.desktop 公共的模板视频图片文档音乐桌面; 总计32 2.-rw-r--r-- 1 yuanye yuanye 357 2011-03-22 22:15 examples.desktop drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 公共的 drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 模板 drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 视频 drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 图片 drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 文档 drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 音乐 drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 桌面 3. . .fontconfig .local .Xauthority .. .gconf .mozilla .xsession-errors .bash_logout .gconfd .nautilus 公共的 .bashrc .gksu.lock .profile 模板 .cache .gnome2 .pulse 视频 .chewing .gnome2_private .pulse-cookie 图片 .config .gnupg .recently-used.xbel 文档 .dbus .gstreamer-0.10 .scim 音乐 .dmrc .gtk-bookmarks .sudo_as_admin_successful 桌面 .esd_auth .gvfs .update-manager-core

操作系统实验题目2

实验报告撰写要求实验报告要求具有以下内容: 一、实验目的 二、实验内容 三、实验要求 四、算法流程图 五、给出测试数据及运行结果 六、实验体会或对改进实验的建议

实验1 进程调度(2学时) 一、实验目的 通过实验加强对进程调度算法的理解和掌握。 二、实验内容 编写程序实现基于优先级的时间片轮转调度算法。 三、实验要求 1、假定系统有5个进程,每个进程用一个进程控制块PCB来代表,进程控制块的结构如下图1.1所示: 图1.1 其中: 进程名:作为进程的标识,假设五个进程的进程名分别为p1,p2,p3,

p4,p5。 指针:进程按顺序排成循环链表,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址。 要求运行时间:假设进程需要运行的单位时间数。 已运行时间:假设进程已经运行的单位时间数,初值为0。 状态:可假设有两种状态,就绪状态和结束状态。进程的初始状态都为就绪状态。 2、每次运行所设计的处理器调度程序调度进程之前,为每个进程随机确定它的要求运行时间。 3、此程序是模拟处理器调度,因此,被选中的进程并不实际启动运行,而是执行 已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一个单位时间。 4、在所设计的程序中应有显示语句,能显示每次被选中的进程名以及运行一次后进程队列的变化。

实验2 银行家算法(2学时) 一、实验目的 理解银行家算法,掌握进程安全性检查的方法及资源分配的方法。 二、实验内容 编写程序实现银行家算法,并验证程序的正确性。 三、实验要求 编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。 例子:某系统有A、B、C、D 4类资源共5个进程(P0、P1、P2、P3、P4)共享,各进程对资源的需求和分配情况如下表所示。 现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按

操作系统实验三

计算机操作系统实验报告 实验内容: P、V原语的模拟实现 实验类型:验证型 指导教师:毕国堂 专业班级: 姓名: 学号: 实验地点:东6E507 实验时间:2017/10/23

一、实验目的 1.理解信号量相关理论 2.掌握记录型信号量结构 3.掌握P、V原语实现机制 二、实验内容 1.输入给定的代码 2.进行功能测试并得出证正确结果 三、实验要求 1.分析signal和wait函数功能模块 ●Signal函数 在进行资源增加时,首先判断增加的资源是否存在,如果不存在则报错 并结束函数;如果存在则将需要增加的资源数量加一,然后再判断增加 后的资源数是否大于0,如果大于0则表示之前等待队列为空,没有需 要分配的进程;如果增加后的资源不大于0,表示之前等待队列中存在 进程,则将队首的进程取出并将资源分给该进程。 ●Wait 函数 在执行wait函数时,先判断请求的资源和进程是否存在,如果不存在则 报错提示;如果存在则将对应资源的资源数减一,然后判断减少后的资 源数是否小于0,如果小于0,表示该资源等待队列为空,可直接将资源 分配给请求的进程;如果不小于0则表示之前资源的等待队列不为空, 则将请求的进程插在等待队列最后。 2.画出signal和wait函数流程图

3.撰写实验报告 四、实验设备 1.PC机1台安装visual c++ 6.0 五、测试

1.首先将所有的资源分配完 2.这时再请求资源时就会出现等待现象 3.此时增加一个资源s0,则进程1对s0的等待结束直接获取资源s0 4.当再增加资源s0、s1时则进程1也结束对资源s1的等待,并且s0资源 为有空闲状态 六、实验思考 1.如何修改wait操作,使之能一次申请多个信号量? wait函数传入一个进程号和多个资源名,在wait函数中使用循环依

操作系统实验页面置换算法C++代码

#include #include #include /*全局变量*/ int mSIZE; /*物理块数*/ int pSIZE; /*页面号引用串个数*/ static int memery[10]={0}; /*物理块中的页号*/ static int page[100]={0}; /*页面号引用串*/ static int temp[100][10]={0}; /*辅助数组*/ /*置换算法函数*/ void FIFO(); void LRU(); void OPT(); /*辅助函数*/ void print(unsigned int t); int main() { int i,k,code; printf(" ╔═══════════════╗\n"); printf(" ║页面置换算法║\n"); printf(" ╚═══════════════╝\n"); printf("请输入物理块的个数(M<=10):"); scanf("%d",&mSIZE); printf("请输入页面号引用串的个数(P<=100):"); scanf("%d",&pSIZE); puts("请依次输入页面号引用串(连续输入,无需隔开):"); for(i=0;i

《 Windows7 操作系统》实验报告

实验(一) Windows 7基本操作 一、实验目的 1.掌握文件和文件夹基本操作。 2.掌握“资源管理器”和“计算机”基本操作。 二、实验要求 1.请将操作结果用Alt+Print Screen组合键截图粘贴在题目之后。 2.实验完成后,请将实验报告保存并提交。 三、实验内容 1.文件或文件夹的管理(提示:此题自行操作一遍即可,无需抓图)★期末机试必考题★ (1) 在D:盘根目录上创建一个名为“上机实验”的文件夹,在“上机实验”文件夹中创建1个名为“操作系统上机实验”的空白文件夹和2个分别名为“2.xlsx”和“3.pptx”的空白文件,在“操作系统上机实验”文件夹中创建一个名为“1.docx”的空白文件。 (2) 将“1.docx”改名为“介绍信.docx”;将“上机实验”改名为“作业”。 (3) 在“作业”文件夹中分别尝试选择一个文件、同时选择两个文件、一次同时选择所有文件和文件夹。 (4) 将“介绍信.docx”复制到C:盘根目录。 (5) 将D:盘根目录中的“作业”文件夹移动到C:盘根目录。 (6) 将“作业”文件夹中的“2.xlsx”文件删除放入“回收站”。 (7) 还原被删除的“2.xlsx”文件到原位置。 2.搜索文件或文件夹,要求如下: 查找C盘上所有以大写字母“A”开头,文件大小在10KB以上的文本文件。(提示:搜索时,可以使用“?”和“*”。“?”表示任意一个字符,“*”表示任意多个字符。)

3. 在桌面上为C:盘根目录下的“作业”文件夹创建一个桌面快捷方式。★期末机试必考题★ 3.“计算机”或“资源管理器”的使用 (1) 在“资源管理器”窗口,设置以详细信息方式显示C:\WINDOWS中所有文件和文件夹,使所有图标按类型排列显示,并不显示文件扩展名。(提示:三步操作全部做完后,将窗口中显示的最终设置结果抓一张图片即可) (2) 将C:盘根目录中“介绍信.docx”的文件属性设置为“只读”和“隐藏”,并设置在窗口中显示“隐藏属性”的文件或文件夹。(提示:请将“文件夹”对话框中选项设置效果与C:盘根目录中该文件图标呈现的半透明显示效果截取在一整张桌面图片中即可) 4.回收站的设置 设置删除文件后,不将其移入回收站中,而是直接彻底删除功能。

操作系统实验报告 附思考题

课程设计(综合实验)报告( 2015 -- 2016 年度第 1 学期) 名称:操作系统综合实验 题目:oslab综合实验 院系:计算机系 班级: 学号: 学生姓名: 指导教师: 设计周数:分散进行 成绩: 日期:2015 年10 月29 日

实验1 实验环境的使用 一、综合实验的目的与要求 熟悉操作系统集成实验环境OS Lab 的基本使用方法。 练习编译、调试EOS 操作系统内核以及EOS 应用程序。 二、实验正文 1.启动 OS Lab 2.1 执行项目 Windows 控制台窗口内容显示 2.2 调试项目 2.2.1 使用断点中断执行 2.2.2 单步调试 2.2.2 .3单步调试结果显示: 练习使用“逐语句”功能和“跳出”功能 2.2.3 查看变量的值 快速监视 添加监视 2.2.4 调用堆栈 调用堆栈显示内容 进入Func 函数 双击 main 函数所在的行表示此函数是当前调用堆栈中的活动函数。 3 新建EOS 内核项目 4 EOS 应用程序项目的生成和调试 4.1 新建EOS 应用程序项目 4.2 调试项目 添加断点后单步调试结果显示 4.3 查看软盘镜像文件中的内容 4.4修改EOS 应用程序项目名称 5 退出OS Lab 6 保存EOS 内核项目 三、综合实验总结或结论 思考与练习: 1.在哪些情况下应该使用“逐过程”调试,在哪些情况下应该使用“逐语句”调试。

答:逐语句为每执行一行语句,如果碰到函数调用它就会进入到函数里面。而逐过程碰到函数时不进入函数,把函数调用当成一条语句去执行。 2. 生成EOS SDK 文件夹的目的和作用。明白文件夹的组织结构和各个文件的来源和作用。查看EOS 应用程序包含了SDK 文件夹中的哪些头文件,是如何包含的? (1)EOS SDK为应用程序调用系统API提供服务,可作为用户编程中使用的工具包集合。(2)其主要包括INC头文件LIB文件夹、导入库文件和BIN文件夹、动态链接库、可执行程序、二进制文件。 (3)包含的头文件有:eos.h负责导出API函数,eosdef.h声明负责导出函数类型的定 义,error.h负责导出错误码。 (4)EOS应用程序在项目的头文件中只是包含了eos.h文件,在eos.h文件中又包含了eosdef.h和error.h文件。 实验 2 操作系统的启动 一、综合实验的目的与要求 跟踪调试 EOS 在 PC 机上从加电复位到成功启动全过程,了解操作系统的启动过程。 查看 EOS 启动后的状态和行为,理解操作系统启动后的工作方式。 二、实验正文 1. 准备实验 新建一个 EOS Kernel 项目。打开boot.asm 和loader.asm 两个汇编文件。生成项目。找到loader.bin 文件,记录下此文件的大小 1566 字节。 2 调试 EOS 操作系统的启动过程 2.1 使用 Bochs 做为远程目标机 找到“远程目标机”属性,将此属性值修改为“BochsDebug” 2.2 调试 BIOS 程序 2.2.1在 Console 窗口中输入调试命令 sreg 后按回车,其中 CS 寄存器信息行中的 “ s=0xf000”表示 CS 寄存器的值为 0xf000。 2.2.2 输入调试命令 r 后按回车,显示当前 CPU 中各个通用寄存器的值。其中 “ rip:0x00000000:0000fff0”表示 IP 寄存器的值为 0xfff0。 2.2.3输入调试命令 xp /1024b 0x0000,查看开始的 1024 个字节的物理内存。在 Console 中输出的这1K 物理内存的值都为 0,说明 BIOS 中断向量表还没有被加载到此处。 2.2.4输入调试命令 xp /512b 0x7c00,查看软盘引导扇区应该被加载到的内存位置。输出的内存值都为 0,说明软盘引导扇区还没有被加载到此处。

操作系统实验实验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)进一步加强对进程概念的理解,明确进程和程序的区别 (2)进一步认识并发执行的实质 二、实验环境 在windows平台上,cygwin模拟UNIX运行环境 三、实验内容 (1) getpid()---获取进程的pid 每个进程都执行自己独立的程序,打印自己的pid; (2) getpid()---获取进程的pid 每个进程都执行自己独立的程序,打印自己的pid; 父进程打印两个子进程的pid;

(3)写一个命令处理程序,能处理max(m,n), min(m,n),average(m,n,l)这几个命令(使用exec函数族)。 Max函数 Min函数 Average函数 Exec函数族调用 四、程序代码 五、运行结果 六、实验结果与分析 七、体会 通过这次上机,我了解了fork函数的运行方法,同时更深刻的了解了进程的并行执行的本质,印证了在课堂上学习的理论知识。同时通过编写实验内容(3)的命令处理程序,学会了exec函数族工作原理和使用方法。通过这次上机实验让我加深了对课堂上学习的理论知识的理解,收获很多。

大连理工大学实验报告 学院(系):专业:班级: 姓名:学号:组:___ 实验时间:实验室:实验台: 指导教师签字:成绩: 实验名称:进程通讯 一、实验目的和要求 了解和熟悉UNIX支持的共享存储区机制 二、实验环境 在windows平台上,cygwin模拟UNIX运行环境 三.实验内容 编写一段程序, 使其用共享存储区来实现两个进程之间的进程通讯。进程A创建一个长度为512字节的共享内存,并显示写入该共享内存的数据;进程B将共享内存附加到自己的地址空间,并向共享内存中写入数据。 四、程序代码 五、运行结果 六、实验结果与分析 七、体会

操作系统实验题目及实验报告要求

操作系统实验题目及实验 报告要求 Prepared on 21 November 2021

实验报告实验课程:操作系统实验 学生姓名:王桥 学号: 24 专业班级:计科123班 2014年 6月3 日 目录 一、实验一 (1) 二、实验二 (7) 三、实验三 (21) 四、实验四 (28) 五、实验五 (33)

南昌大学实验报告 ---(1)操作系统安装及其接口环境 学生姓名:王桥学号: 24 专业班级:计科123班 实验类型:■验证□综合□设计□创新实验日期:实验成绩: 一、实验目的 熟悉Windows1(执行程序) 2.模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。 模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。 [提示]: (1) PV操作同步机构,由P操作原语和V操作原语组成,它们的定义如下: P操作原语P(s):将信号量s减去1,若结果小于0,则执行原语的进程被置成等待信号量s的状态。 V操作原语V(s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。 这两条原语是如下的两个过程: procedure p (var s: semaphore); begin s:=s-1; if s<0 then W(s) end {p} procedure v (var s: semaphore); begin s: =s+1; if s<=0 then R(s) end {V} 其中W(s)表示将调用过程的进程置为等待信号量s的状态;R(s)表示释放一个等待信号量s的进程。 在系统初始化时应把semaphore定义为某个类型,为简单起见,在模拟实验中可把上述的semaphore直接改成integer。 (2)生产者——消费者问题。 假定有一个生产者和消费者,生产者每次生产一件产品,并把生产的产品存入共享缓冲器以供消费者取走使用。消费者每次从缓冲器内取出一件产品去消费。禁止生产者将产品放入已满的缓冲器内,禁止消费者从空缓冲器内取产品。假定缓冲器内可同时存放10件产品。那么,用PV操作来实现生产者和消费者之间的同步,生产者和消费者两个进程的程序如下: B:array [0..9] of products; s 1,s 2 : semaphore; IN, out; integer; IN:=0;out:=0;

操作系统实验之内存管理实验报告

学生学号 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称 计算机操作系统 开 课 学 院 计算机科学与技术学院 指导老师姓名 学 生 姓 名 学生专业班级 2016 — 2017 学年第一学期

实验三 内存管理 一、设计目的、功能与要求 1、实验目的 掌握内存管理的相关内容,对内存的分配和回收有深入的理解。 2、实现功能 模拟实现内存管理机制 3、具体要求 任选一种计算机高级语言编程实现 选择一种内存管理方案:动态分区式、请求页式、段式、段页式等 能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小等 能够选择分配、回收操作 内购显示进程在内存的储存地址、大小等 显示每次完成内存分配或回收后内存空间的使用情况 二、问题描述 所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。 动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配区的序号或该分区的起始地址。 最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的第一个分区。

最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分区。 最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个分区。 三、数据结构及功能设计 1、数据结构 定义空闲分区结构体,用来保存内存中空闲分区的情况。其中size属性表示空闲分区的大小,start_addr表示空闲分区首地址,next指针指向下一个空闲分区。 //空闲分区 typedef struct Free_Block { int size; int start_addr; struct Free_Block *next; } Free_Block; Free_Block *free_block; 定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情况。其中pid作为该被分配分区的编号,用于在释放该内存空间时便于查找。size表示分区的大小,start_addr表示分区的起始地址,process_name存放进程名称,next指针指向下一个分区。 //已分配分区的结构体 typedef struct Allocate_Block { int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct Allocate_Block *next; } Allocate_Block; 2、模块说明 2.1 初始化模块 对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化

操作系统实验六磁盘调度算法正确C代码

操作系统实验六磁盘调度算法正确C代码 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

《操作系统》实验报告 【实验题目】:磁盘调度算法 【实验目的】 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的实现方法。【实验内容】 问题描述: 设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。 程序要求如下: 1)利用先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法模拟磁道访问过程。 2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。 3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。 4)输出:每种算法的平均寻道长度。 实验要求:

1) 上机前认真复习磁盘调度算法,熟悉FCFS,SSTF,SCAN和循环SCAN算法的过程; 2) 上机时独立编程、调试程序; 3) 根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。 实验代码: #include #include #include<> using namespace std; const int MaxNumber=100; int TrackOrder[MaxNumber]; int MoveDistance[MaxNumber];//移动距离 int FindOrder[MaxNumber];//寻好序列 double AverageDistance;//平均寻道长度 bool direction;//方向 true时为向外,false为向里 int BeginNum;//开始磁道号 int M=500;//磁道数 int N;//提出磁盘I/O申请的进程数 int SortOrder[MaxNumber];//排序后的序列 bool Finished[MaxNumber]; void Inith() { cout<<"请输入提出磁盘I/O申请的进程数: "; cin>>N; cout<<"请依次输入要访问的磁道号: "; for(int i=0;i>TrackOrder[i]; for(int j=0;j

操作系统实验报告生产者与消费者问题模拟

操作系统上机实验报告 实验名称: 生产者与消费者问题模拟 实验目的: 通过模拟生产者消费者问题理解进程或线程之间的同步与互斥。 实验内容: 1、设计一个环形缓冲区,大小为10,生产者依次向其中写入1到20,每个缓冲区中存放一个数字,消费者从中依次读取数字。 2、相应的信号量; 3、生产者和消费者可按如下两种方式之一设计; (1)设计成两个进程; (2)设计成一个进程内的两个线程。 4、根据实验结果理解信号量的工作原理,进程或线程的同步\互斥关系。 实验步骤及分析: 一.管道 (一)管道定义 所谓管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。(二)所涉及的系统调用 1、pipe( ) 建立一无名管道。 系统调用格式 pipe(filedes) 参数定义 int pipe(filedes); int filedes[2]; 其中,filedes[1]是写入端,filedes[0]是读出端。 该函数使用头文件如下: #include #inlcude #include 2、read( ) : 系统调用格式 read(fd,buf,nbyte) 功能:从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf 所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。 参数定义:

int read(fd,buf,nbyte); int fd; char *buf; unsigned nbyte; 3、write( ) 系统调用格式 read(fd,buf,nbyte) 功能:把nbyte 个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。 参数定义同read( )。 (三)参考程序 #include #include #include int pid1,pid2; main( ) { int fd[2]; char outpipe[100],inpipe[100]; pipe(fd); /*创建一个管道*/ while ((pid1=fork( ))==-1); if(pid1==0) { lockf(fd[1],1,0); /*把串放入数组outpipe中*/ sprintf(outpipe,child 1 is using pipe!); /* 向管道写长为50字节的串*/ write(fd[1],outpipe,50); sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0); } else { while((pid2=fork( ))==-1); if(pid2==0) { lockf(fd[1],1,0); /*互斥*/ sprintf(outpipe,child 2 is using pipe!); write(fd[1],outpipe,50); sleep(5); lockf(fd[1],0,0);

计算机操作系统实验四

实验三进程与线程 问题: 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位,具有动态性、并发性、独立性、异步性和交互性。然而程序是静态的,并且进程与程序的组成不同,进程=程序+数据+PCB,进程的存在是暂时的,程序的存在是永久的;一个程序可以对应多个进程,一个进程可以包含多个程序。当操作系统引入线程的概念后,进程是操作系统独立分配资源的单位,线程成为系统调度的单位,与同一个进程中的其他线程共享程序空间。 本次实验主要的目的是: (1)理解进程的独立空间; (2)加深对进程概念的理解,明确进程和程序的区别; (3)进一步认识并发执行的实质; (4)了解红帽子(Linux)系统中进程通信的基本原理。 (5)理解线程的相关概念。 要求: 1、请查阅资料,掌握进程的概念,同时掌握进程创建和构造的相关知识和线程创建和 构造的相关知识,了解C语言程序编写的相关知识; (1)进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内

存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。 (2)进程的创建和构造: 进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一个动态的实体,它是程序的一次执行过程。进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码。新的进程通过克隆旧的程序(当前进程)而建立。fork() 和clone()(对于线程)系统调用可用来建立新的进程。 (3)线程的创建和构造: 线程也称做轻量级进程。就像进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与独立的进程相比,进程中的线程之间的独立程度要小。它们共享内存、文件句柄和其他每个进程应有的状态。 线程的出现也并不是为了取代进程,而是对进程的功能作了扩展。进程可以支持多个线程,它们看似同时执行,但相互之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易,但你必须小心,确保它们不会妨碍同一进程里的其他线程。 线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制,但与进程不同的是,同类的多个线程是共享同一块内存空间和一组系统资源的,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小得多,正因如此,线程也被称为轻型进程(light-weight process)。一个进程中可以包含多个线程。 2、理解进程的独立空间的实验内容及步骤

操作系统B2-上机实验-进程

实验二Linux 进程实验 姓名:段叶叶班级:信息1302 学号:07131052 地点:东区实验室FF109 时间:2014年10月13日星期一 成绩: 一、实验内容 1.创建进程的系统调用fork(); 2.创建进程的系统调用vfork(); 3.执行新程序的系统调用exec(); 4.等待进程结束的系统调用wait()或waitpid()。 前三题必做,最后一题选做。 二、实验目的 熟悉进程的系统调用。 三、实验环境 登陆Linux虚拟机,进入Linux shell,提示符为$,表示普通用户提示符。 四、实验题目 1. 【题目】:编写程序forkgrandchild.c,用来创建孙子进程。 【要求】:在读懂程序forktest.c的基础上,编写程序 forkgrandchild.c(forkgrandchild.c创建在用户名(如wm)目录下的process 目录下),所创建的程序forkgrandchild.c可实现创建孙子进程,并显示孙子进程的pid,其父进程的pid,forkgrandchild.c要求可读性好,用户界面友好。 【预备知识】: 1)Linux进程状态 ●运行状态:程序正在运行或在运行队列中等待运行。 ●可中断等待状态:进程正在等待某个事件完成,等待过程可被信号或定时器 唤醒。 ●不可中断等待状态:进程正在等待某个事件完成,不可被信号或定时器唤醒, 必须等待事件的发生,才可唤醒。 ●僵死状态:进程已终止,但进程描述符依然存在,直到父进程调动wait()函 数后释放。 ●停止状态:进程因收到SIGSTOP SIGSTP SIGTIN SIGTOU信号后停止运行 或该进程正在被跟踪(调式程序时)。

操作系统实验复习题

一、选择题 1.下列不是Linux操作系统特点的是() A.开放性 B.良好的用户界面 C.良好的可移植性 D.单用户 2.在Linux系统中最高目录是() A.我的计算机 B.C:\ C./ D. home 3.可以代替任意单个字符的通配符是()。 A.? B.# C.@ D.* 4.可以代替任意字符的通配符是()。 A.? B.# C.@ D.* 4.telnet 命令的功能是() A.远程执行命令 B.传输信息C.远程登录 D.查看网络状态 5.常见的Linux发布版本很多,下列不是Linux发布版本的是() A.Red Hat Linux B.红旗Linux C.Fedora Core D.X-Window 6.怎样更改一个文件的权限设置?() A.attrib B.chmod C.change D.file 7.Linux操作系统中下面哪条命令可以把f1.txt复制为f2.txt? ( ) A. cp f1.txt f2.txt B. cat f1.txt f2.txt C. mv f1.txt f2.txt D. copy f1.txt f2.txt 8.设char dat[10],从键盘输入字符串的输入语句是:( ) A. scanf(“%d”,dat); B. scanf(“%s”,dat); C. scanf(“%d”,&dat); D. scanf(“%c”,dat); 9.让父进程等待子进程结束的函数是( ) A.exit(0); B.sleep(1) C.wait(0); D._exit(0); 10. 对标准输出设备(显示器)加锁的函数是( ) A.lockf(1,1,0);; B.lockf(1,0,0); C.lockf(1,0,1);; D.lockf(1,1,1); 11. 对标准输出设备(显示器)解锁的函数是( ) A.lockf(1,1,0);; B.lockf(1,0,0); C.lockf(1,0,1);; D.lockf(1,1,1); 12. linux系统中,预置当接收到软中断信号16跳转到func函数的命令是() A. signal(16,func) B. signal(func,16) C. kill(pid,17) D. kill(17,func) 13. linux系统中,消息队列通信中发送消息的系统调用格式是() A. msgsnd(msgqid,msfp,size,flag) B. msgqid=msgget(key,flag) C.msgrcv(msgqid,msfp,size,type,flag) D. msgctl(msgqid,IPC_RMID,0); 14. linux系统c语言编程中,让进程暂停6秒钟的命令是() A.wait(60) B.wait(0) C.sleep(6) D.sleep(60) 15. linux系统中,让后台运行的PID为1223的进程暂停的命令是() A. kill –CONT 1223 B. kill –STOP 1223 C. kill –KILL 1223 D. kill –EXIT 1223 二、填空 1)linux系统中删除当前目录下的非空子目录/dir1的命令:__rm –r /dir1____ 2)Windows系统中远程登录Linux系统的命令:__telnet ____ 3)linux系统中,显示当前目录所有文件的许可权、拥有者、文件大小、修改

操作系统实验四

青岛理工大学课程实验报告

算法描述及实验步骤 功能:共享存储区的附接。从逻辑上将一个共享存储区附接到进程的虚拟地址空间上。用于建立调用进程与由标识符shmid指定的共享内存对象之间的连接。 系统调用格式:virtaddr=shmat(shmid,addr,flag) 该函数使用头文件如下: #include #include #include (8)shmdt( ) 功能:用于断开调用进程与共享内存对象之间的连接,成功时返回0,失败返回-1。 系统调用格式: int shmdt(shmaddr) char *shmaddr;/*采用shmat函数的返回值*/ (9)shmctl( ) 功能:共享存储区的控制,对其状态信息进行读取和修改。用于对已创建的共享内存对象进行查询、设置、删除等操作。 系统调用格式:shmctl(shmid,cmd,buf) 该函数使用头文件如下: #include #include #include 2、步骤: (1)定义进程变量(2)定义两个字符数组 (3)创建管道(4)如果进程创建不成功,则空循环(5)如果子进程创建成功,pid为进程号(6)锁定管道 (7)给Outpipe赋值(8)向管道写入数据 (9)等待读进程读出数据(10)解除管道的锁定 (11)结束进程等待子进程结束(12)从管道中读出数据 (13)显示读出的数据(14)父进程结束 创建jincheng.c 插入文字

调 试 过 程 及 实 验 结 果 运行: 运行后: 总 结 (对实验结果进行分析,问题回答,实验心得体会及改进意见) 虽然对pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、 shmdt()、shmctl()的功能和实现过程有所了解,但是运用还是不熟练,过去没 见过,所以运行了一个简单的程序。 利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信,加深了对 其了解。 (1)管道通信机制,同步的实现过程:当写进程把一定数量的数据写入pipe, 便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程读一空pipe 时,也应睡眠等待,直到写进程将数据写入管道后,才将之唤醒,从而实现进 程的同步。 管道通信的特点:A管道是半双工的,数据只能向一个方向流动;需要双方通 信时,需要建立起两个管道;B. 只能用于父子进程或者兄弟进程之间(具有亲 缘关系的进程);C.单独构成一种独立的文件系统:管道对于管道两端的进程而

操作系统实验题目

操作系统实验 上机准备: 熟悉Cygwin环境 编译源程序使用gcc 源程序名–o 目标文件名(缺省为 a.out)。 学习Linux(Unix)的常用命令。 学习vi 编辑器的使用。 C语言语法

1 进程管理 1.1 实验目的 加深对于进程并发执行概念的理解。实践并发进程的创建和控制方法。观察和体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux系统中进程创建与控制有关的系统调用的编程和调试技术。 1.2 实验说明 1)与进程创建、执行有关的系统调用说明 进程可以通过系统调用fork()创建子进程并和其子进程并发执行.子进程初始的执行映像是父进程的一个复本.子进程可以通过exec()系统调用族装入一个新的执行程序。父进程可以使用wait()或waitpid()系统调用等待子进程的结束并负责收集和清理子进程的退出状态。fork()系统调用语法: #include pid_t fork(void); fork成功创建子进程后将返回子进程的进程号,不成功会返回-1. exec 系统调用有一组6个函数,其中示例实验中引用了execve 系统调用语法: #include int execve(const char *path, const char *argv[], const char * envp[]); path 要装入的新的执行文件的绝对路径名字符串.

argv[] 要传递给新执行程序的完整的命令参数列表(可以为空). envp[] 要传递给新执行程序的完整的环境变量参数列表(可以为空). Exec 执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。如果exec 调用失败,它会返回-1。 getpid()---获取进程的pid ● 每个进程都执行自己独立的程序,打印自己的pid ,每个父进程打印其子进程的pid; ● 每个进程都执行自己独立的程序,打印自己的pid ,父进程打印其子进程的pid; ● 编写一个命令处理程序,能处理max(m,n), min(m,n)和 average(m,n,l)这几个命令。(使用exec 函数族)

相关文档
最新文档