操作系统B--实验三

操作系统B--实验三
操作系统B--实验三

实验三请求页式管理页面置换算法设计一、实验目的

实现请求页式管理页面置换FIFO、OPT算法,掌握页式存储管理系统的相关理论知识。

二、实验内容

实现指定淘汰算法。能够处理一下情形:

1、能够输入给作业分配的内存块数;

2、能够输入给定的页面,并计算发生缺页的次数以及缺页率;

3、缺页时,如果发生页面置换,输出淘汰的页号。

三、实验提示

3.1算法的原理描述:

3.1.1先进先出页面置换(FIFO)

FIFO法基本思想:选择在内存驻留时间最长的页将其淘汰。FIFO算法认为先调入内存的页不再被访问的可能性要比其他页大,因而选择最先调入内存的页换出。

3.1.2理想型淘汰页面置换算法(OPT)

OPT法基本思想:当要调入一新页而必须淘汰一旧页时,所淘汰的页是以后不再使用的,或者是以后相当长的时间内不会使用的。这样,淘汰掉该页将不会造成因需要访问该页而又立即把它调入的现象。该算法无法实现,因为,它要求必须预先知道每一个进程的访问串。

3.2 本次课程设计中的算法流程图

3.2.1 FIFO算法的流程图如下图所示:

3.2.2 OPT算法的流程图如下图所示:

四、测试用例

4.1测试用例设计

4.1.1用例1设计:

内存物理块数:N=3

页面引用序列中总页面个数为:m=12

页面引用序列为:4、3、2、1、4、3、5、4、3、2、1、5 4.1.2用例2设计:

内存物理块数:N=4

页面引用序列中总页面个数为:m=15

页面引用序列为:3、7、4、8、3、1、6、7、8、3、1、2、9、3、5

4.2运行结果及运行情况分析

4.2.1测试用例1运行结果如下:

4.2.1.1 FIFO算法的运行结果:

结果验证如下:

FIFO 4 3 2 1 4 3 5 4 3 2 1 5

4 4 4 1 1 1

5 5 5 5 5 5

3 3 3

4 4 4 4 4 2 2 2

2 2 2

3 3 3 3 3 1 1

缺页√√√√√√√√√

淘汰页号 4 3 2 1 4 3

共缺页中断9次

缺页率=缺页次数/ 总访问次数=9 / 12=75%

依次淘汰的页面号为:4、3、2、1、4、3

4.2.1.2 OPT算法的运行结果为:

OPT算法验证如下:

OPT 4 3 2 1 4 3 5 4 3 2 1 5

4 4 4 4 4 4 4 4 4 2 1 1

3 3 3 3 3 3 3 3 3 3 3

2 1 1 1 5 5 5 5 5 5

缺页√√√√√√√

淘汰页号 2 1 4 2

共缺页中断9次

缺页率=缺页次数/ 总访问次数=7 / 12=58.33%

依次淘汰的页面号为:2、1、4、2

4.2.2测试用例2运行结果如下:

4.2.2.1 FIFO算法运行结果如下:

FIFO运行结果验证如下:

FIFO 3 7 4 8 3 1 6 7 8 3 4 2 9 3 5

3 3 3 3 3 1 1 1 1 1

4 4 4 4 4

7 7 7 7 7 6 6 6 6 6 2 2 2 2

4 4 4 4 4 7 7 7 7 7 9 9 9

8 8 8 8 8 8 3 3 3 3 3 5 缺页标记√√√√√√√√√√√√淘汰页号 3 7 4 8 1 6 7 3 共缺页中断11次

缺页率=缺页次数/ 总访问次数=12/ 15=80%

依次淘汰的页面号为:3、7、4、8、1、6、7、3

4.2.2.2 OPT算法运行结果

OPT运行结果验证如下:

OPT 3 7 4 8 3 1 6 7 8 3 4 2 9 3 5

3 3 3 3 3 3 3 3 3 3 3 3 3 3 5

7 7 7 7 7 7 7 7 7 4 4 9 9 9

4 4 4 1 6 6 6 6 6 6 6 6 6

8 8 8 8 8 8 8 8 8 8 8 8 缺页标记√√√√√√√√√√淘汰页号 4 1 7 4 2 3 共缺页中断10次

缺页率=缺页次数/ 总访问次数=10/ 15=66.67%

以此淘汰的页面号为:4、1、7、4、2、3

附录:实验报告参考

石家庄铁道大学

实验报告

课程名称操作系统(B)

专业数字媒体技术

学生姓名

班级信1406

学号

任课教师沙金

完成日期2015年11月10日

信息科学与技术学院

实验一进程同步

一、实验目的

进程的同步是操作系统处理机管理的重要内容,本实验要求学生理解生产

者与消费者问题模型,掌握解决该问题的算法思想,学会使用同步机制。

二、实验内容

一组生产者向一组消费者提供产品,它们共享一个有界缓冲池,生产者向

其中放入产品,消费者从中取得产品。假定这些生产者和消费者互相等效,只要

缓冲池未满,生产者可将产品送入缓冲池;只要缓冲池未空,消费者可从缓冲池

