計算機システムの最近のブログ記事

計算機システムの授業のシメということで、 ネットワークのセキュリティ対策の説明を行う。 以下、キーワード抜粋。

セキュリティトラブルの原因

  • ウィルスによる嫌がらせ
    • 愉快犯
    • 個人情報収集目的
    • 実行プログラムの添付ファイル
    • 記録媒体経由の感染
    • メールソフトの不備を攻撃(バッファオーバーフローなど)
  • リモート接続での乗っ取り
    • クラッキングの踏み台
    • 個人情報収集
  • DoSアタック
    • サービス停止
  •  悪さをしかける方法は様々。(総称してマルウェア)

対策

  • ウィルス対策ソフトの導入
    • ウィルスデータベースとの比較による検出
    • 変異型ウィルス
  • ファイアウォール
    • 様々なネットワークサービスで、サーバ側プログラムの不備を攻撃。
    • 不備のあるサーバは絨毯爆撃方式
    • 不用意にネットワークサービスに接続させないために
        ポートを塞ぐ。怪しいIPアドレスをブロック
  • 個人レベルで防げない事例
    • DNSポイズニング
    • 特定攻撃型ウィルス
  • 個人情報収集と暗号化
    • パケットスニッファ・WiFiの簡単な暗号化の危険性
    • SSL通信と公開鍵暗号
    • SNSでの不用意な友達申請の脅威
    • パスワードの2段階認証
    • どうすべきか
      • ウィルス対策ソフト
      • ファイアウォール
      • OSとウィルス対策ソフトのデータベースの更新
      • ウィルス情報に注意
      • 怪しい添付を開かない、怪しいサイトに近づかない。
    • ウィルスなどの被害にあったら、即ネットワーク切断。
      • 別パソコンでウィルス情報や対策ソフトを仕入れて書き込み禁止USBで。
      • 放置すれば、Botで被害拡大の手助けとなる。

プログラムが、OSによってRAMに呼び出されて動く仕組みや、高級言語の動くしくみを説明する。

コンピュータの構成

コンピュータの基本的構成部品は、CPU,主記憶,補助記憶,周辺装置。 CPUは、メモリから機械語の命令を読み取り(Fetch)、解析(Decode)、メモリ読み出し(Read)、実行(Execute)、メモリ書き込み(Write)を繰り返す。 メモリは、読み出しだけのROMと、読み書きのRAMから構成されるが、 ROMだけでは自由にプログラムを入れ替えて動かすことができない。

コンピュータは電源が入ると、OSを起動するために、ROMに入っている周辺装置を扱い方のBIOSを使い、 OSを起動させるためのプログラム(ブートローダ)を起動する。ブートローダは最終的にOSを起動させ、 ユーザプログラムの起動を待つ。ユーザのプログラム起動要求により、補助記憶装置から プログラムを主記憶に読み出し、実行を行う。

プログラムが動くしくみ

プログラムといっても、コンパイラ方式、インタプリタ方式などがある。 コンパイラは高級言語で書かれたプログラムを、直接実行可能な機械語に変換しておく。 このため、実行時の速度は速い。しかし、プログラムの実行するには、コンパイル・リンクなどの手間が必要となる。また、元々のプログラムがどういった記述なのか解析は困難。 インタプリタ方式は、高級言語のソースを必要に応じて命令の意味を解析し、その都度実行を行う。 このため、プログラムの試作段階で動作を確認しながら開発を行う際には便利である。 しかし、プログラムを実行する際に、高級言語のソースコードが必要となる。 最近では、バイトコードインタプリタ方式と呼ばれる方式もよく利用される。 高級言語の命令を、実行しやすい機械語に近いシンプルな命令にコンパイルし、実行を行う。

一般的なコンパイラ方式では、プログラムを実行するまでに、

  • 高級言語のソースを、コンパイルし中間コードを生成
  • 中間コードと、ライブラリ(一般的な関数の処理の中間コードをまとめたもの)を組み合わせて、機械語を生成(リンク処理)

といった手順をとる。

最近のOSは、マルチユーザ・マルチタスクであるため、ライブラリの機械語は同時に動く他のプログラムでも同じように使われている場合が多い。この時、ライブラリの機械語コードがメモリ上に複数あると、 メモリの無駄や、ライブラリの更新の手間が増える。 このため、最近のOSでは、動的リンクライブラリという方式を使い、ライブラリを共有して用いる。

専攻科1年の計算機システムの初回。 生産システム全員+環境システム1名で始まった。

計算機システムの授業などについて、シラバスを使って説明した後、 最初の授業として、コンピュータの歴史などを概説。

計算機の歴史

ENIACに始まり、演算素子の変化から、 第一世代(真空管)、第二世代(半導体)、 第三世代(IC)、第3.5世代(LSI)、第四世代(VLSI)との変遷を説明する。

次に学生自身が縁の深いということで、パソコンの歴史などを説明する。 電卓向けのi4004から、8bitコンピュータi8008が発生し、 パソコンの普及で、i8080(Z80を含む)、MC6800(6502,6809)などが 使われていく。

性能があがり、16bitコンピュータに移行する際には、i8086のIBM-AT機 向けに MS-DOS(Microsoft) が開発される。この際に機械語の命令互換性 を考慮したことから、この後、Intel のプロセッサが広く普及していく。 一方、モトローラの16bitコンピュータ68000は、命令互換性が低く、 売れ行きが伸びないながらも、Apple社のMacintoshに採用され、 GUIの操作性の良さから教育機関などでは普及が進んだ。 MacintoshのGUIの成功は、Microsoft社にも及び、Windows が開発される。

MacintoshやWindowsのGUIが普及すると、複数のアプリケーションを使う ことが当たり前となり、これまでのシングルユーザ・シングルタスクな OSでは不十分となり、マルチユーザ・マルチタスクなOSが必要となった。 これらのOSでは、他のアプリケーションの不具合の影響を受けないために、 メモリ保護機能などが重要となってきた。 GUIのために十分な処理速度とメモリ保護機能などを備える必要から、 32bitコンピュータが出てきた。

32bitコンピュータとして、Intelの80386やモトローラの68030などが 生まれるが、16bit移行時の市場を Intel が握っていた。 このため、WindowsとIntelの影響力が大きいことから、Wintelといった 言葉で揶揄されることも多かった。

32bitコンピュータの普及と共に、Windowsでは、シングルタスク・ シングルユーザのWindows/95などから、マルチタスク・マルチユーザな、 Windows NT/2000/Xp に移行していく。

一方、このWintelの市場の独占には、情報開示とサードパーティによる 競争が大きく影響している。16bitコンピュータでi8086が普及したのは、 IBMがAT機のハードウェアの情報を広く開示し、それにそってAT互換機が 開発され、大量生産による価格競争と性能競争がおこり、安価で高性能 なものが大量に作られたことが原因となっている。

16bitコンピュータが普及する頃には、インターネットの普及も進んだ。 特に、Windows/95 が普及に貢献している。 この一方、OS では、汎用機の高性能なマルチユーザマルチタスク機能の、 Multics を小型コンピュータに移植した unix が生まれている。 これらは、インターネットを支えるサーバなどで広く普及している。

そして、unix は 32bitのi80386で動くようにと、Linux が開発される。 特に、Linuxは、GNUライセンス(無償利用可、改良を加えたら必ず改良物も 公開)であったため、インターネットの普及とともに広く利用されるように なっている。最近では、Android 携帯に Linux が使われている。

ライブラリとOSの基礎

前回の説明で未消化であった部分のライブラリの説明を行った後、 OSの機能について説明する。

ライブラリ

動く機械語プログラムが出来上がるまでの流れとして、 高級言語が、コンパイラによって中間コード(機械語+未完成の組込関数呼出し)が作られる。 中間コードは、組込み関数などのライブラリと、リンカー(リンケージエディタ)によって、 組合せられ、最終的な機械語が生成される。

ただし、マルチタスクなOSでは、主記憶上でプログラムが動くと、 だれもが使うようなprintf,scanf,sin,cos,...,GUIな処理といったライブラリ処理は、 メモリ上に複数存在するとメモリを効率よく利用できない。 古いOSでは、ライブラリの機械語は、静的リンクによりそのまま機械語の中に 埋め込まれていた。 しかし、最近のOSでは、動的リンク機能により、共通のライブラリを 利用するようになってきた。 動的リンクを使えば、ライブラリ内の処理に間違いが見つかった場合に、 動的リンクライブラリを修正するだけで良いため、OSの不具合修正でも便利となる。

OSの基本

OSは、一般的に基本プログラムなどと呼ばれ、ハードウェアの違うコンピュータでも、 共通となるOSを利用すれば、OS上で動くソフトウェアの共通化ができる。

OSは、制御システム(プロセス制御,メモリ制御,入出力制御,ファイルシステム制御)と呼ばれる、 処理の根幹(kernelなどと呼ばれる)の部分が、最も重要な機能である。 これに、開発環境(コンパイラ、リンケージエディタ、デバッガ)と、 ユーティリティプログラム(コマンドラインインタプリタ/CUI と、グラフィック操作/GUI ) から構成される。

OSを利用すれば、制御システムによりコンピュータ操作の基本的部分で、 プログラムの起動・メモリ管理・周辺装置の利用などの共通化が可能となる。 これらの周辺装置などの物理的なハードウェアや、メモリの使用、CPU処理時間などは、 一般的に資源と呼ばれる。 最近のOSでは、資源の使い方の共通化だけでなく、 資源を適切に扱うための保護機能も重要となってきている。

プログラムが動くとは

プログラムが動くときには、その処理単位としてプロセスがあり、 プロセスでは利用するメモリ領域が決められ他から触れないようになっている。 ユーザに対して一連のサービスを、複数のプロセスで提供している場合、 この処理単位はジョブと呼ばれる。 また、最近のOSでは、並列処理を行う際に、複数の並列処理プログラムが 1つのメモリを共有したほうが便利である。この複数のメモリを共有した処理の個々は、 スレッドと呼ばれる。

また、プログラムで複数の処理をする場合には、バッチ処理(一連の処理をどの順番で処理するか記載し、1プロセス終了後に次のプロセスを起動させる方式)と、 タイムシェアリングシステム(時分割多重処理とも呼ばれ、短い処理単位時間毎に、 複数の処理を切り替え、複数の処理が見かけ上同時に動いているようにみせる方式)がある。

OSの話の入り口として、プログラムの実行について説明する。 その前に、前回話のできなかった、unix,Linuxなどのサーバ系の説明も行った。 特にLinuxのオープンソースによる無料での利用と、携帯向けOSで利用されている ことなども紹介した。

プログラム言語

プログラム言語については、 最初に、機械語,アセンブリ言語の低級なプログラムから、 FORTRAN,COBOLといった最初の高級言語、 構造化プログラミングを取り入れながらC言語等が発達し、 最近ではオブジェクト指向などを取り入れた言語のC++,Javaなどの紹介をする。

このプログラムの実行の際には、あらかじめ高級言語のプログラムを機械語に直して 実行するコンパイラ方式と、必要に応じて機械語に直しながら実行する インタプリタ方式の説明を行う。 コンパイラでは実際にプログラムを動かす際に、元のソース・プログラムを 提供する必要がないことから、技術流出の心配が最小限にできることを紹介。 一方インタプリタ方式は、コンパイルの時間をかけずすぐに動作試験ができる特徴 などを紹介する。

コンピュータの主要構成とプログラム起動

コンピュータの主要な構成が、CPU,メモリ(主記憶),補助記憶(HDD),入出力装置で あることを紹介する。 特にメモリが不揮発性のROMと、揮発性のRAMの2通りがあり、 通常のメモリがRAMであることから、電源が切れてもOSが動く理由を説明する。 (1)必要最小限のROMに、BIOS(基本的な入出力装置の制御プログラム)と、 ブートローダ(OSを起動させるプログラム)が記録されている。 (2)電源が入ると、BIOSを使ってブートローダが、補助記憶装置内の OSを主記憶メモリに読み出し、OSが起動する。 (3)OSが起動すると、ユーザのアプリケーションの起動に合せ、 アプリケーション・プログラムをメモリに読み出し動作する。

この様なコンピュータの起動の説明に加え、サスペンドやレジュームなどの原理を 簡単に紹介しておく。

WAN-LAN、Ethernet、TCP/IP

ネットワークの説明の2回目で、WAN-LAN,Ethernet,TCP/IPの説明を行う。

WAN-LAN/Ethernet

WAN-LANの話として、 WAN接続では、電話などを使った接続が行われ、 MODEM(変復調)によって、デジタル信号とアナログ音声信号の変換を説明し、 振幅変調・周波数変調・位相変調などを紹介。 これによって、電話であれば64kbpsまで通信できることを紹介し、 その後の技術として、ISDN,ADSLの電話線ベースの紹介と、 ブロードバンドとしてCATVやFTTH(光ファイバ)などを紹介。

LAN接続では、Ethernetが広く使われており、 10BASE/5,10BASE/2などの同軸ケーブルベースの接続が、10BASE/Tに 変化してHUBが使われるようになったことを紹介。 さらに通信速度の高速化によって、100BASE/*,1000BASE/*(Giga-bit)と進化したこと を説明する。

また、Ethernetでは基本バス型接続であり、このバスを取り合うための CSMA/CD方式を紹介する。 この中で、衝突多発対策としてサブネット化が重要なこと、 バス共有だからこそ通信の盗聴ができることを紹介し、 スイッチング-HUBが普及していることを説明する。

このネットワークは、上位接続になるにつれ、サブネット分割で枝葉に別れることから、 ツリー接続、スター接続、ネット接続とトポロジが変化していくことを説明する。

TCP/IP

CSMA/CD方式の衝突対策として、サブネット化が重要であるが、その分割した先に データを送り届けるためのメカニズムとして、TCP/IPを紹介。 特にIPについて詳しく説明を行う。

IPアドレスで、現在はIPv4による32bit番号による識別方式が使われる。 (例192.156.145.51など)。でも、232=40億台ではコンピュータの 識別番号では不足し、プライベートアドレスが使われる。 プライベートアドレスは、ルータのNAT機能で、アドレスがグローバルアドレスに 変換されて通信をすることを紹介。

IPの中継メカニズムの説明は来週。

前回の割り込みの説明の補足として、 システムコールについて説明する。

システムコールなど

OSでは、資源保護のために、CPUの特権モードなどを活用する。 周辺装置やCPU内の重要な情報の制御は、特権モードでしか使えない。 ユーザモードでは、入出力機器の制御などの命令は「不当命令エラー」で実行できない。

ユーザが入出力命令を使うためには、システムコールが利用される。 これはソフトウェア割り込み機能を用いて実現される。 システムコールが実行されると、特権モードに移行し実際の周辺機器の制御の前に、 不当な資源アクセスをしていないか、チェックが行われる。 ユーザがシステムコールを経由せずに、入出力命令を実行すれば、 不当命令エラーとなるため、不正に資源を操作することができなくなる。

メモリ管理の説明として、上限・下限レジスタによる許可範囲外のメモリアクセスを 止める機能を解説する。 また、メモリ管理機能として、メモリ階層構造の話をする。 メモリは、CPUレジスタ・キャッシュ・DRAMによる主記憶・HDDによる補助記憶の4段階に分けられ、高速&高価&小容量なメモリから、低速&安価&大容量なメモリに分類できる。 これらのメモリでは、利用頻度の高いデータを、高速メモリ側にコピーしながら使うことで、 高速&大容量のメモリがあるかのように使える。

ネットワークの導入説明

ネットワークの利用目的の説明として、プリンタ共有・ファイル共有・リモート接続での計算能力の共有などの「共有」の視点と、処理能力不足を補うための負荷分散、コンピュータ故障対策としてのリスク分散などの「分散」の視点を説明する。

ネットワークの物理層の説明として、様々なインタフェースの例を示す。 パラレル接続では、単位時間あたりの通信量を増やすために、複数の信号線を使う。 しかし、ケーブル本数が増え全体の太さから取り扱いが難しい。 シリアル接続では、本数が少ないためケーブルの取り扱いが容易で、長距離配線などで よく利用される。 通信速度の高速化をするためには、マイクロインダクタンスや線間容量などの影響で、 信号波形の劣化が問題となる。これらの対策としてインピーダンスマッチングなどが重要で、 SCSIなどでは、末端抵抗(ターミネータ)が重要となる。

最近のシリアル通信では、信号劣化対策を少ない信号線に施すことで、パラレル方式より高速化された方式が増えてきた。

OSと割り込み

先週のジョブ・プロセス・スレッドの説明に引き続き、 プロセスの実行方式の説明から、割り込みなどを中心とした説明を行う。

プロセスの実行方式には、ジョブ方式やTSS方式、リアルタイム方式があることを 説明し、マルチタスクでのメモリ量による処理速度の違いを説明する。 例えとして、主記憶4GBのマシンで、メモリ使用量1GBのプロセスA,B,Cを実行する。 この場合、プロセスが入力待ちなどがあると動かせないので、ジョブ方式では あらかじめ入力データは随時よみこめるようにする必要がある。 ジョブ方式では、1つが終わったら次の処理を起動するので、問題がない。 しかしTSS方式では、みかけ上並行処理をしているようにプロセスの切り替えを するので、若干遅くなる。 しかし、主記憶が2GBという状態では、TSS方式では3つめのCの処理では、 メモリが不足し仮想メモリ機能が必要となる。これに伴い一時停止中の プロセスを補助記憶に保存したり復活させたりという処理が加わるため、 とたんに処理速度が低下する。

こういったOSの処理では、割り込み機能が重要となる。 割り込みとは処理速度の違うものの間での受け渡し時に重要。 割り込みでは、信号が入ったら割り込み許可を確認後、 処理番地(PC)保存・CPU内情報(レジスタ)を行なってから、割り込み処理に切り替わる。 割り込み処理が終了すれば、CPU情報・処理番地情報を元に戻し、本来の処理にもどる。 割り込みには、入出力割り込み・タイマ割り込み・エラー割り込み、ソフトウェア割り込みなどがある。

マルチタスク機能は、タイムスライス時間後にタイマ割り込みが発生するように設定することで実現する。 タイマ割り込み時には、OSが実行待ち行列からプロセスを選んで処理を切り替える。 中断したプロセスは待ち行列の最後尾にいれられ、順次処理が繰り返されることになる。 入出力処理が行われる場合は、プロセスは入出力待ち状態となり、スケジューラは 待ち行列より処理を選んで実行する。時間が経過して入出割り込みが発生すると、 OSが入出力待ちのプロセスを実行状態に戻す。

OSの基本と資源管理

先週で説明の終えていなかった、機械語の生成の話の説明の後、OSについての具体的な説明を行う。

機械語の生成

先週末にコンパイラ方式とインタプリタ方式の話の次段階として、 機械語などはCPUやOSに依存する補足をして、 Javaにおける仮想マシンを用いたバイトコードインタプリタなどの説明を行う。

プログラムの機械語の実行の説明として、コンパイラによる中間コードの生成や、 リンカによる中間コードとライブラリの結合の話を行う。 また、リンクにも静的リンクと動的リンクがあり、 通常はプログラムの中にライブラリが埋め込まれる静的リンクがとられる。 しかしマルチタスクでは、メモリ中にライブラリの機械語が複数でてくると、 メモリのムダになるので、OSにライブラリを展開してもらう動的リンク方式があることを説明。動的リンクを使えば、ライブラリの修正アップデートも簡単といった利点を説明。

OSとは、

OSとは、基本ソフトウェアとよばれ、 (a)制御プログラム(狭義のOS,カーネル)と、(b)開発環境(言語プロセッサ等)、(c)ユーティリティ(CUI/GUI等)から成ることを説明する。

OSの機能として、周辺装置とのデータのやり取り・制御方法を共通化することで、 プログラム作成の労力削減が可能となる。 もう一つの重要な機能は、不用意なことをできなくすることによるデータの保護であり、 ハードを壊すような制御などを実行させない。 他のプロセスの動きを阻害するようなメモリアクセスをさせない。 他人のファイルを権限もないのに読めるようなことをさせない。...といった保護が重要。

これらの共通化や保護の対象となるものを資源(resource)と呼ぶ。 たとえば、キーボードやハードディスクといった周辺機器(物理的なリソース)、 計算に必要となる主記憶(メモリ)、CPUを利用する時間(抽象的なリソース)などがある。

プログラムの動く単位として、利用者視点でトータルの1つのサービスを提供する処理は、 ジョブと呼ばれる。これに対し、CPUが他の処理から保護する仕事の単位はプロセスと呼ばれ、ジョブは複数のプロセスで実現される場合もある。 一方、並行処理では複数のプロセスで実行するのが普通だが、共通のメモリ情報を使いながら動く処理は記述が面倒となる。 これに対しスレッドは、並列する複数の処理で同一メモリを利用できるものを指す。 複数のスレッドで1つのプロセスを構成する。

前回のコンピュータの歴史の続きということで、 パソコン周りのOSの発達の歴史を説明。

パソコンのOSの発達

16bitパソコンが出始めた頃は、Intel&MicrosoftによるMS-DOSと、 Apple社によるMacintoshが主流であった。 この時代では、シングルユーザ・シングルタスクが普通であった。 MacのGUI技術をMicrosoftがWindowsで発表したころから、 処理性能への要求から32bitコンピュータへと変化していく。

32bitコンピュータが出始めたあたりから、パソコンでも汎用機の影響や 複数のウィンドウ操作などの一般化で、マルチユーザ・マルチタスクが 取り入れられていく。 しかし、これまでのコンピュータは、メモリ保護機能が無かったので、 他の怪しいプロセスの影響をうけて動かなくなるトラブルがあたりまえであった。 しかし、Intel 80386で、保護機能がついた頃からマルチユーザ・マルチタスク化が 広がっていく。 Windows でも、Windows/NT,2000と発達していく。

同じ頃、汎用機での巨大なOS(例えばMultics)をミニコンで動かしたいという 要求から、unixがC言語と共に開発される。unixは、サーバ側で普及していく。 この中で、Linuxは無料で使えるOSとして、普及が始まりだす。 オープンソースの世界では、Internetからダウンロードしたソフトに改良を 施して良い物ができたら、そのソフトはインターネットに公開するという 原則から、世界中のハッカーにより改良・開発されたものが広まっていく。

言語プロセッサ

コンピュータは、CPU・メモリ・I/O・周辺装置から作られており、 ノイマン型コンピュータでは、Fetch/Decode/Read/Execute/Write/次の命令...の 繰り返しによって動く。 また、メモリは不揮発性のROMと、揮発性のRAMからできている。 コンピュータは電源が入ると、ROMに書かれているブートローダが、BIOSを 使ってHDDなどからOSの基本機能を、RAM上に読みだして動き出す。 ユーザがアプリケーションを起動すると、RAM上に読み込んで起動する。

アプリケーションなどのプログラムは、高級言語などで記述されるが、 プログラムの動かし方には、コンパイラ方式とインタプリタ方式がある。 コンパイラは、ソースプログラムをあらかじめすべて機械語に直して実行する。 このため機械語に治すのは時間がかかるけど、実行時は効率よく速く動く。 一方、インタプリタ方式は、ソースを必要に応じて解析して実行する。 このため繰り返しなどでは、命令解析がその都度行われるため遅い。

しかしながら、インタプリタ方式はすぐに動かすことができるため、 テスト開発では便利である。一方コンパイラ方式は、実行時にソースプログラム が不要であることから、アプリケーション配布時にソースコードの流出の 心配がないため、企業にとっては有利である。

2015年12月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

アーカイブ

Google

このアーカイブについて

このページには、過去に書かれたブログ記事のうち計算機システムカテゴリに属しているものが含まれています。

前のカテゴリは情報構造論です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。