কাঁটাচামচ এবং এক্সিকিউট কীভাবে কাজ করে?


17

আমার খুব বেশি অভিজ্ঞতা নেই, কেবলমাত্র তারা প্রক্রিয়াগুলিতে জড়িত হওয়ার চেষ্টা করে যা তারা ব্যবহারকারী স্তর থেকে হার্ডওয়্যারকে কীভাবে ব্যাখ্যা করে।

সুতরাং যখন কোনও কমান্ড শেল থেকে বহিস্কার হয়, তখন fork()এটির একটি শিশু প্রক্রিয়া উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং exec()শিশু প্রক্রিয়াটিকে স্মৃতিতে লোড করে এবং কার্যকর করে।

  1. যদি শিশু প্রক্রিয়াতে পিতামাতার প্রক্রিয়ার সমস্ত বৈশিষ্ট্য থাকে (যা মূল প্রক্রিয়া) থাকে তবে এই শিশু প্রক্রিয়াটির কী প্রয়োজন? মূল প্রক্রিয়াটি মেমরিতে লোডও করা যেতে পারে।
  2. এটি forkএবং execধারণাটি কি ইউনিক্সের সমস্ত এক্সিকিউটেবল প্রোগ্রামের জন্য প্রযোজ্য? শেল স্ক্রিপ্টের মতো বা কেবল কমান্ডের জন্য? এটি শেল বিল্টিন কমান্ডগুলির জন্যও প্রযোজ্য?
  3. লেখার ধারণার অনুলিপিটি কখন ব্যবহার করা হয় যদি আমি একটি আদেশ / স্ক্রিপ্ট কার্যকর করি?

একবারে অনেক প্রশ্ন জিজ্ঞাসা করার জন্য দুঃখিত, কিন্তু আমি যখন কোনও আদেশ প্রয়োগের বিষয়ে চিন্তা করি তখন এই সমস্ত প্রশ্ন আমার মনে একবার আসে।


আমি এটি কোনও সদৃশ বলব না, তবে আমি মনে করি আপনার প্রশ্নের কিছুটির উত্তর এখানে দেওয়া হয়েছে: unix.stackexchange.com/questions/136637/… এবং অন্যটির উত্তরটির সাথে এইটির শীর্ষে যুক্ত।
স্বর্ণিলোক

উত্তর:


22

সুতরাং যখন শেল থেকে একটি আদেশ সরিয়ে ফেলা হয়, কাঁটাচামচ () এর একটি শিশু প্রক্রিয়া উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং এক্সিকিউট () শিশু প্রক্রিয়াটিকে মেমোরিতে লোড করে এবং সম্পাদন করে।

বেশ না। fork()অভিন্ন শিশু তৈরি করে বর্তমান প্রক্রিয়াটিকে ক্লোন করে। বিদ্যমান প্রোগ্রামটি প্রতিস্থাপন করে বর্তমান প্রক্রিয়াতে exec()একটি নতুন প্রোগ্রাম লোড করে ।

আমার কিউএসটি হ'ল:

যদি শিশু প্রক্রিয়াতে পিতামাতার প্রক্রিয়ার সমস্ত বৈশিষ্ট্য থাকে (যা মূল প্রক্রিয়া) থাকে তবে এই শিশু প্রক্রিয়াটির কী প্রয়োজন? মূল প্রক্রিয়াটি মেমরিতে লোডও করা যেতে পারে।

প্রয়োজনটি হ'ল কারণ পিতামাতার প্রক্রিয়াটি এখনও শেষ করতে চায় না; এটি একটি নতুন প্রক্রিয়া বন্ধ হয়ে যেতে চায় এবং একই সাথে এটি কার্যকর করতে থাকে এমন একই সময়ে এমন কিছু করতে চায়।

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

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

লেখার ধারণার অনুলিপিটি কখন ব্যবহার করা হয় যদি আমি একটি কমান্ড / স্ক্রিপ্ট কার্যকর করি?

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


4
"প্রায় প্রতিটি কমান্ডের জন্য, শেলটি কাঁটাচামচ () করে যাতে কমান্ডটি একটি নতুন প্রক্রিয়াতে চালিত হয় that যদি সেই কমান্ডটি অন্তর্নির্মিত হয় তবে বাচ্চাকে একটি পৃথক প্রোগ্রাম চালানোর প্রয়োজন হবে না" " ভাল উত্তর, তবে এই অংশটি সম্পাদনা করা উচিত। বিল্টিনগুলি চালানোর সময় শেলটি কাঁটাচামচ করে না। এটি সরাসরি সক্রিয় শেল প্রক্রিয়াতে চালিত করে। এটি বিল্টইনগুলির মতো cdবা readকাজ করতে পারে এমন একমাত্র উপায় । কাঁটাচামড়ার অভাব বাহ্যিক কমান্ডের তুলনায় বিল্টিনগুলি আরও দ্রুত তৈরি করে।
জন কুগেলম্যান মনিকে

6
  1. কিছু প্রোগ্রামের জন্য, শিশু প্রক্রিয়াটি একটি কাজ করে (সিরিয়াল বন্দর থেকে পড়া, টার্মিনালে লিখুন), এবং পিতামাতার প্রক্রিয়াটি অন্য কিছু করে চলে (টার্মিনাল থেকে পড়ুন, সিরিয়াল বন্দরে লিখুন)। আর একটি ক্লাসিক উদাহরণ শিশু প্রক্রিয়াটি দীর্ঘকাল চলমান গণনা যা চলছে তার একটি চেকপয়েন্ট করে। বেশিরভাগ ক্ষেত্রে, শিশু প্রক্রিয়াটি কিছু সেটআপ করে যেমন ডাইরেক্টরি পরিবর্তন করা, সিগন্যাল হ্যান্ডলারগুলি পুনরায় সেট করা বা ফাইল বর্ণনাকারী পুনরায় সেট করা এবং তারপরে execve()বিভিন্ন কোডের সাথে নিজেকে ওভারলেতে কল করে।
  2. fork()এবং exec()সমস্ত এক্সিকিউটেবলের জন্য প্রযোজ্য - বাস্তবে আরজিসি এবং আরজিভি এবং পাইপ, কাঁটাচামচ এবং এক্সিকিউটিস যা ইউনিক্সকে অন্যান্য অপারেটিং সিস্টেম থেকে পৃথক করে। বিএসডি'র fork()মতো vfork()প্ল্যান 9 rfork()এবং লিনাক্স'র মতো কয়েকটি বিশেষত্ব বা সাধারণীকরণ বিদ্যমান রয়েছে clone(), তবে অধ্যক্ষটি একই রয়েছেন।
  3. "লিখিত অনুলিপি" ব্যবহারকারীর কাছে সত্যই প্রদর্শিত হয় না, এটি একটি শিশু প্রক্রিয়া তৈরির অনুকূলিতকরণ করার কৌশল এবং এটি কার্যকর করার সময় আরও বেশি কৌশল। কল স্ট্যাক এবং হিপ (মেমরি বরাদ্দকৃত malloc(), বা এমনকি স্ট্যাটিক বা গ্লোবাল স্কোপ ভেরিয়েবল) হতে পারে "লেখার অনুলিপি"। যখন একটি শিশু প্রক্রিয়া তৈরি হয় একটি দিয়েfork()কল করুন, কার্নেলটি শিশু প্রক্রিয়াটিকে ম্যাপের প্রক্রিয়া হিসাবে গাদা এবং স্ট্যাকের মতো মেমরির ঠিক একই পৃষ্ঠাগুলি স্থাপন করবে। যদি হার্ডওয়্যার (মেমরি ম্যানেজমেন্ট ইউনিট) হিপ বা স্ট্যাকের একটি লিখন সনাক্ত করে, কার্নেলটি মেমরির একটি নতুন শারীরিক পৃষ্ঠা পেতে পারে, পিতামাতার পৃষ্ঠাকে নতুন পৃষ্ঠায় অনুলিপি করতে পারে এবং শিশু প্রক্রিয়াটির স্ট্যাক বা হ্যাপে সেই নতুন পৃষ্ঠাটি ম্যাপ করে। এটি একটি অপ্টিমাইজেশন গঠন করে কারণ কার্নেল শিশু প্রক্রিয়াটির জন্য স্ট্যাক এবং সম্পূর্ণরূপে পুরোপুরি অনুলিপি করার চেয়ে পৃষ্ঠা ম্যাপিংগুলি সেট আপ করতে কম সময় ব্যয় করে।

আপনার উত্তরের জন্য ব্রুস ধন্যবাদ। তবে আপনি এখানে অনেক কিছুই বলেছেন যা আমার মাথার উপরে চলেছে। এই জিনিসগুলির সাথে আমার খুব বেশি জ্ঞান নেই ... আমি উল্লেখ করেছি এই ফাংশনগুলির কাজ করার চেষ্টা করব। তোমাকে অনেক ধন্যবাদ..!!
প্রিয়ব

4
যদি শিশু প্রক্রিয়াতে পিতামাতার প্রক্রিয়ার সমস্ত বৈশিষ্ট্য থাকে (যা মূল প্রক্রিয়া) থাকে তবে এই শিশু প্রক্রিয়াটির কী প্রয়োজন? মূল প্রক্রিয়াটি মেমরিতে লোডও করা যেতে পারে।

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

মাল্টিটাস্কিংটি ডিস্কের বাইরে কোনও প্রক্রিয়া অদলবদল করে এবং একটি পৃথক প্রক্রিয়াটি অদলবদল করে অর্জিত হয়েছিল।

এখন forkসিস্টেম কলটি প্রায় একই ছিল: এটি একটি প্রক্রিয়াটি ডিস্কে সরিয়ে নিয়েছিল, তবে অন্য কোনও প্রক্রিয়া স্যুপের পরিবর্তে এটি মেমরির অনুলিপিটিকে অন্য একটি প্রসেস আইডি দেয় এবং এতে ফিরে আসে। এবং এই প্রক্রিয়াটি কেবল execসর্বোপরি অন্য কোন এক্সিকিউটেবলের মধ্যে স্থির করার সিদ্ধান্ত নেওয়ার উপযুক্ত সময় ছিল une

fork+ execসুতরাং স্প্যানিংয়ের তুলনায় প্রকৃতপক্ষে লক্ষণীয় ওভারহেড ব্যয় হয়নি: আপনাকে আপনার প্রক্রিয়াটি যে কোনও উপায়ে ডিস্কে বদলাতে হবে এবং যেভাবেই আপনার কার্যক্ষম মেমরির স্থানে পুরানো প্রক্রিয়া চিত্রটি ছিল।

ক্রমবর্ধমান পরিমাণে উপলব্ধ মেমরি এবং মেমরি ম্যানেজমেন্ট ইউনিট এবং একাধিক ইন-মেমরি প্রক্রিয়াগুলির সাথে, একটি কাঁটাচামানের প্রাথমিকভাবে নগন্য ব্যয় কিছু আর্কিটেকচারের জন্য কিছুটা উপদ্রব হয়ে পড়ে: এইভাবে vforkজন্মগ্রহণ করে।


2

এটি যতটা সম্ভব বুঝতে সহজ করার জন্য আমি একটি উপমা ব্যবহার করব। এক পাই বেক করা যাক!

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

কাঁটাচামচ () উদ্ধার। এখন আমার দু'জন রয়েছেন। এবং আমরা দুজন পাই ক্রাস্ট তৈরি করা শুরু করতে রান্নাঘরে চলে গেলাম। উফ। সুতরাং আমরা কাঁটাচামচ থেকে ফিরে তাকান। আমি একটি বড় সংখ্যা পেয়েছি সে শূন্য হয়েছে, তাই আমি রান্নাঘরের দিকে রইলাম যখন সে মুরগির কোপ এবং বাগানের দিকে রওনা দিল। আমি ওভেন পেরিয়ে যাওয়ার সময় আমি আবার কাঁটাচামচ (), ফেরতের মানটি দেখুন: বামার আমি শূন্য পেয়েছি। আমি ভাঙ্গা চুলায় তাকিয়ে থাকতেই সে আটার দিকে চালিয়ে যায়। আমি দরজা খুলি, আলো নেই, আমি দরজাটি বন্ধ করে দিই। কেউ কি চুলা ঠিক করতে জানেন?

এক্সিকিউট () উদ্ধার। আমি আমার সরঞ্জাম-বেল্টে ভোল্টমিটারের জন্য পৌঁছেছি, বাল্বটি ডায়াগনস্টিক হতে পারে, তাই আমি শক্তিটি পরীক্ষা করি, সত্যই ট্রিপড ব্রেকার, সহজ ফিক্স। ব্রেকার প্যানেলে চলতে চলতে আমি সহচর বাছাই করে দেখছি। ইশ! আমি চকোলেট সিল্ক পাই পছন্দ করি।

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