23 Sept 2023
Non-blocking IO vs blocking IO
Programmer တွေတခါတလေ အရေမရ အဖတ်မရ ငြင်းကြတဲ့အထဲမှာ ငါ့ language က မြန်တယ် သူ. language က မြန်တယ်ဆိုတာ။ဘယ်ဟာကမြန်တာလဲ CPU ပေါ်လုပ်တဲ့ task လား IO လုပ်တဲ့ကောင်လား။ ဒါမှမဟုတ် thread operation တွေမှာ lock တွေ စောင့်စရာမလိုပဲလုပ်နိုင်တာမျိုးလား မသဲသာ မသဲကွဲတာ။ တခါမြင်ဖူးပါတယ် PHP နဲ. Node.js မှာ PHP ကပိုမြန်တယ်ဆိုတာ။ ကိုယ်နဲ.လဲ မဆိုင်လို. ဝင်တော့မပြောမိဘူး။
ခုနက မြန်တယ်ဆိုတဲ့ ကိစ္စ ကိုဆက်ရရင် ခု language တွေမှာ Node.js (သူကတော့ language ဆိုတာထက် runtime environment လို.ပြောရင်ပိုမှန်မယ်) မတိုင်ခင်အထိက CPU computing time ကိုပဲ ပြောတာ များကြတယ်။ နောက် Node.js ပေါ်လာတော့ response တိုင်းကိုပြောလာကြတယ်။ Node.js ကမြန်တယ်ဆိုတာ response time ကိုပြောတာ။
ဒါဆို Response time ဆိုတာဘာလဲဆိုတာပြောဖို.လိုလာပြီ။ Response time ကိုပြောဖို.ဆိုရင် execution time ဆိုတာသိဖို.လိုလာပြီ။ Execution time ဆိုတာ task တခု (ဆိုကြပါစို. program function တခုခုပေါ့) ကို CPU အပေါ်မှာ တင်ပြီး run ဖို.ကြာတဲ့အချိန်ကိုဆိုလိုတာ။ ဆိုချင်တာက a+b အဲ့လို arithmetic တွေ if လို jump တွေသည် CPU ပေါ်မှာလုပ်ရတာ ဒီလိုကောင်တွေဖို.ဆို execution time လို.ဆိုတယ်။
Program တိုင်းက ခုနက ပေါင်းမယ် နှုတ်မယ် conditional jump ခုန်မယ်ပဲလုပ်တာမဟုတ်ဘူး။ ဘာလိုသေးလဲဆိုတော့ IO လိုတယ်။ ဥပမာ file ဖတ်မယ်။ File ကို သွားရိုက်မယ်။ ဒါတွေလိုတယ်။အဲ့တော့ ခုနက CPU task ကနေ IO ကိုသွားဖတ်ရတယ်။ Response time ဆိုတာ ကိုလိုချင်တဲ့ ဥပမာ HTTP request တခုပေါ့ သူ.ကိုစတဲ့အချိန်ကနေ ပြီး client ဘက်ကို response ပြန်လာတဲ့အချိန်ကိုတိုင်းတာ။
ခုနက Node.js သည် response time မြန်တယ်ဆိုတာကိုရှင်းရရင် non-blocking IO ကြောင့်လို.ဆိုရမယ်။ ဒါဆို Non-blocking IO ကိုရှင်းဖို. blocking IO ကိုရှင်းရမယ်။ Blocking IO ဆိုတာ file တခုဖတ်မယ်။ ဥပမာ
file.read
otherTask();
ဆိုပါစို. blocking IO မှာ file.read ဆိုတာကြီး မပြီးသေးသရွေ. otherTask ကိုဆင်းမလာဘူး။ file ကို ကုန်အောင်ဖတ်မယ် ဖိုင်ဖတ်တဲ့အလုပ် ပြီးမှပဲ နောက်တကြောင်းကိုဆင်းမယ်။ ဒါကို blocking IO လို.ခေါ်တယ်။ မြင်သာအောင်ပြရရင် city mart တွေမှာ ပိုက်ဆံရှင်းရင် ရှေ.ကလူက မပြီးသေးရင် နောက်လူက ရှေ.လူပြီးတာကိုစောင့်နေရတယ်။ ရှေ.က လူက item များနေတယ်ဆိုရင် အမှန်က နောက်လူက ဝယ်ထားတာနည်းနည်းလေးဆို နောက်လူကိုရှင်းပေလိုက်ရင်ပိုမြန်မှာပေါ့။
Non-Blocking ကျတော့ ဒီလိုမဟုတ်ဘူး Lotteria မှာ သွားပြီး ကောင်တာမှာ မှာသလိုပေါ့။ ကိုယ်မှာထားတာ အကုန်လုံးပြီးအောင် တခါတည်းစောင့်စရာမလိုဘူး အဲ့လိုစောင်ေ့နရင် ကိုမပြီးသေးသရွေ. နောက်လူကို process (order မှာတာ) လုပ်ပေးလို.မရဘူး။ waiting လုပ်နေရမယ်။ အဲ့တော့ ခုနက လူကို အော်ဒါ မှာတာလေး မေးလိုက်တယ် ပြီးရင် device လေးပေးလိုက်တယ်။ ကိုယ်အော်ဒါမှာထားတာလေး ရရင် ခုနက device လေးကနေ အချက်ပြတယ်။သွားယူ ။ အဲ့လိုလုပ်တော့ နောက်ကလူလဲ သိပ်မစောင့်ရဘူး။ ဒါကို non-blocking IO လို.ပြောတယ်။ Device လေးပေးလိုက်တယ် ပြီးရင် အချက်ပေးတယ် ဒါမျိုးကိုကျတော့ non blocking IO မှာ callback လို.သုံးတယ်။
အဲ့တော့ blocking IO မှာ request တခု ဥပမာ file ဖတ်မယ်ဆိုပါစို. file ကိုပြီးအောင်ဖတ်မယ် ပြီးမှ response ပြန်မယ်။ ဆိုပါစို. file ဖတ်တာက 500 ms ကြာမယ်ဆိုရင် သူ. response time သည် 500 ms ဖြစ်မယ်။ စောင့်နေရတာကိုး။ ဒါပေသိ Node.js လို non-blocking IO တွေမှာလို စောင့်စရာမလိုဘူး response ကတော့ ချက်ချင်းပြန်မယ်။ နောက်မှ callback နဲ. data ပေးမယ်ဆိုရင် တခြား CPU task တွေ IO task တွေ အလှည့်ပေးလို.ရမယ်။ အဲ့တော့ response လုပ်တာ ပိုမြန်မယ်ပေါ့။
Operating System ရဲ. thread တွေ process တွေ IO ဖတ်လို. thread block ဖြစ်တာတွေ waiting ဖြစ်တာတွေကို နားလည်ရင် ဒီသဘောတရားကိုပိုရှင်းလိမ့်မယ်။
Original link
One thought on “Non-blocking IO vs blocking IO”