লিনাক্স প্রক্রিয়া স্টেটস


90

লিনাক্সে, যখন কোনও ডিস্ক থেকে ব্লকগুলি পড়ার প্রয়োজন হয় তখন কোনও প্রক্রিয়াটির অবস্থা কী ঘটে? এটি কি অবরুদ্ধ? যদি তা হয় তবে অন্য একটি প্রক্রিয়া কার্যকর করার জন্য কীভাবে বেছে নেওয়া হয়?

উত্তর:


87

যদিও জন্য অপেক্ষা read()বা write()একটি ফাইল বর্ণনাকারী আগমন থেকে / প্রতি, প্রক্রিয়া ঘুম একটি বিশেষ ধরনের, যেমন "ডি" বা "ডিস্ক ঘুম" নামে পরিচিত রাখা হবে। এটি বিশেষ, কারণ এই জাতীয় অবস্থায় থাকাকালীন প্রক্রিয়াটি হত্যা বা বাধা দেওয়া যায় না। আইওসিটিএল () থেকে ফেরার অপেক্ষার প্রক্রিয়াটিও এইভাবে ঘুমানো হবে।

এর ব্যতিক্রম হ'ল যখন কোনও ফাইল (যেমন টার্মিনাল বা অন্যান্য অক্ষর ডিভাইস) O_NONBLOCKমোডে খোলা হয় , যখন এটি ধরে নেওয়া হয় যে কোনও ডিভাইস (যেমন একটি মডেম) আরম্ভ করার জন্য সময় প্রয়োজন হবে। তবে, আপনি আপনার প্রশ্নে ব্লক ডিভাইসগুলি নির্দেশ করেছেন। এছাড়াও, আমি কখনও চেষ্টা করে দেখিনি ioctl()যা সম্ভবত ব্লকবিহীন মোডে খোলার কোনও এফডি তে ব্লক করতে পারে (অন্তত জেনে নেই)।

কীভাবে অন্য একটি প্রক্রিয়া চয়ন করা হয় তা সম্পূর্ণরূপে আপনি যে শিডিয়ুলারটি ব্যবহার করছেন তার উপর নির্ভর করে পাশাপাশি সেই শিডুলারের মধ্যে অন্যান্য ওজনগুলি কীভাবে তাদের ওজনগুলি পরিবর্তন করতে পারে তার উপর নির্ভর করে।

কিছু পরিস্থিতিতে কিছু ব্যবহারকারী স্পেস প্রোগ্রাম পুনরায় বুট না হওয়া পর্যন্ত চিরতরে এই অবস্থায় থাকবে বলে জানা গেছে। এগুলি সাধারণত অন্যান্য "জম্বি" এর সাথে গোষ্ঠীযুক্ত হয় তবে শব্দটি সঠিক হবে না কারণ তারা প্রযুক্তিগতভাবে অক্ষম নয়।


4
"আইওসিটিএল () থেকে ফেরার অপেক্ষার প্রক্রিয়াটিও এইভাবে ঘুমানো হবে"। আমি কেবল আমার ইউজারস্পেস প্রক্রিয়াটিকে একটি ব্লকিং আইওসিটিএল-এর জন্য অপেক্ষা করে হত্যা করেছি যাতে এটি সত্য নয়। আমি যদি ভুল বুঝতে পারি না
হামজাহফ্রাক

এই জাতীয় পরীক্ষা করাটা দারুণ কঠিন হবে। নিরবচ্ছিন্ন প্রক্রিয়াগুলি হত্যা করা যায় না; আপনি যদি এটি হত্যা করতে সক্ষম হন তবে এটি কেবল অবরুদ্ধ ছিল (কর্নেলটি আইওএসটিএলের কোনও অংশের মাঝখানে ছিল না, এবং আপনি যে স্থানে পাশ করেছেন সেখানে ব্যবহারকারী স্পেসের সাথে সম্পর্কিত কোনও প্রতিক্রিয়া অনুলিপি করেছেন) (বা কমপক্ষে এটিতে ছিল না কপি করার মাঝখানে))। ২০০৯ সাল থেকে লিনাক্সেও অনেক পরিবর্তন হয়েছে যখন এটি লেখা হয়েছিল; ঘটনাটি যেমনটি একবার ছিল তেমন কম পর্যবেক্ষণযোগ্য।
টিম পোস্ট

133

যখন কোনও প্রক্রিয়াটি কোনও ডিস্ক থেকে ডেটা আনার প্রয়োজন হয়, তখন এটি কার্যকরভাবে সিপিইউতে চলতে বন্ধ করে দেয় অন্য প্রসেসগুলি চালাতে দেয় কারণ অপারেশনটি সম্পূর্ণ হতে দীর্ঘ সময় নিতে পারে - কমপক্ষে 5 এমএস একটি ডিস্কের জন্য সময় সন্ধান করা সাধারণ, এবং 5 মিমি 10 মিলিয়ন হয় সিপিইউ চক্র, প্রোগ্রামের দৃষ্টিকোণ থেকে একটি অনন্তকাল!

প্রোগ্রামার দৃষ্টিকোণ থেকে (এছাড়াও "ইউজারস্পেসে" বলেছেন), এটিকে ব্লকিং সিস্টেম কল বলা হয় । ফোন দিলেwrite(2) (যা একই নামের সিস্টেম কলের চারপাশে একটি পাতলা libc মোড়ক), আপনার প্রক্রিয়া ঠিক সেই সীমানায় থামবে না; এটি চলতে থাকে, কার্নেলে, সিস্টেম কল কোড চালিয়ে। বেশিরভাগ সময় এটি নির্দিষ্ট ডিস্ক নিয়ন্ত্রক ড্রাইভার (ফাইলের নাম → ফাইলসিস্টেম / ভিএফএস → ব্লক ডিভাইস → ডিভাইস ড্রাইভার) পর্যন্ত যায়, যেখানে ডিস্কে একটি ব্লক আনার আদেশ একটি সঠিক হার্ডওয়্যারের কাছে জমা দেওয়া হয়, যা খুব কার্যকর দ্রুত অপারেশন বেশিরভাগ সময়।

তারপরে প্রক্রিয়াটিকে ঘুমের স্থানে রাখা হয় (কার্নেল স্পেসে, ব্লকিংকে ঘুম বলা হয় - কার্নেলের দৃষ্টিকোণ থেকে কোনও কিছুই 'ব্লক করা হয় না')। হার্ডওয়্যারটি শেষ পর্যন্ত যথাযথ ডেটা আনার পরে এটি জাগ্রত হবে, তারপরে প্রক্রিয়াটি চলমানযোগ্য হিসাবে চিহ্নিত হবে এবং নির্ধারিত হবে। শেষ পর্যন্ত, সময়সূচী প্রক্রিয়াটি পরিচালনা করবে।

পরিশেষে, ইউজারস্পেসে, ব্লকিং সিস্টেম কল যথাযথ স্থিতি এবং ডেটার সাথে প্রত্যাবর্তন করে এবং প্রোগ্রাম প্রবাহ এগিয়ে যায়।

এটা তোলে সবচেয়ে ইনপুট / আউটপুট সিস্টেম কল ডাকা সম্ভব অ ব্লক মোড (দেখুন O_NONBLOCKopen(2)এবং fcntl(2))। এই ক্ষেত্রে, সিস্টেম কলগুলি তত্ক্ষণাত্ ফিরে আসে এবং কেবলমাত্র ডিস্ক ক্রিয়াকলাপ জমা দেওয়ার প্রতিবেদন করে। প্রোগ্রামারটি অপারেশনটি সফলভাবে সম্পন্ন হয়েছে কিনা সফলতার সাথে শেষ হয়েছে কিনা তা পরবর্তী সময়ে স্পষ্টভাবে যাচাই করতে হবে এবং এর ফলাফল (যেমন, সহ select(2)) আনতে হবে । একে অ্যাসিক্রোনাস বা ইভেন্ট-ভিত্তিক প্রোগ্রামিং বলা হয়।

এখানে ডি স্টেটের উল্লেখ করা বেশিরভাগ উত্তর (যা TASK_UNINTERRUPTIBLEলিনাক্স রাজ্যের নামগুলিতে ডাকা হয়) ভুল। ডি রাষ্ট্র একটি বিশেষ ঘুম মোড যার কেবলমাত্র কার্নেল স্থান কোড পাথ, যখন যে কোড পথে আলোড়ন সৃষ্টি হয় বাধাগ্রস্থ করা যাবে না (কারণ এটা প্রোগ্রাম অত্যন্ত জটিল হবে), প্রত্যাশা সঙ্গে যে এটি শুধুমাত্র একটি খুব জন্য ব্লক হবে সংক্ষিপ্ত সময়. আমি বিশ্বাস করি যে বেশিরভাগ "ডি স্টেটস" আসলে অদৃশ্য; এগুলি খুব স্বল্পস্থায়ী এবং 'শীর্ষ' এর মতো নমুনা সরঞ্জাম দ্বারা পর্যবেক্ষণ করা যায় না।

