オペレーティングシステムがアプリケーションプログラムに対して提供するインターフェースの重要性を2つ述べよ。一つ目の重要性は、プログラマがハードウェアのことをあまり意識しなくてもプログラミングできるようにすることである。これにより、プログラマがプログラミングするための手間を大幅に削減することが出来る。二つ目の重要性は、アプリケーションソフトの互換性を保障することである。ンピュータ同士では、アプリケーションソフトを改変しなくては同じ動作をさせることである。OS毎に実行するソースコードを変更させることで具現化できる。これにより、プログラマが、プログラムを移植する際に被る手間を削減することが出来る。各自が聞いたことがあるOSの名前を4つ述べ、その特徴を説明せよ。OSASK:OSの実行効率向上を追求したOS。実行効率を上げるため、低級言語を用いてプログラムされているところも比較的多い。簡単にWindowsとUbuntoのデュアルブートを実現できるようになるOS。Knoppix:CDやDVDから起動することが出来る。ハードウェアを自動で認識してくれるので、例えば、Knoppixから他OSで生成したファイルにアクセスすることができる。Windows:OS市場で最も高いシェア率を持つOS。新旧の互換性に優れている。Macintosh:ハードウェア設計とOS開発を同時に手がけていて、ハードとソフトとの統一感に優れている。OSが使用できなかった場合、ユーザプログラマが記述する必要があるプログラムはどのように変わってくるのか200字程度で説明せよ。OSが使用できない場合は、OSが提供するAPIを使用することができないので、CPUの提供する機能以外は使用することができない。加えて、OSの提供するABIも使えなくなるため、例え命令体系が似ているマイクロプロセッサであったとしても、プログラムを移植することができなくなる。C言語を実行する場合にスタックはどのように使用されるのか?特に、Cの関数を呼び出すときにスタックがどのように使用されるかに関して説明せよ。スタックは、現在レジスタに格納されている値を、FIFOなどの方式を用いて一時的に非難させるために用いられる。いる非難させた値をレジスタに戻してあげることになる。することで、どのような関数を呼び出したとしても、使う予定のレジスタが書き換えられるというような危険性がなくなる。キャッシュメモリと命令パイプラインに関してそれぞれ100字程度で説明せよ。シュメモリ:記憶装置の一つで、メインメモリとレジスタとのアクセス速度の格差を緩和させるためのメモリである。メモリほど離れているわけではない。キャッシュ>レジスタという順になっている。命令パイプライン:CPUの処理速度を高速化する方法で、LOAD命令やSTORE命令に必要なphaseを固定長にすることで、CPUが行う様々な命令を並列的に処理することができる。現在、ほとんどのCPUがこの方法を用いて命令を実行している。コンテキストスイッチとプロセススケジューリングに関してそれぞれ100字程度で説明せよ。ンテキストスイッチ:CPUの状態を保存・復元させて、複数のプロセスを1つのCPUに割り当てること。するときには、複数のプロセスを同時進行しているかのように見せる必要がある。同時に扱うことができない。同時進行しているかのように見せることができる。プロセススケジューリング:CPUに効率よくプロセスを割り当てること。きにコンテキストスイッチを使い、次にどのプロセスをCPUに割り当てるのかによって、システム全体にスループットや、リアルタイム性に変化が生じる。プログラムを実行する上で、プログラムカウンタとスタックポインタの役割を100字程度で説明せよ。プログラムカウンタ:CPU内部にあるレジスタの一つで、次に実行する命令のアドレスが入っている。1つの命令が終わると、固定された値を現在のプログラムカウンタに加算する。このとき、プログラムカウンタの指すアドレスが次に実行する命令のアドレスとなる。スタックポインタ:CPU内部にあるレジスタの一つで、スタックポインタに格納されている値は、今扱っているスタックのトップの場所を指している。プログラムから違うプログラムを呼び出すとき、プログラムカウンタの値をスタックポインタに詰め込むことで、呼び出されたプログラムから元いた番地に戻ることが出来る。プログラムを実行するときに、どのようにメモリ空間が利用されるかを100字程度で説明せよ。図を使用してもかまわない。プログラムを実行するとき、メモリ空間からそのプログラムの実行に必要なメモリ容量を確保する必要がある。起こっていた場合は、「連続して空いているメモリ空間≧確保したいメモリ容量」の場所をメモリ空間の中から探し出す。条件にあう場所を発見したら、その場所を使ってプログラムの実行を行う。ユーザ空間とカーネル空間の2つのメモリ空間が存在する理由を100字程度で説明せよ。カーネル空間とユーザ空間を分けることで、ユーザ空間を使ってカーネル空間の内容を書き換えられないようにすることが出来る。これにより、悪意をもってカーネルを破壊しようとするプログラムから、カーネル空間におかれている内容を守ることが出来る。10年後のコンピュータがどうなっていると思われるか各自の意見を述べよ。そのコンピュータは20年後のコンピュータとはどう違うと予測するか?ムーアの法則から、10年後にはマシンのスペックが少なくとも約7倍向上することが予想される。加えて、様々なモノに組み込み系の技術が使われ、色々なモノが電子化されていくと考えている。20年後には、電流ではなく光を使ったCPUが使われ、CPUの処理速度は今よりも格段に向上すると考える。加えて、様々なモノに組み込まれるOSが規格化され、組み込み系ソフトの入っているモノ同士の通信が容易になると思う。普通は、OSのデータ構造にはアクセスできない。システムコールを介してのみ、アクセス可能。structについてC言語とはOSを作るのに適切な言語。低水準programmingassembly言語はCPU毎にソースコードが違う→移植するときは全部変更しなくてはいけない。C言語の場合、大抵使いまわせる。C言語には予約語が一杯ある。→JAVAに似ているが、CLASSの概念はない。C言語は分割しても一括してもどちらでも大丈夫。→どの関数をどのファイルに置くかを考える必要がある。Structure-宣言部-main関数-そのほかの関数C言語を使うときは、型のbyte数を把握する必要がある。JAVAの"NEW"に近いallocateをするためには、sizeof(型)をやって自分でbyte数を確保する必要がある。・auto(自動変数)関数内部の変数とか。関数から出たら、解放する。・static(静的変数)呼び出すかどうかに関わらず、いつでも存在する。EX:staticで大きい配列はダメ・Register(レジスタ変数)register上に置くので、早くなるかもしれない。使っても無視されることがしばしばある。・exterm(外部参照変数)プログラムの外に変数を書く。関数内の変数をstaticにすると、以前使ったときの結果が残っている。main()引数の数は自分で数える。gccは良いが、他のコンパイラには引数をカウントしないものもある。→clashしてdownする可能性がある。foo(int);compilerがcheckしてくれる。"queue.h"↓preprocessorがlibraryの中にある"queue.h"をソースファイル内に展開する。stdout)xは引数としてマクロ展開する。用途:何行も使うものをまとめるときに使う。