কাঁটাচামচ (), ভিফোর্ক (), এক্সিকিউট () এবং ক্লোন () এর মধ্যে পার্থক্য


198

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

আমি এই সিস্টেম কলগুলির মধ্যে পার্থক্যগুলি এবং এক্ষেত্রে আমি কী পেয়েছি তা দেখতে এক ধরণের বেসিক এক নজরে সংকলনের চেষ্টা করার বিষয়ে সেট করেছি। এই সমস্ত তথ্য সঠিক / আমি কি গুরুত্বপূর্ণ কিছু অনুপস্থিত?

Fork : কাঁটাচামচ কলটি মূলত বর্তমান প্রক্রিয়াটির একটি সদৃশ করে তোলে, প্রায় প্রতিটি উপায়ে একইরকম (সমস্ত কিছু অনুলিপি করা হয় না, উদাহরণস্বরূপ, কিছু বাস্তবায়নে রিসোর্স সীমা থাকে তবে ধারণাটি সম্ভব যতটা সম্ভব একটি অনুলিপি তৈরি করা)।

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

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

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

Exec :এক্সিকিউট কলটি মূলত পুরো বর্তমান প্রক্রিয়াটিকে নতুন প্রোগ্রামের সাথে প্রতিস্থাপনের একটি উপায়। এটি প্রোগ্রামটিকে বর্তমান প্রক্রিয়া জায়গাতে লোড করে এবং এন্ট্রি পয়েন্ট থেকে চালায়। exec () ফাংশন দ্বারা নির্বাহযোগ্য পয়েন্টের সাথে বর্তমান প্রক্রিয়াটিকে প্রতিস্থাপন করে। এক্সিকিউট () ত্রুটি না থাকলে নিয়ন্ত্রণ কখনই আসল প্রোগ্রামে ফিরে আসে না।

Clone :কাঁটাচামচ হিসাবে ক্লোন একটি নতুন প্রক্রিয়া তৈরি করে। কাঁটাচামচ ভিন্ন নয়, এই কলগুলি চাইল্ড প্রক্রিয়াটিকে কলিং প্রক্রিয়া, যেমন মেমরির স্থান, ফাইল বর্ণনাকারীর সারণী এবং সিগন্যাল হ্যান্ডলারের সারণীর মতো কলিং প্রক্রিয়ার সাথে তার সম্পাদন প্রসঙ্গে কিছু অংশ ভাগ করার অনুমতি দেয়।

যখন শিশু প্রক্রিয়াটি ক্লোন দিয়ে তৈরি করা হয়, এটি ফাংশন অ্যাপ্লিকেশন fn (আরগ) সম্পাদন করে। (এটি কাঁটাচামচ থেকে পৃথক, যেখানে মূল কাঁটা কলের বিন্দু থেকে শিশুতে মৃত্যুদন্ড কার্যকর হয়)) fn আর্গুমেন্ট একটি ক্রিয়াকলাপের জন্য নির্দেশক যা এটি কার্যকর করার শুরুতে শিশু প্রক্রিয়া দ্বারা ডাকা হয়। আরগ আর্গুমেন্টটি fn ফাংশনে প্রেরণ করা হয়।

যখন fn (আরগ) ফাংশন অ্যাপ্লিকেশনটি ফিরে আসে, শিশু প্রক্রিয়াটি সমাপ্ত হয়। Fn দ্বারা প্রত্যাশিত পূর্ণসংখ্যা হ'ল শিশু প্রক্রিয়াটির প্রস্থান কোড। শিশু প্রক্রিয়াটি প্রস্থান (2) কল করে বা মারাত্মক সংকেত পাওয়ার পরেও স্পষ্টভাবে শেষ হতে পারে।

তথ্য অর্জিত ফর্ম:

এই পড়ার সময় দেবার জন্য ধন্যবাদ ! :)


2
কেন অবশ্যই ভোরককে প্রস্থান কল করতে হবে না ()? নাকি ফিরবে না? () কি প্রস্থান করে না শুধু _exit () ব্যবহার? আমিও বোঝার চেষ্টা করছি :)
LazerSharks