আপনি কয়েকটি পরিস্থিতিতে অকেটেযোগ্য প্রক্রিয়াগুলির মুখোমুখি হতে পারেন। এনএফএস এর জন্য বিখ্যাত এবং আমি বহুবার এর মুখোমুখি হয়েছি। আমি মনে করি কিছু ভিএফএস কোড পাথের মধ্যে একটি শব্দার্থবিরোধ রয়েছে, যা সর্বদা স্থানীয় ডিস্ক এবং দ্রুত ত্রুটি সনাক্তকরণে পৌঁছায় বলে মনে করে (এসটিএ-তে একটি ত্রুটির সময়সীমা প্রায় 100 এমএসের কাছাকাছি হবে), এবং এনএফএস, যা আসলে নেটওয়ার্ক থেকে ডেটা নিয়ে আসে যা আরও স্থিতিস্থাপক এবং ধীরে ধীরে পুনরুদ্ধার হয়েছে (300 সেকেন্ডের একটি টিসিপি সময়সীমা সাধারণ)। রাষ্ট্রের সাথে লিনাক্স ২.6.২৫ এ চালু করা শীতল সমাধানের জন্য এই নিবন্ধটি পড়ুন TASK_KILLABLE। এই যুগের আগে একটি হ্যাক ছিল যেখানে আপনি কর্নেল থ্রেডে একটি সিগ্কিল প্রেরণ করে এনএফএস প্রক্রিয়া ক্লায়েন্টকে প্রকৃতপক্ষে সংকেত পাঠাতে পারতেন rpciod, তবে সেই কুৎসিত কৌশলটি ভুলে যান…


4
বিস্তারিত প্রতিক্রিয়াটির জন্য +1, তবে দয়া করে মনে রাখবেন যে এই থ্রেডটির প্রায় দুই বছর ধরে একটি গ্রহণযোগ্য উত্তর রয়েছে। আপনি যদি সাম্প্রতিক প্রশ্নগুলিতে হাত ধার দিতে চান তবে "প্রশ্নগুলি" লিঙ্কটি হিট করুন। স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম, এবং অবদানের জন্য ধন্যবাদ!
গারগান্টুচেট

20
এই উত্তরটি শুধুমাত্র এনএফএসের উল্লেখ করার জন্য, যা কিছু পরিবেশে ডি রাজ্যের প্রক্রিয়াগুলির জন্য সর্বাধিক সাধারণ ব্যাখ্যা is +1
পিংকো

14
খুব ভাল উত্তর, ধন্যবাদ। এছাড়াও নোট করে রাখুন যে প্রক্রিয়াগুলি সরিয়ে নেওয়া পৃষ্ঠাগুলির জন্য অপেক্ষা করতে গিয়ে ডি অবস্থায় চলে যায়, সুতরাং একটি থ্র্যাশিং প্রক্রিয়া দীর্ঘ সময়ের জন্য ডি অবস্থায় থাকবে।
cha0site

@ জেরোডাক্স ভাল উত্তর দিচ্ছেন, তবে আমি মনে করি আপনার স্কিমা (ফাইলের নাম -> ফাইল সিস্টেম / ভিএফএস -> ব্লক ডিভাইস -> ডিভাইস ড্রাইভার) এটি হওয়া উচিত (ফাইলের নাম -> ভিএফএস -> ফাইলসিস্টেম (এক্সট্রি) -> ব্লক ডিভাইস -> ডিভাইস ড্রাইভার)
c4f4t0r

4
অনুমান করা কি নিরাপদ হবে যে স্পিনলকসের জন্য অপেক্ষা কর্নেলের সময় (যা ডিস্ক i / o এর সাথে সম্পর্কিত হতে পারে বা নাও হতে পারে) সমস্ত ডি-স্টেট হিসাবে রিপোর্ট করা হয়েছে /proc/stat?
উইক

8

