Windowsã¯ãªãœå‹•ãã®ã‹

概è¦

Windowsã¯ãªãœå‹•ãã®ã‹
2002å¹´ã€WindowsXPç™ºå£²å¾Œã®æ›¸ç±ã€‚
「10年後も通用ã™ã‚‹åŸºæœ¬ã‚’身ã«ã¤ã‘よã†ã€ã®ã‚³ãƒ³ã‚»ãƒ—トã§å‡ºç‰ˆã•れãŸã€Œãªãœï½žã€ã‚·ãƒªãƒ¼ã‚º2作目。
CPUã®ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã€ãƒ—ログラムã«å¯¾ã™ã‚‹ãƒ¡ãƒ¢ãƒªç®¡ç†ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ç®¡ç†ã€ãƒ‡ãƒã‚¤ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ã€ãƒ—ロセス管ç†ç­‰ã€10年経ã£ãŸä»Šã§ã‚‚有用ãªçŸ¥è­˜ã‚’å­¦ã¹ã¾ã™ã€‚
åˆå¿ƒè€…å‘ã‘を謳ã£ã¦ã¾ã™ãŒåˆ†ã‹ã‚Šã‚„ã™ã書ã„ã¦ã‚ã‚‹ã‚‚ã®ã®å分深ã„ã§ã™ã€‚
基本情報技術者資格等ã§å‡ºã¦ãã‚‹ä»®æƒ³è¨˜æ†¶ç­‰ã®æŠ€è¡“ã«ã¤ã„ã¦ã€
「ã“れを勉強ã—ã¦ä½•ã«ãªã‚‹ã‚“ã ï¼Ÿã€
ã¨ã„ã†ç–‘å•ãŒã“ã®æœ¬ã‚’読んã§ä»Šæ›´è§£æ¶ˆã•れã¾ã—ãŸã€‚
ã—ã£ã‹ã‚ŠWindowsã§ã‚‚使ã‚れã¦ã¾ã—ãŸã€‚
OSã€ãƒ‡ãƒã‚¤ã‚¹ã€ãƒ¡ãƒ¢ãƒªç®¡ç†ã®è©±ã¯éžåŒæœŸå‡¦ç†ã‚„排他処ç†ã€ãƒ—ログラム連æºã‚’行ã†éš›ã«æœ‰ç”¨ã§ã™ã€‚
ã¨è¨€ã†ã‚ˆã‚Šã“ã“ã‚’ç†è§£ã—ã¦ã„ã‚‹å‰æã§æŠ€è¡“æ›¸ãŒæ›¸ã‹ã‚Œã¦ã„ã‚‹ã®ã§å¿…é ˆã§ã™ã€‚
å¤ã„本ã§ã™ãŒã‚‚ã£ã¨æ—©ãã«èª­ã‚“ã§ãŠã‘ã°è‰¯ã‹ã£ãŸã§ã™ã€‚

オペレーティング・システムã¨ã¯

システムコール(WindowsAPI)

OSãŒã€OS上ã§å‹•ãプログラムã®ç‚ºã«å‘¼ã³å‡ºã™å‘½ä»¤ã€‚
・メモリã®ç¢ºä¿ã€è§£æ”¾
・プロセスã€ã‚¹ãƒ¬ãƒƒãƒ‰ã®åˆ‡ã‚Šæ›¿ãˆ
・入出力装置ã®åˆ¶å¾¡
ç­‰ã€å€‹ã€…ã®ãƒ—ログラムãŒå‹æ‰‹ã«è¡Œã†ã¨å•題ãŒã‚る処ç†ã«ã¤ã„ã¦OSã«ä¾é ¼ã—ã¦ã‚„ã£ã¦ã‚‚らã†ã€‚

ライブラリ

システムコールãŒå‹•作ã™ã‚‹å®Ÿè¡Œãƒ•ァイル。

マルãƒã‚¿ã‚¹ã‚¯ã®ãµã—ãŽ

メモリー管ç†

リロケータブル

å˜ä¸€ã®ãƒ—ログラムã ã‘ãŒå‹•作ã™ã‚‹å‰æã®OSã§ã¯ã€ãƒ—ログラム領域・データ領域ã®é–‹å§‹ä½ç½®ã‚’固定ã—ã¦ã„ãŸã€‚
ã“れã«å¯¾ã—ã€OS上ã§è¤‡æ•°ã®ãƒ—ログラムを起動ã•ã›ã‚‹å‰æã§ã€ãƒ—ログラム領域・データ領域ã®é–‹å§‹ä½ç½®ã‚’å‹•çš„ã«ãšã‚‰ã—ã¦å‹•作ã•ã›ã‚‹ä»•組ã¿ã€‚