取走一个产品。根据进程同步机制,编写一个解决上述问题的可视化程序,可显

示缓冲池状态、放产品、取产品等过程。

三、实验要求

(1)在windows下用C语言实现,界面友好,自定义数据结构;

(2)实验报告书写请参考实验一;

(3)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区

的全部内容,当前指针位置和生产者/消费者县城的标识符。

(4)生产者和消费者各有两个以上。

(5)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数。

四、设计原理

通过一个有界缓冲区把生产者和消费者联系起来。假定生产者和消费者的

优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。

类似地,只要缓冲区未空,消费者就可以从缓冲区中取走产品。应该禁止生产者

向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一

机制有生产者线程和消费者线程之间的互斥关系来实现。与计算打印两进程同步

关系相同,生产者和消费者两进程P和C之间应满足下列两个同步条件:

①只有在缓冲池中至少有一个缓冲区已存入消息后,消费者才能从中提取信息,

否则消费者必须等待。

②只有缓冲池中至少有一个缓冲区是空时,生产者才能把消息放入缓冲区,否则

生产者必须等待。

为了满足第一个同步条件,设置一个同步信号量full,它代表的资源是缓冲区满,

它的初始值为0,它的值为n时整个缓冲池满。这个资源是消费者类进程C所有,C进程可以申请该资源,对它施加P操作,而C进程的合作进程生产者进程P对它施加V操作。同样为了满足第二个同步条件,设置另一个同步信号量empty,它代表的资源是缓冲空区,它的初始值为n,表示缓冲池中所有缓冲区空。信号量full表示可用缓冲区数量,信号量empty表示缓冲区数量,设置整型变量:存入指针in和取出指针out。

为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另一个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0.另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要在设置一个互斥信号量

g_hMutex,初始值为1.

P原语的主要动作是:

①sem减1;

②若sem减一后仍大于或等于零,则进程继续执行;

③若sem减一后小于零,则该进程被阻塞后入与该信号相对应的队列

中,然后转进程调度。

V原语的操作主要动作是:

①sem加1;

②若相加结果大于零,进程继续执行;

③若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程

然后再返回原进程继续执行或转进程调度。

采用的同步方法:

1)利用函数CreateMutex(NULL,FALSE,NULL)创建互斥信号量g_hMutex,表

示缓冲区当前的状态,若为true时,则表示缓冲区正被别的进程使用。三个参数

表示的意义分别为:指向安全属性的指针,初始化互斥对象的所有者,指向互斥

对象名的指针。

2)利用函数CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1, NULL)创建缓冲区满的信号量g_hFullSemaphore,值为true时表示缓冲区已满。四

个参数分别为:表示是否允许继承、设置信号机的初始计数、设置信号机的最大

计数、指定信号机对象的名称(-1是因为计数从开始)。

3)利用函数CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)创建缓冲区空的信号量g_hEmptySemaphore ,该值为true 时表示缓冲区为空。

五、流程图

生产者流程图

消费者流程图

六、程序清单

入 口

sem=sem-1

S<=0

唤醒等待队列中的一个进程

返回或转进程调度

返回

sem=sem-1

入口

s>=0

调用进程入等待队列

转进程调度

返回

1.存储结构定义

利用信号量解决生产者消费者问题

const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度

unsigned short ProductID = 0; //产品号

unsigned short ConsumeID = 0; //将被消耗的产品号

unsigned short in = 0; //产品进缓冲区时的缓冲区下标

unsigned short out = 0; //产品出缓冲区时的缓冲区下标

int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列

bool g_continue = true; //控制程序结束

HANDLE g_hMutex; //用于线程间的互斥

HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待

HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待

DWORD WINAPI Producer(LPVOID); //生产者线程

DWORD WINAPI Consumer(LPVOID); //消费者线程

2.算法相关的函数

(1)创建各个互斥信号以及生产者线程和消费者线程的函数在如下主函数里面所示:

int main()

{

//创建各个互斥信号

g_hMutex = CreateMutex(NULL,FALSE,NULL);

g_hFullSemaphore

CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);

g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); //调整下面的数值,可以发现,当生产者个数多于消费者个数时,

//生产速度快,生产者经常等待消费者;反之,消费者经常等待。

const unsigned short PRODUCERS_COUNT = 3; //生产者的个数

const unsigned short CONSUMERS_COUNT = 1; //消费者的个数

//总的线程数

const unsigned short THREADS_COUNT

PRODUCERS_COUNT+CONSUMERS_COUNT;

HANDLE hThreads[PRODUCERS_COUNT]; //各线程的handle

DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符

DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符

//创建生产者线程

for (int i=0;i {

hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]); if (hThreads[i]==NULL)

return -1;

}

//创建消费者线程

for ( i=0;i {

hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0 &consumerID[i]);

if (hThreads[i]==NULL)

return -1;

}

while(g_continue)

{

if(getchar())

{ //按回车后终止程序运行

g_continue = false; }}

return 0; }

(2)生产者生产一个产品的函数:

//生产一个产品。简单模拟了一下,仅输出新产品的ID号

void Produce()

