অপেক্ষার চ্যানেলটি কার্নেলের সেই জায়গা যেখানে বর্তমানে টাস্কটি অপেক্ষা করছে। কোনও টাস্কের জন্য রিসোর্সের অপেক্ষা করতে হবে, যা ডেটা বা প্রক্রিয়াকরণের সময় হতে পারে। এই দু'টির মধ্যে রয়েছে নেটওয়ার্ক সকেট, হার্ডওয়্যার, ফাইলস এবং আরও কিছু; যেহেতু তাদের বেশিরভাগটি ইউনিক্সের মতো সিস্টেমে কেবল ফাইল।
0
: প্রক্রিয়াটি অপেক্ষা করছে না
poll_schedule_timeout
poll()
I / O পরিচালনা করার জন্য ব্যবহৃত একটি সিস্টেম কল 1 । এটি অনুরূপ select()
। 2
যে অ্যাপ্লিকেশনগুলি অ-অবরুদ্ধকরণ আই / ও ব্যবহার করে তারা এই কলগুলি কোনও ফাইল থেকে পড়তে বা লিখতে পারে কিনা তা দেখতে এই ব্লকগুলি ব্যবহার করে, যাতে এটি ব্লক করে থাকতে পারে। এগুলি প্রায়শই ইনপুট / আউটপুট স্ট্রিমের জন্য ব্যবহৃত হয়, যা ব্লক করা নাও যেতে পারে (অন্যথায়, সম্ভবত আপনার মাউস সরে যেতে থামবে)।
অপেক্ষার চ্যানেলটি poll_schedule_timeout
ইঙ্গিত দেয় যে কোনও কাজ আই / ও এর জন্য অপেক্ষা করছে, হয় কীবোর্ড এবং ইঁদুর, সাউন্ড ডিভাইস বা এমনকি নেটওয়ার্ক সকেটের মতো হার্ডওয়্যার।
- কার্নেলের একটি ফাংশন
- তারা সংজ্ঞায়িত করা হয়
<linux/poll.h>
। poll
সিস্টেম ভি-তে প্রথম দেখা একটি বাস্তবায়ন ছিল, select
এটি বিএসডি ইউনিক্স সমতুল্য।
futex_wait_queue_me
:
এটি ব্যাখ্যা করার জন্য, আমাদের লকগুলি দেখতে হবে। একটি লক সিস্টেমে একটি সংরক্ষিত অবস্থা যা সূচিত করে যে কোনও কাজ কোনও সংস্থান দিয়ে কাজ করে। উদাহরণস্বরূপ, কেবলমাত্র একটি কাজ যা একটি ফাইল পড়ে। এই টাস্কটি ফাইলটি লক করে দেবে, অন্য কোনও টাস্ক 1 যা ফাইলটি পড়ার চেষ্টা করে তা এটি লক হয়ে থাকতে পারে এবং এটি অ্যাক্সেস করার আগে লকটি চলে যাওয়ার অপেক্ষায় ছিল। প্রসেসরের সময়ের ক্ষেত্রেও একই ঘটনা ঘটে।
লিনাক্সের আধুনিক সংস্করণে (বেশিরভাগ আর্কিটেকচারে) কার্নেলের মধ্যে একটি ফিউটেক্স (দ্রুত ইউজারস্পেস মিটেক্স) লক ব্যবহার করা হয়। মুটেক্স, পারস্পরিক বর্জন, এই ধারণাটিকে বোঝায় যে কোনও সাধারণ উত্স যে কোনও সময়ে কেবল একটি কাজ দ্বারা অ্যাক্সেস করা যেতে পারে। এই জন্য, সিস্টেমের মধ্যে পতাকা সেট করা হয়।
যদি কোনও প্রক্রিয়া কোনও লক করা সংস্থার জন্য অপেক্ষা করে থাকে তবে এটিকে ব্যাসি ওয়েটিং
বা "স্পিনিং" বলা হয়, এটি যতক্ষণ না সম্ভব এটি বার বার এটি অ্যাক্সেস করার চেষ্টা করে বলে উল্লেখ করে। কোনও কাজ স্পিন হয়ে গেলে তাকে অবরুদ্ধ করে বলা হয় ।
ফিউটেক্স লকগুলি ইউজার স্পেসের একটি সংখ্যা হিসাবে ভাবা যেতে পারে, যা কোনও কাজ দ্বারা বাড়ানো বা হ্রাস করা যায় (এমন ক্ষেত্রে যেখানে একাধিক কাজ দ্বারা সংস্থানটি অ্যাক্সেস করা যেতে পারে, এই সংখ্যাটি একের বেশি হতে পারে)। এটি চিত্রের 4 তে প্রদর্শিত নম্বর ।
এই টাস্কগুলি ওয়েট কাতারে নিজেকে সজ্জিত করে , একটি সাধারণ ক্রিয়াসমূহ যা কিছু কাজ করা দরকার, একবার প্রক্রিয়া করার সময় পাওয়া গেলে, কার্যগুলি তাদের কাজ করে এবং সারি থেকে সরিয়ে ফেলা হয়।
futex_wait_queue_me
একটি কাজ enqueues। এরপরে এটি সংকেত, একটি সময় শেষ হওয়ার বা জাগরণের অপেক্ষা করে its এই অপেক্ষার চ্যানেলে যে কাজগুলি অপেক্ষার সারিতে অপেক্ষা করছে না, তারা অপেক্ষা করার জন্য অপেক্ষা করছে।
- কোনও কাজ প্রক্রিয়া 3 বা থ্রেড 2 হতে পারে
- একটি থ্রেড একটি প্রক্রিয়ার একটি উপ-বিভাগ। অনেক থ্রেড সমান্তরাল চলতে পারে
- একটি প্রক্রিয়া একটি পূর্ণ-বিকাশযুক্ত প্রোগ্রাম, এতে এক বা একাধিক থ্রেড থাকে, যদিও কোনও প্রোগ্রামে একাধিক প্রক্রিয়াও থাকতে পারে।
- মনে রাখবেন, এটি এখনও জিনিসগুলির একটি খুব উচ্চ স্তরের দৃষ্টিভঙ্গি, এটি বাস্তবায়নের বিশদটি বিবেচনা করে না
__skb_recv_datagram
লক হওয়া নেটওয়ার্ক সকেটে কিছু ডেটার জন্য অপেক্ষা করুন।
sk_wait_data
কোনও নেটওয়ার্ক সকেটে কিছু ডেটার জন্য অপেক্ষা করুন।
do_exit
এটি একটি প্রক্রিয়া ছাড়ার শেষ অংশ। পরেরটি do_exit()
কল করে schedule()
, অন্য প্রক্রিয়াটি নির্ধারণ করার জন্য। যখন do_exit()
ডাকা হয়, প্রক্রিয়াটি একটি ZOMBIE
।
do_wait
তফসিলকারীদের অপেক্ষা কাতারে একটি প্রক্রিয়া যুক্ত হয়।
pipe_wait
, unix_stream_data_wait
একটি প্রক্রিয়া একটি উপপ্রসেস থেকে ডেটার জন্য অপেক্ষা করছে। এটি ঘটে, উদাহরণস্বরূপ, আপনি যখন এই ধরণের কোড চালাবেন:
echo | sleep 10 && echo hallo # pipe
অথবা
cat < hello.c # unix data stream
hrtimer_nanosleep
প্রক্রিয়াটি ঘুমিয়ে আছে, hrtimer_nanosleep()
পদ্ধতিটি ব্যবহার করে । এই পদ্ধতিটি ন্যানোসেকেন্ডের যথার্থতার সাথে নির্দিষ্ট সময়ের জন্য ঘুমানোর প্রোগ্রামের জন্য ব্যবহার করা যেতে পারে।
এগুলি সব কিছু নয়, তবে আমি অন্য কাউকে পর্যবেক্ষণ করি নি। আমি কিছু মিস করেছি যদি একটি মন্তব্য পোস্ট করুন।