セグメント

CPUãŒä¸€åº¦ã«ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªãƒ¡ãƒ¢ãƒªé ˜åŸŸã€‚
CPUã®æ€§èƒ½ã«ã‚ˆã‚Šå¤§ãã•ãŒé•ã†ã€‚

(ローカル)ディスクリプタテーブル(LDT)

32bitCPU以é™ã§åˆ©ç”¨ã•れるメモリ領域。
プログラムãŒãƒ¡ãƒ¢ãƒªé ˜åŸŸã«ãŠã„ã¦ã©ã“ã‹ã‚‰ã©ã“ã¾ã§ä½¿ç”¨ã™ã‚‹ã®ã‹ï¼Ÿ
を記憶ã—ã¦ãŠãã€ä¾‹ãˆãƒ—ログラムã«ã‚ˆã£ã¦å‘½ä»¤ã•れãŸã¨ã—ã¦ã‚‚範囲外ã®é ˜åŸŸã«æ›¸ã込む事ã¯ã§ããªã„構造ã«ãªã£ã¦ã„る為ã€
マルãƒã‚¿ã‚¹ã‚¯ç’°å¢ƒã«ãŠã‘る安定性ãŒä¿éšœã•ã›ã‚‹ã€‚
ã¾ãŸã€å­˜åœ¨ãƒ•ラグã«ã‚ˆã£ã¦ä»®æƒ³è¨˜æ†¶ã‚‚実ç¾ã•れる。

仮想記憶

メモリ領域ã®ä¸è¶³ã«å¯¾ã—ã¦ã€ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’メモリã¨ã—ã¦æ‰±ã†æŠ€è¡“。
OS上ã§å‹•作ã™ã‚‹ãƒ—ログラムãŒä½¿ç”¨ã™ã‚‹ãƒ¡ãƒ¢ãƒªé ˜åŸŸã®ä¸€éƒ¨ã‚’仮想記憶ã¸ã‚³ãƒ”ーã—ã€å¿…è¦ã«ãªã£ãŸå ´åˆã«ã¯ã¾ãŸæˆ»ã™ã€‚
スワップ方å¼/ページング方å¼ãŒã‚る。

存在フラグ(P:Presentフラグ)

仮想記憶利用ã®ç‚ºã®ãƒ•ラグ。
本æ¥ã®ãƒ¡ãƒ¢ãƒªé ˜åŸŸã«ã¯ãƒ‡ãƒ¼ã‚¿ãŒç„¡ã„å ´åˆã€å­˜åœ¨ãƒ•ラグã¯OFF。ã‚ã‚‹å ´åˆã¯ON。
ON/OFFã«å¿œã˜ã¦ä»®æƒ³è¨˜æ†¶ã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã®å¾©å…ƒãŒè¡Œã‚れる。

セグメントä¸åœ¨å‰²ã‚Šè¾¼ã¿

プログラムを実行ã™ã‚‹éš›ã€èª­ã¿è¾¼ã¿å…ˆãƒ¡ãƒ¢ãƒªé ˜åŸŸã«ãƒ—ログラムãŒç„¡ã„å ´åˆ(仮想記憶領域ã«ãƒšãƒ¼ã‚¸ã‚¢ã‚¦ãƒˆã•れã¦ã„ã‚‹å ´åˆ)ã€
OSã¯ã‚»ã‚°ãƒ¡ãƒ³ãƒˆä¸åœ¨å‰²ã‚Šè¾¼ã¿ã‚’発生ã•ã›ã€ã‚らゆる処ç†ã«å„ªå…ˆã—ã¦ãƒ¡ãƒ¢ãƒªé ˜åŸŸã«ãƒ—ログラムを復元ã•ã›ã‚‹ã€‚

スワップ

(スワップイン/スワップアウト)
ä»®æƒ³è¨˜æ†¶åˆ©ç”¨ã®æ–¹æ³•。
プログラム(セグメント)å˜ä½ã§ãƒ—ログラムを仮想記憶領域ã«é€€é¿ã€å¾©å…ƒã™ã‚‹ã€‚
32bitCPUã§ã¯ã‚»ã‚°ãƒ¡ãƒ³ãƒˆãŒå¤§ãã„為ページングãŒä½¿ç”¨ã•れる。

