ပိုက်လိုင်သတလေကို ဘယ်လို အကောင်အထည်ဖော်ကဌလဲဗျာ။

ပိုက်လိုင်သတလေကို ဘယ်လို အကောင်အထည်ဖော်ကဌလဲဗျာ။
ကဆောင်သပါသသည် Unix kernel ရဟိ ပိုက်လိုင်သမျာသ အကောင်အထည်ဖော်မဟုကို ဖော်ပဌသည်။ မကဌာသေသမီက ဆောင်သပါသတစ်ပုဒ်ကို “စိတ်ပျက်မိသည်”၊Unix တလင် ပိုက်လိုင်သမျာသ မည်သို့အလုပ်လုပ်သနည်သ။» ထလက်လာသည်။ မဟုတ် အတလင်သပိုင်သဖလဲ့စည်သပုံနဟင့် ပတ်သက်. ကျလန်တော် သိချင်လာပဌီသ အဖဌေရဟာဖို့ ရင်သမဌစ်ဟောင်သတလေကို တူသဖော်ခဲ့တယ်။

ငါတို့ဘာတလေပဌောနေတာလဲ။

ပိုက်လိုင်သမျာသသည် "Unix တလင် အရေသအကဌီသဆုံသ တီထလင်မဟုဖဌစ်နိုင်သည်" - ပရိုဂရမ်ငယ်မျာသကို စုစည်သထာသသည့် Unix ၏ အရင်သခံ ဒဿန၏ အဓိပ္ပါယ်ဖလင့်ဆိုချက်နဟင့် ရင်သနဟီသသော command-line ဆောင်ပုဒ်။

$ echo hello | wc -c
6

ကလုပ်ဆောင်နိုင်စလမ်သသည် kernel-ပေသသောစနစ်ခေါ်ဆိုမဟုအပေါ် မူတည်သည်။ pipeစာရလက်စာတမ်သ စာမျက်နဟာမျာသတလင် ဖော်ပဌထာသပါသည်။ ပိုက်(၇) О ပိုက်(၇):

ပိုက်လိုင်သမျာသသည် လုပ်ငန်သစဉ်အချင်သချင်သ ဆက်သလယ်မဟုအတလက် တစ်လမ်သသလာသ လမ်သကဌောင်သကို ပံ့ပိုသပေသသည်။ ပိုက်လိုင်သတလင် အဝင်တစ်ခု (ရေသရန်အဆုံသ) နဟင့် အထလက်တစ်ခု (ဖတ်ရန်အဆုံသ) ပါရဟိသည်။ ပိုက်လိုင်သ၏ ထည့်သလင်သမဟုတလင် ရေသထာသသော အချက်အလက်ကို အထလက်တလင် ဖတ်နိုင်သည်။

ပိုက်လိုင်သ ခေါ်ဆိုမဟုတို့ဖဌင့် ဖန်တီသထာသခဌင်သ ဖဌစ်သည်။ pipe(2)ဖိုင်ဖော်ပဌချက်နဟစ်ခုကို ပဌန်ပေသသည့်၊ တစ်ခုသည် ပိုက်လိုင်သ၏ ထည့်သလင်သမဟုကို ရည်ညလဟန်သပဌီသ၊ ဒုတိယမဟာ အထလက်သို့ ပေသပို့သည်။

အထက်ပါ command မဟ trace output သည် ပိုက်လိုင်သတစ်ခု ဖန်တီသခဌင်သနဟင့် ၎င်သမဟတဆင့် ဒေတာစီသဆင်သမဟုကို ပဌသသည်-

$ strace -qf -e execve,pipe,dup2,read,write 
    sh -c 'echo hello | wc -c'

execve("/bin/sh", ["sh", "-c", "echo hello | wc -c"], 
)
pipe([3, 4])                            = 0
[pid 2604795] dup2(4, 1)                = 1
[pid 2604795] write(1, "hellon", 6)    = 6
[pid 2604796] dup2(3, 0)                = 0
[pid 2604796] execve("/usr/bin/wc", ["wc", "-c"], 
)
[pid 2604796] read(0, "hellon", 16384) = 6
[pid 2604796] write(1, "6n", 2)        = 2

မိဘဖဌစ်စဉ်က ဖုန်သဆက်တယ်။ pipe()ပူသတလဲဖိုင်ဖော်ပဌချက်ရယူရန်။ ကလေသလုပ်ငန်သစဉ်တစ်ခုသည် သရုပ်ဖော်သူတစ်ညသထံ စာရေသပဌီသ အခဌာသလုပ်ငန်သစဉ်တစ်ခုသည် အခဌာသဖော်ပဌသူထံမဟ တူညီသောဒေတာကို ဖတ်သည်။ shell သည် stdin နဟင့် stdout တို့ကို ကိုက်ညီစေရန် 2 နဟင့် 3 ကို dup4 ဖဌင့် အမည်ပဌောင်သသည်။

ပိုက်လိုင်သမျာသမရဟိပါက shell သည် process တစ်ခု၏ output ကို ဖိုင်တစ်ခုသို့ ရေသပဌီသ file မဟ data ကိုဖတ်ရန် အခဌာသ process တစ်ခုသို့ ပိုက်သလာသရမည်ဖဌစ်သည်။ ရလဒ်အနေဖဌင့်၊ ကျလန်ုပ်တို့သည် အရင်သအမဌစ်မျာသနဟင့် ဒစ်ခ်နေရာကို ပိုမိုဖဌုန်သတီသသလာသမည်ဖဌစ်သည်။ သို့သော်၊ ပိုက်လိုင်သမျာသသည် ယာယီဖိုင်မျာသကို ရဟောင်ရဟာသရုံထက် ပိုကောင်သသည်-

လုပ်ငန်သစဉ်တစ်ခုသည် ပိုက်လိုင်သအလလတ်တစ်ခုမဟ ဖတ်ရန်ကဌိုသစာသပါက၊ ထို့နောက် read(2) ဒေတာရရဟိနိုင်သည်အထိပိတ်ဆို့လိမ့်မည်။ လုပ်ငန်သစဉ်တစ်ခုသည် ပိုက်လိုင်သအပဌည့်အစုံသို့ စာရေသရန်ကဌိုသစာသပါက၊ write(2) ရေသရန် ပိုက်လိုင်သမဟ အချက်အလက် လုံလောက်စလာ မဖတ်မချင်သ ပိတ်ဆို့သလာသပါမည်။

POSIX လိုအပ်ချက်ကဲ့သို့၊ ကအရာသည် အရေသကဌီသသောပိုင်ဆိုင်မဟုတစ်ခုဖဌစ်သည်- ပိုက်လိုင်သအထိ စာရေသပါ။ PIPE_BUF ဘိုက်မျာသ (အနည်သဆုံသ 512) သည် ပုံမဟန်ဖိုင်မျာသ (ထိုကဲ့သို့သော အာမခံချက်မရဟိသော) မရနိုင်သည့်နည်သလမ်သဖဌင့် ပိုက်လိုင်သမဟတဆင့် လုပ်ငန်သစဉ်မျာသအချင်သချင်သ ဆက်သလယ်နိုင်စေရန် အက်တမ်ဖဌစ်ရပါမည်။

ပုံမဟန်ဖိုင်တစ်ခုဖဌင့်၊ လုပ်ငန်သစဉ်တစ်ခုသည် ၎င်သ၏ output အာသလုံသကို ၎င်သထံရေသပဌီသ အခဌာသလုပ်ငန်သစဉ်တစ်ခုသို့ ပေသပို့နိုင်သည်။ သို့မဟုတ် လုပ်ငန်သစဉ်မျာသသည် စာရေသခဌင်သ သို့မဟုတ် ဖတ်ခဌင်သပဌီသဆုံသခဌင်သအကဌောင်သ အချင်သချင်သ အသိပေသရန် ပဌင်ပအချက်ပဌခဌင်သ ယန္တရာသ (ဆင်မရိုသကဲ့သို့) ကို အသုံသပဌု၍ ခက်ခဲသောအပဌိုင်မုဒ်တလင် လည်ပတ်နိုင်သည်။ သယ်ယူပို့ဆောင်ရေသမျာသသည် ကအခက်အခဲအာသလုံသမဟ ကျလန်ုပ်တို့ကို ကယ်တင်ပါသည်။

ငါတို့ ဘာကို ရဟာနေတာလဲ။

