先进先出(FIFO)置换算法讲解

基本思想

先进先出(First In first Out,FIFO) 页面置换算法,每次置换最先调入内存的页面,即将内存中等待时间最长的页面进行置换。此算法的适用范围是顺序结构程序

实现原理

这和我们现实生活中的排队方式很相似, 先进队伍的人会先买到票, 然后先从队伍中离开。如果使用FIFO算法作为页面置换算法, 缓存空间大小是三个页面时, 一次进入Page1, Page2, Page3。当Page4要进入缓存时, 操作系统将会把Page1清除出缓存, 将Page4加入至缓存中。如果再有Page5要进入缓存时, 操作系统会将Page2清除出缓存空间, 以此类推。

实现过程

比如有下述页面走向:1, 2, 3, 4, 2, 1, 5, 6, 2, 1, 2, 3, 7, 6, 3, 2, 1, 2, 3, 6。当内存块数量分别为3时, 我们算一算使有此方法时产生的缺页次情况。 (注意, 所有内存块最初都是空的, 凡第一次用到的页面都产生一次缺页。)
当内存块数量分别为3时, FIFO算法的执行过程如下图所示。
打叉的表示发生了缺页, 共缺页16次。

示例题目

已知页面走向为1、2、1、3、5、3、2、4、5、2、1、3、1、2、5当分配给该作业的物理块数分别为3时,试分别计算采用FIFO页面淘汰算法时缺页次数为多少,缺页率为多少?页面置换次数是多少? (写出计算步骤)

走向

1

2

1

3

5

3

2

4

5

2

1

3

1

2

5

1

1

1

1

1

5

5

5

5

5

5

1

1

1

1

1

2

2

2

2

2

2

2

4

4

4

4

3

3

3

3

3

3

3

3

3

3

3

2

2

2

2

2

5

缺页

缺页次数=9  缺页率=9/15*100%=60%   页面置换次数:6

优点

先进先出页面置换算法的优点是其实现起来比较简单,可以不需要硬件的支持, 因而不需要增加系统的成本。

缺点

没有考虑到缓存页面被使用的情况。如果一个页面被频繁访问, 我们应该将它保留在缓存中, 这样就能够提高程序的性能。但是使用FIFO算法, 很可能将一个被频繁访问的页面清除出缓存, 所以FIFO算法在实际的应用中是很少被使用到的, 但是这种思想是计算机系统中常常被采用的。
在大数情况下,先进先出页面置换算法缺页率比较低或会产生Belady异常现象。

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
页面置换算法课设 private void FIFO_button1_Click(object sender, EventArgs e) { if (page.Length == 0 || strsize.Length == 0) MessageBox.Show("输入得页面序列或物理块数不能为空", "提示", MessageBoxButtons.OK); else { //初始化数据,并访问第一个页面 int i, j, u, losecount, changecount = 0; for (i = 0; i < size; i++) { X[i].Num = -1; X[i].Timer = 0; } X[0].Num = page[0]; X[0].Timer = 1; FIFO_label.Text = "FIFO\n" + (X[0].Num - 48).ToString() + "\n"; losecount = 1; //循环,按照页面序列,选择淘汰的页面并进行置换 for (i = 1; i < page.Length; i++) { u = 0;//进程的内存中是否存在要访问的页面的标记 //若内存中存在要访问的页面,则设置u=1,并退出循环 for (j = 0; j < size; j++) { if (X[j].Num == page[i]) { u = 1; break; } } //若内存中不存在要访问的页面,且内存中无空闲的空间则进行下列置换 if (u != 1 && X[size - 1].Num != -1) { j = GetMaxTime();//选择呆的时间最长的页面进行置换 X[j].Num = page[i]; X[j].Timer = 0; changecount++; losecount++; } //若内存中不存在要访问的页面,且内存中有空闲的空间则进行下列置换 if (u != 1 && X[size - 1].Num == -1) { for (j = 0; j < size; j++) { if (X[j].Num == -1) { X[j].Num = page[i]; losecount++; break; } } } //对内存中不为空的页面的时间加1 for (j = 0; j < size; j++) { if (X[j].Num != -1) X[j].Timer++; } //输出数据 for (j = 0; j < size; j++) { if (X[j].Num != -1) FIFO_label.Text += (X[j].Num - 48).ToString(); else FIFO_label.Text += " "; } FIFO_label.Text += "\n"; } FIFOlosepage = (float)losecount / (float)(page.Length);//缺页率 FIFO_label.Text += "访问次数是:" + page.Length + "\n页面置换次数:" + changecount + "\n缺页中断次数:" + losecount + "\n缺页率是:" + FIFOlosepage; } } (3)LRU置换算法 private void LRU_button1_Click(object sender, EventArgs e) { if (page.Length == 0 || strsize.Length == 0) MessageBox.Show("输入得页面序列或物理块数不能为空", "提示", MessageBoxButtons.OK); else { //初始化数据,并访问第一个页面,并输出访问结果 int i, j, u, losecount, changecount = 0; for (i = 0; i < size; i++) { X[i].Num = -1; X[i].Timer = 0; } X[0].Num = page[0]; X[0].Timer = 1; losecount = 1; LRU_label.Text = "LRU\n" + (X[0].Num - 48).ToString() + "\n"; //循环,按照页面序列依次访问页面,并输出访问结果 for (i = 1; i < page.Length; i++) { u = 0; //如果内存中存在要访问的页面,则置Timer为0,u为1 for (j = 0; j < size; j++) {
FIFO(First-In-First-Out)是一种简单的调度算法,它按照作业或进程到达的顺序来安排它们的执行顺序。以下是一个用C语言编写的FIFO调度算法的示例程序: ``` #include <stdio.h> #include <stdlib.h> #define MAX_JOBS 100 typedef struct Job { int job_id; int arrival_time; int execution_time; } Job; void fifo(Job jobs[], int num_jobs) { int current_time = 0; int total_wait_time = 0; int i; for (i = 0; i < num_jobs; i++) { if (jobs[i].arrival_time > current_time) { current_time = jobs[i].arrival_time; } int completion_time = current_time + jobs[i].execution_time; int wait_time = current_time - jobs[i].arrival_time; printf("Job %d:\n", jobs[i].job_id); printf("Arrival time: %d\n", jobs[i].arrival_time); printf("Execution time: %d\n", jobs[i].execution_time); printf("Completion time: %d\n", completion_time); printf("Wait time: %d\n\n", wait_time); current_time = completion_time; total_wait_time += wait_time; } float average_wait_time = (float) total_wait_time / num_jobs; printf("Average wait time: %.2f\n", average_wait_time); } int main() { int num_jobs; Job jobs[MAX_JOBS]; int i; printf("Enter the number of jobs: "); scanf("%d", &num_jobs); for (i = 0; i < num_jobs; i++) { printf("Enter arrival time and execution time of Job %d: ", i + 1); scanf("%d %d", &jobs[i].arrival_time, &jobs[i].execution_time); jobs[i].job_id = i + 1; } fifo(jobs, num_jobs); return 0; } ``` 在此示例程序中,我们首先定义了一个`Job`结构体,用于存储作业的信息,包括作业ID、到达时间和执行时间。然后,我们实现了一个`fifo`函数,该函数接受一组作业以及作业的数量作为输入,并根据FIFO调度算法进行调度。最后,我们在`main`函数中读取输入作业的数量和每个作业的到达时间和执行时间,并调用`fifo`函数来进行调度并输出结果。 希望以上示例能帮助您理解如何编写一个实现FIFO调度算法的程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值