কেন ডিফল্ট প্রক্রিয়া তৈরির প্রক্রিয়াটির কাঁটাচামচ?


46

ইউনিক্স সিস্টেম প্রক্রিয়া তৈরির জন্য আহ্বান জানায়, কাঁটাচামচ (), পিতামাতার প্রক্রিয়াটি অনুলিপি করে একটি শিশু প্রক্রিয়া তৈরি করে। আমার বোধগম্যতা হল প্রায়শই এটির পরে শিশু প্রক্রিয়াটির মেমোরি স্পেস (পাঠ্য বিভাগটি সহ) প্রতিস্থাপনের জন্য এক্সিকিউটেড () কল করা হয়। পিতা-মাতার স্মৃতির স্থানটি কাঁটাচামচ () এ অনুলিপি করা আমার কাছে সর্বদা অপব্যয়কর মনে হয়েছে (যদিও আমি বুঝতে পারি যে মেমরি বিভাগগুলিকে অনুলিপি করে কেবল পয়েন্টারগুলি অনুলিপি করে বর্জ্য হ্রাস করা যায়)। যাইহোক, কেউ কি জানেন যে প্রক্রিয়া তৈরির জন্য কেন এই সদৃশ পদ্ধতির প্রয়োজন?


3
নোট করুন যে fork(2)লিনাক্সের অধীনে ম্যান পেজটি বলেছেন: Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child. আমি কল্পনা করেছি (তবে নিশ্চিতভাবে জানি না) অন্যান্য আধুনিক ইউনিক্স স্বাদের ক্ষেত্রে এটিই।
larsks

4
আসল, পিডিপি-১১ ইউনিক্স সত্যই, একটি কাঁটাযুক্ত প্রক্রিয়াটির সমস্ত বাইটগুলি অনুলিপি করে ফেলেছিল: তবে এটিতে কেবলমাত্র কার্যকর করা যায় 64৪ কেবি, এবং সর্বাধিক K৪ কেবি ডেটা, তাই এটি একটি বিশাল বোঝা ছিল না, এমনকি ১৯ 197৫ সালেও I অনুমান করুন যে ১৯৯০ সাল থেকে প্রতিটি ইউনিক্স এবং ইউনিক্স-এর মতো লিখিত অংশগুলিতে অনুলিপি রয়েছে, সুতরাং বই এবং নিবন্ধগুলি "কাঁটাচামচ দিয়ে পারফরম্যান্স সমস্যা" কেন আর প্রচার করে তা আমি নিশ্চিত নই।
ব্রুস এডিগার

আজকাল, কাঁটাচামচ vfork ( openbsd.org/cgi-bin/… ) এর অনুরূপ ফ্যাশনে প্রয়োগ করা হয় । এটা দক্ষ, চিন্তা করবেন না।
আকি

আরও মনে রাখবেন যে প্রচুর ব্যবহার রয়েছে যেখানে আপনি কাঁটাচামচ পরে কার্যকর করেন না (বা কমপক্ষে, এখনই চালানো হয় না): পাইপ এবং ওয়েব সার্ভারগুলির কথা চিন্তা করুন।
jfg956

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

উত্তর:


57

এটি ইন্টারফেস সহজতর করা। বিকল্প forkএবং execউইন্ডোজ 'ভালো কিছু হবে CreateProcess ফাংশন। কতগুলি পরামিতি CreateProcessরয়েছে তা লক্ষ্য করুন এবং এর মধ্যে অনেকগুলি আরও বেশি পরামিতি সহ স্ট্রাক্ট রয়েছে। এটি কারণ যে আপনি নতুন প্রক্রিয়াটি সম্পর্কে নিয়ন্ত্রণ করতে পারেন এমন সমস্ত কিছু করতে হবে CreateProcess। আসলে, CreateProcessপর্যাপ্ত প্যারামিটার নেই, তাই মাইক্রোসফ্টের ক্রিয়েটপ্রোসেসস ব্যবহারকারী এবং ক্রিয়েটপ্রসেসউইথলগনডব্লু যোগ করতে হয়েছিল

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

আপনি কি অন্য কিছু বর্তমান ডিরেক্টরী সঙ্গে একটি প্রক্রিয়া শুরু করতে চাইলে: fork, chdir, exec

আপনি যদি স্টিডিন / স্টডআউট পুনর্নির্দেশ করতে চান:, forkফাইলগুলি বন্ধ / খুলুন exec,।

আপনি সুইচ ব্যবহারকারীদের চাইলে: fork, setuid, exec

এই সমস্ত জিনিস প্রয়োজন হিসাবে একত্রিত করা যেতে পারে। যদি কেউ নতুন ধরণের প্রক্রিয়া বৈশিষ্ট্য নিয়ে আসে তবে আপনাকে পরিবর্তন করতে হবে না forkএবং exec

যেমন উল্লেখ করা হয়েছে, বেশিরভাগ আধুনিক ইউনিক্সগুলি অনুলিপি-অনুলিপি ব্যবহার করে, তাই forkউল্লেখযোগ্য ওভারহেড জড়িত না।


16
দুর্দান্ত ব্যাখ্যা। "যারা ইউনিক্স বোঝেন না তাদের এটিকে পুনর্নবীকরণের নিন্দা করা হচ্ছে, খারাপভাবে।" - হেনরি স্পেন্সার
কাইল জোন্স

1
ধন্যবাদ! আপনার কি কোনও সুযোগ রয়েছে?
এলেন স্পারটাস

1
@ আকি, না, ক্রিয়েটপ্রসেস () আক্ষরিক অর্থে একটি নতুন প্রক্রিয়া তৈরি করে এবং এটিকে স্ক্র্যাচ থেকে তৈরি করে, কোনও জাল না।
psusi

2
তবে ইউনিক্সের কোথাও ক্রিয়েটপ্রোসেসের সমতুল্য হওয়া উচিত না? নাহলে প্রথম প্রক্রিয়াটি কীভাবে তৈরি হয়? কোনও পৌরাণিক সৃষ্টিকর্তা Unশ্বরের বিপরীতে, প্রথম প্রক্রিয়া নিজেকে () নির্লজ্জতা থেকে কাঁটাতে পারে না। ;-)
স্টিভেন সোমবার

2
@ স্টিভেনমন্ডে, হ্যাঁ, তবে এটি কার্নেলের প্রারম্ভিককরণের কোডে এবং বাহ্যিকভাবে অ্যাক্সেসযোগ্য নয়। এটি সমস্ত পরামিতিগুলির প্রয়োজন হয় না কারণ প্রায় সমস্ত কিছুই হার্ডকোডযুক্ত। এটি কেবল প্রক্রিয়া আইডি 1 তৈরি করতে পারে, আরম্ভের প্রক্রিয়াটি। এর পরে, প্রক্রিয়াগুলি কেবল কাঁটাচামচ করে তৈরি করা হয়।
সিজেএম

5

সিজেএম এর উত্তরের অংশ হিসাবে, একক ইউনিক্স স্পেসিফিকেশন নামের একটি ফাংশন সংজ্ঞায়িত করে vfork()। যে ফাংশন কাঁটাচামচ মত কাজ করে, ছাড়া Forked প্রক্রিয়া অনির্ধারিত আচরণ হয়েছে থাকে এটা চেষ্টা ছাড়া আর কিছু একটি Exec familly ফাংশন কলিং, বা কলিং করে _exit()

এইভাবে নির্ধারিত আচরণের সাথে একমাত্র ব্যবহার হ'ল:

pid_t ret = vfork();
if(ret == 0)
{
    exec(...);
    _exit(EXIT_FAILURE); //in case exec failed for any reason.
}

তাহলে কি করে vfork? এটি একটি সস্তা fork। অনুলিপি অনুলিপি ব্যতীত, ফলস্বরূপ প্রক্রিয়া মূল প্রক্রিয়া (অতএব অপরিবর্তিত আচরণ) এর সাথে মেমরির স্থান ভাগ করে দেবে। অনুলিপি অনুলিপি সহ বাস্তবায়নগুলিতে, অনুলিপি vforkহিসাবে অনুমোদিত হয় fork(), যেহেতু অনুলিপি-অনুলিপি কার্যকর হয়।

Theচ্ছিক posix_spawnফাংশন (এবং একটি posix_spawnpফাংশন) রয়েছে যা সরাসরি একটি নতুন প্রক্রিয়া তৈরি করতে পারে। (এটা তাদের একটি লাইব্রেরি কল ব্যবহার করে বাস্তবায়ন অনুমোদনযোগ্য forkএবং exec, এবং একটি উদাহরণ বাস্তবায়ন প্রদান করা হয়।)

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