ページング

(ページイン/ページアウト)
ページ(4KB)ã®ãƒ¡ãƒ¢ãƒªé ˜åŸŸå˜ä½ã§ä»®æƒ³è¨˜æ†¶é ˜åŸŸã«ãƒ—ログラムを退é¿ã€å¾©å…ƒã™ã‚‹ã€‚
ã“ã®éš›ã€ãƒ—ログラムã«ãŠã‘ã‚‹ã©ã®éƒ¨åˆ†ã‚’ページアウトã—ã¦ã„ã‚‹ã‹ï¼Ÿã¯ãƒšãƒ¼ã‚¸ãƒ†ãƒ¼ãƒ–ルã§ç®¡ç†ã™ã‚‹ã€‚

DLL

通常ã®ã‚³ãƒ³ãƒ‘イル・リンク手順(StaticLinkLibraryæ–¹å¼)
・ソースファイル
↓(Byコンパイラ)
・オブジェクトファイル
・ライブラリ
↓(Byリンカ)
・実行ファイル
DLLを利用ã™ã‚‹æ‰‹é †(DynamicLinkLibraryæ–¹å¼)
・ソースファイル
↓(Byコンパイラ)
・オブジェクトファイル
・ライブラリ
・スタブ
↓(Byリンカ)
・実行ファイル
※DLLã¯å®Ÿè¡Œãƒ•ァイルã¨ã—ã¦ã¯å–り込ã¾ã‚Œãªã„。
スタブを用ã„ã¦å‚照経路を確ä¿ã™ã‚‹ã ã‘ã§ã€å®Ÿè¡Œæ™‚ã«(å‹•çš„ã«)åˆã‚ã¦å–り込ã¾ã‚Œã‚‹ã€‚

スタブ

実行時ã«DLLを呼ã¹ã‚‹æ§˜ã«ã€ãƒªãƒ³ã‚¯ã®éš›ã«ä½œæˆã•れるプログラム。
オブジェクトファイルã‹ã‚‰DLLã®å‘¼ã³å‡ºã—を仲立ã¡ã™ã‚‹ã€‚

マルãƒã‚¦ã‚£ãƒ³ãƒ‰ã‚¦

ウィンドウãƒãƒ³ãƒ‰ãƒ«

Windows上ã§å„ウィンドウを識別ã™ã‚‹ç‚ºã®ç•ªå·
厳密ã«ã¯ä¸€ã¤ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦å†…ã§ã‚‚ボタンやメッセージ領域等ã§åˆ¥ã®æ•°å­—ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŠã‚Šã€
ã“れã«ã‚ˆã‚Šå„オブジェクトã€å„イベントã«å¿œã˜ãŸã‚¤ãƒ™ãƒ³ãƒˆãƒãƒ³ãƒ‰ãƒ©ã‚’発生ã•ã›ã‚‹äº‹ãŒå¯èƒ½ã«ãªã‚‹ã€‚

イベントãƒãƒ³ãƒ‰ãƒ©

ボタン押下やマウスクリック等ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ“作ã«å¯¾ã—ã¦ãƒ—ログラムã™ã‚‹ç‰¹å®šã®å‡¦ç†ã€‚
イベントãŒç™ºç”Ÿã™ã‚‹åº¦ã«å‡¦ç†ã‚’分å²ã•ã›ã‚‹ã®ã§ã¯ãªãã€ã‚¤ãƒ™ãƒ³ãƒˆç™ºç”Ÿå‰ã«ã‚¤ãƒ™ãƒ³ãƒˆæ¯Žã«å‡¦ç†å†…容を登録ã—ã¦ãŠã。
ï¼ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ»ãƒ—ロシージャ

イベントドリブン

イベントãƒãƒ³ãƒ‰ãƒ©ã‚’実行ã™ã‚‹ã«å½“ãŸã£ã¦ã€ãƒ—ログラムãŒãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ“作を常ã«ç›£è¦–ã™ã‚‹å¿…è¦ã¯ãªã„。
マルãƒã‚¿ã‚¹ã‚¯å®Ÿè¡Œä¸­ã§ã€ä»–ã®ãƒ—ロセスãŒå®Ÿè¡Œä¸­ã§ã‚ã£ã¦ã‚‚ã€
自プロセスã«å¯¾ã™ã‚‹æ“作ãŒã‚れã°ã‚¤ãƒ™ãƒ³ãƒˆã‚’検知ã™ã‚‹ã®ã¯OSã®ä»•事。
OSãŒæ¤œçŸ¥ãŒè¡Œã†äº‹ã‚’剿ã«ã—ãŸã‚·ã‚¹ãƒ†ãƒ ã‚„プログラミング言語ã®äº‹ã‚’イベントドリブン型ã€ã‚¤ãƒ™ãƒ³ãƒˆé§†å‹•型言語等ã¨å‘¼ã¶ã€‚

ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ»ã‚µãƒãƒ¼ãƒˆ

