C++で学ぶオペレーティングシステムの固定(静的)パーティショニング
固定パーティショニングとは
このチュートリアルでは、オペレーティングシステム(OS)における固定パーティショニング(Fixed Partitioning)、別名静的パーティショニングについて解説します。
固定パーティショニングは、OSでメモリを管理するための古典的な手法の一つです。この方式では、メインメモリをあらかじめ決められたサイズのブロック(パーティション)に分割します。各ブロックのサイズは事前に定義されており、システムの稼働中に変更することはできません。
分割された各パーティションには、連続した(コンティギュアスな)領域としてプロセスが1つずつ割り当てられます。
固定パーティショニングの特徴
- メモリは固定サイズのブロックに分割される
- パーティションの数とサイズは事前に決定され、実行時には変更不可
- 1つのパーティションには1つのプロセスのみが割り当てられる
- 実装がシンプルでオーバーヘッドが少ない
注意点:内部フラグメンテーション
固定パーティショニングの最大の欠点は内部フラグメンテーション(内部断片化)です。プロセスのサイズがパーティションのサイズより小さい場合、余ったメモリ領域は無駄になってしまいます。例えば、サイズ4のパーティションにサイズ1のプロセスを割り当てると、3の分だけメモリが無駄になります。
サンプルプログラム
それでは、プロセスサイズに基づいてメモリを割り当てるサンプルプログラムを見てみましょう。このプログラムでは、空いているブロックの中から、プロセスサイズが収まる最初のブロックを順に探して割り当てる(ファーストフィット方式)実装になっています。
#include<iostream>
using namespace std;
int main() {
int blockNumber = 5, processesNumber = 3;
int blockSize[5] = {4, 4, 4, 4, 4}, processSize[3] = {1, 2, 3};
int flags[5], allocation[5];
for(int i = 0; i < 5; i++) {
flags[i] = 0;
allocation[i] = -1;
}
// プロセスにブロックを割り当てる
for(int i = 0; i < processesNumber; i++) {
for(int j = 0; j < blockNumber; j++) {
if(flags[j] == 0 && blockSize[j] >= processSize[i]) {
allocation[j] = i;
flags[j] = 1;
break;
}
}
}
for (int i = 0; i < blockNumber; i++) {
if (flags[i] == 1) {
cout << "Process " << processSize[allocation[i]] << " is allocated" << endl;
}
}
return 0;
}
実行結果
上記のプログラムを実行すると、以下のような結果が得られます。
Process 1 is allocated
Process 2 is allocated
Process 3 is allocated
プログラムの解説
このプログラムの処理の流れは以下の通りです。
- サイズ4のブロックを5つ、サイズ1・2・3のプロセスを3つ定義します。
- flags配列で各ブロックの使用状況(0=未使用、1=使用中)を、allocation配列で割り当てられたプロセスの番号を管理します。
- 各プロセスについて、未使用かつプロセスサイズ以上のブロックを先頭から順に探し、見つかり次第そこに割り当てます。
- 最後に、割り当てが完了したプロセスの情報を出力します。
まとめ
固定パーティショニングはシンプルで実装しやすいメモリ管理手法ですが、内部フラグメンテーションによってメモリが無駄になりやすいという課題があります。このチュートリアルについてご不明な点がある場合は、ぜひコメント欄でお知らせください。
-
C++で点集合の線対称(ラインリフレクション)を判定するアルゴリズム
問題概要2次元平面上にn個の点が与えられます。このとき、y軸に平行な直線で全ての点を鏡映(反射)した結果が、元の点集合と完全に一致するような直線が存在するかどうかを判定します。言い換えれば、ある直線を対称軸として全ての点を反転させたとき、反転後の点の集合が元の集合と同一になるかを確認する問題です。例えば、入力が points = [[1,1],[-1,1]] の場合を考えてみましょう。この場合、x = 0 の直線(y軸)を対称軸とすると、点 (1,1) は (-1,1) へ、(-1,1) は (1,1) へと移ります。点集合全体としては変化がないため、出力は true となります。解法のポイン
-
C++で解く対角トラバースII:リストのリストを対角順に出力する方法
問題の概要 「リストのリスト」である nums が与えられたとき、そのすべての要素を対角順(ダイアゴナルオーダー)に並べて出力するのがこの問題の目的です。 たとえば、次のような行ごとに長さの異なる配列(ジャグ配列)が入力として与えられた場合を考えてみましょう。 このとき、期待される出力は次のとおりです。 [1, 6, 2, 8, 7, 3, 9, 4, 12, 10, 5, 13, 11, 14, 15, 16] 解法のアプローチ この問題は、各要素を「値と座標のセット」として一旦記録し、対角線ごとの順序になるようにソートし直すことで解けます。具体的な手順は以下の通りです。 結果を格納す