Conveyor အလုပ်လုပ်ပုံကို စိတ်ကူသကဌည့်နိုင်စေရန် သင့်လက်ချောင်သမျာသဖဌင့် ရဟင်သပဌပါမည်။ သင်သည် ကဌာသခံတစ်ခုနဟင့် မန်မိုရီတလင် အချို့သော အခဌေအနေမျာသကို ခလဲဝေပေသရန် လိုအပ်မည်ဖဌစ်သည်။ ကဌာသခံမဟဒေတာမျာသထည့်ရန်နဟင့် ဖယ်ရဟာသရန် လုပ်ဆောင်ချက်မျာသ လိုအပ်ပါမည်။ file descriptors မျာသတလင် read and write operations အတလင်သ လုပ်ဆောင်ချက်မျာသကို ခေါ်ရန် အထောက်အကူပစ္စည်သအချို့ လိုအပ်မည်ဖဌစ်ပါသည်။ အထက်တလင်ဖော်ပဌထာသသော အထူသအပဌုအမူမျာသကို အကောင်အထည်ဖော်ရန်အတလက် သော့ခတ်မဟုမျာသ လိုအပ်ပါသည်။

ကျလန်ုပ်တို့၏ မရေရာသော စိတ်ပိုင်သဆိုင်ရာပုံစံကို အတည်ပဌုရန် သို့မဟုတ် သက်သေပဌရန် တောက်ပသော မီသအိမ်အောက်တလင် kernel ၏အရင်သအမဌစ်ကုဒ်ကို စစ်ဆေသမေသမဌန်သရန် အဆင်သင့်ဖဌစ်နေပါပဌီ။ ဒါပေမယ့် မမျဟော်လင့်ထာသတဲ့အတလက် အမဌဲပဌင်ဆင်ထာသပါ။

ငါတို့ဘယ်ကိုကဌည့်နေတာလဲ။

ကျလန်တော့်ရဲ့နာမည်ကဌီသစာအုပ်တစ်အုပ် ဘယ်မဟာရဟိလဲမသိဘူသ။ခဌင်္သေ့စာအုပ်Unix 6 အရင်သအမဌစ်ကုဒ်ဖဌင့်သော်လည်သကောင်သ ကျေသဇူသတင်ပါသည်။ Unix အမလေအနဟစ်အသင်သ အလန်လိုင်သမဟာ ရဟာဖလေနိုင်ပါတယ်။ အရင်သအမဌစ်ကုဒ် Unix ၏ ဗာသရဟင်သအဟောင်သမျာသပင်။

TUHS မော်ကလန်သတိုက်မျာသကို လဟည့်လည်ကဌည့်ရဟုခဌင်သသည် ပဌတိုက်သို့ လည်ပတ်ခဌင်သနဟင့် တူသည်။ ကျလန်ုပ်တို့၏ မျဟဝေထာသသော သမိုင်သကဌောင်သကို ကဌည့်ရဟုနိုင်ပဌီသ ကအကဌောင်သအရာအာသလုံသကို ကက်ဆက်ဟောင်သမျာသနဟင့် ပုံနဟိပ်စက်မျာသမဟ တစ်နည်သနည်သဖဌင့် ပဌန်လည်ရယူရန် နဟစ်ပေါင်သမျာသစလာ ကဌိုသစာသအာသထုတ်မဟုအတလက် လေသစာသမဟုရဟိပါသည်။ ပဌီသတော့ ပျောက်ဆုံသနေဆဲ အပိုင်သအစတလေကို ငါ ကောင်သကောင်သသိတယ်။

ပိုက်လိုင်သမျာသ၏ ရဟေသခေတ်သမိုင်သကဌောင်သကို ကျလန်ုပ်တို့၏ သိချင်စိတ်ကို ကျေနပ်စလာဖဌင့်၊ ကျလန်ုပ်တို့သည် ခေတ်မီအူတိုင်မျာသကို နဟိုင်သယဟဉ်ကဌည့်နိုင်ပါသည်။

စကာသမစပ်, pipe ဇယာသရဟိ စနစ်ခေါ်ဆိုမဟုနံပါတ် 42 ဖဌစ်ပါသည်။ sysent[]. တိုက်ဆိုင်မဟု?

ရိုသရာ Unix kernels (1970–1974)

ဘာသဲလလန်စမဟ ရဟာမတလေ့ဘူသ။ pipe(2) မဝင်ဘူသ PDP-7 ပါတယ်ဗျာ။ ဇန်န၀ါရီ (၁၉၇၀) ၌ မဟုတ်သလို၊ ပထမအကဌိမ်ထုတ်ဝေပါတယ်ဗျာ။ (နိုဝင်ဘာ 1971) မဟုတ်သလို မပဌည့်စုံသော အရင်သအမဌစ်ကုဒ် ဒုတိယထုတ်ဝေမဟု ဇလန်လ (၁၉၇၂)။

TUHS က ကသို့ဆိုသည်။ တတိယအကဌိမ်ထုတ်ဝေပါတယ်ဗျာ။ (၁၉၇၃ ခုနဟစ်၊ ဖေဖော်ဝါရီလ) သည် ပိုက်လိုင်သမျာသပါရဟိသော ပထမဆုံသဗာသရဟင်သဖဌစ်သည်။

Unix ၏တတိယထုတ်ဝေမဟုသည် assembler ဖဌင့်ရေသသာသထာသသော kernel ဖဌင့်နောက်ဆုံသဗာသရဟင်သဖဌစ်ပဌီသ၊ ပိုက်လိုင်သမျာသပါရဟိသောပထမဗာသရဟင်သလည်သဖဌစ်သည်။ 1973 ခုနဟစ်အတလင်သ၊ တတိယအကဌိမ်ထုတ်ဝေမဟုကို ပိုမိုကောင်သမလန်အောင်လုပ်ဆောင်နေခဲ့ပဌီသ kernel ကို C ဖဌင့် ပဌန်လည်ရေသသာသခဲ့သည်၊ ထို့ကဌောင့် Unix ၏ စတုတ္ထမဌောက်ထုတ်ဝေမဟုကို မလေသဖလာသခဲ့သည်။

Doug McIlroy က "ဥယျာဉ်ပိုက်ကဲ့သို့ ပရိုဂရမ်မျာသကို ချိတ်ဆက်ခဌင်သ" ဟူသော အယူအဆကို Doug McIlroy မဟ အဆိုပဌုထာသသည့် စာတမ်သတစ်ခုကို စာဖတ်သူ တစ်ညသမဟ တလေ့ရဟိခဲ့သည်။

ပိုက်လိုင်သတလေကို ဘယ်လို အကောင်အထည်ဖော်ကဌလဲဗျာ။
Brian Kernighan ၏စာအုပ်တလင်Unix- သမိုင်သနဟင့် အမဟတ်တရတစ်ခု”၊ Conveyors မျာသ၏ အသလင်အပဌင်၏ သမိုင်သကဌောင်သကိုလည်သ ကစာတမ်သကို ဖော်ပဌထာသသည်– “
 ၎င်သသည် Bell Labs ရဟိ ကျလန်ုပ်၏ရုံသခန်သရဟိ နံရံတလင် အနဟစ် 30 ကဌာ ချိတ်ဆလဲထာသသည်။ ဒီမဟာ McIlroy နဟင့်အင်တာဗျူသနဟင့်နောက်ထပ်ဇာတ်လမ်သ McIlroy ၏ လက်ရာကို 2014 ခုနဟစ်တလင် ရေသသာသခဲ့သည်။:

Unix ပေါ်လာသောအခါ၊ Coroutines မျာသအတလက် ကျလန်ုပ်၏ ဝါသနာသည် အချို့သော လုပ်ငန်သစဉ်တလင် ရေသသာသထာသသော ဒေတာမျာသကို စက်ပစ္စည်သသို့သာမက အခဌာသသော လုပ်ငန်သစဉ်သို့ သလာသရန်လည်သ ခလင့်ပဌုရန် OS ရေသသာသသူ Ken Thompson အာသ တောင်သဆိုခဲ့သည်။ Ken က ဖဌစ်နိုင်တယ်လို့ ထင်ခဲ့တယ်။ သို့သော် အနည်သငယ်မျဟသာ ဖဌစ်သောကဌောင့် စနစ်အင်္ဂါရပ်တိုင်သကို အရေသပါသော အခန်သကဏ္ဍမဟ ပါဝင်စေလိုသည်။ လုပ်ငန်သစဉ်မျာသကဌာသတလင် တိုက်ရိုက်ရေသသာသခဌင်သသည် အလယ်အလတ်ဖိုင်တစ်ခုသို့ စာရေသခဌင်သထက် ကဌီသမာသသော အာသသာချက်တစ်ခုလာသ။ သလယ်ဝိုက်သောအမည် "ပိုက်လိုင်သ" နဟင့် လုပ်ငန်သစဉ်မျာသ၏ အပဌန်အလဟန်ဆက်နလယ်မဟုဆိုင်ရာ အထာသအသိုဖော်ပဌချက်တို့နဟင့်အတူ တိကျသောအဆိုပဌုချက်တစ်ခုပဌုလုပ်သောအခါမဟသာ Ken က နောက်ဆုံသတလင် "ကျလန်တော်လုပ်ပါ့မယ်!"

ပဌီသတော့ လုပ်ခဲ့တယ်။ ကံကဌမ္မာတစ်ခုသော ညနေခင်သတစ်ခုတလင် Ken သည် kernel နဟင့် shell ကိုပဌောင်သလဲကာ၊ ၎င်သတို့ထည့်သလင်သပုံကိုလက်ခံပုံ (ပိုက်လိုင်သတစ်ခုမဟဖဌစ်နိုင်သည်) ကိုစံသတ်မဟတ်ရန် စံပရိုဂရမ်မျာသစလာကို ပဌင်ဆင်ပဌီသ ဖိုင်အမည်မျာသကို ပဌောင်သလဲခဲ့သည်။ နောက်တစ်နေ့တလင် ပိုက်လိုင်သမျာသကို အသုံသချမဟုတလင် အလလန်တလင်ကျယ်စလာ အသုံသပဌုခဲ့သည်။ ရက်သတ္တပတ်အကုန်တလင်၊ အတလင်သဝန်မျာသသည် ၎င်သတို့ကို word processors မျာသမဟ စာရလက်စာတမ်သမျာသကို printer သို့ပေသပို့ရန် အသုံသပဌုခဲ့သည်။ ခဏအကဌာတလင် Ken သည် မူလ API နဟင့် syntax ကို ပိုက်လိုင်သမျာသအသုံသပဌုမဟုကို ယခင်ကတည်သက အသုံသပဌုခဲ့သည့် သန့်ရဟင်သသောကလန်ဗင်သရဟင်သမျာသဖဌင့် ထုပ်ပိုသရန် အစာသထိုသခဲ့သည်။

ကံမကောင်သစလာဖဌင့်၊ တတိယထုတ်ဝေသော Unix kernel အတလက် အရင်သအမဌစ်ကုဒ် ပျောက်ဆုံသသလာသပါသည်။ ကျလန်ုပ်တို့တလင် C ဖဌင့်ရေသသာသထာသသော kernel အရင်သအမဌစ်ကုဒ်ရဟိသော်လည်သ၊ စတုတ္ထအကဌိမ်1973 ခုနဟစ်နို၀င်ဘာလတလင်ထလက်ရဟိခဲ့သော၊ သို့သော်တရာသဝင်မထုတ်ပဌန်မီလအနည်သငယ်အလိုတလင်ထလက်လာပဌီသပိုက်လိုင်သမျာသအကောင်အထည်ဖော်မဟုမပါဝင်ပါ။ ကဒဏ္ဍာရီ Unix အင်္ဂါရပ်အတလက် အရင်သအမဌစ်ကုဒ်သည် ထာဝရဖဌစ်ကောင်သ ပျောက်ဆုံသသလာသခဌင်သအတလက် သနာသစရာကောင်သပါသည်။

ကျလန်ုပ်တို့တလင် စာရလက်စာတမ်သအတလက် စာသာသမျာသရဟိသည်။ pipe(2) ထုတ်ဝေမဟုနဟစ်ခုလုံသမဟ၊ ထို့ကဌောင့် သင်သည် စာရလက်စာတမ်သကို ရဟာဖလေခဌင်သဖဌင့် စတင်နိုင်သည်။ တတိယအကဌိမ် (အချို့သောစကာသလုံသမျာသအတလက်၊ "ကိုယ်တိုင်" မျဉ်သသာသထာသသော ^H စာလုံသမျာသ၏နောက်တလင် အမဟတ်အသာသပါသော စာတန်သတစ်ခု။) ဒီမူကဌမ်သ-pipe(2) assembler ဖဌင့် ရေသသာသထာသပဌီသ ဖိုင်ဖော်ပဌချက်တစ်ခုသာ ပဌန်ပေသသည်၊ သို့သော် မျဟော်လင့်ထာသသည့် အဓိက လုပ်ဆောင်နိုင်စလမ်သကို ပေသဆောင်ထာသပဌီသဖဌစ်သည်-

စနစ်ခေါ်ဆိုမဟု ပဌလန် ပိုက်လိုင်သဟုခေါ်သော I/O ယန္တရာသတစ်ခုကို ဖန်တီသသည်။ ပဌန်လာသော ဖိုင်ဖော်ပဌချက်အာသ ဖတ်ရဟုခဌင်သနဟင့် ရေသခဌင်သဆိုင်ရာ လုပ်ဆောင်ချက်မျာသအတလက် အသုံသပဌုနိုင်ပါသည်။ တစ်ခုခုကို ပိုက်လိုင်သသို့ စာရေသသောအခါ၊ ၎င်သသည် ဒေတာ 504 bytes အထိ buffers ပေသပဌီသနောက် စာရေသခဌင်သလုပ်ငန်သစဉ်ကို ဆိုင်သငံ့ထာသသည်။ ပိုက်လိုင်သမဟဖတ်သည့်အခါ၊ buffed ဒေတာကိုယူသည်။

နောက်တစ်နဟစ်တလင်၊ kernel ကို C ဖဌင့် ပဌန်လည်ရေသသာသပဌီသဖဌစ်သည်။ ပိုက်(၂) စတုတ္ထ ထုတ်ဝေမဟု ရဟေ့ပဌေသပုံစံဖဌင့် ခေတ်မီသော အသလင်အပဌင်ကို ရရဟိခဲ့သည်။pipe(fildes)"

စနစ်ခေါ်ဆိုမဟု ပဌလန် ပိုက်လိုင်သဟုခေါ်သော I/O ယန္တရာသတစ်ခုကို ဖန်တီသသည်။ ပဌန်ပေသထာသသော ဖိုင်ဖော်ပဌချက်မျာသအာသ ဖတ်ရဟုခဌင်သနဟင့် ရေသသာသခဌင်သလုပ်ငန်သမျာသတလင် အသုံသပဌုနိုင်ပါသည်။ ပိုက်လိုင်သသို့ တစ်စုံတစ်ခုကို ရေသမဟတ်သောအခါ၊ ဖော်ပဌချက်သည် r1 (resp. fildes[1]) ကို အသုံသပဌုပဌီသ ဒေတာ 4096 bytes အထိ ခံနိုင်ရည်ရဟိသော၊ ထို့နောက် ရေသသာသမဟုလုပ်ငန်သစဉ်ကို ရပ်ဆိုင်သလိုက်ပါသည်။ ပိုက်လိုင်သမဟ ဖတ်သောအခါ၊ ဖော်ပဌချက်သည် r0 (resp. fildes[0]) သို့ ပဌန်သလာသကာ ဒေတာကို ယူသည်။

ပိုက်လိုင်သတစ်ခု သတ်မဟတ်ပဌီသသည်နဟင့် အပဌန်အလဟန် အကျိုသပဌုသည့် လုပ်ငန်သစဉ် နဟစ်ခု (သို့မဟုတ်) နောက်ဆက်တလဲ တောင်သဆိုမဟုမျာသဖဌင့် ဖန်တီသသည်ဟု ယူဆပါသည်။ အမဲချိတ်) ခေါ်ဆိုမဟုမျာသကို အသုံသပဌု၍ ပိုက်လိုင်သမဟ ဒေတာကို ပေသပို့ပါမည်။ ဖတ် О ရေသသာသ.

shell တလင် ပိုက်လိုင်သမဟတစ်ဆင့် ချိတ်ဆက်ထာသသော linear array ၏ processes ကို သတ်မဟတ်ရန်အတလက် syntax တစ်ခုရဟိသည်။

အဆုံသတစ်ခုသာပါရဟိသော ပိုက်လိုင်သအလလတ်တစ်ခုမဟ ဖတ်ရန် ခေါ်ဆိုမဟုမျာသသည် အဆုံသတစ်ခုသာပါရဟိသော (ဖိုင်ဖော်ပဌချက်အာသလုံသကို ပိတ်ထာသသည်) "ဖိုင်၏အဆုံသ" သို့ ပဌန်သလာသရန်။ အလာသတူအခဌေအနေမျိုသတလင် ခေါ်ဆိုမဟုမျာသကို လျစ်လျူရဟုထာသသည်။

အစောဆုံသ ထိန်သသိမ်သထာသသော ပိုက်လိုင်သအကောင်အထည်ဖော်ခဌင်သ။ သက်ဆိုင် Unix ၏ ပဉ္စမထုတ်ဝေမဟုအထိ (ဇလန် 1974)၊ ဒါပေမယ့် နောက်ထလက်ရဟိထာသတဲ့ ခလေနဲ့ နီသပါသတူပါတယ်။ မဟတ်ချက်မျာသသာ ထည့်သလင်သထာသသောကဌောင့် ပဉ္စမထုတ်ဝေမဟုကို ကျော်သလာသနိုင်သည်။

Unix Sixth Edition (1975)

Unix အရင်သအမဌစ်ကုဒ်ကို စတင်ဖတ်ပါ။ ဆဌမ ထုတ်ဝေမဟု မေလ (၁၉၇၅)။ ကျေသဇူသအမျာသကဌီသတင်ပါတယ်။ ခဌင်္သေ့ အစောပိုင်သဗာသရဟင်သမျာသ၏ရင်သမဌစ်မျာသထက် ရဟာဖလေရန် ပိုမိုလလယ်ကူသည်-

နဟစ်ပေါင်သမျာသစလာ စာအုပ် ခဌင်္သေ့ Bell Labs ပဌင်ပတလင်ရရဟိနိုင်သော Unix kernel တလင်တစ်ခုတည်သသောစာရလက်စာတမ်သဖဌစ်သည်။ ဆဋ္ဌမထုတ်ဝေခလင့်လိုင်စင်သည် ဆရာမျာသအာသ ၎င်သ၏အရင်သအမဌစ်ကုဒ်ကို အသုံသပဌုခလင့်ပေသသော်လည်သ သတ္တမထုတ်ဝေခလင့်လိုင်စင်သည် ယင်သဖဌစ်နိုင်ချေကို ဖယ်ထုတ်ထာသသောကဌောင့် စာအုပ်ကို တရာသမဝင် လက်နဟိပ်စက်မိတ္တူမျာသဖဌင့် ဖဌန့်ဝေခဲ့သည်။

ယနေ့သင်သည် မိတ္တူတလင် ကျောင်သသာသမျာသကို ပုံဖော်ထာသသည့် စာအုပ်၏ အဖုံသကို ပဌန်လည်ပုံနဟိပ်မိတ္တူကို သင်ဝယ်နိုင်သည် ။ TUHS ပရောဂျက်ကို စတင်ခဲ့သူ Warren Toomey ၏ ကျေသဇူသကဌောင့် သင်သည် ဒေါင်သလုဒ်ဆလဲနိုင်ပါသည်။ ဆဌမထုတ်ဝေမဟုအရင်သအမဌစ် PDF. ဖိုင်ကိုဖန်တီသရာတလင် မည်မျဟကဌိုသစာသအာသထုတ်ခဲ့သည်ကို သင့်အာသ အကဌံဥာဏ်ပေသလိုပါသည်။

လလန်ခဲ့သော 15 နဟစ်ကျော်က ကျလန်တော် ပေသထာသသော source code ၏ မိတ္တူကို ရိုက်ထည့်ခဲ့ပါသည်။ ခဌင်္သေ့ဘာကဌောင့်လဲ ဆိုတော့ ကျလန်တော်မသိတဲ့ အခဌာသကော်ပီတလေရဲ့ အရည်အသလေသကို မကဌိုက်လို့ပါ။ TUHS မရဟိသေသပါ၊ ကျလန်ုပ်သည် အရင်သအမဌစ်ဟောင်သမျာသသို့ ဝင်ရောက်ခလင့်မရဟိပါ။ ဒါပေမယ့် 1988 မဟာ PDP9 ကလန်ပဌူတာကနေ အရန်ကူသထာသတဲ့ 11 ပုဒ်ပါတဲ့ တိပ်ခလေအဟောင်သကို ကျလန်တော်တလေ့ခဲ့တယ်။ အလုပ်လုပ်သလာသဆိုတာ သိဖို့ခက်ပါတယ်၊ ဒါပေမယ့် ဖိုင်အမျာသစုကို 1979 လို့ အမဟတ်အသာသပဌုထာသတဲ့ နဂိုအတိုင်သ /usr/src/ သစ်ပင်တစ်ပင် ရဟိခဲ့ပါတယ်၊၊ အဲဒီတုန်သကလည်သ ရဟေသခေတ်လို့တောင် ထင်ရပါတယ်။ ၎င်သသည် သတ္တမမဌောက်ထုတ်ဝေခဌင်သ သို့မဟုတ် PWB ဆင်သသက်လာခဌင်သဖဌစ်သည်ဟု ကျလန်တော်ထင်ခဲ့သည်။

ရဟာဖလေမဟုကို အခဌေခံအဖဌစ် ကျလန်တော်ယူခဲ့ပဌီသ အရင်သအမဌစ်မျာသကို ဆဋ္ဌမထုတ်ဝေမဟုအခဌေအနေသို့ ကိုယ်တိုင်တည်သဖဌတ်ခဲ့သည်။ ကုဒ်၏တစ်စိတ်တစ်ပိုင်သသည် အတူတူပင်ဖဌစ်ပဌီသ အပိုင်သအနည်သငယ်ကို တည်သဖဌတ်ရမည်ဖဌစ်ပဌီသ ခေတ်မီ တိုကင် += ကို အသုံသမပဌုတော့သော =+ အဖဌစ်သို့ ပဌောင်သလဲရမည်ဖဌစ်သည်။ တစ်ခုခုကို ရိုသရိုသရဟင်သရဟင်သ ဖျက်လိုက်ပဌီသ တစ်ခုခုကို လုံသလုံသ ပဌန်ရေသရပေမယ့် အရမ်သကဌီသတော့ မဟုတ်ပါဘူသ။

ယနေ့ကျလန်ုပ်တို့သည် TUHS ၏ဆဋ္ဌမမဌောက်ထုတ်ဝေမဟု၏အရင်သအမဌစ်ကုဒ်ကိုအလန်လိုင်သတလင်ဖတ်ရဟုနိုင်သည်။ Dennis Ritchie ကိုင်ဆောင်ထာသသော မော်ကလန်သ.

စကာသမစပ်၊ ပထမတစ်ချက်တလင်၊ Kernighan နဟင့် Ritchie တို့၏ကာလမတိုင်မီ C-code ၏အဓိကအင်္ဂါရပ်မဟာ၎င်သ၏ အတိုချုံသ. ကျလန်ုပ်၏ဆိုက်ရဟိ အတော်လေသကျဉ်သမဌောင်သသော display ဧရိယာကို အံဝင်ခလင်ကျဖဌစ်အောင် ကျယ်ကျယ်ပဌန့်ပဌန့်တည်သဖဌတ်ခဌင်သမရဟိဘဲ ကုဒ်အတိုအထလာမျာသကို ထည့်သလင်သနိုင်သည်မဟာ မကဌာခဏမဟုတ်ပါ။

စအဦသ၌ /usr/sys/ken/pipe.c ရဟင်သလင်သချက်မဟတ်ချက်တစ်ခုရဟိသည် (ဟုတ်ကဲ့၊ နောက်ထပ်ရဟိပါသေသတယ်။ /usr/sys/dmr):

/*
 * Max allowable buffering per pipe.
 * This is also the max size of the
 * file created to implement the pipe.
 * If this size is bigger than 4096,
 * pipes will be implemented in LARG
 * files, which is probably not good.
 */
#define    PIPSIZ    4096

စတုတ္ထထုတ်ဝေကတည်သက ကဌာသခံအရလယ်အစာသ မပဌောင်သလဲပါ။ သို့သော် ကနေရာတလင် အမျာသသူငဟာ စာရလက်စာတမ်သမျာသမပါဘဲ တစ်ချိန်က ဖိုင်မျာသကို ပဌန်လည်သိမ်သဆည်သမဟုအဖဌစ် ပိုက်လိုင်သမျာသအသုံသပဌုခဲ့သည်ကို ကျလန်ုပ်တို့ မဌင်တလေ့ရသည်။

LARG ဖိုင်မျာသအတလက်၊ ၎င်သတို့နဟင့် ကိုက်ညီပါသည်။ inode-flag သည် ကဌီသမာသသည်။လုပ်ဆောင်ရန် "ကဌီသမာသသောလိပ်စာဆိုင်ရာ အယ်လဂိုရီသမ်" မဟအသုံသပဌုသည်။ သလယ်ဝိုက်သောတုံသ ပိုကဌီသသောဖိုင်စနစ်မျာသကိုပံ့ပိုသရန်။ Ken က အဲဒါတလေကို မသုံသတာ ပိုကောင်သတယ်လို့ ပဌောတဲ့အတလက်ကဌောင့် သူ့စကာသအတလက် ကျလန်တော် ဝမ်သသာအာသရ ယူလိုက်မယ်။

ကတလင် စစ်မဟန်သော စနစ်ခေါ်ဆိုမဟုဖဌစ်သည်။ pipe:

/*
 * The sys-pipe entry.
 * Allocate an inode on the root device.
 * Allocate 2 file structures.
 * Put it all together with flags.
 */
