Ruby1.9/スレッド処理を読む
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#contents
*はじめに [#s658c09b]
今回はRuby1.9のスレッド処理を読解したいと思います。対象と...
-スレッドの作成
-スレッドのスケジューリング
*スレッドの作成 [#l5b791f1]
**thread_s_new(thread.c) [#hf1796e7]
Rubyで、
Thread.new { ... }
とした場合に呼ばれる処理関数はthread_s_new関数です。まずr...
**thread_create_core(thread.c) [#i155b3ea]
thread_create_core関数ではまずスレッドが実行するprocが設...
rb_block_proc関数(proc.c)→proc_new関数→vm_make_proc関数...
その後、native_thread_create関数が呼ばれプラットフォーム...
**vm_make_env_each(vm.c) [#ic77bde0]
vm_make_proc関数が呼び出しているvm_make_env_object関数、...
stop = false
timer_th = Thread.new(0.1) {|interval|
until stop
print '.'
$>.flush
sleep interval
end
puts
}
timer_th.join(1.0)
stop = true
timer_th.join
スタックの内容はこんな感じ。ブロックの中だと再帰的に情報...
|stop
|time_th
|svar
dfp,lfp→|GC_GUARDED_PTR(0)
sp,bp→|
...
cfp→|トップレベルのフレーム情報
トップレベルのiseqはNORMALなiseqなのでlocal_sizeは3になり...
env_size = 3 + 1 + 2
local_size = 3
prev_envval = 0
また、各種ポインタは以下のように設定されます。
env->env→|stop
|time_th
|svar
lfp,dfp→|GC_GUARDED_PTR(0)
|envval # self
|penvval # 0
呼び出し側のlfp, dfpも変更することでProc作成側とProcで変...
**thread_start_func_1(thread_pthread.c) [#c7d4f018]
ネイティブスレッドの実行関数としてthread_start_func_1関数...
**thread_start_func_2(thread.c) [#q79e57e4]
というわけでスレッド実行のメインであるthread_start_func_2...
Init_Thread(void)
{
...
/* acquire global interpreter lock */
rb_thread_lock_t *lp = &GET_THREAD()->vm->global_in...
native_mutex_initialize(lp);
native_mutex_lock(lp);
となっているのでメインスレッドが獲得しっぱなしです。とい...
ロックを獲得した後はスレッドに設定されたブロックを実行し...
*スレッドのスケジューリング [#x9e13dab]
というわけでスレッドがどう作られて初期化されて実行される...
> ネイティブスレッドを使うということはCレベルでもプリエン...
ということなようです。それではいつglobal_interpreter_lock...
**RUBY_VM_CHECK_INTS(vm_core.h) [#de7f467e]
今までちらほらRUBY_VM_CHECK_INTSマクロというのを見てきた...
#define RUBY_VM_CHECK_INTS_TH(th) do { \
if(th->interrupt_flag){ \
/* TODO: trap something event */ \
rb_thread_execute_interrupts(th); \
} \
} while (0)
#define RUBY_VM_CHECK_INTS() \
RUBY_VM_CHECK_INTS_TH(GET_THREAD())
というわけでrb_thread_execute_interrupts関数に続きます。...
**rb_thread_schedule(thread.c) [#hf265103]
rb_thread_schedule関数にて、
native_mutex_unlock(&th->vm->global_interpreter_lock);
{
native_thread_yield();
}
native_mutex_lock(&th->vm->global_interpreter_lock);
となっており、global_interpreter_lockが解放されています。...
**timer_thread_function(thread.c) [#h9f310b8]
スレッドが切り替わるきっかけはいろいろありますが普通時間...
Init_Thread(void)
{
...
rb_thread_create_timer_thread();
}
thread_pthread.c
rb_thread_create_timer_thread(void)
{
...
err = pthread_create(&timer_thread_id, &attr, thread_ti...
とスレッドが作られており、
thread_timer(void *dummy)
{
while (system_working) {
struct timespec req, rem;
req.tv_sec = 0;
req.tv_nsec = 10 * 1000 * 1000; /* 10 ms */
nanosleep(&req, &rem);
...
timer_thread_function();
}
とtimer_thread_function関数が呼び出されています。ここでま...
timer_thread_function(void)
{
rb_vm_t *vm = GET_VM(); /* TODO: fix me for Multi-VM...
/* for time slice */
RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread);
vm_core.h
#define RUBY_VM_SET_TIMER_INTERRUPT(th) ((th)->interrupt...
ということで現在実行しているスレッドに割り込みフラグが設...
*おわりに [#y5166422]
今回はRuby1.9のスレッド処理を見てきました。Ruby1.9ではネ...
ではネイティブスレッドにしても意味ないんじゃないのか?と...
> rubyの重要関数はどいつもこいつもデカい。このrb_thread_s...
と書かれているものがRuby1.9ではわずか18行です。これだけで...
それではみなさんもよいコードリーディングを。
終了行:
#contents
*はじめに [#s658c09b]
今回はRuby1.9のスレッド処理を読解したいと思います。対象と...
-スレッドの作成
-スレッドのスケジューリング
*スレッドの作成 [#l5b791f1]
**thread_s_new(thread.c) [#hf1796e7]
Rubyで、
Thread.new { ... }
とした場合に呼ばれる処理関数はthread_s_new関数です。まずr...
**thread_create_core(thread.c) [#i155b3ea]
thread_create_core関数ではまずスレッドが実行するprocが設...
rb_block_proc関数(proc.c)→proc_new関数→vm_make_proc関数...
その後、native_thread_create関数が呼ばれプラットフォーム...
**vm_make_env_each(vm.c) [#ic77bde0]
vm_make_proc関数が呼び出しているvm_make_env_object関数、...
stop = false
timer_th = Thread.new(0.1) {|interval|
until stop
print '.'
$>.flush
sleep interval
end
puts
}
timer_th.join(1.0)
stop = true
timer_th.join
スタックの内容はこんな感じ。ブロックの中だと再帰的に情報...
|stop
|time_th
|svar
dfp,lfp→|GC_GUARDED_PTR(0)
sp,bp→|
...
cfp→|トップレベルのフレーム情報
トップレベルのiseqはNORMALなiseqなのでlocal_sizeは3になり...
env_size = 3 + 1 + 2
local_size = 3
prev_envval = 0
また、各種ポインタは以下のように設定されます。
env->env→|stop
|time_th
|svar
lfp,dfp→|GC_GUARDED_PTR(0)
|envval # self
|penvval # 0
呼び出し側のlfp, dfpも変更することでProc作成側とProcで変...
**thread_start_func_1(thread_pthread.c) [#c7d4f018]
ネイティブスレッドの実行関数としてthread_start_func_1関数...
**thread_start_func_2(thread.c) [#q79e57e4]
というわけでスレッド実行のメインであるthread_start_func_2...
Init_Thread(void)
{
...
/* acquire global interpreter lock */
rb_thread_lock_t *lp = &GET_THREAD()->vm->global_in...
native_mutex_initialize(lp);
native_mutex_lock(lp);
となっているのでメインスレッドが獲得しっぱなしです。とい...
ロックを獲得した後はスレッドに設定されたブロックを実行し...
*スレッドのスケジューリング [#x9e13dab]
というわけでスレッドがどう作られて初期化されて実行される...
> ネイティブスレッドを使うということはCレベルでもプリエン...
ということなようです。それではいつglobal_interpreter_lock...
**RUBY_VM_CHECK_INTS(vm_core.h) [#de7f467e]
今までちらほらRUBY_VM_CHECK_INTSマクロというのを見てきた...
#define RUBY_VM_CHECK_INTS_TH(th) do { \
if(th->interrupt_flag){ \
/* TODO: trap something event */ \
rb_thread_execute_interrupts(th); \
} \
} while (0)
#define RUBY_VM_CHECK_INTS() \
RUBY_VM_CHECK_INTS_TH(GET_THREAD())
というわけでrb_thread_execute_interrupts関数に続きます。...
**rb_thread_schedule(thread.c) [#hf265103]
rb_thread_schedule関数にて、
native_mutex_unlock(&th->vm->global_interpreter_lock);
{
native_thread_yield();
}
native_mutex_lock(&th->vm->global_interpreter_lock);
となっており、global_interpreter_lockが解放されています。...
**timer_thread_function(thread.c) [#h9f310b8]
スレッドが切り替わるきっかけはいろいろありますが普通時間...
Init_Thread(void)
{
...
rb_thread_create_timer_thread();
}
thread_pthread.c
rb_thread_create_timer_thread(void)
{
...
err = pthread_create(&timer_thread_id, &attr, thread_ti...
とスレッドが作られており、
thread_timer(void *dummy)
{
while (system_working) {
struct timespec req, rem;
req.tv_sec = 0;
req.tv_nsec = 10 * 1000 * 1000; /* 10 ms */
nanosleep(&req, &rem);
...
timer_thread_function();
}
とtimer_thread_function関数が呼び出されています。ここでま...
timer_thread_function(void)
{
rb_vm_t *vm = GET_VM(); /* TODO: fix me for Multi-VM...
/* for time slice */
RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread);
vm_core.h
#define RUBY_VM_SET_TIMER_INTERRUPT(th) ((th)->interrupt...
ということで現在実行しているスレッドに割り込みフラグが設...
*おわりに [#y5166422]
今回はRuby1.9のスレッド処理を見てきました。Ruby1.9ではネ...
ではネイティブスレッドにしても意味ないんじゃないのか?と...
> rubyの重要関数はどいつもこいつもデカい。このrb_thread_s...
と書かれているものがRuby1.9ではわずか18行です。これだけで...
それではみなさんもよいコードリーディングを。
ページ名: