匿名質問者
匿名質問者匿名質問者とは「匿名質問」を利用して質問した質問者。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら

「プログラムはなぜ動くのか」という本を読んでいて、CPUとメモリの関係についてなんとなく理解ができたのですが、コンピュータの動作する流れについて、わかったようでわからないままです。

この本のおかげで、プログラマが書いたプログラムはマシン語に翻訳されてメモリ上に配置されて、それをCPUが上から順に、場合によっては番地を飛ばしたりしながら演算していくのだと理解しました。この本ではメモリの仕組みについてしっかり書かれていたので、データがメモリ上でどうやって表現されているのかということなどについてはよくわかりました。

しかし、それでもコンピュータがやっていることがよくわかりません。

私がキーボードの「A」を押したとき、コンピュータの内部では何が起きているのでしょうか?目で見えるのは、小指がキーボードの「A」の部分を押し込み、ほぼ同時にスクリーンに期待していた「あ」が表示される光景です。小指が「A」を押し込んでからスクリーンに「あ」が表示されるまでのこの間に、何が起きているのでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2015/03/11 21:45:10
  • 終了:2015/03/18 21:50:05

回答(5件)

匿名回答1号 No.1

匿名回答1号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2015/03/11 22:27:54

OSは内部にBIOS(basic I/O system:基本入出力体系)をコントロールするプログラム群を持っています。利用頻度の高い処理をOS側で用意する事によって、プログラム作成者が細かなプログラムを作成する負担から開放されるからです。そうしたOS側によって用意されている制御ルーチンのうち、キー入力を担当しているルーチンを呼び出す事で、現在リアルタイムで押下されているキー、そのアスキーコードを入手する事が可能となっています。

あなたはなぜキーボードを押そうと思ったのでしょう?。キー入力で変化が起こるプログラムを動かしているからです。

プログラムが起動している間、そのプログラムはキーデータを繰り返し要求し続けている、いわばキーボードを監視し続けているわけで、何かキーが押された時だけ画面に反映するというアクションを起こしている、という事になります。つまり、何もキーが押されていない状況下でもプログラムは無駄に動き続けているという事。処理を停止させるまでプログラムは止まりませんので。

他4件のコメントを見る
匿名回答6号

最近はそうなんですね。20年以上前の記憶で話してました。マトリックスにしておいて、列の信号線を順番にLにしていって行の信号線を読むってやつをワンチップマイコンで。

2015/03/12 21:58:32
匿名回答2号

いや、昔もそうでしょう。
縦横スキャンするのに何クロック使うか分からないけど、それより短いタイミングでON/OFFされたら読みそこなっちまう。
せめて、横1word、縦1byte で 2クロックで読みこんでキーを判断という感じでは。

ワンチップだと入力のbit数が少ないから、回路で16進に変換して1wordに納めて inp で読み込み、だったと思います。

2015/03/12 23:34:39
匿名回答3号 No.2

匿名回答3号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2015/03/11 22:43:50

CPU に、「割り込み処理」という機能があります。

割り込み (コンピュータ) - Wikipedia

CPU がメモリから読み出した命令を実行している最中に「割り込み」が発生すると、あらかじめ設定しておいた処理を実行する、という機能があります。

キーボードに限らず、CPU から見て外部からの入力を受け付けるような処理の場合に、この割り込み処理が使われます。PC の BIOS などのファームウェアや OS が、初期化処理をする時に、割り込み処理の内容をあらかじめメモリ上に配置し、「この番号の割り込みが発生したら、○○番地へ飛ぶ」みたいな設定をしておきます。

割り込みにはもう一つ、プログラムが意図的に割り込みを発生させるものもあり、実際、そのための命令が CPU に用意されています。その昔、MS-DOS というパソコン向けの簡素な OS があったのですが、アプリケーションから MS-DOS が用意している機能(例えば、ディスク上のファイルの読み書き)を呼び出す時に、この割り込み命令を使っていました。

匿名回答4号 No.3

匿名回答4号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2015/03/12 16:05:44

実装によって違うと思いますので一例として読んでいただければ。
あと厳密な用語がよく分かんないので詳しい人のフォロー待ちで。

  • No.2の回答のようにしてキーボードの入力を受け付けた後、その入力されたコードは「キーバッファ」とか呼ばれる領域に貯められます。この場合は"a"ですね。
  • OSがカーネルに対してファンクションコールをしてバッファの1文字を取ってきます。こっちの処理は割り込みじゃないですたぶん。この場合は"a"ですね。
  • この"a"に対してプログラム的にごにょごにょすると"あ"になります。
  • この"あ"をさらにプログラム的にごにょごにょすると、"あ"という形のピクセルデータになります。
  • OSはこれをVRAMとか呼ばれるグラフィックバッファ領域の表示したい場所にしまっておきます。
  • グラフィックコントローラと呼ばれるCPUとは別のプロセッサが定期的にそのデータを拾いに来て(走査と呼ばれます)、まあなんか色々計算してこれをディスプレイに表示します。

細かい部分は次の回答者よろしく。

匿名回答5号 No.4

匿名回答5号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2015/03/12 20:19:20

できるようになっているのです。

せっかくの向学心に水をさすようですが、物事は構造的に捉えることが肝要です。
構造的に捉えることで、理解するに消費する時間を節約できます。
ある部分がどうしてもわからない。できるようには考えられないと思った時にだけ、理解を深めましょう。

あなたが、今回の質問内容の回答がなければ、目的が達せないというのであれば他の方の回答に委ねます。

匿名回答7号 No.5

匿名回答7号「匿名質問」を利用した質問に回答すると「匿名回答○号」と匿名で表示されます。
「匿名質問」では、ユーザー名を公開せずに匿名の質問ができます。
詳しくはこちら
2015/03/13 17:45:42

小指が「A」を押し込んでからスクリーンに「あ」が表示されるまでのこの間に、何が起きているのでしょうか?

これが簡単そうに見えて果てしなく長い道のりなのです。
昔ならスパコンが必要なんじゃないかという程の計算を行っています。

それをCPUが上から順に、場合によっては番地を飛ばしたりしながら演算していくのだと理解しました。

基本はそうですが、今の、特にパソコンに使うようなCPUは命令がかなり増えていたりします。
整数演算だけでなく浮動小数点演算や、それを複数のメモリに対して一度に行う命令、
また、単なる演算だけでなく、指定したメモリ領域へのアクセスを許可/禁止したり、使用できる命令を制限したりする特権関係なども複雑になってます。

CPUだけでなく周辺も複雑になってます。
画面表示関係ではGPUというCPUのように(特性は違うが)演算出来るチップが使われていて、CPUとGPUが協調して画面表示が行われていますし、キーボードも昔からあるPS/2のほかUSBもあります。

さらにソフトウェアも複雑になってます。
単純に一つのプログラムで読み書きしているわけではなく、アプリケーションとOSがあり、OSもドライバや仮想ドライバ、カーネル、DLLなどのようなものがあり、入出力や割り込み処理のほか、タスクスイッチやメモリ管理、権限管理もあります。

単純にキーボードが押されたといってもキーボードの種類(日本語・英語とか、Dvorak配列や親指シフトとか)により変わってくることもある。それをかな漢字変換するのか、それはどれ(MS-IMEとかATOKとか)なのか。どのアプリケーション・ウィンドウに渡すのか。
ほかにもユーザー補助のシステムとか。
OSは設定や他の状態を参照(たとえばメモリのここが幾らの値ならとか、あそこからあそこの範囲にこれこれの値が何番目にあるから云々とか)しながら、必要なモジュールを順次呼び出し(それに伴いタスクや権限を切り替え)ます。
結果、どのアプリケーションのどの位置に表示するか、現在の状態(カーソルの位置とかaltキーが押された後かとか)から、アドレスXの値にYを掛けZを足して……とかやってウィンドウのどの位置にいくらの大きさの何のフォントで何を表示するとか決めて、決まり(APIとかABIとか言います)にしたがって、この値はメモリに配置してそのアドレスをスタックに積んで……とかやってDLLなどに表示をお願いして、それを受けてOSがフォントデータをキャッシュやディスクから探して、ベクトルデータを演算したりアンチエイリアスかけたり、またはGPUに渡すためにアドレスをドライバに通知したりDMA使うためにIO命令だしたり。

ほかにもスクリーンセーバーが動いていないかどうかとか、ディスクからファイルを読みだすならウィルスチェックのソフトが動くとか、キャッシュのメモリを割り当てるとか。

といった事を一気に学ぼうと思っても大変なので、MS-DOSのプログラミングあたりから学んでいくとわかりやすい気がします。

