オペレーティング・システム 教科書の例 • Windowsはなぜ動くのか 天野司著 日経BP社 平 木 ユーザから見た計算機システム ソース プログラム プリ プロセッサ ヘッダと マクロ定義 コンパイラ ダイナミック リンク ライブラリ ウィンドウ システム ディスプレイ サーバ デバイス ドライバ オブジェクト プログラム リンカ 実行機械語 イメージ 実行時 ライブラリ デバッガ ローダ 実行イメージ(メモリ上) メモリ管理、スケジューリング、デバイス管理 割り込み処理 シェル ソフトウェアとハードウェアの協調設計 平 木 • 現在の標準的計算機システム – CPU + メモリ + キーボード・マウス + ディスプレイ + DISK + CD-ROM + ネットワークI/F + サウンドボード – ウィンドウシステム + マルチプロセス環境 + ファイルシステム + インターネット環境 • 上記システム機能の一部分しかハードウェアでは実現しない CPU: Central Processing Unit OSによる計算機システムアーキテクチャの拡張 OS: Operating System 平 木 システムソフトウェアの構成 ユーザの応用プログラム コンパイラ シェル デバッガ メール・ ブラウザ ウィンドウシステム システムコール処理 O S 通 信 ・ イ ン タ ー ネ ッ ト デバイス ドライバ メモリ管理 スケジューラ 割り込み処理ルーチン I/O デバイス CPU・メモリ O S カ ー ネ ル システムコール: OS機能とユーザのインタフェース プログラム • プロセスの生成・スケジューリング • メモリの割り当て・メモリの共有 • ファイルとのインタフェース – OPEN・CLOSE・READ・WRITE • ネットワークとのインタフェース OS(カーネル)の機能分類 プロセッサ 仮想化の 実現 メモリの 仮想化 実現 ファイル システムの 実現 デバイスハンドラ群 平 木 プロセスと実行環境 • プロセス プログラム + 実行のためのコンテクスト + 資源 – プログラム実行のための抽象化された実体 • 実際には、Job、タスク、プロセス、スレッド などの単位で実行 カーネルプロセス 各種デーモン ユーザプロセス カーネルプロセス 各種デーモン ユーザプロセス カーネルプロセス 各種デーモン 応用プログラム カーネルプロセス OSカーネル システム ユーザプログラム 平 木 マルチ・プロセス (マルチ・タスク) 先取り 先制攻撃 プリエンプティブ プロセスA プロセスB プロセスC カーネル 実行状態 シ ス テ ム コ ー ル 待ち状態 実行状態 実行可能状態 タ イ マ ー 割 り 込 み 実行状態 シ ス テ ム コ ー ル 実行状態 平 木 プロセス間通信 • パイプ プロセス間をファイルI/Oのインタフェースで結合 • ソケット プロセス間をネットワークのインタフェースで結合 • メモリ共有 複数のプロセスでメモリページを共有する • メッセージ・キュー 複数のプロセスでメッセージ・キューを共用 平 木 メモリ管理 • プロセス毎に独立したメモリ空間を与える • ユーザ間、ユーザ・カーネル間の保護機構を実現 • 物理メモリよりも大きなメモリ空間を実現 – ディスク等との間でスワップ • 必要な場所を共有する • CPUハードウェアの担当 – MMUによるアドレス変換と各種の割り込みの処理 • OSのメモリ管理の担当 – MMUでの変換情報の管理 – メモリスワップ領域の管理 – メモリスワップ動作の実現 MMU: Memory Management Unit ファイルシステム • ファイルとのインタフェース – OPEN・CLOSE・READ・WRITE • ディレクトリ構造の管理 • 名前があって構造があるものを 何でもファイルとしてインタフェース – 記憶装置(ディスク、テープ等)のファイルシステム • メモリをファイルシステムとして用いることもある – ネットワークファイルシステム • 疑似ファイルシステム – デバイスのインタフェース Javaのマルチ・スレッド機能 • Javaの仮想機械の中で、 複数のタスク(スレッド)を 実行することができる。 • スレッドは、Threadクラスのサブクラスの インスタンスとして生成される。 • スレッドのインスタンスに対して、 startメソッドを実行すると、 runメソッドからスレッドの実行が始まる。 public class Thread91 extends Thread { int n, s; House mh; Thread91(int n, int s, House m) { this.n = n; this.s = s; this.mh = m; } public void run() { mh.polygon(n,s); mh.house(s); } public static void main(String[] args) { TurtleFrame f = new TurtleFrame(); House m = new House(); f.add(m); Thread91 t1 = new Thread91(3,50,m); Thread91 t2 = new Thread91(5,40,m); t1.start(); t2.start(); System.out.println("Main method finished."); } } スレッドの生成と実行 • 生成 Thread91 t1 = new Thread91(3,50,m); • 実行 t1.start(); ↓ public void run() { mh.polygon(n,s); mh.house(s); } House m1 = new House(); House m2 = new House(); f.add(m1); f.add(m2); Thread91 t1 = new Thread91(3,50,m1); Thread91 t2 = new Thread91(5,40,m2); t1.start(); t2.start(); public class SimpleAnimation extends JPanel implements Runnable { public SimpleAnimation() { ... } public synchronized void startAnimation() { //アニメーションを開始 if (animatorThread == null) { animatorThread = new Thread(this); } animatorThread.start(); } public synchronized void stopAnimation() { if (animatorThread != null) {//アニメーションスレッドを止める animatorThread = null; } } public void run() { ... } public static void main(String[] args) { JFrame f = new JFrame("Simple Animation"); SimpleAnimation anime = new SimpleAnimation(); f.getContentPane().add(anime, BorderLayout.CENTER); f.setSize(new Dimension(100, 100)); f.setVisible(true); } } イベント処理 • アプレットなどに対するイベントは、 イベント処理用のスレッドによって 処理される。 • このスレッドは、 あらかじめ登録された 様々なリスナーを呼び出す。 • 一つ一つのイベントに対して 新しいスレッドが立ち上がる、という感じ。 public class HelloApplet extends JApplet implements ActionListener { JLabel label; //ラベル用の変数 JButton b1, b2;//ボタン用の変数 public void init(){ label = new JLabel(" "); //JLabelオブジェクトの生成 b1 = new JButton("ごあいさつ"); //JButtonオブジェクトの生成 b2 = new JButton("消去"); //JButtonオブジェクトの生成 b1.addActionListener(this); //イベントリスナーを設定 b2.addActionListener(this); //イベントリスナーを設定 Container c = getContentPane(); //フレームの内容表示域を得る c.add(label, BorderLayout.NORTH); //ラベルを置く c.add(b1, BorderLayout.CENTER); //ボタンを置く c.add(b2, BorderLayout.EAST); //ボタンを置く } public void actionPerformed(ActionEvent e){ Object obj = e.getSource(); if(obj == b1){ //b1が押されたら label.setText("こんにちは"); //labelに文字列を設定 } else if(obj == b2){ //b2が押されたら label.setText(" "); //labelの文字列を消す } } } リスナーの登録と定義 • 登録 自分自身をリスナーとして登録 b1.addActionListener(this); //イベントリスナーを設定 b2.addActionListener(this); //イベントリスナーを設定 • 定義 public void actionPerformed(ActionEvent e){ Object obj = e.getSource(); if(obj == b1){ //b1が押されたら label.setText("こんにちは"); //labelに文字列を設定 } else if(obj == b2){ //b2が押されたら label.setText(“ ”); //labelの文字列を消す } } DijkstraApplet • 登録 GraphPanel example = new GraphPanel(); example.addMouseListener(example); public void mouseClicked(MouseEvent e) { int X = e.getX(); int Y = e.getY(); int k = 0; double d = 1000000.0; for (int i = 0; i < n; i++) { double dd = Math.sqrt((x[i]-X)*(x[i]-X) + (y[i]-Y)*(y[i]-Y)); if (dd < d) { k = i; d = dd; } } if (e.getButton() == MouseEvent.BUTTON1 && e.isShiftDown() == false) { start = k; label.setText("start="+start+" goal="+goal); ... } else { goal = k; label.setText("start="+start+" goal="+goal); ... } repaint(); }
© Copyright 2024 ExpyDoc