{

std::cerr << "Producing " << ++ProductID << " *** ";

std::cerr << "Succeed" << std::endl;

}

(3)把新生产的产品放入缓冲区的函数:

//把新生产的产品放入缓冲区

void Append()

{

std::cerr << "Appending a product *** ";

g_buffer[in] = ProductID;

in = (in+1)%SIZE_OF_BUFFER;

std::cerr << "Succeed" << std::endl;

}

(4)输出缓冲区当前的状态的函数:

//输出缓冲区当前的状态

for (int i=0;i {

std::cout << i <<": " << g_buffer[i]; if (i==in)

std::cout << " <-- 生产";

if (i==out)

std::cout << " <-- 消费";

std::cout << std::endl;

}

从缓冲区中取出一个产品的函数:

//从缓冲区中取出一个产品

void Take()

{

std::cerr << "Taking a product *** "; ConsumeID = g_buffer[out];

out = (out+1)%SIZE_OF_BUFFER;

利用信号量解决生产者消费者问题

std::cerr << "Succeed" << std::endl;

}

(5)输出缓冲区当前的状态的函数:

//输出缓冲区当前的状态

for (int i=0;i {

std::cout << i <<": " << g_buffer[i]; if (i==in)

std::cout << " <-- 生产";

if (i==out)

std::cout << " <-- 消费";

std::cout << std::endl;

}

}

(6)消耗一个产品的函数:

//消耗一个产品

void Consume()

{

std::cerr << "Consuming " << ConsumeID << " *** "; std::cerr << "Succeed" << std::endl;

}

3.生产者和消费者算法

(1)生产者算法:

//生产者

DWORD WINAPI Producer(LPVOID lpPara)

{

while(g_continue)

{

WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE);

Produce();

Append();

Sleep(1500);

ReleaseMutex(g_hMutex);

ReleaseSemaphore(g_hEmptySemaphore,1,NULL);

}

return 0;

}

(2)消费者算法:

//消费者

DWORD WINAPI Consumer(LPVOID lpPara)

{

while(g_continue)

{

WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE);

Take();

Consume();

Sleep(1500);

ReleaseMutex(g_hMutex);

ReleaseSemaphore(g_hFullSemaphore,1,NULL); }

return 0;

}

七、运行结果分析(截图)

该程序设置的缓冲区数据长度为20,生产者个数为3,消费者个数为1,程序启动后,生产者先进行生产,当3个生产者全部生产完之后,消费者开始从缓冲区中取出产品,当消费者取出一个后,生产者开始继续生产,当生产完3个之后,消费者开始从缓冲池中取产品,依次循环。

八、心得体会与总结(不少于120字)

《嵌入式操作系统》实验指导书

实验成绩评定表

班级:姓名:学号:

序号评分项目满分实得分

1 学习态度认真、遵守纪律10

2 设计分析合理性10

3 设计方案正确性、可行性、创造性20

4 设计结果正确性40

5 设计报告的规范性10

6 设计验收10

总得分/等级

评语:

注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79)、及格(60-69分)、60分以下为不及格。

指导教师签名:

2015年月日

操作系统实验三

计算机操作系统实验报告 实验内容: 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函数中使用循环依

操作系统实验报告三

课程实验报告 课程名称姓名实验名称实验目的及要求 实验3进程并发与同步 1、加深对进程概念的理解,区分进程并发执行与串行执行; 2、掌握进程并发执行的原理,理解进程并发执行的特点; 3、了解fork()系统调用的返回值,掌握用fork()创建进程的方法;熟悉wait、exit等系统调用; 4、能利用相应的系统调用实现进程树与进程间的同 步。 实 验操作系统:linux Un bu ntu 11.10 环 境实验工具:Vmware 实验内容 1、编写一C语言程序,实现在程序运行时通过系统调用fork()创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father ”,儿子进 程执行时屏幕显示“ I am son ",女儿进程执行时屏幕显示“ I am daughter ”。 要求多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。要求有运行结果截图与结果分析 2、连续4个fork()的进程家族树,family1-1.c 程序清单如下: #in clude main () { fork(); fork(); fork(); fork(); printf( A\n ”); } 请根据程序运行结果,画出进程家族树,并分析原 因。

3、 修改程序1,在父、子进程中分别使用 wait 、exit 等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束, 才可以输出消息。 写出相应的同 步控制,并分析运行结果。 4、 创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知 该键盘命令的路径与文件名为: /bin/ls 。父进程创建子进程, 并加载./child2 程序。 写出相应的程序代码并分析程序运行结果。 1、编写一 C 语言程序,实现在程序运行时通过系统调用 fork()创建两个子进 程,使父、子三进程并发执行,父亲进程执行时屏幕显示“ I am father ”, 儿子进程执行时屏幕显示“ I am son ”,女儿进程执行时屏幕显示“ I am daughter "。并且反复的测试,观察每一次的执行的顺序有什么不同 2、修改程序1,在父、子进程中分别使用 wait 、exit 等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束,才可以输出消息。 4、创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知 该键盘命令的路径与文件名为: /bin/ls 。父进程创建子进程, 并加载./child2 程序。 法 描 述 及 实 验 步 骤 调 试过 程及实 验结果