I/Oãƒãƒ¼ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹

Windows上ã§å„ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’識別ã™ã‚‹ç‚ºã®æ•°å­—
プラグ&プレイã«ã‚ˆã‚Šé‡è¤‡ã—ãªã„番å·ãŒè‡ªå‹•ã§å‰²ã‚ŠæŒ¯ã‚‰ã‚Œã‚‹ã€‚

デãƒã‚¤ã‚¹ãƒ‰ãƒ©ã‚¤ãƒ

OSãŒè¡Œã†ã€ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã«å¯¾ã™ã‚‹æ“作を仲介ã™ã‚‹ã‚½ãƒ•トウェア。
本æ¥ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢æ¯Žã«ä»•様ãŒç•°ãªã‚Šã€ã“れをæ“作ã™ã‚‹ç‚ºã«ã¯å€‹åˆ¥ã®æ“作プログラムãŒå¿…è¦ã«ãªã‚‹ãŒã€
ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ¡ãƒ¼ã‚«ãƒ¼ãŒã€OSã®æ“作命令ã«å¯¾å¿œã™ã‚‹ãƒ—ログラムを作æˆãƒ»æä¾›ã™ã‚‹äº‹ã«ã‚ˆã£ã¦OSå´ã¯ãƒ—ログラムを変更ã™ã‚‹äº‹ãªããƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’æ“作ã§ãる。

プラグ&プレイ

ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’OSã«æŽ¥ç¶šã—ãŸéš›ã«è‡ªå‹•ã§OSã‹ã‚‰æ“作å¯èƒ½ã«ã™ã‚‹æ©Ÿèƒ½ã€‚

プログラム連æº

プロセス間通信

別々ã®ãƒ—ロセスåŒå£«ãŒè‡ªãƒ—ログラムã®ãƒ‡ãƒ¼ã‚¿é ˜åŸŸä»¥å¤–ã®ãƒ¡ãƒ¢ãƒªé ˜åŸŸã‚’使ã£ã¦ãƒ‡ãƒ¼ã‚¿é€£æºã‚’行ã†äº‹ã€‚
プロセスã¯ãƒ—ログラム領域ã«åŠ ãˆãƒ‡ãƒ¼ã‚¿é ˜åŸŸã‚’æŒã¡å¤‰æ•°ã‚„スタックã«åˆ©ç”¨ã™ã‚‹ã€‚
ã—ã‹ã—他プロセスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿é ˜åŸŸã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹äº‹ã¯OSã«ã‚ˆã‚Šç¦æ­¢ã•れã¦ã„る。

ファイルマッピング

プロセス間通信ã®ä¸€æ‰‹æ³•。
ä»–OSã§ã¯å…±æœ‰ãƒ¡ãƒ¢ãƒªã¨å‘¼ã°ã‚Œã‚‹ã€‚
ファイルをメモリ上ã«ä½œæˆ(マッピング)ã—ã€ãƒ—ロセスåŒå£«ã§ã“ã®ãƒ•ァイルã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹äº‹ã§ãƒ‡ãƒ¼ã‚¿ã‚’連æºã™ã‚‹ã€‚
例:クリップボード

åå‰ä»˜ãパイプ

