#A. 操作系统
操作系统
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述
在操作系统中,内存分配管理是非常关键的问题。一台计算机的内存是有限的,当我们用计算机处理程序的时候,我们需要将程序和它所定义的数组等信息加载进内存中间。如果对内存的分配不当,那么我们将无法运行更多的程序。
为了简化这个问题,我们认为一台有 Byte内存的计算机的内存空间是一个长度为的格子,编号为。在计算机处理程序的过程中,他会运行一些程序和释放一些程序。当计算机运行一个需要使用 Byte空间的程序时,它会在空闲可使用的内存空间中寻找一段长度大于等于 Byte的连续内存空间,将程序放入这段内存空间中。当计算机需要释放一个程序时,它会回收程序原先使用的内存空间到空闲可使用的内存空间段中。
例如,下图是在Byte的计算机中执行(运行Byte的程序,运行Byte的程序,运行Byte的程序,释放程序,运行Byte的程序,运行Byte的程序)的示意图。
观察上图,我们发现第6次操作,计算机仍然剩余Byte空间,但是由于这Byte的空间不是连续的,导致无法给程序分配空间。于是我们想到一些优化的办法:
- 我们没有规定寻找一段长度大于等于Byte的内存空间找的是哪一段,如果我们找到的运行程序的空间是后面那一段,那么我们就有空间运行程序了。于是我们规定:每次给将要运行的程序寻找大于等于其所需内存空间的空闲内存空间段中,最小的那一条。如果最小的有多个,选择起始格子最靠左的那一个。将我们的程序分配到该空闲内存段中最靠左的一部分里。例如:当我们要给一个Byte的计算机执行(运行Byte的程序)时,已经在运行的程序占据了时,我们会选择这个空闲段,因为这一段在四个空闲内存段中大小是大于等于的最小的一段,虽然和一样都是Byte,但是更靠左,因此依据题意我们选择。接着我们将程序分入。这种方案在内存分配中叫做最优适配(Best Fit)。
- 当采用上面一条规则没有找到可以使用的内存空间时,我们首先判断剩余的所有空闲内存段的空间和是否大于等于该程序所需的内存空间。若小于,则直接返回Fail,否则我们将所有已分配内存空间的程序所占内存空间向左靠拢。这样可以在最右边挤出一点空间。将程序分配到该空闲内存段中最靠左的一部分里;例如:当我们要给一个Byte的计算机执行(运行Byte的程序)时,原先的程序已经占据,我们发现找不到一段大于等于Byte的空闲空间,于是我们通过上述规则将已分配的程序内存空间左移,变为,此时右边挤出空闲空间,我们将程序分配进。这种方案在内存分配种叫做紧凑。
现在,给你一台 Byte的计算机以及次分配操作,请你依据最优适配和紧凑的原则,对程序运行空间进行分配和释放。
输入描述
第一行两个正整数。
接下来行,每行两个正整数。若,则表示一次分配操作,你需要将占用 Byte内存空间的程序按题中所述原则分配进内存。若,则表示一次释放操作,你需要将第次分配操作对应的程序从内存中释放,输入保证第次分配操作为成功的分配操作,且在该操作前未被释放。
输出描述
输出共行。
对于每次分配操作,若分配成功,输出给程序分配的内存中,编号最靠左的格子编号。若分配失败,输出Fail
。
对于每次释放操作,输出被释放的程序释放前占用的最靠左的格子编号。
样例输入
30 15
1 10
1 10
1 10
2 2
1 8
1 3
2 1
1 3
1 8
2 7
1 9
2 6
2 4
2 3
2 8
样例输出
1
11
21
11
11
Fail
1
1
22
22
22
1
4
12
22
样例解释
数据范围
测试点编号 | n | q | 性质 |
---|---|---|---|
1 | |||
2 | AB | ||
3 | B | ||
4 | |||
5 | AB | ||
6 | B | ||
7 | |||
8 | AB | ||
9 | B | ||
10 |
性质A:没有内存释放操作。
性质B:保证每次采用最优适配均能成功。