কোনও প্রোগ্রাম যখন সিগন্যাল সিগন্যাল প্রেরণ করে তখন কী করবে?


39

আমি যখন killall -9 nameকোনও প্রোগ্রাম হত্যা করতাম , তখন রাষ্ট্রটি জম্বি হয়ে যায়। কয়েক মিনিট পরে, এটি সত্যিই বন্ধ হয়ে গেল। তো, এই মিনিটের মধ্যে কী ঘটছে?

উত্তর:


66

প্রোগ্রামটি কখনই সিগ্কিল সিগন্যাল পায় না, কারণ সিগ্কিল সম্পূর্ণ অপারেটিং সিস্টেম / কার্নেল দ্বারা পরিচালিত হয়।

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

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

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

ফলস্বরূপ, প্রক্রিয়াটি নিজেই যে তথ্যটি একটি সিগিল পেয়েছে তা বাস্তবে প্রক্রিয়াকরণের সুযোগ পাবে না।

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

যদি পিতামাতা প্রক্রিয়াটি তার বাচ্চাদের আগে মারা যায়, তবে অনাথ শিশু প্রক্রিয়াগুলি পিআইডি # 1 দ্বারা স্বয়ংক্রিয়ভাবে গৃহীত হয়, যার কল রাখা চালানোর বিশেষ কর্তব্য রয়েছে wait(2)যাতে কোনও অনাথ প্রক্রিয়া জম্বি হিসাবে না যায়।

যদি কোনও জম্বি প্রক্রিয়াটি সাফ হতে কয়েক মিনিট সময় নেয় তবে এটি পরামর্শ দেয় যে জম্বিটির পিতামাতার প্রক্রিয়াটি লড়াই করছে বা সঠিকভাবে তার কাজটি করছে না।

ইউনিক্স-এর মতো অপারেটিং সিস্টেমে জম্বি সমস্যার ক্ষেত্রে কী করা উচিত সে সম্পর্কে জিহ্বা-ইন-গাল বর্ণনা রয়েছে: "জম্বিরা ইতিমধ্যে মারা গেছে বলে আপনি নিজেরাই কিছু করতে পারবেন না Instead পরিবর্তে দুষ্ট জম্বি কর্তাকে হত্যা করুন! " (অর্থাত্ ঝামেলা জম্বিগুলির মূল প্রক্রিয়া)


5
প্রক্রিয়াটি কার্নেল কলে (উদাহরণস্বরূপ I / O করছেন) সিস্কিল প্রেরিত হলে কী হবে?
গিডস

9
@ জিগডস সিগ্কিল কার্যকর করার জন্য I / O হয় বাতিল হবে, অথবা I / O সম্পূর্ণ না হওয়া পর্যন্ত সাইনকিলে বিলম্ব হবে। এটি 'এস' এবং 'ডি' ঘুমের মধ্যে পার্থক্যটি বলে ps: 'এস' I / O এর জন্য অপেক্ষা করে যে কোনও সংকেত সরবরাহ করতে কার্নেলটি বাতিল করতে পারে এবং 'ডি' তাদের পক্ষে এটি সম্ভব নয়।
zwol

6
তফসিলটি তত্ক্ষণাত প্রক্রিয়াটিকে সিপিইউর সময় দেওয়া বন্ধ করে দেওয়া বলা সম্পূর্ণভাবে সঠিক নয়। সিগন্যাল হ্যান্ডলিংয়ের কার্নেল পাশটি এখনও সেই প্রক্রিয়াটির দ্বারা কার্যকর করা হয়, তবে প্রক্রিয়াটি কেবল কার্নেল কোডটি সম্পাদন করবে তাই আপনি যখন বলবেন প্রোগ্রাম কখনই সংকেতটি গ্রহণ করে না। প্রক্রিয়াটি বেশিরভাগ সংস্থান (ক্লায়েন্ট ফাইল, ভার্চুয়াল মেমরি ইত্যাদি) এর জন্য দায়ী কার্নেল কোডটি সম্পাদন করবে clean এই ক্লিনআপ কোডের শেষ পদক্ষেপগুলি প্রসেসের অবস্থাটি জম্বিতে পরিবর্তন করা এবং শিডিয়ুলারকে অনুরোধ করা। তারপরে আর কখনও নির্ধারিত হবে না।
ক্যাস্পার্ড

4
@ জিগডস কমপক্ষে চারটি পৃথক রাষ্ট্র রয়েছে যা প্রক্রিয়াটি চালু থাকতে পারে It এটি এই মুহুর্তে কার্নেল কোডটি চালানো হতে পারে বা এটি তিনটি ভিন্ন ঘুমের মধ্যে একটিতে ঘুমিয়ে থাকতে পারে। ঘুমের অবস্থাগুলি মারাত্মক সংকেত ব্যতীত বাধা দিতে পারে, অ-বাধাপ্রাপ্ত হতে পারে বা অবিচ্ছিন্ন হতে পারে। যদি এটি অবিচ্ছিন্ন ঘুমে থাকে তবে এটি যতক্ষণ প্রয়োজন ততক্ষণ ঘুমিয়ে থাকবে এবং কেবল একবার জেগে উঠলে এটির মৃত্যুর সুযোগ থাকবে। যদি এটি অন্য দুটি ঘুমের একটিতে থাকে তবে এটি অবিলম্বে জেগে উঠবে এবং এর জন্য সিপিইউ উপলব্ধ হওয়ার সাথে সাথে তা নির্ধারিত হবে।
ক্যাস্পার্ড

2
@ জিডস পরবর্তী কী ঘটবে তা কার্নেল কোডটি চলছিল তার উপর নির্ভর করে। এটি ইতিমধ্যে চালু ছিল কিনা তা আগে নির্বিশেষে জেগে উঠতে হবে এবং তারপরে যে কার্নেল কোডটি ছিল তা চালানো শুরু করতে পারে তা চালিয়ে যাওয়ার অনুমতি দেওয়া হবে। এবং সেই কার্নেল কোডটি প্রক্রিয়াটি মারা যাওয়ার কথা বলেছে এবং তদনুসারে কাজ করার জন্য এটি দায়ী করার জন্য দায়ী। বেশিরভাগ সময় কার্নেল কোডে এটির সাথে মোকাবিলা করার উপযুক্ত উপায়টি হ'ল এটি যে কার্য সম্পাদন করে তা থেকে একটি ত্রুটি ফিরে পাওয়া। একবার কার্নেল কল স্ট্যাকটি অবাধ্য হয়ে উঠলে সিগন্যাল হ্যান্ডলিং কোডটি ব্যবহারকারী মোডে ফিরে আসার ঠিক আগে নিতে পারে।
ক্যাস্পার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.