操作系统实验实验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、用软中断通信实现进程同步的机理

操作系统实验报告三

课程实验报告

3、修改程序1,在父、子进程中分别使用wait、exit等系统调用“实现”其同步推进,父进程必须等待儿子进程与女儿进程结束,才可以输出消息。写出相应的同步控制,并分析运行结果。 4、创建一个子进程,并给它加载程序,其功能是调用键盘命令“ls -l”,已知该键盘命令的路径与文件名为:/bin/ls。父进程创建子进程,并加载./child2程序。写出相应的程序代码并分析程序运行结果。 算法描述及实验步骤 1、编写一C语言程序,实现在程序运行时通过系统调用fork( )创建两个子进 程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father”, 儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。并且反复的测试,观察每一次的执行的顺序有什么不同 2、修改程序1,在父、子进程中分别使用wait、exit等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束,才可以输出消息。 4、创建一个子进程,并给它加载程序,其功能是调用键盘命令“ls -l”,已知该键盘命令的路径与文件名为:/bin/ls。父进程创建子进程,并加载./child2程序。 调试过程及实验结果

总结 1、实现在程序运行时通过系统调用fork( )创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。这一点需要注意。返回结果时,由于每一次的不确定性,所以要想得到比较具有说服性的,就必须经过多次的测试。 2、连续4个fork()的进程家族树在进行实验的时候可能会出现进程输出信息一直一样的情况,需要多次执行输出才有可能会看到输出结果不一样的情况

操作系统-实验三

操作系统-实验三 文件系统的用户界面 一、实验目的 进一步理解、使用和掌握文件的系统调用、文件的标准子例程,能利用和选择这些基本的文件操作完成复杂的文件处理工作。 二、实验题目 1.编写一个文件复制的C语言程序:分别使用文件的系统调用read(fd, buf, nbytes), write(fd, buf, nbytes)和文件的库函数fread(buf, size, nitems, fp), fwrite(buf, size, nitems, fp),编写一个文件的复制程序(文件大小>1M ),文件可以编一个C 程序来生成,或使用/usr/bin下的二进制执行文件。 调用格式例如: copy file1 file2 #include main(int argc, char*argv[]) { … fd1=open(argv[1], O_RDONLY); //系统调用 creat (argv[2], 0660); fd2=open(argv[2], O_WRONL Y); while((n=read(fd1, buf, BUFSIZE))>0) write(fd2, buf, n); … main带参的调用方法例(含测试时间): time ./mycp infile outfile 流文件的实验程序请参考该程序完成。

上述函数中nbytes, size和nitems都取值为1时(即一次读写一个字节),比较系统调用和流文件两种程序的执行效率。当nbytes取4096字节,size取1字节且nitems取4096时(即一次读写4096字节),再次比较这两种程序的执行效率(文件大小>1M)。如: 创建大文件的方法之一,比如用creat 创建一个新文件,用open写打开该文件,用lseek将写指针移到很远处,写入随便一个字符。比如移动0x100000,用write写个“1”,就会得到一个1M大小的文件。也可到Linux的/usr/bin找一个1~3M左右的大的执行文件。 对于单独使用的速度较快的计算机,文件要10M~100M。 2.编写一个父子进程之间用无名管道进行数据传送的C程序。父进程逐一读出一个文件的内容,并通过管道发送给子进程。子进程从管道中读出信息,再将其写入一个新的文件。程序结束后,对原文件和新文件的内容进行比较。 3.在两个用户的独立程序之间,使用有名管道,重新编写一个C程序,实现题2的功能。 三、源代码 1.编写一个文件复制的C语言程序:分别使用文件的系统调用read(fd, buf, nbytes), write(fd, buf, nbytes)和文件的库函数fread(buf, size, nitems, fp), fwrite(buf, size, nitems, fp),编写一个文件的复制程序。 程序一 #define BUFSIZE 4096 #include #include #include #include int main(int argc, char *argv[]) { printf("这个是一次4096个字节的运行结果:\n");

Windows操作系统实验三实验报告

Windows操作系统C/C++ 程序实验 姓名:___________________ 学号:___________________ 班级:___________________ 院系:___________________ ______________年_____月_____日

实验三Windows 2000/xp线程同步 一、背景知识 二、实验目的 在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000/xp线程同步的理解。 1) 回顾系统进程、线程的有关概念,加深对Windows 2000/xp线程的理解。 2) 了解事件和互斥体对象。 3) 通过分析实验程序,了解管理事件对象的API。 4) 了解在进程中如何使用事件对象。 5) 了解在进程中如何使用互斥体对象。 6) 了解父进程创建子进程的程序设计方法。 三、工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1) 一台运行Windows 2000/xp Professional操作系统的计算机。 2) 计算机中需安装V isual C++ 6.0专业版或企业版。 四、实验内容与步骤 1. 事件对象 清单4-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。 步骤1:登录进入Windows 2000/xp Professional。 步骤2:在“开始”菜单中单击“程序”-“Microsoft V isual Studio 6.0”–“Microsoft V isual C++ 6.0”命令,进入V isual C++窗口。 步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-1.cpp。 步骤4:单击“Build”菜单中的“Compile 3-1.cpp”命令,并单击“是”按钮确认。系统