2
@ জ্নুই: কারণ এটি সম্ভাব্য (যদি এটি fork()লিনাক্সে রয়েছে এবং যা সম্ভবত সমস্ত বিএসডি থেকে আলাদাভাবে প্রয়োগ করা হয়) তার পিতামাতার ঠিকানার জায়গা ধার করে নেয়। কল করে execve()বা করা ছাড়াও যা কিছু _exit()করা যায় তার পিতামাতাকে গোলমাল করার একটি দুর্দান্ত সম্ভাবনা রয়েছে। বিশেষত, exit()কলগুলি atexit()হ্যান্ডলারগুলি এবং অন্যান্য "চূড়ান্তকরণকারী", যেমন: এটি স্টডিও স্ট্রিমগুলিকে প্রবাহিত করে। একটি vfork()শিশু থেকে ফিরে সম্ভাব্য (পূর্বের মত একই সতর্কীকরণ) পিতামাতার স্ট্যাক বিঘ্নিত হবে।
নিনজালজ

আমি ভাবছিলাম পিতামাতার প্রক্রিয়াটির থ্রেডগুলিতে কী ঘটে; তাদের সমস্ত কি ক্লোনড বা কেবল থ্রেড যা forkসিস্কেলকে কল করে ?
মোহাম্মদ জাফর মাশহাদি

@ লেজারশার্কস ভিফোর্ক একটি থ্রেড-জাতীয় প্রক্রিয়া তৈরি করে যেখানে অনুলিপি প্রতিলিপি ছাড়াই মেমরি ভাগ করা হয়, তাই স্ট্যাক স্টাফ করা পিতামাতার প্রক্রিয়াটি ট্র্যাশ করতে পারে।
জেসেন 21

উত্তর:


160
  • vfork()একটি অপ্রচলিত অপ্টিমাইজেশন। ভাল মেমরি পরিচালনার আগে, fork()পিতামাতার স্মৃতির একটি সম্পূর্ণ অনুলিপি তৈরি করা হয়েছে, তাই এটি বেশ ব্যয়বহুল ছিল। যেহেতু অনেক ক্ষেত্রে একটি fork()অনুসরণ করা হয়েছিল exec(), যা বর্তমান মেমরি মানচিত্রটিকে ত্যাগ করে এবং একটি নতুন তৈরি করে, এটি অহেতুক ব্যয়। আজকাল, fork()স্মৃতি কপি করবেন না; এটা শুধু তাই হয়, "লেখার উপর কপি" হিসাবে সেট fork()+ + exec()দক্ষ হিসাবে ঠিক হয় vfork()+ + exec()

  • clone()ব্যবহৃত সিস্টেমে fork()। কিছু পরামিতি সহ এটি একটি নতুন প্রক্রিয়া তৈরি করে, অন্যদের সাথে এটি একটি থ্রেড তৈরি করে। তাদের মধ্যে পার্থক্য হ'ল ডেটা স্ট্রাকচার (মেমরি স্পেস, প্রসেসর স্টেট, স্ট্যাক, পিআইডি, ওপেন ফাইল, ইত্যাদি) ভাগ করা বা না।



22
vforkসাময়িকভাবে আরও বেশি মেমরি কমিট করার প্রয়োজনকে এড়িয়ে যায় যাতে কেউ কার্যকর করতে পারে exec, এবং এটি এখনও forkপ্রায় দক্ষতার চেয়ে বেশি , এমনকি প্রায় উচ্চ ডিগ্রি না হলেও। সুতরাং, কেউ মেমরিকে অতিরিক্ত সংঘবদ্ধ করা এড়াতে পারে ঠিক তেমন একটি শিকারী বড় প্রোগ্রাম একটি শিশু প্রক্রিয়া উত্সাহিত করতে পারে। সুতরাং, কেবল একটি পারফরম্যান্স-উত্সাহই নয়, এটি একেবারেই সম্ভাব্য করে তুলতে পারে।
উত্সাহীকারী

5
আসলে, আমি প্রথম হাতে সাক্ষ্য দিয়েছি যে যখন আপনার আরএসএস বড় হয় তখন কাঁটাচামচ () কীভাবে সস্তা। আমার ধারণা এটি এটি কারণ কার্নেলটি এখনও সমস্ত পৃষ্ঠা সারণী অনুলিপি করে।
মার্টিনা ফেরারি

4
এটিতে সমস্ত পৃষ্ঠার সারণী অনুলিপি করতে হবে, উভয় প্রক্রিয়াতে সমস্ত লিখনযোগ্য মেমরি অনুলিপি সেট করতে হবে , টিএলবি ফ্লাশ করবে এবং তারপরে এটি প্যারেন্টে সমস্ত পরিবর্তন (এবং আবার টিএলবি ফ্লাশ করতে হবে) চালু করতে হবে exec
zwol

3
vfork এখনও সাইগউইনে কার্যকর (একটি কার্নেল এমুলেটিং ডেল, যা মাইক্রোসফ্টের উইন্ডোজের শীর্ষে চলে)। অন্তর্নিহিত ওএসের না থাকায় সাইগউইন একটি কার্যকর কাঁটাচামচ বাস্তবায়ন করতে পারে না।
ctrl-alt-delor

81
  • execve() একটি এক্সিকিউটেবল ফাইল থেকে লোড হওয়া অন্যটির সাথে বর্তমান এক্সিকিউটেবল চিত্রটি প্রতিস্থাপন করে।
  • fork() একটি শিশু প্রক্রিয়া তৈরি করে।
  • vfork()এর একটি optimতিহাসিক অপ্টিমাইজড সংস্করণ fork(), যার অর্থ execve()সরাসরি যখন পরে ডাকা হয় তখন এটি ব্যবহৃত হয় fork()। এটি নন-এমএমইউ সিস্টেমে (যেখানে fork()দক্ষ পদ্ধতিতে কাজ করতে পারে না) এবং fork()কিছু ছোট প্রোগ্রাম চালানোর জন্য বিশাল মেমরির পদক্ষেপ সহ প্রসেসগুলি আইএনএস করার সময় (জাভা মনে করে) ভালভাবে কাজ করেছে Runtime.exec()। পসিএক্স posix_spawn()এই আধুনিক দুটি আরও আধুনিক ব্যবহারগুলি প্রতিস্থাপনের জন্য প্রমিতকরণ করেছে vfork()
  • posix_spawn()এর সমতুল্য কাজ করে fork()/execve()এবং এর মধ্যে কিছু fd জাগলিংয়ের অনুমতি দেয়। এটি প্রতিস্থাপনের কথা fork()/execve(), মূলত নন-এমএমইউ প্ল্যাটফর্মের জন্য।
  • pthread_create() একটি নতুন থ্রেড তৈরি করে।
  • clone()একটি লিনাক্স-নির্দিষ্ট কল, যা থেকে fork()যে কোনও কিছু প্রয়োগ করতে ব্যবহার করা যেতে পারে pthread_create()। এটি অনেক নিয়ন্ত্রণ দেয়। অনুপ্রাণিত rfork()
  • rfork()প্ল্যান -9 নির্দিষ্ট কল। এটি একটি জেনেরিক কল হওয়ার কথা, পুরো প্রক্রিয়া এবং থ্রেডের মধ্যে কয়েক ডিগ্রি ভাগ করে নেওয়ার অনুমতি দেয়।

2
প্রকৃতপক্ষে যা চেয়েছিল তার চেয়ে আরও বেশি তথ্য যুক্ত করার জন্য ধন্যবাদ, এটি আমার সময় বাঁচাতে সহায়তা করেছে
নীরজ

5
প্ল্যান 9 এমন টিজ is
জেজে

1
যারা
এমএমইউর

43
  1. fork()- একটি নতুন শিশু প্রক্রিয়া তৈরি করে, যা পিতামাতার প্রক্রিয়ার সম্পূর্ণ অনুলিপি। শিশু এবং পিতামাতার প্রসেসগুলি বিভিন্ন ভার্চুয়াল অ্যাড্রেস স্পেস ব্যবহার করে, যা প্রাথমিকভাবে একই মেমরি পৃষ্ঠাগুলি দ্বারা পপুলেট হয়। তারপরে, উভয় প্রক্রিয়া কার্যকর হওয়ার সাথে সাথে ভার্চুয়াল ঠিকানার স্থানগুলি আরও বেশি আলাদা হতে শুরু করে, কারণ অপারেটিং সিস্টেম মেমরি পৃষ্ঠাগুলির একটি অলস অনুলিপি সম্পাদন করে যা এই দুটি প্রক্রিয়ার মধ্যে দুটি দ্বারা লিখিত হয় এবং এর পরিবর্তিত পৃষ্ঠাগুলির একটি স্বতন্ত্র অনুলিপি বরাদ্দ করে the প্রতিটি প্রক্রিয়া জন্য মেমরি। এই কৌশলটি অনুলিপি (অনুলিপি) বলা হয়।
  2. vfork()- একটি নতুন শিশু প্রক্রিয়া তৈরি করে, যা পিতামাতার প্রক্রিয়ার একটি "দ্রুত" অনুলিপি। সিস্টেম কলের বিপরীতে fork(), শিশু এবং পিতামাতার প্রক্রিয়াগুলি একই ভার্চুয়াল ঠিকানার স্থান ভাগ করে দেয়। বিঃদ্রঃ! একই ভার্চুয়াল ঠিকানার স্থান ব্যবহার করে পিতা-মাতা এবং শিশু উভয়ই ক্লাসিকের ক্ষেত্রে একই স্ট্যাক, স্ট্যাক পয়েন্টার এবং নির্দেশ পয়েন্টার ব্যবহার করে fork()! অভিভাবক এবং সন্তানের মধ্যে অযাচিত হস্তক্ষেপ রোধ করতে, যা একই স্ট্যাক ব্যবহার করে, পিতা-মাতার প্রক্রিয়াটি কার্যকর হয়ে যায় যতক্ষণ না শিশু কল করবে exec()(একটি নতুন ভার্চুয়াল ঠিকানার স্থান তৈরি করবে এবং একটি পৃথক স্ট্যাকের রূপান্তর করবে) বা _exit()(প্রক্রিয়া সম্পাদনের সমাপ্তি ) )। "কাঁটাচামচ এবং এক্সিকিউট" মডেলটির vfork()অপ্টিমাইজেশন fork()। এটি এর চেয়ে 4-5 গুণ বেশি দ্রুত সঞ্চালিত হতে পারে fork()কারণ এর বিপরীতেfork()(এমনকি সিওডাব্লু মাথায় রেখেও), vfork()সিস্টেম কল প্রয়োগের ক্ষেত্রে একটি নতুন ঠিকানা স্থান তৈরি করা (নতুন পৃষ্ঠাগুলির ডিরেক্টরি বরাদ্দকরণ এবং সেটআপ করা) অন্তর্ভুক্ত নয়।
  3. clone()- একটি নতুন শিশু প্রক্রিয়া তৈরি করে। এই সিস্টেমের বিভিন্ন পরামিতি কল করে, উল্লেখ করে যে পিতামাতার প্রক্রিয়াটির কোন অংশগুলি শিশু প্রক্রিয়াতে অনুলিপি করা উচিত এবং কোন অংশগুলি তাদের মধ্যে ভাগ করা হবে। ফলস্বরূপ, এই সিস্টেম কলটি থ্রেড থেকে শুরু করে এবং সম্পূর্ণ স্বতন্ত্র প্রক্রিয়া সমাপ্ত করে, সমস্ত ধরণের এক্সিকিউশন সত্তা তৈরি করতে ব্যবহৃত হতে পারে। আসলে, clone()সিস্টেম কল হল সেই বেস যা সিস্টেম কলগুলির বাস্তবায়নের জন্য pthread_create()এবং সমস্ত পরিবারের জন্য ব্যবহৃত হয় fork()
  4. exec()- প্রক্রিয়াটির সমস্ত স্মৃতি পুনরায় সেট করে, নির্বাহযোগ্য বাইনারি নির্দিষ্ট করে লোড এবং পার্স করে, নতুন স্ট্যাক সেট আপ করে এবং লোড এক্সিকিউটেবলের এন্ট্রি পয়েন্টে নিয়ন্ত্রণ পাস করে। এই সিস্টেম কলটি কলকারীকে কখনই নিয়ন্ত্রণ ফিরিয়ে দেয় না এবং ইতিমধ্যে বিদ্যমান প্রক্রিয়াতে একটি নতুন প্রোগ্রাম লোড করার জন্য পরিবেশন করে। সিস্টেম কল সহ এই fork()সিস্টেম কল একত্রে একটি ক্লাসিকাল ইউএনআইএক্স প্রক্রিয়া পরিচালনার মডেল গঠন করে যা "ফর্ক-অ্যান্ড-এক্সিকিউট" নামে পরিচিত।

