DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

コンピュータと人の感覚の違い

初めてコンピュータでプログラムを組んで何かを実行させようとするとコンピュータの速度に驚くと思う。

 

f:id:DreamerDream:20191230144318p:plain

例えば、下のpythonプログラムをRaspberryPiで実行すると、1から順番に1足した値が画面出力される。

c = 0
while True:
 c += 1
 print str(c)

実行結果

1
2

(略)

1396

1397
1398
1399

 

RaspberryPiのような非力なコンピュータで速度の遅いスクリプト言語を実行させても一瞬(1秒ぐらい?)で1000回ぐらいループしているのが解る。

 このようにコンピュータの「一瞬」という表現は人の感覚では測れないほど高速なのだ。

これを覚えておかないと電子工作の回路の設計ではまず

チャタリング

というものに悩まされることになる。

チャタリングの概要 | マルツオンライン

 

機械式スイッチ(トグルスイッチ・プッシュスイッチ・スライドスイッチ・機械式リレー)をコンピュータに接続して信号として入力する場合、スイッチのON-OFFの際にほぼ必ず接点がバウンドする状態が作り出されてしまう。

人が「えいっ!」と”一瞬”にしてスイッチを押した瞬間、コンピュータにはON-OFF接点バウンド信号が”しばらくの間”入力されてしまう。

例えば、RaspberryPiのGPIOでスイッチ入力させるプログラムをPythonで書いて実行させ、スイッチを押すと

 

「スイッチ入力回数表示プログラム」

#!/usr/bin/python
#coding:utf-8

import RPi.GPIO as GPIO
import time

Switch = 22
count = 0

def switch_callback(gpio_pin):
  global count
  count += 1
  print "count=" + str(count)

def standby():
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(Switch, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  GPIO.add_event_detect(Switch, GPIO.BOTH)
  GPIO.add_event_callback(Switch, switch_callback)

  while True:
    time.sleep(1)
  GPIO.cleanup()

 

if __name__=='__main__':
  standby()

 

 

結果

count=1
count=2
(略)
count=10
count=11
count=12 

 

1度だけスイッチを押したハズなのに何度もカウントされてしまうのだ。

これを予防する処置としてスイッチ回路の設計やプログラムで暫く待つ(20ms程度)という処理を入れなければ思ったような処理をさせることが難しくなる。

 

このように人にとっての「一瞬」は機械にとっては「しばらくの間」だという感覚でプログラムもしないと予期せぬエラーに見舞われることがあるので要注意だ。

 

 

次に「通信速度」の問題

 

さて「光の早さ」は30万キロメートル/秒。電気信号も光の早さで伝達される。

同軸ケーブルで伝達される高周波信号は若干遅くなるらしいが、ここでは電気信号=光速としておく。

1秒間に300,000kメートルというと地球7週半(一周40,000km)/秒とされ、途方も無く早いイメージだけど。

 

ここで問題

「地球の裏側と通信するのにどのぐらい時間がかかるのでしょうか?」

 

つまり、「地球半周はどのぐらい?」ということ。

※実際には海底ケーブルや衛星通信等でもっと長距離になるのだけど、ここでは単純に直線で結んだ場合を想定するものとする。

地球の円周は40,000kmなので20,000kmは

半周にかかる秒数 = 20,000km / 300,000km = 0.0666....秒

大雑把に計算しても最速で最低66ミリ秒はかかる。ということですね。

受け取った信号に対して返信するとさらに66ミリ秒。

処理速度を入れず、単純に信号の往復で最速132ミリ秒です。

 

この「ミリ秒」というのは機械にとっては「かなりの時間」なのだ。

以前、コンピュータの通信エラーによりロケットの打ち上げ延期になったことがあった。

イプシロンロケット、打ち上げ中止より重要な「失敗」 | 宇宙開発にひとこと

この0.07秒(70ミリ秒)の信号の遅れでコンピュータはエラーを発生させ、国家事業が延期になってしまったのだ。

 

今の時代、小さなマイコンでも10MHzや8MHzという周波数で動いている。

1MHzとは1秒間に1,000,000回命令処理する能力だ。

1MHzで1クロックの間に信号を伝達出来る距離 = 300,000,000m / 1,000,000 = 300m

なんと光の速度でも1クロックの間には300mしか進まない。

10MHzだと30m

1GHzだと0.3mだ。

つまりケーブルが30cm以上あると1GHzのCPUの1クロックの間では通信出来ないということなのだ。

まあ、一般的なPC間の通信なら「通信プロトコル」というものに合わせて組むのでこのレベルの心配は不要だが、マイコンを用いたローレベルでの通信プロトコルを自分で組むには通信ラインの長さも意識しないといけない。

 

ものすごく高速に遠くにデータを伝達しなければいけないようなプログラムを組んだ場合、いかに必用データ量を少なくするか?がキモになってくる。

動画配信サービス等はこの辺りがよく考えられていて動画の形式と視聴する端末によってデータを最小限に抑え、できるだけ近くのサーバーからデータを送れるよう工夫されている。

 

kampa.me