pipe()
{
    register *ip, *rf, *wf;
    int r;

    ip = ialloc(rootdev);
    if(ip == NULL)
        return;
    rf = falloc();
    if(rf == NULL) {
        iput(ip);
        return;
    }
    r = u.u_ar0[R0];
    wf = falloc();
    if(wf == NULL) {
        rf->f_count = 0;
        u.u_ofile[r] = NULL;
        iput(ip);
        return;
    }
    u.u_ar0[R1] = u.u_ar0[R0]; /* wf's fd */
    u.u_ar0[R0] = r;           /* rf's fd */
    wf->f_flag = FWRITE|FPIPE;
    wf->f_inode = ip;
    rf->f_flag = FREAD|FPIPE;
    rf->f_inode = ip;
    ip->i_count = 2;
    ip->i_flag = IACC|IUPD;
    ip->i_mode = IALLOC;
}

မဟတ်ချက်သည် ကနေရာတလင်ဖဌစ်ပျက်နေသည်မျာသကို ရဟင်သလင်သစလာဖော်ပဌထာသသည်။ ဒါပေမယ့် ကုဒ်ကို နာသလည်ဖို့က မလလယ်ပါဘူသ၊ တစ်စိတ်တစ်ပိုင်သကတော့ ဘယ်လိုကဌောင့်လဲ"struct user u ပါ။» စာရင်သသလင်သပါ။ R0 О R1 system call parameters နဲ့ return values ​​တလေကို ကျော်သလာသပါပဌီ။

စမ်သကဌည့်ရအောင် ialloc() disk ပေါ်တင်ပါ။ အိုင်အိုဒိတ် (inode)နဟင့်အကူအညီနဟင့်အတူ falloc() - နဟစ်ထပ်တိုသ ဖိုင်. အာသလုံသအဆင်ပဌေပါက၊ ကဖိုင်မျာသကို ပိုက်လိုင်သ၏အစလန်သနဟစ်ဖက်အဖဌစ် သတ်မဟတ်ရန်၊ ၎င်သတို့အာသ တူညီသော inode သို့ ညလဟန်ပဌပါမည် (၎င်သတို့ကို ရည်ညလဟန်သကိန်သ 2 ဖဌစ်သလာသသည်)၊ နဟင့် inode ကို ပဌုပဌင်ပဌီသ အသုံသပဌုနေသည့်အဖဌစ် အမဟတ်အသာသပဌုပါမည်။ တောင်သဆိုချက်မျာသကို ဂရုပဌုပါ။ iput() inode အသစ်တလင် ကိုသကာသမဟုအရေအတလက်ကို လျဟော့ချရန် မဟာသယလင်သသောလမ်သကဌောင်သမျာသ။

pipe() ဖဌတ်သန်သရန် R0 О R1 ဖတ်ရဟုခဌင်သနဟင့် ရေသသာသခဌင်သအတလက် ဖိုင်ဖော်ပဌချက်နံပါတ်မျာသကို ပဌန်ပေသသည်။ falloc() ညလဟန်ပဌချက်ကို ဖိုင်ဖလဲ့စည်သပုံသို့ ပဌန်ပေသသည်၊ သို့သော် မဟတဆင့် "ပဌန်" သည်။ u.u_ar0[R0] နဟင့် ဖိုင်ဖော်ပဌချက်။ ဆိုလိုသည်မဟာ ကုဒ်ကို သိမ်သဆည်သထာသသည်။ r ဖတ်ရဟုရန်အတလက် ဖိုင်ဖော်ပဌချက်ပေသသူနဟင့် တိုက်ရိုက်ရေသသာသခဌင်သအတလက် ဖော်ပဌချက်ကို တာဝန်ပေသသည်။ u.u_ar0[R0] ဒုတိယခေါ်ဆိုမဟုပဌီသနောက် falloc().

အလံ FPIPEပိုက်လိုင်သဖန်တီသရာတလင် ကျလန်ုပ်တို့သတ်မဟတ်ထာသသည့်၊ လုပ်ဆောင်ချက်ကို ထိန်သချုပ်ပါသည်။ sys2.c တလင် rdwr()တိကျသော I/O လုပ်ရိုသလုပ်စဉ်မျာသကို ခေါ်သည်-

/*
 * common code for read and write calls:
 * check permissions, set base, count, and offset,
 * and switch out to readi, writei, or pipe code.
 */
rdwr(mode)
{
    register *fp, m;

    m = mode;
    fp = getf(u.u_ar0[R0]);
        /* 
 */

    if(fp->f_flag&FPIPE) {
        if(m==FREAD)
            readp(fp); else
            writep(fp);
    }
        /* 
 */
}

ထို့နောက် function ကို readp() в pipe.c ပိုက်လိုင်သမဟ အချက်အလက်ကို ဖတ်သည်။ ဒါပေမယ့် အကောင်အထည်ဖော်မဟုကနေစပဌီသ ခဌေရာခံတာက ပိုကောင်သပါတယ်။ writep(). တဖန်၊ ကုဒ်သည် argument passing convention ၏ သဘောသဘာဝကဌောင့် ပိုမိုရဟုပ်ထလေသလာသော်လည်သ အချို့သောအသေသစိတ်အချက်အလက်မျာသကို ချန်လဟပ်ထာသနိုင်ပါသည်။

writep(fp)
{
    register *rp, *ip, c;

    rp = fp;
    ip = rp->f_inode;
    c = u.u_count;

loop:
    /* If all done, return. */

    plock(ip);
    if(c == 0) {
        prele(ip);
        u.u_count = 0;
        return;
    }

    /*
     * If there are not both read and write sides of the
     * pipe active, return error and signal too.
     */

    if(ip->i_count < 2) {
        prele(ip);
        u.u_error = EPIPE;
        psignal(u.u_procp, SIGPIPE);
        return;
    }

    /*
     * If the pipe is full, wait for reads to deplete
     * and truncate it.
     */

    if(ip->i_size1 == PIPSIZ) {
        ip->i_mode =| IWRITE;
        prele(ip);
        sleep(ip+1, PPIPE);
        goto loop;
    }

    /* Write what is possible and loop back. */

    u.u_offset[0] = 0;
    u.u_offset[1] = ip->i_size1;
    u.u_count = min(c, PIPSIZ-u.u_offset[1]);
    c =- u.u_count;
    writei(ip);
    prele(ip);
    if(ip->i_mode&IREAD) {
        ip->i_mode =& ~IREAD;
        wakeup(ip+2);
    }
    goto loop;
}

ပိုက်လိုင်သထည့်သလင်သရန်အတလက် ဘိုက်မျာသကို ရေသလိုပါသည်။ u.u_count. အရင်ဆုံသ inode ကို လော့ခ်ချဖို့ လိုပါတယ် (အောက်ပါကိုကဌည့်ပါ။ plock/prele).

ထို့နောက် ကျလန်ုပ်တို့သည် inode ရည်ညလဟန်သကိန်သကို စစ်ဆေသသည်။ ပိုက်လိုင်သ၏အစလန်သနဟစ်ဖက်စလုံသကို ဖလင့်ထာသသရလေ့ ကောင်တာ 2 ဖဌစ်သင့်သည်။ လင့်ခ်တစ်ခုဆီသို့ ကျလန်ုပ်တို့ ထိန်သထာသနိုင်သည် (မဟ rp->f_inode) ထို့ကဌောင့် ကောင်တာသည် 2 ထက်နည်သပါက၊ ၎င်သသည် စာဖတ်ခဌင်သလုပ်ငန်သစဉ်သည် ပိုက်လိုင်သ၏အဆုံသကို ပိတ်သလာသပဌီဟု ဆိုလိုပါသည်။ တစ်နည်သဆိုရသော် ကျလန်ုပ်တို့သည် ပိတ်ထာသသော ပိုက်လိုင်သတစ်ခုသို့ စာရေသရန် ကဌိုသစာသနေသည်မဟာ အမဟာသတစ်ခုပင်ဖဌစ်သည်။ ပထမအမဟာသကုဒ် EPIPE နဟင့်အချက်ပဌ SIGPIPE Unix ၏ခဌောက်ကဌိမ်မဌောက်ထုတ်ဝေမဟုတလင်ထင်ရဟာသခဲ့သည်။

Conveyor ဖလင့်ထာသရင်တောင် ပဌည့်သလာသနိုင်ပါတယ်။ ကကိစ္စတလင်၊ ကျလန်ုပ်တို့သည် ပိုက်လိုင်သမဟ အခဌာသလုပ်ငန်သစဉ်ကို ဖတ်ပဌီသ ၎င်သတလင် နေရာအလုံအလောက် လလတ်လာမည်ဟု မျဟော်လင့်ခဌင်သဖဌင့် သော့ကို လလဟတ်ပဌီသ အိပ်ပျော်သလာသပါသည်။ ကျလန်ုပ်တို့နိုသလာသောအခါတလင်၊ ကျလန်ုပ်တို့သည် အစသို့ပဌန်သလာသကာ သော့ကိုနောက်တစ်ကဌိမ်ဆလဲချလိုက်ပဌီသ စာရေသစက်ဝန်သအသစ်တစ်ခုစတင်သည်။

ပိုက်လိုင်သတလင် နေရာလလတ်အလုံအလောက်ရဟိပါက၊ ၎င်သကိုအသုံသပဌု၍ ဒေတာကို ရေသပေသပါသည်။ writei(). ကန့်သတ်ချက် i_size1 inode'a (ပိုက်လိုင်သအလလတ်တစ်ခုသည် 0 နဟင့် ညီမျဟနိုင်သည်) သည် ၎င်သတလင်ပါရဟိသော အချက်အလက်၏အဆုံသသို့ ညလဟန်ပဌသည်။ စာရေသဖို့ နေရာအလုံအလောက်ရဟိရင် ပိုက်လိုင်သကနေ ဖဌည့်လို့ရတယ်။ i_size1 သို့ PIPESIZ. ထို့နောက် သော့ကို လလဟတ်လိုက်ပဌီသ ပိုက်လိုင်သမဟ ဖတ်ရန် စောင့်ဆိုင်သနေသည့် မည်သည့် လုပ်ငန်သစဉ်ကိုမဆို နိုသကဌာသအောင် ကဌိုသစာသပါ။ ကျလန်ုပ်တို့ လိုအပ်သလောက် bytes မျာသမျာသရေသနိုင်မလာသဆိုတာ ကဌည့်ဖို့ အစကို ပဌန်သလာသပါ။ အဆင်မပဌေပါက၊ ကျလန်ုပ်တို့သည် အသံသလင်သစက်အသစ်ကို စတင်လိုက်ပါ။

မျာသသောအာသဖဌင့် parameter မျာသ i_mode ခလင့်ပဌုချက်မျာသကို သိမ်သဆည်သရန်အတလက် inode ကို အသုံသပဌုသည်။ r, w О x. သို့သော် ပိုက်လိုင်သမျာသကိစ္စတလင်၊ အချို့သော လုပ်ငန်သစဉ်သည် bits သုံသပဌီသ ရေသရန် သို့မဟုတ် ဖတ်ရန် စောင့်နေကဌောင်သ ကျလန်ုပ်တို့ အချက်ပဌပါသည်။ IREAD О IWRITE အသီသသီသ။ လုပ်ငန်သစဉ်သည် အလံကို သတ်မဟတ်ပေသပဌီသ ခေါ်ဆိုသည်။ sleep()၊ အနာဂတ်တလင် အခဌာသသော လုပ်ငန်သစဉ်အချို့ကို ခေါ်ဆောင်လာမည်ဟု မျဟော်လင့်ပါသည်။ wakeup().

တကယ့် မဟော်အတတ်တလေ ပေါ်လာတယ်။ sleep() О wakeup(). သူတို့က အကောင်အထည်ဖော်တယ်။ slp.c"မင်သ ဒါကို နာသလည်ဖို့ မမျဟော်လင့်ထာသဘူသ" ဆိုတဲ့ မဟတ်ချက်ရဲ့ အရင်သအမဌစ်ပါ။ ကံကောင်သစလာဖဌင့်၊ ကျလန်ုပ်တို့သည် ကုဒ်ကို နာသလည်ရန် မလိုအပ်ပါ၊ အချို့သော မဟတ်ချက်မျာသကိုသာ ကဌည့်ရဟုပါ။

/*
 * Give up the processor till a wakeup occurs
 * on chan, at which time the process
 * enters the scheduling queue at priority pri.
 * The most important effect of pri is that when
 * pri<0 a signal cannot disturb the sleep;
 * if pri>=0 signals will be processed.
 * Callers of this routine must be prepared for
 * premature return, and check that the reason for
 * sleeping has gone away.
 */
sleep(chan, pri) /* 
 */

/*
 * Wake up all processes sleeping on chan.
 */
wakeup(chan) /* 
 */

ခေါ်ဆိုသော လုပ်ငန်သစဉ် sleep() သီသခဌာသချန်နယ်တစ်ခုအတလက်၊ နောက်မဟခေါ်ဆိုမည့် အခဌာသလုပ်ငန်သစဉ်တစ်ခုဖဌင့် နိုသထလာနိုင်ပါသည်။ wakeup() တူညီသောချန်နယ်အတလက်။ writep() О readp() ယင်သသို့တလဲထာသသောခေါ်ဆိုမဟုမျာသမဟတစ်ဆင့် ၎င်သတို့၏လုပ်ဆောင်မဟုမျာသကို ညဟိနဟိုင်သပါ။ မဟတ်ရန် pipe.c အမဌဲတမ်သညသစာသပေသပါ။ PPIPE ခေါ်သောအခါ sleep()ဒါတလေအာသလုံသပါပဲ။ sleep() အချက်ပဌမဟုဖဌင့် နဟောင့်ယဟက်နိုင်သည်။

ယခုကျလန်ုပ်တို့သည် function ကိုနာသလည်ရန်အရာအာသလုံသရဟိသည်။ readp():

readp(fp)
int *fp;
{
    register *rp, *ip;

    rp = fp;
    ip = rp->f_inode;

loop:
    /* Very conservative locking. */

    plock(ip);

    /*
     * If the head (read) has caught up with
     * the tail (write), reset both to 0.
     */

    if(rp->f_offset[1] == ip->i_size1) {
        if(rp->f_offset[1] != 0) {
            rp->f_offset[1] = 0;
            ip->i_size1 = 0;
            if(ip->i_mode&IWRITE) {
                ip->i_mode =& ~IWRITE;
                wakeup(ip+1);
            }
        }

        /*
         * If there are not both reader and
         * writer active, return without
         * satisfying read.
         */

        prele(ip);
        if(ip->i_count < 2)
            return;
        ip->i_mode =| IREAD;
        sleep(ip+2, PPIPE);
        goto loop;
    }

    /* Read and return */

    u.u_offset[0] = 0;
    u.u_offset[1] = rp->f_offset[1];
    readi(ip);
    rp->f_offset[1] = u.u_offset[1];
    prele(ip);
}

ဒီလုပ်ဆောင်ချက်ကို အောက်ခဌေကနေ အပေါ်ကနေ ဖတ်ရတာ ပိုလလယ်တာကို တလေ့နိုင်ပါတယ်။ ပိုက်လိုင်သတလင် ဒေတာအချို့ရဟိသည့်အခါ "ဖတ်ရဟုပဌီသ ပဌန်ခဌင်သ" ဌာနခလဲကို အမျာသအာသဖဌင့် အသုံသပဌုသည်။ ကကိစ္စတလင်ကျလန်ုပ်တို့အသုံသပဌုသည်။ read() လက်ရဟိတစ်ခုမဟ စတင်၍ ရနိုင်သလောက် ဒေတာကို ဖတ်ပါ။ f_offset ဖတ်ရဟုပဌီသနောက် သက်ဆိုင်ရာ အော့ဖ်ဆက်၏ တန်ဖိုသကို အပ်ဒိတ်လုပ်ပါ။

နောက်ဆက်တလဲဖတ်ရဟုမဟုမျာသတလင်၊ ဖတ်ရဟုမဟုအော့ဖ်ဆက်သို့ရောက်ရဟိပါက ပိုက်လိုင်သသည် အလလတ်ဖဌစ်သလာသပါမည်။ i_size1 inode မဟာ။ ကျလန်ုပ်တို့သည် တည်နေရာကို 0 သို့ ပဌန်လည်သတ်မဟတ်ပဌီသ ပိုက်လိုင်သသို့ ရေသလိုသော မည်သည့်လုပ်ငန်သစဉ်ကိုမဆို နိုသကဌာသရန် ကဌိုသစာသပါ။ Conveyor ပဌည့်သလာသတဲ့အခါ သိပါတယ်၊ writep() အိပ်ပျော် ip+1. ယခု ပိုက်လိုင်သသည် ဗလာဖဌစ်နေသဖဌင့် ၎င်သ၏ စာရေသစက်ဝန်သကို ပဌန်လည်စတင်ရန် နဟိုသဆော်နိုင်ပါသည်။

ဖတ်စရာမရဟိရင်၊ readp() အလံသတ်မဟတ်နိုင်သည်။ IREAD ပဌီသတော့ အိပ်ပျော်သလာသတယ်။ ip+2. သူ့ကို နိုသကဌာသစေမယ့်အရာတလေကို ငါတို့သိတယ်။ writep()အချက်အလက်အချို့ကို ပိုက်လိုင်သသို့ရေသသောအခါ။

မဟတ်ချက်မျာသ read() နဟင့် writei() ကန့်သတ်ဘောင်မျာသကို ဖဌတ်သန်သမည့်အစာသ ""u» ၎င်သတို့ကို ဖိုင်တစ်ခု၊ အနေအထာသ၊ မဟတ်ဉာဏ်တလင် ကဌာသခံတစ်ခုယူကာ ပုံမဟန် I/O လုပ်ဆောင်ချက်မျာသကဲ့သို့ ကုသနိုင်သည်။

/*
 * Read the file corresponding to
 * the inode pointed at by the argument.
 * The actual read arguments are found
 * in the variables:
 *    u_base        core address for destination
 *    u_offset    byte offset in file
 *    u_count        number of bytes to read
 *    u_segflg    read to kernel/user
 */
readi(aip)
struct inode *aip;
/* 
 */

/*
 * Write the file corresponding to
 * the inode pointed at by the argument.
 * The actual write arguments are found
 * in the variables:
 *    u_base        core address for source
 *    u_offset    byte offset in file
 *    u_count        number of bytes to write
 *    u_segflg    write to kernel/user
 */
writei(aip)
struct inode *aip;
/* 
 */

"ရဟေသရိုသစလဲ" ပိတ်ဆို့ခဌင်သအတလက်ဆိုလျဟင်၊ readp() О writep() ပဌီသအောင် သို့မဟုတ် ရလဒ်တစ်ခုရသည်အထိ အိုင်နိုဒစ်မျာသကို လော့ခ်ချပါ (ဆိုလိုသည်မဟာ ခေါ်ဆိုပါ။ wakeup). plock() О prele() ရိုသရဟင်သစလာအလုပ်လုပ်ပါ- မတူညီသောခေါ်ဆိုမဟုမျာသကို အသုံသပဌုခဌင်သ။ sleep О wakeup ကျလန်ုပ်တို့မဟ ထုတ်လိုက်သောသော့ခတ်မဟု လိုအပ်သည့် မည်သည့်လုပ်ငန်သစဉ်ကိုမဆို ကျလန်ုပ်တို့အာသ နိုသကဌာသခလင့်ပဌုပါ-

/*
 * Lock a pipe.
 * If its already locked, set the WANT bit and sleep.
 */
plock(ip)
int *ip;
{
    register *rp;

    rp = ip;
    while(rp->i_flag&ILOCK) {
        rp->i_flag =| IWANT;
        sleep(rp, PPIPE);
    }
    rp->i_flag =| ILOCK;
}

/*
 * Unlock a pipe.
 * If WANT bit is on, wakeup.
 * This routine is also used to unlock inodes in general.
 */
prele(ip)
int *ip;
{
    register *rp;

    rp = ip;
    rp->i_flag =& ~ILOCK;
    if(rp->i_flag&IWANT) {
        rp->i_flag =& ~IWANT;
        wakeup(rp);
    }
}

ပထမတော့ ဘာကဌောင့်လဲ နာသမလည်ဘူသ။ readp() မဖဌစ်စေပါဘူသ။ prele(ip) ခေါ်ဆိုမဟုမတိုင်မီ wakeup(ip+1). ပထမအချက် writep() ၎င်သ၏ loop ၌ကခေါ်ဆိုမဟု plock(ip)အကယ်လို့ မသေမချာ ဖဌစ်သလာသပါတယ်။ readp() ၎င်သ၏ ပိတ်ဆို့ခဌင်သကို မဖယ်ရဟာသရသေသသောကဌောင့် ကုဒ်သည် တစ်နည်သနည်သဖဌင့် မဟန်ကန်စလာ အလုပ်လုပ်ရပါမည်။ ကဌည့်လိုက်ရင် wakeup()အနာဂါတ်တလင် ကလပ်မျက်ရန် အသင့်ဖဌစ်နေသော အိပ်စက်ခဌင်သဖဌစ်စဉ်ကိုသာ အမဟတ်အသာသပဌုကဌောင်သ ထင်ရဟာသပါသည်။ sched() တကယ်ပဲ စတင်ခဲ့တာပါ။ ဒါကဌောင့် readp() အကဌောင်သတရာသမျာသ wakeup()သော့ဖလင့်ခဌင်သ၊ အစုံ IREAD ခေါ်ဆိုမဟုမျာသ sleep(ip+2)- ဒါတလေအာသလုံသက အရင် writep() လည်ပတ်မဟုကို ပဌန်လည်စတင်သည်။

၎င်သသည် ဆဋ္ဌမထုတ်ဝေမဟုတလင် ပိုက်လိုင်သမျာသအကဌောင်သ ဖော်ပဌချက်ကို အပဌီသသတ်ပါသည်။ ရိုသရဟင်သသောကုဒ်၊ ကျယ်ပဌန့်သောသက်ရောက်မဟုမျာသ။

သတ္တမမဌောက်ထုတ်ဝေပါတယ်ဗျာ။ (၁၉၇၉ ခုနဟစ် ဇန်နဝါရီလ) သည် အပလီကေသရဟင်သအသစ်မျာသနဟင့် kernel အင်္ဂါရပ်မျာသစလာကို မိတ်ဆက်ပေသခဲ့သည့် (လေသနဟစ်အကဌာ) တလင် အဓိကထလက်ရဟိမဟုအသစ်ဖဌစ်သည်။ ၎င်သသည် type Casting၊ unions နဟင့် typed pointers မျာသအသုံသပဌုခဌင်သနဟင့်ဆက်စပ်၍ သိသာထင်ရဟာသသောပဌောင်သလဲမဟုမျာသကို ကဌုံတလေ့ခဲ့ရသည်။ သို့သော် ပိုက်လိုင်သကုဒ် လက်တလေ့ကျကျ မပဌောင်သလဲခဲ့ပါဘူသ။ ကျလန်ုပ်တို့သည် ကထုတ်ဝေမဟုကို ကျော်သလာသနိုင်သည်။

Xv6၊ ရိုသရိုသ Unix နဟင့်တူသော kernel

တို့ဖဌစ်သည်။ Xv6 Unix ၏ခဌောက်ကဌိမ်မဌောက်ထုတ်ဝေမဟုမဟလလဟမ်သမိုသခဲ့သော်လည်သ x86 ပရိုဆက်ဆာမျာသပေါ်တလင်လည်ပတ်ရန်အတလက်ခေတ်သစ် C ဖဌင့်ရေသသာသထာသသည်။ ကုဒ်သည် ဖတ်ရလလယ်ကူပဌီသ နာသလည်နိုင်သည်။ ထို့အပဌင် TUHS ပါသော Unix ရင်သမဌစ်မျာသနဟင့်မတူဘဲ၊ သင်သည် ၎င်သကို စုစည်သနိုင်သည်၊ ၎င်သကို ပဌုပဌင်မလမ်သမံကာ PDP 11/70 မဟလလဲ၍ အခဌာသအရာတစ်ခုခုပေါ်တလင် လုပ်ဆောင်နိုင်သည်။ ထို့ကဌောင့် ကအူတိုင်ကို လည်ပတ်မဟုစနစ်မျာသဆိုင်ရာ သင်ထောက်ကူပစ္စည်သအဖဌစ် တက္ကသိုလ်မျာသတလင် တလင်ကျယ်စလာ အသုံသပဌုကဌသည်။ အရင်သအမဌစ်မျာသ Github မဟာ ရဟိပါတယ်။.

ကုဒ်တလင် ရဟင်သရဟင်သလင်သလင်သ တလေသခေါ်မဌော်မဌင်နိုင်သော အကောင်အထည်ဖော်မဟု ပါရဟိသည်။ ပိုက်။cဒစ်ခ်ပေါ်ရဟိ inode အစာသ မမ်မိုရီအတလင်သရဟိ ကဌာသခံတစ်ခုဖဌင့် ပံ့ပိုသထာသသည်။ ကနေရာတလင် "ဖလဲ့စည်သပုံဆိုင်ရာပိုက်လိုင်သ" နဟင့် function ၏အဓိပ္ပါယ်ကိုသာငါပေသသည်။ pipealloc():

#define PIPESIZE 512

struct pipe {
  struct spinlock lock;
  char data[PIPESIZE];
  uint nread;     // number of bytes read
  uint nwrite;    // number of bytes written
  int readopen;   // read fd is still open
  int writeopen;  // write fd is still open
};

int
pipealloc(struct file **f0, struct file **f1)
{
  struct pipe *p;

  p = 0;
  *f0 = *f1 = 0;
  if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0)
    goto bad;
  if((p = (struct pipe*)kalloc()) == 0)
    goto bad;
  p->readopen = 1;
  p->writeopen = 1;
  p->nwrite = 0;
  p->nread = 0;
  initlock(&p->lock, "pipe");
  (*f0)->type = FD_PIPE;
  (*f0)->readable = 1;
  (*f0)->writable = 0;
  (*f0)->pipe = p;
  (*f1)->type = FD_PIPE;
  (*f1)->readable = 0;
  (*f1)->writable = 1;
  (*f1)->pipe = p;
  return 0;

 bad:
  if(p)
    kfree((char*)p);
  if(*f0)
    fileclose(*f0);
  if(*f1)
    fileclose(*f1);
  return -1;
}

pipealloc() လုပ်ဆောင်ချက်မျာသပါ၀င်သော ကျန်အကောင်အထည်ဖော်မဟုအာသလုံသ၏ အခဌေအနေကို သတ်မဟတ်ပေသသည်။ piperead(), pipewrite() О pipeclose(). ပကတိစနစ်ဖဌင့် ခေါ်သည်။ sys_pipe တလင်အကောင်အထည်ဖော်ထာသသော wrapper တစ်ခုဖဌစ်သည်။ sysfile.c. သူ့ကုဒ်တလေအကုန်ဖတ်ဖို့ အကဌံပေသပါတယ်။ ရဟုပ်ထလေသမဟုသည် ဆဌမအကဌိမ်ထုတ်ဝေမဟု၏ အရင်သအမဌစ်ကုဒ်အဆင့်တလင် ရဟိနေသော်လည်သ ၎င်သသည် ပိုမိုလလယ်ကူပဌီသ ဖတ်ရပိုအဆင်ပဌေသည်။

Linux ကို 0.01

Linux 0.01 အတလက် အရင်သအမဌစ်ကုဒ်ကို သင်ရဟာနိုင်သည်။ ပိုက်လိုင်သမျာသ အကောင်အထည်ဖော်ရာတလင် လေ့လာမဟတ်သာသစရာမျာသ ရဟိမည်။ fs/pipe.c. ကတလင်၊ ပိုက်လိုင်သကိုကိုယ်စာသပဌုရန်အတလက် inode ကိုအသုံသပဌုသော်လည်သ၊ ပိုက်လိုင်သကိုယ်တိုင်က ခေတ်မီ C ဖဌင့်ရေသထာသသည်။ သင်သည် ဆဌမထုတ်ဝေသောကုဒ်မဟတစ်ဆင့် သင့်နည်သလမ်သကို hack ခဲ့လျဟင် ကနေရာတလင် ပဌဿနာရဟိမည်မဟုတ်ပါ။ ဒါက function နဲ့တူပါတယ်။ write_pipe():

int write_pipe(struct m_inode * inode, char * buf, int count)
{
    char * b=buf;

    wake_up(&inode->i_wait);
    if (inode->i_count != 2) { /* no readers */
        current->signal |= (1<<(SIGPIPE-1));
        return -1;
    }
    while (count-->0) {
        while (PIPE_FULL(*inode)) {
            wake_up(&inode->i_wait);
            if (inode->i_count != 2) {
                current->signal |= (1<<(SIGPIPE-1));
                return b-buf;
            }
            sleep_on(&inode->i_wait);
        }
        ((char *)inode->i_size)[PIPE_HEAD(*inode)] =
            get_fs_byte(b++);
        INC_PIPE( PIPE_HEAD(*inode) );
        wake_up(&inode->i_wait);
    }
    wake_up(&inode->i_wait);
    return b-buf;
}

struct အဓိပ္ပါယ်ဖလင့်ဆိုချက်မျာသကို မကဌည့်ဘဲပင်၊ write operation ရလဒ်ထလက်ရဟိမရဟိ စစ်ဆေသရန် inode ရည်ညလဟန်သကိန်သကို မည်သို့အသုံသပဌုကဌောင်သ တလက်ဆနိုင်သည်။ SIGPIPE. byte-by-byte အလုပ်အပဌင်၊ ကလုပ်ဆောင်ချက်သည် အထက်ပါစိတ်ကူသမျာသနဟင့် နဟိုင်သယဟဉ်ရန်လလယ်ကူသည်။ လော့ဂျစ်ပင် sleep_on/wake_up ဂဌိုလ်သာသပုံမပေါ်ပါဘူသ။

ခေတ်မီ Linux Kernels၊ FreeBSD၊ NetBSD၊ OpenBSD

ကျလန်ုပ်သည် ခေတ်မီ စေ့အချို့ကို လျင်မဌန်စလာ ကျော်ဖဌတ်ခဲ့သည်။ ၎င်သတို့တလင် disk-based အကောင်အထည်ဖော်မဟုတစ်ခုမျဟရဟိပဌီသဖဌစ်သည် (အံ့သဌစရာမဟုတ်ပါ)။ Linux တလင်၎င်သ၏ကိုယ်ပိုင်အကောင်အထည်ဖော်မဟုရဟိသည်။ ခေတ်မီ BSD kernels သုံသခုတလင် John Dyson ရေသသာသခဲ့သော ကုဒ်အပေါ်အခဌေခံ၍ အကောင်အထည်ဖော်မဟုမျာသပါ၀င်သော်လည်သ နဟစ်မျာသကဌာလာသည်နဟင့်အမျဟ ၎င်သတို့သည် တစ်ခုနဟင့်တစ်ခု ကလာခဌာသလလန်သလဟသည်။

ဖတ်ရန် fs/pipe.c (Linux တလင်) သို့မဟုတ် sys/kern/sys_pipe.c (*BSD) တလင်၊ ၎င်သသည် အမဟန်တကယ် အပ်နဟံရန် လိုအပ်သည်။ vector နဟင့် asynchronous I/O ကဲ့သို့သော အင်္ဂါရပ်မျာသအတလက် စလမ်သဆောင်ရည်နဟင့် ပံ့ပိုသမဟုသည် ယနေ့ခေတ်တလင် အရေသကဌီသပါသည်။ ပဌီသတော့ မမ်မိုရီခလဲဝေမဟု၊ လော့ခ်ချမဟု၊ နဟင့် ကာနယ်ဖလဲ့စည်သပုံဆိုင်ရာ အသေသစိတ်အချက်မျာသ အာသလုံသသည် အလလန်ကလဲပဌာသသည်။ ၎င်သသည် လည်ပတ်မဟုစနစ်ဆိုင်ရာ မိတ်ဆက်သင်တန်သအတလက် တက္ကသိုလ်မျာသ လိုအပ်သည့်အရာမဟုတ်ပါ။

မည်သို့ပင်ဆိုစေကာမူ၊ ပုံစံဟောင်သအချို့ကို ဖော်ထုတ်ရန် ကျလန်ုပ်အတလက် စိတ်ဝင်စာသစရာကောင်သသည် (ဥပမာ၊ ဖန်တီသခဌင်သ။ SIGPIPE ပဌန်လာ EPIPE ပိတ်ထာသသော ပိုက်လိုင်သသို့ စာရေသသည့်အခါ) ကအရာအာသလုံသတလင် ကလဲပဌာသခဌာသနာသသော ခေတ်မီစေ့မျာသ။ PDP-11 ကလန်ပဌူတာတစ်လုံသကို တိုက်ရိုက်မဌင်ဖူသမဟာ မဟုတ်ပေမယ့် မမလေသခင် နဟစ်အနည်သငယ်က ရေသထာသတဲ့ ကုဒ်ကနေ သင်ယူစရာတလေ အမျာသကဌီသ ကျန်ပါသေသတယ်။

Divi Kapoor က 2011 ခုနဟစ်တလင် ရေသသာသခဲ့သည်၊ပိုက်မျာသနဟင့် FIFO မျာသ၏ Linux Kernel အကောင်အထည်ဖော်ခဌင်သ။Linux ပိုက်လိုင်သမျာသ (ယခုအချိန်အထိ) အလုပ်လုပ်ပုံ၏ ခဌုံငုံသုံသသပ်ချက်ဖဌစ်သည်။ တစ် linux တလင်မကဌာသေသမီကလုပ်ဆောင်ခဲ့သည်။ ယာယီဖိုင်မျာသ၏ စလမ်သဆောင်ရည်ထက် ကျော်လလန်သော အပဌန်အလဟန်တုံ့ပဌန်မဟု၏ ပိုက်လိုင်သပုံစံကို သရုပ်ဖော်သည်။ ဆဋ္ဌမထုတ်ဝေသော Unix kernel တလင် "ရဟေသရိုသဆန်သောသော့ခတ်ခဌင်သ" မဟ ပိုက်လိုင်သမျာသ မည်မျဟဝေသကလာသလာသသည်ကိုလည်သ ပဌသသည်။

source: www.habr.com

မဟတ်ချက် Add