2
নোট যে জন্য বাসদ এবং POSIX প্রয়োজনীয়তা vforkএত দুর্বল এটি করতে আইনি হবে হয় vforkএকটি প্রতিশব্দ fork(এবং POSIX.1-2008 অপসারণ vforkবৈশিষ্ট সম্পূর্ণভাবে থেকে)। আপনি যদি এমন কোনও সিস্টেমে আপনার কোডটি পরীক্ষা করে দেখে থাকেন যা তাদের সমার্থক (যেমনঃ নেটবিএসডি, প্রাক-২.২.০-প্রি-লিনাক্স কার্নেল ইত্যাদির বাইরে সর্বাধিক ৪.৪ বিএসডি থাকে) এটি vforkচুক্তি লঙ্ঘন করেও কাজ করতে পারে , তবে বিস্ফোরিত হবে যদি আপনি এটি অন্য কোথাও চালান। এটির fork(যেমন ওপেনবিএসডি) সিমুলেট করে এমন কিছু এখনও গ্যারান্টি দেয় যে পিতামাতারা সন্তানের execএস বা _exitএস না হওয়া অবধি চলমান শুরু করবেন না । এটি হাস্যকরভাবে অ-বহনযোগ্য।
শ্যাডোর্যাঞ্জার

2
আপনার ২ য় পয়েন্টের শেষ বাক্যটি সম্পর্কে: আমি লিনাক্সে স্ট্রেস ব্যবহার করে লক্ষ্য করেছি যে সত্যই কাঁটাচামচ () জন্য
গ্ল্যাবসি মোড়ক ক্লোনকে সিস্কেল

7

কাঁটাচামচ (), ভিফোর্ক () এবং ক্লোন () সকলেই প্রকৃত কাজটি করার জন্য do_fork () কে কল করে তবে বিভিন্ন পরামিতি সহ।

asmlinkage int sys_fork(struct pt_regs regs)
{
    return do_fork(SIGCHLD, regs.esp, &regs, 0);
}

asmlinkage int sys_clone(struct pt_regs regs)
{
    unsigned long clone_flags;
    unsigned long newsp;

    clone_flags = regs.ebx;
    newsp = regs.ecx;
    if (!newsp)
        newsp = regs.esp;
    return do_fork(clone_flags, newsp, &regs, 0);
}
asmlinkage int sys_vfork(struct pt_regs regs)
{
    return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, &regs, 0);
}
#define CLONE_VFORK 0x00004000  /* set if the parent wants the child to wake it up on mm_release */
#define CLONE_VM    0x00000100  /* set if VM shared between processes */

SIGCHLD means the child should send this signal to its father when exit.

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

ভিফোর্কের জন্য, ভার্চুয়াল মেমরিটি হ'ল শিশু এবং পিতার দ্বারা ঠিক --- সেই কারণেই পিতা এবং শিশু একই সাথে জাগ্রত হতে পারে না কারণ তারা একে অপরকে প্রভাবিত করবে। সুতরাং বাবা "do_fork ()" এর শেষে ঘুমাবে এবং জাগ্রত হবে যখন শিশু কলটি প্রস্থান করবে () বা কার্যকর করবে () তখন থেকে এটি নতুন পৃষ্ঠার টেবিলটির মালিক হবে। এখানে কোড (do_fork () এ রয়েছে যা পিতা ঘুমায়।

if ((clone_flags & CLONE_VFORK) && (retval > 0))
down(&sem);
return retval;

এখানে কোডটি (মিমি_রিলিজ () এ প্রস্থান দ্বারা ডাকা হয় () এবং কার্যকর করুন ()) যা পিতাকে জাগ্রত করে।

up(tsk->p_opptr->vfork_sem);

সিস_ক্লোন () এর ক্ষেত্রে এটি আরও নমনীয় যেহেতু আপনি এতে কোনও ক্লোন_ফ্ল্যাগগুলি ইনপুট করতে পারবেন। সুতরাং pthread_create () অনেক ক্লোন_ফ্ল্যাগ সহ এই সিস্টেমে কল করুন:

int clone_flags = (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGNAL | CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID | CLONE_SYSVSEM);

সংক্ষিপ্তসার: কাঁটাচামচ (), ভিফোর্ক () এবং ক্লোন () পিতা প্রক্রিয়াটির সাথে ভাগ করে নেওয়ার বিভিন্ন উত্স সহ শিশু প্রক্রিয়া তৈরি করবে। আমরা vfork () এবং ক্লোন () থ্রেড তৈরি করতে পারি (প্রকৃতপক্ষে এগুলি প্রক্রিয়া হিসাবে তারা স্বতন্ত্র টাস্ক_স্ট্রাক্ট রয়েছে) যেহেতু তারা পিতা প্রক্রিয়াটির সাথে ভিএম পৃষ্ঠা সারণীটি ভাগ করে।


-4

কাঁটাচামচ () এ, সিপিইউ নির্বাচনের ভিত্তিতে শিশু বা পিতামাতার প্রক্রিয়া কার্যকর করা হবে .. তবে ভিফোর্কে () অবশ্যই শিশু প্রথমে মৃত্যুদন্ড কার্যকর করবে। শিশুকে সমাপ্ত করার পরে, পিতামাতারা মৃত্যুদণ্ড কার্যকর করবেন।


3
ভুল। vfork()ঠিক হিসাবে বাস্তবায়ন করা যেতে পারে fork()
নিনজালজ

যেকোনফোর্কের () পরে, প্রথম পিতামাতা / সন্তান কে চালায় এটি নির্ধারিত নয়।
অজয় কুমারবাসুথকর

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

আসলে @ অজয়কুমারবাসুথকার এবং @ নিনজালজ, আপনি দুজনেই ভুল are সাথে vfork(), শিশুটি প্রথম চালায়। এটি ম্যান পেজে রয়েছে; সন্তানের মৃত্যু হয় না হওয়া পর্যন্ত পিতামাতার ফাঁসি স্থগিত করা হয় exec। এবং নিনজাল্ কার্নেল উত্স কোডটি সন্ধান করুন। বাস্তবায়ন কোনো উপায় নেই vfork()যেমন fork()কারণ তারা বিভিন্ন আর্গুমেন্ট পাস do_fork()কার্নেল মধ্যে। যাইহোক, আপনি সিস্কেল vforkদিয়ে প্রয়োগ করতে পারেনclone
জ্যাক ওয়াইমার

@ZacWimer: অন্য কোনো উত্তর ShadowRanger এর মন্তব্য stackoverflow.com/questions/4856255/... প্রাচীন লিনাক্স করেনি synonimize তাদের, যেমন দৃশ্যত NetBSD বা ছাড়া অন্য BSD গুলোর (যা tends অ MMU ব্যবস্থা অনেক বৈশিষ্ট্যসমূহ নিয়ে আসা হবে) না। লিনাক্স ম্যানপেজ থেকে: 4.4BSD এ এটি কাঁটাচামচ (2) এর সমার্থক হিসাবে তৈরি করা হয়েছিল কিন্তু নেটবিএসডি এটি আবার চালু করেছে; ⟨দেখতে netbsd.org/Documentation/kernel/vfork.html ⟩। লিনাক্সে এটি ২.২.০-প্রি 6 বা আরও কিছুক্ষণ অবধি কাঁটা (২) এর সমতুল্য।
নিনজালজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.