ちなみに皆さんが書いてるのは入出力(IO)ですね。

データがメモリ上でどうやって表現されているのかということなどについてはよくわかりました。

とあるからでしょう。
IOについては通常のIOのほか、VRAMで出てるんですがメモリマップドIOとかDMA転送とかいくつかあり、IOを支えてるのがハードウェア割り込みです。
#ほかに権限違反とかでソフトウェア割り込みがあります。

匿名回答7号

もっと原始的なコンピュータについて知りたいです。それについて書かれた本などがあれば教えていただけないでしょうか?


http://www.amazon.co.jp/dp/4789831655
コンピュータというか、それを構成するハードウェアの話です。
今のPCに使われているチップセットもこれらが発展に発展を重ねたものといえます。

あと、コンピュータの具体的な動作を知りたければ存在するコンピュータ自体を知るのが一番な気がするので、その候補と解説本的なものをググって見ました。

TK-80
http://www.st.rim.or.jp/~nkomatsu/evakit/TK80.html
ハードウェアは小さく単純です。有名なので情報も多いと思います。
実際に扱った事はないですが、ハードウェアが単純だとソフトウェアが複雑というかトリッキーになりがちなので、その辺の心配はあります。
あと、PCとは違いすぎるというのもあります。
http://www.amazon.co.jp/dp/4756134017
どこかで安く手に入るなら良いのですが。

PC-9801シリーズ
国産PCです。なので情報も多いです。実ハードの入手も(それなりの価格がしますが)可能と思います。
http://www.webtech.co.jp/company/doc/undocumented_mem/index.html
解説は割り込みやIOなどが分かってる前提です。
http://www.amazon.co.jp/dp/4871484238
テクニカルデータブックは本当にデータブックなので解説はほとんどありません。
そのかわり詳細です。

実機をいじれるとおもしろいし、わかりやすいとは思いますが、なかなか大変ですのでエミュレータとか使うと良いでしょう。
http://homepage3.nifty.com/takeda-toshiya/common/index.html
http://retropc.net/yui/np2.html
http://worholicanada.mydns.jp/pc98/00101.html
OSはFreeDOSが良いのではないでしょうか。
http://dosmania.blog.fc2.com/blog-entry-76.html
http://mwlab.net/2011/11/pc-98-emu-hdd-image.html
nasmというアセンブラが使えるようです。
http://www.freedos.org/software/?prog=nasm

PC/AT互換機
これまでの国産機と違いどうしても英語情報が多くなりますが、情報もソフトウェアも多く、なにより目の前のそれが実機とも言えます。
#mac使ってたらすいません
http://www.amazon.co.jp/dp/4816318313
http://www.amazon.co.jp/dp/4789834964
書籍の方はやっぱり少ない様で、取り合えず見つけたのをあげた感じです。
ソフトウェアは先のFreeDOSもいいですが、DOSBoxも良いのではないでしょうか。
http://ja.wikipedia.org/wiki/DOSBox
nasmも使えるようです。
http://www7b.biglobe.ne.jp/~makandat/NASM.html

と、まあ、ほとんどアセンブラ入門って感じになりますが、CPUとメモリというハードウェアから広げていくとそうなるのかなと思います。
#と書いてから、逆にハードウェアから離れてOSのプロセス管理やメモリ管理なんかに行くのもありな気がした
#最終的には「電子計算機概論」みたいな話になってしまうかも

2015/03/14 00:27:01
匿名質問者

質問者から

匿名質問者2015/03/20 11:09:32

うーん、深いですね…。みなさんの回答読ませてもらいましたが、どの方もとても丁寧に教えてくださっているのでベストアンサーを選ぶのが難しいです。現代のコンピュータは複雑すぎるようなので、もっと原始的なコンピュータについて知りたいです。それについて書かれた本などがあれば教えていただけないでしょうか?

  • 匿名回答8号
    匿名回答8号 2015/03/16 11:50:02
    GUIを前提としたプログラムの動作って、相当難しいんですよね…「A」を打っているのに「あ」が表示されるにのはIM(昔風だとFEP)が関わってくるので、特に複雑。私も細部は理解できないです。

    キーボードの「A」を打って「A」が表示される方にした方がずいぶん簡単でしょう。それでも十分に複雑です。


    「現代の」という括りよりは「GUIかCUIか」「インタラクティブかノン・インタラクティブか」の方が大きいです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません