基本情報技術者試験

CPUを効率的に使うには?

ぼく

こんにちは、まさとです。

ぼく

今回はCPUを効率よく動かすために
OSは何をしているかをみていきます

タスクスケジューリング

どのような順番でタスクを実行すべきか

到着順方式

一番単純なもので前から順番に
処理していくという方法です。

タスクは上図のように実行待ちの状態で絵
列になって並んでいます。

それをディスパッチャというものが
次はあなたですよと
指示出ししてくれています。

ただ、一度やったら処理を辞めないという
ノンプリエンプティブなスケジューリング方式なので
効率はあまり良くありません。

ノンプリエンプティブがわからないという方は
下記記事を一読していただけると
理解することができますので是非!

優先順方式

タスクそれぞれに優先度がついていて
優先度が高いものから処理していくという方式です。

今実行しているものよりも
優先度が高いタスクが来たときに
今実行しているタスクを
一番後ろに回して実行するというものです。

簡単にいうと順番抜かしをするという感じですね!

ただ優先度の低いタスクが
永遠に実行されないということも考えられます。

これをスタベーションと言います。

スタベーションを防ぐためにも
前記事で紹介したような
タイムスライシングなどと
混ぜて使われることが多いです。

ラウンドロビン方式

処理時間を決めて、
順にタスクを処理する方式です。

CPUを効率的に使うには?

CPUで処理できる数は限られてますので
できるだけ有効に使いたいですよね。

効率よく使うために色々な解決方法があります。

ここからは聞き慣れない言葉も多く出てくるので
ゆっくり読んでくださいね。

スプーリング

一時的に記憶領域に保存し、
処理の高速化を図るものです。

CPUから「これを出力してください」と
命令があったとします。

プリンターの処理速度は遅いので
出力が終わるまで待ってたら
CPUが働かない時間ができてしまいます。

そのため記憶領域に投げて、
CPUは他の仕事に移ります。

そして、出力が終わると
また記憶領域から先程のデータをとってきて
処理を再開すると言った流れになります。

マルチプログラミング

プログラムを複数組み合わせて
実行することで高速化を図ります。

入力出力などの処理中はCPUが暇しています。

そのため、

「入出力中は暇だから
他の処理をやっとくよー」

と言った考え方です。

メモリ領域を効率的に使うには?

CPUにはまだ解決すべき問題点があります。

それは「限られたメモリ領域をどのように使うか」です。

メモリ領域というのは作業机のようなもので
作業するときに使う記憶領域です。

机ということもあり容量は小さいもののため
これを効率的に使わないといけません。

仮想記憶管理

仮想記憶領域とはメモリっぽい役割を与えられた
HDDなどの一部を指します。

よく使うものはメモリ上に置いておいて、
あまり使わないものをハードディスクの中にしまっておきます。

使うべき時が来たら、
ハードディスクの中から取り出して使います
みたいな感じです。

これをすることで
メモリにはこれだけしか入らないから、
この大きさのプログラムしか実行できないみたいなことが
なくなります。

より自由にメモリ領域を使うことができるってことですね。

固定区画方式

メモリ領域に対して初めから区画を分けておくものです。

元々決まっているため、無駄な部分が出てくることも多いです。

可変区画方式

プログラムに応じて調整する。
自由に仕切りを動かすことができます。

スワッピング

プログラムはメモリの中に入れたり出したりします。
使うものを入れて、使わないものは出しておく。
と言ったような処理が必要です。

プログラムを入れるときはスワップイン

プログラムを出すときはスワップアウト

と言います。

フラグメンテーションの対処

上記で出てきた、可変区画方式は
便利な反面問題点も出てきます。

それがフラグメンテーションです。

フラグメンテーションとは
とびとびにデータが存在してしまうことで
限られているメモリ領域の中に無駄があるのは
勿体無いですよね。

無駄な部分を詰める作業が必要になります。

そのためメモリコンパクションという方法で
適宜つめてあげる必要があります。

ページングとは

物理的な配置可能領域より大きなプログラムを
ロードするための仕組みです

例えば2Gしかのせれないメモリに
4Gのデータはどう頑張ってものりません。

10冊しか入らない本棚にどう頑張っても
20冊いれることはできないのと同じですね。

そんなときにページングという方法が使われます。

ページングとは
データを分けて順番に
メモリに乗せていくということをします。

分けると言ってもどう分けるのかとなりますが、
この分け方も非常に重要です。

ほしいデータがメモリ上になくて、
それをHDDなどから引っ張ってくると
時間がかかってしまいますよね。

それだとあまり効率が良くありません。

上記の目的のデータがメモリ上にないことを
ページフォールトと呼んだりします。

ページ書き換えアルゴリズム

ページフォールトを避けるために
色々なアルゴリズムがあります。

FIFO(First In FirstOut)

最初にページインしたものから
順にページアウト対象とする。

LIFO(Last In First Out)

最後にページインしたページを
ページアウト対象とする。

LRU(Least Recently Used)

最も長い間参照されていないページを
ページアウト対象とする。

LFU(Least Frequently Used)

最も参照回数の少ないページを
ページアウト対象とする。

このようにアルゴリズムで
ページフォールトを無くすように
努力しているんですね。

最後に

いかがだったでしょうか。

今回の内容をまとめます。

✔️本記事のまとめ
  • タスクスケジューリングとは
  • CPUを効率的に使うには
  • 限られたメモリを効率的に使うには
  • フラグメンテーションの対処
  • ページングとは
ぼく

お疲れ様でした。

悩む人

CPUを効率的に使うために
こんな色々してるとは、、

ぼく

遅いパソコンは使う気に
ならないですからね。

今回はOSの具体的な
仕事を解説してきました!

タスクスケジューリングにはどんな方法があったか
仮想記憶管理とは何か
固定区画方式、可変区画方式とは何か
フラグメンテーションの対処はどうするか

この4つしっかり
答えれるようにしてくださいね。

ぼく

以上、まさとでした。