ラベル yasu_kei の投稿を表示しています。 すべての投稿を表示
ラベル yasu_kei の投稿を表示しています。 すべての投稿を表示

2012年9月1日土曜日

マルチスレッドとは・・・

このエントリーをはてなブックマークに追加
マルチスレッドプログラムについて経験値がいくらかたまったので、一度自分の知見をまとめてみようと思います。自分の知識の整理を目的としたいと思います。

スレッドとは

端的に言うと、スレッドとは、プログラムを実行する主体の最小単位です。ここで言っている主体とは、例えば、a.outという実行ファイルを実行する"そのもの"を指します。プログラムを実行するスレッドが1つであればそれをシングルスレッドプログラムと呼び、プログラムを実行するスレッドが複数であればそれをマルチスレッドプログラムと呼びます。シングルスレッドプログラムはa.outを逐次実行し、マルチスレッドプログラムはa.outを並列・並行実行します。
次にリソースの観点では、スレッドはプログラムカウンタを始めとしたレジスタ群とスタックを個別に持ちます。スレッドは、プログラムを実行する主体の最小単位であるため、それぞれに個別のプログラムカウンタとスタックを持つ必要があります。一方で、命令コードと静的データ、ヒープは、スレッド間で共有されます。これら命令コード、静的データ、ヒープを所有する主体となるのが、プロセスです。
スレッドは、必ず1つのプロセスに属します。また、1つのスレッドが2つ以上のプロセスに属することはありません。プロセスというのは、実行される実行ファイルごとのメモリ上の区切りのようなものです。プロセスごとに、命令コード、静的データ、ヒープ、スタックをメモリ上に持ちます。実行ファイルa.outを2つ同時に実行すれば、2つのプロセスがコンピュータ上に同時に存在するということになります。もちろんこのとき、それぞれのプロセスにスレッドが存在します。

シングルスレッドプログラムとマルチスレッドプログラム

シングルスレッドプログラムとマルチスレッドプログラムの実装の違いを、簡単に見てみます。マルチスレッドプログラムで用いるスレッドライブラリは、openMPとpthreadを使いました。
以下、printfを10回実行するプログラムです。環境によっては、マルチスレッドプログラムのhelloがプリントされる順番が入れ替わったりするかと思います。

singleThread.c
#include <stdio.h>

int main(void)
{
 int i;
 
 for(i = 0; i < 10; i++)
 {
  printf("hello%d\n", i);
 }
 
 return 0;
}

multiThread_openMP.c
#include <stdio.h>
#include <omp.h>

int main(void)
{
 int i;
 
 #pragma omp parallel for
 for(i = 0; i < 10; i++)
 {
  printf("hello%d\n", i);
 }
 
 return 0;
}

multiThread_pthread.c
#include <stdio.h>
#include <pthread.h>

#define NUMOF_THREADS 10

void* printHello(void* arg)
{
 printf("hello%d\n", *(int*)arg);
}

int main(void)
{
 int i;
 pthread_t threads[NUMOF_THREADS];
 int threadArg[NUMOF_THREADS];
 
 for(i = 0; i < NUMOF_THREADS; i++)
 {
  threadArg[i] = i;
  pthread_create(&threads[i], NULL, printHello, (void*)&threadArg[i]);
 }
 
 for(i = 0; i < NUMOF_THREADS; i++)
 {
  pthread_join(threads[i], NULL);
 }
 
 return 0;
}


singleThread.cは、単にprintfをfor文で回しているだけなので、特に問題ないと思います。
multiThread_openMP.cは、singleThread.cとほぼ同じです。異なるのは、openMPのヘッダをインクルードしていることと、for文の前に#pragma omp paralle forの1行があることだけです。たったこれだけで、for文のなかのprintfが並列・並行実行されます。
multiThread_pthread.cは、openMPのものと同じ並列・並行実行であるのに対して、コード量が多くなっています。これは、pthreadでは、スレッドの作成と、終了待ちを関数呼び出しで明示的に行う必要があるためです。openMPの方では、ほぼスレッドなど意識せずただfor文を並列に実行する、とプログラムしているだけでした。
上記の例を一見すると、openMPの方が簡単にマルチスレッドプログラムを作ることができます。しかし、for文の並列化はopenMPが得意とするところなので、openMPの方がコード量を少なく記述できているだけです。
世にいくつかもあるスレッドライブラリですが、それぞれに得意なところ、不得意なところがあります。得意なところは、比較的コード量が少なくなり、不得意なところはコード量が多くなるのが一般的かと思います。また、各スレッドの同期等の細かな動作を細かく制御できるスレッドライブラリは、細かく制御できる分、コード量が多めになる傾向があります。pthreadは比較的何でもできるスレッドライブラリなので、並列化のためのコード量が多めになりがちです。

まとめ

スレッドの概念、スレッドとプロセスの関係を説明し、マルチスレッドプログラムの例を見ました。スレッドライブラリはいくつもあり、それぞれに得意・不得意なところを持っていることを述べました。マルチスレッドプログラムに関して、説明しなかったしなかったことは、なぜマルチスレッドにするのか?、何をマルチスレッド化するのか?、どのようにマルチスレッド化するのか?といったことになります。こういったことは、マルチスレッドに関する本が参考になります。また、現実に使われているマルチスレッドプログラムを探しだして読むことも参考になります。


2012年3月9日金曜日

minttyにカラースキームを適用する

このエントリーをはてなブックマークに追加
Cygwinのターミナルエミュレータminttyにカラースキームsolarizedを適用します。minttyのデフォルトカラースキームもいいですが、solarizedの方が目にやさしいと思います。

solarized mintty

まず、solarizedの公式ページ。
SOLARIZED

mintty版のsolarizedはこちらにあります。
mavnn/mintty-colors-solarized

READMEのところにも書いてありますが、まず、sol.darkとsol.lightをダウンロードして適当な場所に置きます。次に、以下のコマンドを実行します(もちろん、your_dirは適当に置いた場所です)。これによりカラースキームがターミナルに適用されます。

source ~/your_dir/sol.light

or

source ~/your_dir/sol.dark

minttyの起動時にカラースキームを適用させるには、cygwin上の /etc/bash.bashrc に上記コマンドを追加します。以上で、カラースキームsolarizedの適用は終わりです。

vimやemacsにも、このsolarizedのテーマが引き継がれるようなので、エディタも見やすくなります。 ただしvimの場合は、.vimrcにsyntax enableを追加する必要があるかもしれません。


参考ページ
新卒さんのための人気Vimカラースキーマランキング5+1(vim.org & github調べ) - 常識という迷信

2012年3月6日火曜日

Rubyでスレッド処理をしてみた

このエントリーをはてなブックマークに追加
Rubyでスレッド処理をしてみました。ちょっとでも使えるようになると、プログラミングが楽しくなるのが、スレッド処理かなと思います。

今回のサンプルプログラムでは、メインとなるプログラムのスレッドのほかに、2つのスレッドを作成します。それぞれのスレッドで文字列を並行して出力させ、実行結果がどうなるか見てみます。

thread_sample1.rb
require 'thread'

# 1つ目のスレッド(作成後、すぐに走り始める)
Thread.new do
  5.times do
    puts "Thread1"; $stdout.flush
  end
end

# 2つ目のスレッド(作成後、すぐに走り始める)
Thread.new do
  5.times do
    puts "Thread2"; $stdout.flush
  end
end

# 上記2つのスレッドの実行が終わるのを待つ
Thread.list.each { |t| t.join unless t == Thread.current }

puts "Main Thread"


実行結果
(※同じプログラムでも、実行環境によって実行結果が変わると思います。)
$ ruby thread_sample1.rb
Thread1
Thread2Thread1

Thread2
Thread1
Thread2
Thread2Thread1

Thread1Thread2

Main Thread


プログラムではputsを使って文字列を1行単位で出力させている($stdout.flushも敢えて実行させている)はずですが、実際の実行結果では、なぜか"Thread2Thread1"と続けて文字列が出力されました。このあたりがスレッド処理特有の現象で、1つのメインプログラムだけのシングルスレッドではなかなか予想できないことが、起きるようになります。

この"Thread2Thread1"と出力された原因は、おそらく、Thread2が出力バッファからflushされる前に、Thread1が出力バッファに書きこまれたためです。よって、出力部分をMutexでロックしてflushまでをアトミックな処理にするようプログラムを変更してみます。

thread_sample2.rb
require 'thread'

# Mutex
lock = Mutex.new

# 1つ目のスレッド(作成後、すぐに走り始める)
Thread.new do
  5.times do
    lock.synchronize { puts "Thread1"; $stdout.flush }
  end
end

# 2つ目のスレッド(作成後、すぐに走り始める)
Thread.new do
  5.times do
    lock.synchronize { puts "Thread2"; $stdout.flush }
  end
end

# 上記2つのスレッドの実行が終わるのを待つ
Thread.list.each { |t| t.join unless t == Thread.current }

puts "Main Thread"


実行結果
(※同じプログラムでも、実行環境によって実行結果が変わると思います。)
$ ruby thread_sample2.rb
Thread1
Thread1
Thread1
Thread1
Thread1
Thread2
Thread2
Thread2
Thread2
Thread2
Main Thread

今度は、putsからflushまでがアトミックな処理として行われたことを反映して、Thread1, Thread2の文字列出力が1行ごとに出力されています。スレッドを使うと予期せぬ現象が起こり、バグになりやすいため扱いが難しいところもありますが、その分使いこなせるようになるとおもしろいと思います。

参考ページ
ミューテックス - Wikipedia -
アトミック性 - Wikipedia -
スレッドセーフ - Wikipedia -

2012年2月12日日曜日

twitter botプログラムを作ってみた

このエントリーをはてなブックマークに追加
twitter botプログラムを作ってみました。このbotは、インターネットを定期的に移動して、今いるページのURLをサムネイル付きでTwitterに投稿します。

botプログラムのTwitterアカウント
http://twitter.com/#!/wandering_bot


2011年12月29日木曜日

apt-cygのプロキシ設定

このエントリーをはてなブックマークに追加
Cygwinをとりあえず使うまでの手順に補足です。使う人の環境によっては、apt-cygをとりあえず使うまでにプラスαの手順が必要になるので、紹介しておきます。この手順は、会社や学校などのネットワークでプロキシが設定されている場合への対処法です。

結論としては、wgetの設定ファイルである/etc/wgetrcにプロキシの設定を加えます。
おそらく、デフォルトの/etc/wgetrcには次のような記述がすでに含まれています。

# You can set the default proxies for Wget to use for http, https, and ftp.
# They will override the value in the environment.
#https_proxy = http://proxy.yoyodyne.com:18023/
#http_proxy = http://proxy.yoyodyne.com:18023/
#ftp_proxy = http://proxy.yoyodyne.com:18023/

このhttp_proxyやftp_proxyのコメントアウトをはずして、使用しているネットワーク環境のプロキシ設定に合わせたものに書き換えてください。プロキシの設定がどうなっているかわからない場合、まずはInternetExplorerのプロキシ設定を見てみてください。大抵はこれで解決します。

<InternetExplorerのプロキシ設定>
InternetExplorerを立ち上げる → 「ツール」 → 「インターネットオプション」 → 「接続」 → 「LANの設定」 → 「詳細設定」 をクリックする。

httpsやhttp、ftpのプロキシが設定されているはずです。これと同じ設定を、/etc/wgetrcにも設定してください。これにより、wgetがプロキシを通したネットワーク環境でも動作するようになり、apt-cygも使えるようになります。

参考ページ
プロキシ設定: Internet Explorer for Windows
proxy あれこれ

2011年11月27日日曜日

javariでクーポン3,000円 (-12/5まで)

このエントリーをはてなブックマークに追加
タイトルの通りです。
8,000円以上の買い物が、クーポン3,000円の対象だそうです。
Amazon.co.jpのアカウント持っている人は、そのままjavariで買い物できるので寄ってみてはどうでしょうか?

ちなみに私はランニングシューズを買ってみました。


8,000円以上のお買い上げで今すぐ使える3,000円のクーポンプレゼント @ javari


2011年11月20日日曜日

Kindleを買いました

このエントリーをはてなブックマークに追加
まだまだ日本では電子書籍が流行っているという状況ではないと思いますが、近い将来、電子書籍が主流になっていくだろうという予想のもと、すでに売られている電子書籍リーダーKindleを買ってみました。ちょっとさわってみたあとの雑感としては、電子インク見やすい、薄い、軽いといった感じで、Kindle買ってよかったなと思いました。

KindleへのWelcome message

2011年11月19日土曜日

きのこ

このエントリーをはてなブックマークに追加
ネーミングにセンスを感じるフリーソフトです。
デスクトップのアイコンを小さくして、一覧性をよくしてくれます。
PCのデスクトップが混沌としがちな方に、特におすすめです。

まずは、スクリーンショット。
http://freesoft-100.com/screen/kinoko1up.html
残念ながら、自PCのWindows7 64bitではきのこを使えないようでスクリーンショットを撮れないので、他サイトのものを参照させてもらいました。

きのこを使うと、上のリンク先の図のようにデスクトップのアイコンが小さくなります。エクスプローラの一覧表示や詳細表示のように見せてくれるので、一気に一覧性がよくなります。私も仕事で使っているPCにはきのこを入れており、重宝しています。

Windows VistaやWindows 7では、デスクトップ上でCtrl+マウスホイールさせるとアイコンのサイズを変えてくれますが、やはりきのこの方がよいです。ネーミング的にも。

きのこ
http://www.vector.co.jp/soft/win95/util/se354433.html

きのこ1UP++
http://www.tmkoubou.com/kinoko.html
http://freesoft-100.com/review/kinoko1up.php

Win7のCtrl+マウスホイールにより最小化したアイコン。きのこはもっと小さくしてくれる。

2011年11月13日日曜日

WellnessLINKで日々の活動を記録する

このエントリーをはてなブックマークに追加
歩数計(万歩計)も少しずつ進歩しているもので、最近のものは、記録した歩数をネットに記録してくれます。オムロンの活動量計HJA-307ITを使えば、付属のUSB通信トレイの上に置くだけで、自動的に日々の歩数計の記録をWellnessLINKに記録してくれます。記録は、WellnessLINK上でグラフで見ることができ、日々の運動へのよい刺激になります。

WellnessLINK上で見ることができるグラフ

2011年11月5日土曜日

デスクトップカレンダー+時計アプリ - SlideCalendar -

このエントリーをはてなブックマークに追加
PCを使っていると、けっこうな頻度でカレンダーを参照したくなることがあると思います。そんなとき、いちいちWindowsの右下にある時計をクリックしているのであれば、SlideCalendarをインストールしてみるといいかもしれません。カーソルを左に動かすだけで、数ヶ月先までチェックできるようになります。

カーソルを左端にもっていくとカレンダーがスライドして表示される

カーソルを端に合わせずカレンダーを隠した状態だと、次のように日付と時計が表示されます。個人的には、秒表示がよいと思うことと、ここで時刻をチェックできるのでWindows標準の右下の時計をなくしタスクバーを若干広く使えるようになることがよいと思います。

カレンダーを隠した状態

アプリのダウンロードは、作者さんのホームページ、もしくはVectorからできます。

2011年10月26日水曜日

ちょこっと加湿器

このエントリーをはてなブックマークに追加
部屋が乾燥しているのはわかっているけど、加湿器までは買いたくない。

そんな人には、コレがおすすめ。

水を入れるだけで加湿器になります。手軽に持ち運びもOK。オフィスでも使えます。


2011年10月23日日曜日

気持ちよく書けるボールペン「ジェットストリーム」

このエントリーをはてなブックマークに追加
気持ちよく”書く”ことができれば、それだけ仕事、勉強もはかどる。といっても過言ではないと思う。

ジェットストリームを使うと、誰しもこのボールペンは何かが違うと感じるはず。 

書く心地はさながら、こちらのJET STREAMのようです。お試しあれ。




2011年10月2日日曜日

Cygwinをとりあえず使うまで

このエントリーをはてなブックマークに追加
たまにあると便利なので、Cygwinをとりあえず使うまでに必要なことは以下の通りです。
Cygwinのインストールと、Cygwinの各種パッケージを管理するapt-cygのインストールを行います。apt-cygはかなり便利ですので、インストールをおすすめします。

2011年9月25日日曜日

Google+の一般開放

このエントリーをはてなブックマークに追加
Google+が一般開放されました。
(Googleの検索結果の左上を見て)

スクリーンショットはこちら。


中央にストリーム(Twitterでいうタイムライン)があり、自分のサークル(Twitterでいうフォローしている人の集合)に入っているひとの投稿が表示されます。UIは、Google Buzzと比べると洗練されているように見えますね。

Google+で出来ることは、Twitterでいうつぶやきはもちろんのこと、撮った写真の共有や複数人でのビデオチャット、リアルタイムでほかのユーザとお絵かきなどがあるようです。
Google+が全ユーザーに開放~新たに9つの機能を追加
Google+: 92, 93, 94, 95, 96, 97, 98, 99... 100.

”ソーシャル”が最近ホットですが、TwitterやFacebookなどに続いて流行るんでしょうか。。

また、検索はPageRankからソーシャルへ向かうのか。全部が全部じゃないにしろ、何らかの情報の性質によって住み分けるのかなぁと思います。

参考ページ
ソーシャル検索が日本にもやってきました
http://ja.wikipedia.org/wiki/ページランク
人力検索はてな
Googleプロフィール検索が超ヤバイ!Google+登場で個人情報をどう扱うか?

2011年8月6日土曜日

Linuxへ移行してみた

このエントリーをはてなブックマークに追加
Xubuntu をセットアップしたときのメモです。

Xubuntu は、軽い Ubuntu という位置付け。
今回インストールしたバージョンは、11.04です。


2011年7月10日日曜日

Chorme拡張機能の自作体験

このエントリーをはてなブックマークに追加
Googleの公式ページにある入門用サンプルを利用して、Google Chromeの拡張機能(Extension)の自作を体験します。

2011年7月3日日曜日

自前のプリンタを持たないなら、ネットプリント

このエントリーをはてなブックマークに追加
ネットプリントは、セブンイレブンのプリンタで、自分のファイルを有料で印刷できるサービスです。プリンタは持ちたくないけど、ごくたまに印刷したいときがある人にはぴったり。

2011年6月3日金曜日

WiMAXを試す - Try WiMAX -

このエントリーをはてなブックマークに追加
WiMAXを試しに使ってみました。モバイルルータは思ったよりも小さかったです。速度は調べ物などでネットを使う分には問題ないです。

I tried using WiMAX. The mobile router was smaller than I thought. There is no problem to use for searching on the Internet.


2011年5月27日金曜日

Chromeでよく使うショートカット - Commonly used shortcuts in Chrome -

このエントリーをはてなブックマークに追加
Chrome使いならこれぐらいのショートカットは使いこなしたいですね。

If you are a Chrome user, you are expected to use the following shortcuts.

2011年5月20日金曜日

龍安寺の写真 - Photos of Ryoanji -

このエントリーをはてなブックマークに追加
ちょっと前になりますが、京都の龍安寺に行ってきました。龍安寺の石庭で有名ですね。今日は息抜きの写真展です。

I went to Ryoanji in Kyoto a little before. It's famous for the Ryoanji rock garden. Today is a break photo gallery.