আই / ও সম্পাদনকারী একটি প্রক্রিয়া ডি স্টেটে (নিরবচ্ছিন্ন ঘুম) করা হবে , যা সিপিইউকে মুক্ত করে এমনকী একটি হার্ডওয়্যার বিঘ্নিত না হয় যা সিপিইউকে প্রোগ্রামটি চালিয়ে ফিরে আসতে বলে। man psঅন্যান্য প্রক্রিয়া রাষ্ট্রের জন্য দেখুন ।

আপনার কার্নেলের উপর নির্ভর করে একটি প্রসেস শিডিয়ুলার রয়েছে , যা সঞ্চালনের জন্য প্রস্তুত প্রসেসের রান্কুয়ের উপর নজর রাখে। এটি একটি নির্ধারিত অ্যালগরিদম সহ, কার্নেলটি কোন সিপিইউতে নির্ধারিত হবে তা জানায়। বিবেচনা করার জন্য কার্নেল প্রক্রিয়া এবং ব্যবহারকারী প্রক্রিয়া রয়েছে। প্রতিটি প্রক্রিয়া একটি সময়-স্লাইস বরাদ্দ করা হয়, যা এটি ব্যবহারের জন্য অনুমোদিত সিপিইউ সময়ের একটি অংশ। প্রক্রিয়াটি তার সমস্ত টাইম-স্লাইস একবার ব্যবহার করার পরে, এটি নির্ধারিত হিসাবে চিহ্নিত হয় এবং সময়সূচী অ্যালগরিদমে কম অগ্রাধিকার দেওয়া হয়।

ইন 2.6 কার্নেল , একটি হল হে (1) সময় জটিলতা নির্ধারণকারী কত প্রসেস আপনি চলমান আপ আছে, এটা ধ্রুব সময় সিপিইউ বরাদ্দ হবে, তাই কোন ব্যাপার। যদিও এটি আরও জটিল, কারণ 2.6 প্রিফিমেশন এবং সিপিইউ লোড ব্যালেন্সিং সহজ অ্যালগরিদম নয় introduced যাই হোক না কেন, এটি দক্ষ এবং সিপিইউগুলি নিষ্ক্রিয় থাকবে না যখন আপনি I / O এর জন্য অপেক্ষা করবেন।


3

যেমন অন্যদের দ্বারা ইতিমধ্যে ব্যাখ্যা করা হয়েছে, "ডি" স্টেটের প্রক্রিয়াগুলি (নিরবচ্ছিন্ন ঘুম) পিএস প্রক্রিয়াটির স্তব্ধতার জন্য দায়ী। আমার কাছে এটি রেডহ্যাট x.x এবং স্বয়ংক্রিয় এনএফএস হোম ডিরেক্টরিগুলির সাথে বহুবার ঘটেছে।

ডি অবস্থায় প্রক্রিয়াগুলি তালিকাভুক্ত করতে আপনি নিম্নলিখিত কমান্ডগুলি ব্যবহার করতে পারেন:

cd /proc
for i in [0-9]*;do echo -n "$i :";cat $i/status |grep ^State;done|grep D

প্রক্রিয়াটির বর্তমান ডিরেক্টরি এবং এটি হতে পারে যে মাউন্ট করা এনএফএস ডিস্কে সমস্যা রয়েছে আপনি নিম্নলিখিত উদাহরণের অনুরূপ একটি কমান্ড ব্যবহার করতে পারেন (স্লিপিং প্রক্রিয়া নম্বর সহ 31134 প্রতিস্থাপন করুন):

# ls -l /proc/31134/cwd
lrwxrwxrwx 1 pippo users 0 Aug  2 16:25 /proc/31134/cwd -> /auto/pippo

আমি দেখতে পেয়েছি যে সম্পর্কিত মাউন্ট করা এনএফএস ফাইল সিস্টেমে -f (ফোর্স) স্যুইচ সহ umount কমান্ড দেওয়া ঘুমন্ত প্রক্রিয়াটি জাগ্রত করতে সক্ষম হয়েছিল:

umount -f /auto/pippo

ফাইল সিস্টেমটি আনমাউন্ট করা হয়নি, কারণ এটি ব্যস্ত ছিল, তবে সম্পর্কিত প্রক্রিয়াটি জাগ্রত হয়েছিল এবং আমি রিবুট না করেই সমস্যাটি সমাধান করতে সক্ষম হয়েছি।


1

আপনার প্রক্রিয়াটি একক থ্রেড হিসাবে ধরে নেওয়া এবং আপনি I / O- কে ব্লক করা ব্যবহার করছেন, আপনার প্রক্রিয়া I / O সম্পূর্ণ হওয়ার অপেক্ষায় অবরুদ্ধ হবে। কার্নেল বিশেষত্ব, অগ্রাধিকার, সর্বশেষ রান সময় ইত্যাদির উপর ভিত্তি করে চালানোর জন্য অন্য প্রক্রিয়া বেছে নেবে যদি অন্য কোনও চলমান প্রক্রিয়া না থাকে তবে কার্নেলটি আর চালাবে না; পরিবর্তে, এটি হার্ডওয়্যারকে বলবে মেশিনটি নিষ্ক্রিয় (যার ফলে বিদ্যুতের পরিমাণ কম হবে)।

প্রক্রিয়াগুলি যে I / O সম্পূর্ণ করার জন্য অপেক্ষা করছে তা সাধারণত D তে, যেমন, psএবং এ প্রদর্শিত হবে top


মোট স্মৃতির প্রায় 10% ব্যবহার করে আমি বেশ কয়েকটি প্রক্রিয়া চালু করেছি। আমি লক্ষ্য করেছি যে তাদের মধ্যে অনেকগুলি ডি অবস্থায় রয়েছে। এই বিশেষ মেশিনে আইও ধীর হয়ে যাওয়ার কারণে এটি হয়? বলুন আমার 9 টি প্রক্রিয়া রয়েছে, তারা আইওয়ের হয়ে প্রতিযোগিতা করতে পারে এবং তাদের মধ্যে অনেকগুলি ডি অবস্থায় রয়েছে।
কেমিন ঝো

@ কেমিনঝৌ সিপিইউ গতির তুলনায়, I / O বেশ ধীর - এমনকি I / O দ্রুত fast একটি একক I / O ভারী প্রক্রিয়া সহজেই একটি চৌম্বকীয় ডিস্ক এমনকি একটি এসএসডি ব্যস্ত করতে পারে। 10 I / O ভারী প্রক্রিয়াগুলি বেশ কয়েকটি ব্যস্ত হতে পারে।
ডারোবার্ট

1

হ্যাঁ, রিড () সিস্টেম কলটিতে টাস্কটি ব্লক হয়ে যায়। আর একটি টাস্ক যা প্রস্তুত তা রান করে, বা অন্য কোনও কাজ প্রস্তুত না হলে অলস টাস্ক (সেই সিপিইউয়ের জন্য) চলে।

একটি সাধারণ, ব্লক করা ডিস্ক রিডের ফলে টাস্কটি "ডি" অবস্থায় প্রবেশ করে (যেমন অন্যরা উল্লেখ করেছেন)। এ জাতীয় কাজগুলি লোড গড়কে অবদান রাখে, যদিও তারা সিপিইউ গ্রহণ করে না।

আইওর কিছু অন্যান্য ধরণের, বিশেষত টিটিস এবং নেটওয়ার্ক, বেশ একইরকম আচরণ করে না - প্রক্রিয়াটি "এস" অবস্থায় শেষ হয় এবং বাধা দেওয়া যায় এবং লোড গড়ের তুলনায় গণনা করা যায় না।


0

হ্যাঁ, আইওর জন্য অপেক্ষা করা কার্যগুলি অবরুদ্ধ করা হয়েছে এবং অন্যান্য কাজগুলি কার্যকর করা হবে। পরবর্তী কাজ নির্বাচন করা লিনাক্স শিডিয়ুলার দ্বারা সম্পন্ন হয় ।


0

সাধারণত প্রক্রিয়াটি ব্লক হয়ে যাবে। যদি পঠন অপারেশনটি কোনও ব্লক বর্ণনকারীকে অ-ব্লক করা হিসাবে চিহ্নিত করা থাকে বা প্রক্রিয়াটি যদি অ্যাসিঙ্ক্রোনাস আইও ব্যবহার করে তবে এটি অবরুদ্ধ হবে না। এছাড়াও যদি প্রক্রিয়াটির অন্যান্য থ্রেডগুলি অবরুদ্ধ না থাকে তবে তারা চলতে পারে।

পরবর্তী কোন প্রক্রিয়াটি চালিত হবে সে সিদ্ধান্তটি কার্নেলের সময়সূচীর উপর নির্ভর করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.