プロセス間通信ã®ä¸€æ‰‹æ³•。
ä»–OSã§ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ»ã‚­ãƒ¥ãƒ¼ã¨å‘¼ã°ã‚Œã‚‹ã€‚
ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’介ã—ã¦ä»–コンピュータã‹ã‚‰ã‚‚共有ã•れるメモリ領域。
ãƒ•ã‚¡ã‚¤ãƒ«ã®æ§˜ã«Create/Read/Write/Close命令を用ã„ã¦ã‚¢ã‚¯ã‚»ã‚¹ã§ãã€Closeã™ã‚‹ã¨æ¶ˆæ»…ã™ã‚‹ã€‚
匿åパイプもã‚ã‚‹ãŒOSã«ã‚ˆã£ã¦è‡ªå‹•çš„ã«ãƒ©ãƒ³ãƒ€ãƒ ãªãƒ‘イプåãŒä»˜ã‘られるã ã‘ã§ä»•組ã¿ã¯åŒã˜ã€‚
パイプãŒå‹æ‰‹ã«æ¶ˆãˆãŸã‚Šã€ä»–アプリケーションã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•れãŸã‚Šã™ã‚‹äº‹ãŒç„¡ã„。
共用メモリー方å¼ã‚ˆã‚Šå°‘é‡ã®ãƒ‡ãƒ¼ã‚¿ã‚’連æºã™ã‚‹å ´åˆã€ãƒ—ロセス間ã§åŒæœŸã‚’å–ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã«ä½¿ç”¨ã€‚

ミューテックス

プロセス間通信ã®ä¸€æ‰‹æ³•。
CreateMutex()関数ã§ãƒ¡ãƒ¢ãƒªç©ºé–“ã«ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚ªãƒ–ジェクトを作æˆã€‚
ã“ã®éš›ã€æ‰€æœ‰è€…åã€ã‚ªãƒ–ジェクトåを引数ã¨ã—ã¦æ¸¡ã™ã€‚
外プロセスã‹ã‚‰åŒåã®ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚ªãƒ–ジェクトãŒä½œæˆã•れã¦ã„ã‚‹å ´åˆã€
OSã¯æ—¢å­˜ã®ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚ªãƒ–ジェクトを探ã—ã¦æ‰€æœ‰è€…情報を返ã™ã®ã§åŒåã®ã‚ªãƒ–ジェクトãŒè¤‡æ•°ä½œã‚‰ã‚Œã‚‹äº‹ã¯ç„¡ã„。
OpenMutex()
所有者情報をå–å¾—
WaitForSingleObject()
所有権ãŒç©ºãã¾ã§å¾…機。
ReleaseMutex()
所有権を離ã™ã€‚

セマフォ

プロセス間通信ã®ä¸€æ‰‹æ³•。
ミューテックスãŒï¼‘ãƒ—ãƒ­ã‚»ã‚¹ã®æ‰€æœ‰ã—ã‹èªã‚ãªã„ã®ã«å¯¾ã—ã€è¤‡æ•°ã®æ‰€æœ‰ãŒèªã‚られる。
複数ã®ãƒ—ロセスã®åŒæ™‚処ç†ã¯å¯èƒ½ã ãŒã€è² è·ã‚’軽減ã™ã‚‹ç‚ºã«ãã®æ•°ã‚’制é™ã—ãŸã„å ´åˆç­‰ã«ä½¿ç”¨ã€‚
åˆ¶é™æ•°ã‚’1ã«ã—ã¦ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã¨åŒæ©Ÿèƒ½ã®ä½¿ã„方もå¯èƒ½ã€‚
作æˆã€é–‹å§‹ã€å¾…機ã€çµ‚了ã¯ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã¨ã»ã¼åŒã˜
CreateSemaphore()
OpenSemaphore()
WaitForSingleObject()
ReleaseSemaphore()

ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯

ãƒãƒ¼ãƒˆç•ªå·

ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã§ã‚³ãƒ³ãƒ”ュータを識別ã™ã‚‹IPアドレスã«ä»˜åŠ ã™ã‚‹ã‚µãƒ–アドレス
IPアドレス+ãƒãƒ¼ãƒˆç•ªå·ã‚’ソケットã¨å‘¼ã³ã€ã‚³ãƒ³ãƒ”ュータ上ã®å„アプリケーションを区別ã™ã‚‹ã€‚
Windows上ã§èµ·å‹•ã™ã‚‹ã‚¢ãƒ—リケーションã¯ãƒ‡ãƒ•ォルトã§ä½¿ç”¨ã™ã‚‹ãƒãƒ¼ãƒˆç•ªå·ãŒæ±ºã¾ã£ã¦ã„る。
※メールサービス:110等
起動時ã«åˆ¥ã®ã‚¢ãƒ—リã«ã‚ˆã£ã¦ãã®ç•ªå·ãŒä½¿ç”¨ã•れã¦ã„ã‚‹å ´åˆã¯ç©ºã„ã¦ã„る別ã®ç•ªå·ã‚’使用ã™ã‚‹ã€‚

Follow me!