操作系统实验报告 实验三

昆明理工大学信息工程与自动化学院学生实验报告 (2012 —2013 学年第二学期) 课程名称:操作系统开课实验室:信自楼445 2013 年 5 月 16 日 一、实验要求 对给定的一个页面走向序列,请分别用先进先出算法和二次机会算法,计算淘汰页面的顺序、缺页次数和缺页率,具体的页面走向可参考教材例题或习题。 二、实验目的 存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。通过本次实验,要求学生通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解,通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 三、实验原理及基本技术路线图(方框原理图) 用C或C++语言模拟实现请求式分页管理。要求实现:页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。 提示:可先用动态申请的方式申请一大块空间,然后假设该空间为内存区域,对该空间进行

流程图:

数据结构定义: 我提供定义了两个类。第一个类就是页面类,在这类里面包括一些重要的数据成员。

有页号(page_no),页框号(frame_no),页面是否在内存的标志(flag(1表示在内存,0表示不在内存)),访问次数(times)。另一个类是进程控制块类PCB。类的数据成员有id(进程编号),name(进程名),size(进程大小),*p(页类指针)。在本类中,有一些成员函数:构造函数(用来初始化本类的所有数据),displayPCB(输出函数),convert(地址映射函数),allocation(分配函数),restore(回收函数)。另外还有一些类外的函数:initMemorySpace(初始化内存空间的函数),displayMemorySpace(输出内存空间的状态1(表示占用)0(表示空))。 四、所用仪器、材料(设备名称、型号、规格等)。 计算机一台 五、实验方法、步骤 程序代码: #include #include #include using namespace std; const int frame_size=1024;//页框长度,固定为 1k const int page_size=1024;//页面长度,固定为 1k const int memory_size=102400;//内存容量,固定为 100k const int frame_number=memory_size/frame_size;// 100k/1k=100 frames int *memory;//指针变量,用来存内存的状态1还是0。 void initMemorySpace()//初始化内存空间 { int i,ran,times; time_t t;//定义time_t对象 t t=time(0); srand(t);//随机改变每秒 times=0;//变量times初始化为0,变量的功能是检查内存空间是否有一半空了没。 memory=new int[frame_number];//申请内存空间,有frame_number 这么大的空间 for(i=0;i

操作系统实验

操作系统实验报告

实验一进程控制与描述 一、实验目的 通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000中进程的“一生”。 二、实验环境 硬件环境:计算机一台,局域网环境; 软件环境:Windows 2000 Professional、Visual C++ 6.0企业版。 三、实验内容和步骤 第一部分(共三个程序): Windows 2000 Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI 应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。 程序1-1 # include # pragma comment(lib, “user32.lib” ) int APIENTRY WinMain(HINSTANCE /* hInstance */ , HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */ ) { :: MessageBox( NULL, “Hello, Windows 2000” , “Greetings”, MB_OK) ; return(0) ; } 实验结果 然后改变参数,运行结果如下:

1-2显示了当前进程的优先级: 1-3进一步显示进程的具体情况: 第二部分:进程的“一生”(共三个程序) 1、创建进程 本程序展示的是一个简单的使用CreateProcess() API函数的例子。首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。大多数参数都可取缺省值,但是创建标志参数使用了:BOOL bCreateOK标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。然后该克隆进程的创建方法关闭传

操作系统实验报告

操作系统教程实验报告 专业班级 学号 姓名 指导教师

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环:

操作系统实验一实验报告

操作系统实验一实验报告 基本信息 1.1 实验题目 进程控制实验 1.2完成人 王召德 1.3报告日期 2015-4-8 实验内容简要描述 2.1实验目标 加深对于进程并发执行概念的理解。实践并发进程的创建和控制方法。观察和 体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过 程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux 系统中 进程创建与控制有关的系统调用的编程和调试技术。 2.2实验要求 参考以上示例程序中建立并发进程的方法,编写一个多进程并发执行程序。父进程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制ps 命令总在ls 命令之前执行。 2.3实验的软硬件环境

Ubuntu14.04 intelPC 报告的主要内容 3.1实验的思路 按照上面的实例,先生成一个子进程让其等待,然后生成第二个子进程,父进程等待其执行ps命令后唤醒第一个子进程执行ls即可。 3.2实验模型的描述 无 3.3主要数据结构的分析说明 无 3.4主要算法代码的分析说明 无 3.5项目管理文件的说明 无 实验过程和结果 4.1实验投入的实际学时数 1学时 4.2调试排错过程的记录 曾尝试让第二个子进程激活第一个子进程,结果发现当运行ps后,后面的代码将不再执行,所以不可行。 4.3多种方式测试结果的记录

实验结果: 父进程启动 (12239) ls子进程启动 (12240) ps子进程启动 (12241) PID TTY TIME CMD 12239 pts/27 00:00:00 born 12240 pts/27 00:00:00 born 12241 pts/27 00:00:00 ps ps子进程结束 (12241) 唤醒ls子进程 (12240) 键盘中断信号产生... ls子进程被唤醒 (12240) . born born.c~ hello.c pctl pctl.c~ pctl.o .. born.c helelo.h~ hello.c~ pctl.c pctl.h ls子进程结束 (12240) 父进程结束 (12239) 4.4实验结果的分析综合 无 实验的总结 父进程可以通过fork()函数生成子进程,子进程会从fork()函数开始执行原来的代码,当

操作系统实验三 进程的创建#(精选.)

操作系统 实验报告 哈尔滨工程大学 软件学院

第一讲实验环境的使用 一、实验概述 1. 实验名称 进程的创建 2. 实验目的 练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。 调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。 3. 实验类型(验证、设计) 验证 4. 实验内容

二、实验环境 操作系统:windows xp 编译环境:OS Lab 语言:汇编语言、C语言 三、实验过程(每次实验不一定下面6条都写,根据实际情况定) 1.设计思路和流程图

main函数流程图 2. 需要解决的问题及解答 (1)在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进程。提示:可以使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。 答:后文中,有此题解决方案。 尝试根据之前对PsCreateProcess函数和PspCreateProcessEnvironment函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。

PspCreateThread创建 了进程的主线程 结束 (3)在PsCreateProcess函数中调用了PspCreateProcessEnvironment函数后又先后调用了PspLoadProcessImage和PspCreateThread函数,学习这些函数的主要功能。能够交换这些函数被调用的顺序吗?思考其中的原因。 答:PspCreateProcessEnvironment 的主要功能是创建进程控制块并且为进程创建了地址空间和分配了句柄表。PspLoadProcessImage是将进程的可执行映像加载到了进程的地址空间中。PspCreateThread创建了进程的主线程。这三个函数被调用的顺序是不能够改变的就向上面描述的加载可执行映像之前必须已经为进程创建了地址空间这样才能够确定可执行映像可以被加载到内存的什么位置在创建主线程之前必须已经加载了可执行映像这样主线程才能够知道自己要从哪里开始执行,执行哪些指令。因此不能交换他们的顺序。 3.主要数据结构、实现代码及其说明 主要定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄 4.源程序并附上注释 #include "EOSApp.h" // // main 函数参数的意义: // argc - argv 数组的长度,大小至少为1,argc - 1 为命令行参数的数量。 // argv - 字符串指针数组,数组长度为命令行参数个数+ 1。其中argv[0] 固定指向当前 // 进程所执行的可执行文件的路径字符串,argv[1] 及其后面的指针指向各个命令行 // 参数。

操作系统实验报告16487

西安邮电大学 (计算机学院) 课实验报告 实验名称:进程管理 专业名称:计算机科学与技术 班级: 学生: 学号(8位): 指导教师: 实验日期:*****年**月**日

一. 实验目的及实验环境 目的:(1)加深对进程概念的理解,明确进程和程序的区别。 (2)进一步认识并发执行的实质。 (3)分析进程竞争资源现象,学习解决进程互斥的方法。 (4)了解Linux系统中进程通信的基本原理。 环境:Linux操作系统环境: 二. 实验容 (1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。 (2)阅读Linux的fork.c源文件,分析进程的创建过程。 三.方案设计 (1)进程的创建 编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。(2)进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。 如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 (3)①编写一段程序,使其现实进程的软中断通信。 要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Processll is Killed by Parent! Child Processl2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止 Parent Process is Killed! 程序流程图如下:

操作系统实验3答案

实验三操作系统进程管理 一、实验目的 1) 掌握系统进程的概念,加深对Linux / UNIX进程管理的理解。 2) 学会使用ps命令和选项。 3) 列出当前shell中的进程。 4) 列出运行在系统中的所有进程。 5) 根据命令名搜索特定的进程。 6) 使用kill命令终止进程。 7) 根据用户名查找和终止进程。 二、实验内容和相应的答案截图,三、实验结果分析 步骤1:创建一个普通用户(参见实验二),以普通用户身份登录进入GNOME。 步骤2:打开一个“终端”窗口(参见实验二)。 步骤3:回顾系统进程概念,完成以下填空: 1) Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的__PID__进程标识符,用于跟踪从进程启动到进程结束。 2) 当启动新进程的时候,内核也给它们分配系统资源,如__内存_和__CPU_。 3) 永远不向父进程返回输出的进程叫做__僵进程__。 4) 由父进程派生出来的进程叫做____子___进程。 5) ___父_进程是一个派生另一个进程的进程。 6) 运行用于提供服务的Linux系统进程是_______________。 7) 如果父进程在子进程之前结束,它创建了一个______________进程。 步骤4:回顾ps命令和信息。基本的ps命令显示当前shell中的进程信息,用户只能够查看当前终端窗口中初始化的进程。输入ps命令,将结果填入表3-3中。 表3-3 实验记录 下面,在当前终端窗口中,练习使用给出的每个选项的ps命令。

