কীভাবে লিনাক্স একটি প্রক্রিয়া "হত্যা" করে?


91

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

আজ আমি killকমান্ডটি সম্পর্কে ভেবেছিলাম , এবং আমি এটি প্রতিদিন একাধিকবার ব্যবহার করার সময় (এটির "স্বাভাবিক" এবং -9স্বাদ উভয়ই ) আমাকে অবশ্যই স্বীকার করতে হবে যে এটি পর্দার পিছনে কীভাবে কাজ করে তা সম্পর্কে আমার কোনও ধারণা নেই।

আমার দৃষ্টিকোণ থেকে, যদি কোনও চলমান প্রক্রিয়া "স্তব্ধ" হয় তবে আমি killএর পিআইডি কল করি এবং তারপরে হঠাৎ এটি আর চলছে না। ম্যাজিক!

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

  • লিনাক্স কীভাবে সিপিইউ সময় গ্রহণের প্রক্রিয়াটি থামিয়ে দেয়?
  • এটি নির্ধারিত সময় থেকে সরানো হয়েছে?
  • এটি কি তার উন্মুক্ত ফাইল হ্যান্ডলগুলি থেকে প্রক্রিয়াটি সংযোগ বিচ্ছিন্ন করে?
  • প্রক্রিয়াটির ভার্চুয়াল মেমরি কীভাবে প্রকাশিত হয়?
  • স্মৃতিতে কি কোনও বৈশ্বিক টেবিলের মতো কিছু রয়েছে, যেখানে লিনাক্স কোনও প্রক্রিয়া দ্বারা গৃহীত সমস্ত সংস্থার রেফারেন্স রাখে এবং আমি যখন একটি প্রক্রিয়া "হত্যা" করি, তখন লিনাক্স কেবল সেই টেবিলটি দিয়ে যায় এবং একের পর এক উত্সগুলি মুক্ত করে দেয়?

আমি সত্যিই সব জানতে চাই!


উত্তর:


71

কোনও প্রক্রিয়ায় কিল -9 প্রেরণে প্রক্রিয়াটির সহযোগিতা প্রয়োজন হয় না (যেমন একটি সংকেত পরিচালনা করার মতো), এটি কেবল এটি বন্ধ করে দেয়।

আপনি ধারণা করছেন যে কারণ কিছু সংকেত ধরা পড়তে পারে এবং এড়িয়ে যেতে পারে সেগুলি সকলেই সহযোগিতার সাথে জড়িত। তবে অনুসারে man 2 signal, " সিগন্যালস সিগিল এবং সিগস্টপ ধরা যাবে না বা উপেক্ষা করা যাবে না"। সিগন্টারমে ধরা যেতে পারে, এ কারণেই প্লেইন killসর্বদা কার্যকর হয় না - সাধারণত এর অর্থ হ'ল প্রক্রিয়াটির হ্যান্ডলারের কিছু খারাপ হয়ে গেছে। 1

যদি কোনও প্রক্রিয়া কোনও প্রদত্ত সিগন্যালের জন্য কোনও হ্যান্ডলারকে সংজ্ঞায়িত করে (বা না পারে), কার্নেল একটি ডিফল্ট ক্রিয়া সম্পাদন করে। সিগনেটার এবং সিগকলের ক্ষেত্রে, এটি প্রক্রিয়াটি সমাপ্ত করা হয় (যদি না এর পিড 1 হয়; কার্নেলটি শেষ না করা হয় init) 2 এর অর্থ ফাইলহ্যান্ডলগুলি বন্ধ থাকে, এটির স্মৃতি সিস্টেম পুলে ফিরে আসে, এর পিতামাতারা স্বতঃসিদ্ধ হন, তার অনাথ শিশু init ইত্যাদি দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত, ঠিক যেমন এটি কল করেছে exit(দেখুন man 2 exit)। প্রক্রিয়া আর বিদ্যমান নেই - যদি না এটি একটি জম্বি হিসাবে শেষ হয়, তবে সেক্ষেত্রে এটি এখনও কিছু তথ্য সহ কার্নেলের প্রক্রিয়া সারণীতে তালিকাভুক্ত রয়েছে; এটি ঘটে যখন তার পিতামাতারা না করেwaitএবং এই তথ্যটি সঠিকভাবে মোকাবেলা করুন। যাইহোক, জম্বি প্রক্রিয়াগুলিতে তাদের কাছে আর কোনও মেমরি বরাদ্দ থাকে না এবং তাই এটি চালানো চালিয়ে যেতে পারে না।

মেমোরিতে এমন কোনও গ্লোবাল টেবিলের মতো কিছু আছে যেখানে লিনাক্স কোনও প্রক্রিয়া দ্বারা গৃহীত সমস্ত সংস্থার রেফারেন্স রাখে এবং যখন আমি একটি প্রক্রিয়া "হত্যা" করি তখন লিনাক্স কেবল সেই টেবিলটি দিয়ে যায় এবং একের পর এক সংস্থানগুলি মুক্ত করে দেয়?

আমি মনে করি এটি যথেষ্ট সঠিক। দৈহিক মেমরি পৃষ্ঠা দ্বারা ট্র্যাক করা হয় (এক পৃষ্ঠায় সাধারণত 4 কেবি অংশের সমান) এবং এই পৃষ্ঠাগুলি থেকে নেওয়া হয় এবং একটি গ্লোবাল পুলে ফিরে আসে। এটিকে আরও জটিল করে দেওয়া হয়েছে যে কিছু ফ্রি'ড পৃষ্ঠাগুলি ক্যাশে হলে তাদের থাকা ডেটাগুলি আবার প্রয়োজন হয় (এটি এখনও বিদ্যমান ফাইল থেকে পড়া ডেটা)।

মানচিত্রগুলি "সংকেত" সম্পর্কে কথা বলে তবে অবশ্যই এটি একটি বিমূর্ততা।

অবশ্যই, সমস্ত সংকেত একটি বিমূর্ততা। এগুলি ধারণাগত, যেমন "প্রক্রিয়াগুলি"। আমি খানিকটা শব্দার্থক খেলছি, তবে যদি আপনি বোঝাচ্ছেন যে সিগিল হ'ল সিগমেন্টের চেয়ে গুণগতভাবে আলাদা, তবে হ্যাঁ এবং না। হ্যাঁ এই অর্থে যে এটি ধরা যায় না, তবে এই অর্থে যে তারা উভয়ই সংকেত। সাদৃশ্য অনুসারে, একটি আপেল কমলা নয় তবে আপেল এবং কমলা উভয়ই ফল বলে definition আপনি এটি ধরতে পারবেন না বলে সিক্কিল আরও বিমূর্ত বলে মনে হচ্ছে , তবে এটি এখনও একটি সংকেত। এখানে سگরটার হ্যান্ডলিংয়ের একটি উদাহরণ রয়েছে, আমি নিশ্চিত আপনি এগুলি আগে দেখেছেন:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>

void sighandler (int signum, siginfo_t *info, void *context) {
    fprintf (
        stderr,
        "Recieved %d from pid %u, uid %u.\n",
        info->si_signo,
        info->si_pid,
        info->si_uid
    );
}

int main (void) {
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_sigaction = sighandler;
    sa.sa_flags = SA_SIGINFO;
    sigaction(SIGTERM, &sa, NULL);
    while (1) sleep(10);
    return 0;
}             

এই প্রক্রিয়াটি কেবল চিরকাল ঘুমাবে। আপনি এটিকে একটি টার্মিনালে চালাতে পারেন এবং এটি দিয়ে سگরটার পাঠাতে পারেন kill। এটি এ জাতীয় জিনিস ছড়িয়ে দেয়:

Recieved 15 from pid 25331, uid 1066.

1066 আমার uid হয়। পিডটি সেই শেলটি থেকে হবে যা থেকে killকার্যকর করা হয়, বা আপনি যদি কাঁটাচামচ করেন তবে পিড হত্যার পিড হবে kill 25309 & echo $?)

আবার, সিকিলের জন্য কোনও হ্যান্ডলার সেট করার কোনও অর্থ নেই কারণ এটি কাজ করবে না। 3 আমি যদি kill -9 25309প্রক্রিয়া শেষ হবে। তবে এটি এখনও একটি সংকেত; কার্নেলটিতে সিগন্যালটি কে প্রেরণ করেছে , এটি কী ধরণের সংকেত ইত্যাদি প্রকারের তথ্য রয়েছে etc.


1. আপনি যদি সম্ভাব্য সংকেতের তালিকার দিকে নজর না দিয়ে থাকেন তবে দেখুন kill -l

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

৩. এর অর্থ এই নয় যে ব্যবহার kill -9করা অনুশীলনে আরও ভাল জিনিস। আমার উদাহরণ হ্যান্ডলারটি খারাপ দিক থেকে বোঝা যায় যে এটি না হয় exit()। একটি সিগমেন্টার হ্যান্ডলারের আসল উদ্দেশ্য হ'ল প্রক্রিয়াটিকে অস্থায়ী ফাইলগুলি পরিষ্কার করার মতো কিছু করার সুযোগ দেওয়া, তারপরে স্বেচ্ছায় প্রস্থান করা। আপনি যদি ব্যবহার kill -9করেন তবে এটি এই সুযোগটি পায় না, কেবল তাই করুন যদি "স্বেচ্ছায় প্রস্থান" অংশটি ব্যর্থ হয়েছে বলে মনে হয়।


ঠিক আছে তবে কী প্রক্রিয়াটি মেরে -9ফেলেছে কারণ এটাই আসল সমস্যা কী করে কে মারা যায় যে এই মারা যাবে! ;)
কিউই

@ কিউই: কার্নেল সংকেত সহ আইপিসি এর মধ্য দিয়ে যায়; কার্নেলটি ডিফল্ট ক্রিয়া প্রয়োগ করে।
গোল্ডিলোক

12
এই প্রক্রিয়াটি সেই অবস্থায় থাকা অবস্থায় ডিস্ক স্লিপ (ডি) সমস্ত সংকেতকে ছাড়িয়ে যায় mentioning সুতরাং kill -9নির্দিষ্ট আই / ও বাউন্ড প্রক্রিয়াগুলির চেষ্টা করা কার্যকর হচ্ছে না, অন্তত তাত্ক্ষণিকভাবে নয়।
টিম পোস্ট

7
আমি যুক্ত করব যেহেতু একটি kill -9ধরা পড়তে পারে না, তাই এটি গ্রহণের প্রক্রিয়াটি কোনও ক্লিনআপ সম্পাদন করতে পারে না (যেমন অস্থায়ী ফাইলগুলি সরিয়ে নেওয়া, ভাগ করা মেমরি মুক্ত করা ইত্যাদি) প্রস্থান হওয়ার আগেই। অতএব, কেবলমাত্র kill -9( kill -killশেষ) অবলম্বন হিসাবে (ওরফে ) ব্যবহার করুন । একটি kill -hupএবং / অথবা kill -termপ্রথম দিয়ে আরম্ভ করুন এবং তারপরে kill -killচূড়ান্ত ঘা হিসাবে ব্যবহার করুন ।
JRFerguson

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

3

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

প্রক্রিয়াটি ব্যাহত হওয়ার পরে, নিয়ন্ত্রণটি কার্নেল কোডে ফিরে আসে। এই কোডটি তখন প্রক্রিয়া পক্ষের কোনও সহযোগিতা ছাড়াই বাধিত প্রক্রিয়াটির কার্য সম্পাদন পুনরায় শুরু না করার সিদ্ধান্ত নিতে পারে। কিল -9 আপনার প্রোগ্রামের যে কোনও লাইনে মৃত্যুদন্ড কার্যকর করতে পারে।


0

প্রক্রিয়া হত্যার কাজ কীভাবে হয় তার একটি আদর্শ বিবরণ এখানে। অনুশীলনে, যে কোনও ইউনিক্স বৈকল্পিকের অনেকগুলি অতিরিক্ত জটিলতা এবং অনুকূলিতকরণ থাকবে ations

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

যদি প্রক্রিয়াটির একটি থ্রেডটি বর্তমানে অন্য সিপিইউতে নির্ধারিত থাকে তবে কার্নেলটি সেই অন্য সিপিইউতে আরও দ্রুত সঞ্চালন বন্ধ করার জন্য সেই থ্রেড পেতে একটি বাধা দিতে পারে।

যখন শিডিয়ুলার লক্ষ্য করে যে কোনও থ্রেড প্রক্রিয়াধীন রয়েছে যেটিকে অবশ্যই হত্যা করা উচিত, এটি আর তফসিল করে না।

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

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

(প্রক্রিয়া সারণিতে প্রবেশ হ'ল প্রকৃতপক্ষে এমন একটি সংস্থান যা অভিভাবক প্রক্রিয়ার সাথে সম্পর্কিত, যা প্রক্রিয়াটি মারা যাওয়ার পরে মুক্ত হয়ে যায় এবং পিতামাতার ইভেন্টটি স্বীকার করে ))

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