输入ps -f 命令,显示运行在系统中的某个进程的完全信息,填入表3-4中。 表3-4 实验记录 步骤5:列出系统中运行的所有进程。 输入ps -ef 命令,显示运行在系统中的各个进程的完全信息。执行该命令,并与ps –f 命令的输出结果对照,一致吗?有何不同? 答:不一致,后者显示了所有进程的完全可用信息,多了很多。 分析当前终端窗口中的输出结果,记录下来用于写实验报告。 a. 显示了多少个进程?答:59 b. 进程ID的PID是什么? c. 启动进程的命令(CMD) 是什么?答:sched d. 请观察,什么命令的PID号是1?答:init[5] e. 执行ps –ef >aaa命令,将ps命令的输出送到文本文件aaa。再次运行cat aaa | wc命令,计算进程的数目。其中,cat是显示文本文件命令。“|”是管道命令,就是将前一个命令的输出作为后一个命令的输入。wc 命令用来计算文本的行数,第一个数字显示的是行的数目,可以用来计算进程的数目。计算出进程数目并做记录。 执行man ps命令,可以打开Linux用户命令手册。了解ps命令的用法。输入wq命令可退出用户手册的阅读。man命令可以执行吗?结果如何? 答:Man ps时出现

操作系统实验报告

操作系统实验报告 实验名称: 系统的引导 所在班级: 指导老师: 老师 实验日期: 2014年3 月29 日

一、实验目的 ◆熟悉hit-oslab实验环境; ◆建立对操作系统引导过程的深入认识; ◆掌握操作系统的基本开发过程; ◆能对操作系统代码进行简单的控制,揭开操作系统的神秘面纱。 二、实验容 1. 阅读《Linux核完全注释》的第6章引导启动程序,对计算机和Linux 0.11的引导过程进行初步的了解。 2. 按照下面的要求改写0.11的引导程序bootsect.s。 3. 有兴趣同学可以做做进入保护模式前的设置程序setup.s。 4. 修改build.c,以便可以使用make BootImage命令 5. 改写bootsect.s主要完成如下功能: bootsect.s能在屏幕上打印一段提示信息XXX is booting...,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等。 6. 改写setup.s主要完成如下功能: bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s 向屏幕输出一行"Now we are in SETUP"。setup.s能获取至少一个基本的硬件参数(如存参数、显卡参数、硬盘参数等),将其存放在存的特定地址,并输出到屏幕上。setup.s不再加载Linux核,保持上述信息显示在屏幕上即可。 三、实验环境

本实验使用的系统是windows系统或者是Linux系统,需要的材料是osexp。 四、实验步骤 1. 修改bootsect.s中的提示信息及相关代码; 到osexp\Linux-0.11\boot目录下会看到图1所示的三个文件夹,使用UtraEdit 打开该文件。将文档中的98行的mov cx,#24修改为mov cx,#80。同时修改文档中的第246行为图2所示的情形。 图1图2 图3 2. 在目录linux-0.11\boot下,分别用命令as86 -0 -a -o bootsect.obootsect.s和 ld86 -0 -s -obootsectbootsect.o编译和bootsect.s,生成bootsect文件; 在\osexp目录下点击MinGW32.bat依此输入下面的命令: cd linux-0.11 cd boot as86 -0 -a -o bootsect.obootsect.s ld86 -0 -s -o bootsectbootsect.o

操作系统实验报告

操作系统实验报告 银行家算法 班级:计算机()班 姓名:李君益 学号:(号) 提交日期: 指导老师: 林穗 一、设计题目 加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。 二、设计要求

内容: 编制银行家算法通用程序,并检测思考题中所给状态的安全性。 要求: (1)下列状态是否安全?(三个进程共享个同类资源) 进程已分配资源数最大需求数 (状态) (状态) (2)考虑下列系统状态 分配矩阵最大需求矩阵可用资源矩阵 问系统是否安全?若安全就给出所有的安全序列。若进程请求(),可否立即分配? 三、设计分析 一.关于操作系统的死锁 .死锁的产生 计算机系统中有许多独占资源,他们在任一时刻只能被一个进程使用,如磁带机,绘图仪等独占型外围设备,或进程表,临界区等软件资源。两个进程同时向一台打印机输出将导致一片混乱,两个进程同时进入临界区将导致数据库错误乃至程序崩溃。正因为这些原因,所有操作系统都具有授权一个进程独立访问某一辞源的能力。一个进程需要使用独占型资源必须通过以下的次序: ●申请资源 ●使用资源 ●归还资源 若申请施资源不可用,则申请进程进入等待状态。对于不同的独占资源,进程等待的方式是有差别的,如申请打印机资源、临界区资源时,申请失败将一位这阻塞申请进程;而申请打开文件文件资源时,申请失败将返回一个错误码,由申请进程等待一段时间之后重试。只得指出的是,不同的操作系统对于同一种资源采取的等待方式也是有差异的。 在许多应用中,一个进程需要独占访问多个资源,而操作系统允许多个进程并发执行共享系统资源时,此时可能会出现进程永远被阻塞的现象。这种现象称为“死锁”。 2.死锁的定义 一组进程处于死锁状态是指:如果在一个进程集合中的每个进程都在等待只能由该集合中的其他一个进程才能引发的时间,则称一组进程或系统此时发生了死锁。 .死锁的防止 .死锁产生的条件: ●互斥条件

操作系统实验实验3

大学学生实验报告 一、实验目的 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。 二、实验容 实验1: 设计一个虚拟存储区和存工作区,并使用下述算法计算访问命中率。 1、最佳淘汰算法(OPT) 2、先进先出的算法(FIFO) 3、最近最久未使用算法(LRU) 4、最不经常使用算法(LFU) 5、最近未使用算法(NUR) 命中率=1-页面失效次数/页地址流长度 实验2: 在Linux环境下利用下列系统调用malloc(), free()编写一段程序实现存分配与回收的管理。 要求: 1、返回已分配给变量的存地址; 2、返回释放后的存地址; 3、释放已分配的存空间后,返回释放存后未使用存的大小。 三、实验原理 UNIX中,为了提高存利用率,提供了外存进程对换机制;存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入存便可运行;还支持请求调页的存储管理方式。 当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入存。这种页面调入方式叫请求调页。为实现请求调页,核心配置了四种数据结构:页表、页框号、访问位、修改位、有效位、保护位等。 当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。该程序通过查找页表,得到该页所在外存的物理块号。如果此时存未满,能容纳新页,则启动磁盘I/O将所缺之页调入存,然后修改页表。如果存已满,则须按某种置换算法从存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。利用修改后的页表,去形成所要访问数据的物理地址,再去访问存数据。整个页面的调入过程对用户是透明的。

操作系统实验报告3

操作系统实验报告 学号 姓名 班级

实验一实验报告 【实验名称】:并发程序设计(实验1) 【实验目的】:掌握在程序中创建新进程的方法,观察并理解多道程序并发执行的现象。 【实验原理】:fork():建立子进程。子进程得到父进程地址空间的一个复制。 返回值:成功时,该函数被调用一次,但返回两次,fork()对子 进程返回0,对父进程返回子进程标识符(非0值)。不成功时对 父进程返回-1,没有子进程。 【实验内容】:首先分析一下程序运行时其输出结果有哪几种可能性,然后实际调试该程序观察其实际输出情况,比较两者的差异,分析其中的原 因。 void main (void) { int x=5; if( fork( ) ) { x+=30; printf (“%d\n”,x); } else printf(“%d\n”,x); printf((“%d\n”,x); } 【实验要求】:每个同学必须独立完成本实验、提交实验报告、源程序和可执行程序。实验报告中必须包含预计的实验结果,关键代码的分析, 调试记录,实际的实验结果,实验结果分析等内容。

【预计的实验结果】 35 5 35 5 【关键代码分析】 1,代码主要由fork()函数和一个if else 条件分支语句组成。 2,fork()函数,它是Linux的系统调用。 函数定义: int fork( void ); 返回值: 子进程中返回0,父进程中返回子进程ID,出错返回-1 函数说明: 一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。 子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。 3,父进程和子进程的代码段都是上面的所有代码,由定义可知不过子进程的代码只从创建此子进程那里开始执行。也就是从if( fork( ) )语句开始,出现了子进程,两个进程并发执行。 当这个程序执行if(fork()) 时,操作系统创建一个新的进程(子进程),并且在进程表中相应为它建立一个新的PCB表项。其中子进程从父进程继承到了大部分的参数。也有独有的参数,如进程号等。但是此后他们是独立的两个进程。在子进程里创建的东西是子进程的,在父进程创建的东西是父进程

操作系统实验报告3

操作系统实验报告 实验名称:________文件的操作和使用________________________________________ 成绩:___________ 专业班级:____商务1101____ 姓名:____张怀平______ 学号:__1112200108___________ 联系电话:_613836________ 实验日期:2013 年6月6日实验报告日期:2013 年6月6日 一、实验名称 文件的操作和使用 二、实验目的 熟悉文件系统的操作和使用方法。 三、实验设备 一台带有虚拟机的计算机设备。 四、实验步骤 1:测试COPY文件时性能与缓冲大小的关联性; 2:用密码串逐字符异或操作来实现对一个文件的加/解密。 五、实验数据、结果分析 1. 写一段java文件复制程序: package com; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;

import java.io.IOException; public class FileCopy { public static void main(String[] args) throws IOException { fileCopy("a.txt", "b.txt"); } public static void fileCopy(String in, String out) throws IOException { long time1 = System.currentTimeMillis(); FileInputStream inFileInput = new FileInputStream(in); FileOutputStream outFileOutPut = new FileOutputStream(new File(out), true); byte[] bytes = new byte[1024]; int i; while ((i = inFileInput.read(bytes)) != -1) { outFileOutPut.write(bytes, 0, i); } inFileInput.close(); outFileOutPut.close(); System.out.println("需要时间:" + (System.currentTimeMillis() - time1) + "毫秒"); } } 结果: javac FileCopy.java java FileCopy 需要时间:15毫秒 2. 写一段java用异或对文件进行加密的程序: package com; import java.io.File;

相关文档
最新文档