কাঁটাচামচ () এবং vfork () এর মধ্যে পার্থক্য কি?


13

আমি বিস্তারিতভাবে কাঁটাচামচ () এবং vfork মধ্যে পার্থক্য বুঝতে চাই ()। আমি সম্পূর্ণভাবে man পৃষ্ঠা হজম করতে পারল না।

আমিও আমার সহকর্মীরা মন্তব্য এক নির্মল চাই " বর্তমান লিনাক্স-এ, কোন vfork (), এমনকি যদি আপনি একে ডাকতে, এটা অভ্যন্তরীণভাবে কাঁটাচামচ ডাকব () হল ।"

উত্তর:


24

ম্যান পেজগুলি সাধারণত রেফারেন্স ডকুমেন্টগুলি থাকে। উইকিপিডিয়া একটি ভাল জায়গা ধারণাগত ব্যাখ্যা চালু হয়।

ফর্ক একটি প্রক্রিয়া সদৃশ: এটা একটি শিশু প্রক্রিয়া যার পিতা বা মাতা প্রক্রিয়া প্রায় অভিন্ন সৃষ্টি (অধিকাংশ সুস্পষ্ট পার্থক্য হল যে নতুন পদ্ধতির একটি ভিন্ন প্রক্রিয়া আইডি আছে) হয়। বিশেষ করে, কাঁটাচামচ (ধারণার দিক থেকে) সমস্ত পিতা বা মাতা প্রক্রিয়া স্মৃতিতে কপি উচিত নয়।

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

if (fork()) {
    # parent process …
} else {
    # child process (with a new copy of the process memory)
    execve("/bin/sh", …);  # discard the process memory
}

execveকল লোড একটি নতুন এক্সিকিউটেবল প্রোগ্রাম, এবং এই প্রতিস্থাপন নতুন এক্সিকিউটেবল কোড এবং একটি নতুন করে তথ্য মেমরি দ্বারা প্রক্রিয়া এর কোড এবং ডাটা মেমরির। দ্বারা নির্মিত পুরো মেমরির কপি সুতরাং forkকিছুই জন্য সব ছিল।

এভাবে vforkকল আবিষ্কৃত হয়। এটি মেমরি একটি কপি দেখা যায় না। অতএব vforkসস্তা, কিন্তু এটা যেহেতু আপনি নিশ্চিত করতে হবে ব্যবহার করা কঠিন আপনি না এক্সেস প্রক্রিয়া এর স্ট্যাকের বা শিশু প্রক্রিয়ায় গাদা স্থান কোন। মনে রাখবেন যে পড়তে এমনকি সমস্যা হতে পারে, কারণ পিতামাতার প্রক্রিয়া চালিয়ে যায়। উদাহরণ হিসেবে বলা যায়, এই কোড ভাঙ্গা (এটা বা শিশু বা অভিভাবক প্রথমে একটি সময় ফালি পায় কিনা না নির্ভর করে কাজ করতে পারে পারে) হয়:

if (vfork()) {
    # parent process
    cmd = NULL; # modify the only copy of cmd
} else {
    # child process
    execve("/bin/sh", "sh", "-c", cmd, (char*)NULL);  # read the only copy of cmd
}

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

লিনাক্স vfork ধরে রাখা আছে। forkসিস্টেম কল এখনও প্রক্রিয়া এর ভার্চুয়াল মেমরি টেবিল একটি কপি করতে হবে, যদিও তা প্রকৃত মেমরি কপি না; vforkএমনকি এই কাজ করতে প্রয়োজন হবে না। কর্মক্ষমতা বৃদ্ধি সবচেয়ে অ্যাপ্লিকেশনের মধ্যে তুচ্ছ হয়।


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

@Sen: forkচাহিদা আলাদা ভার্চুয়াল মেমরি ম্যাপিং তৈরি করতে যাতে পরবর্তী কপি-অন-লেখ কপি মাত্র দুটি প্রসেস এক প্রভাবিত।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

আপনি যে পিতা বা মাতা প্রক্রিয়া চলছে কি নিশ্চিত?
qbolec

2

fork()এবং vfork()syscalls ভিন্ন।

fork()প্রাপ্ত syscall পৃথক মেমরির একই রকম দুটি প্রসেস জেনারেট করে। vfork()প্রাপ্ত syscall দুই প্রক্রিয়ার ভাগ একই মেমরির জেনারেট করে।

সঙ্গে vfork()পিতা বা মাতা সন্তান বন্ধ জন্য অপেক্ষা করব। ভেরিয়েবল থেকে পিতা বা মাতা inherites যে প্রোগ্রাম ভাগ করছে। তাই পরে সন্তান বলা হয়, সব ভেরিয়েবল শিশু ভিতরে পরিবর্তিত এখনও পিতা বা মাতা ভিতরে পরিবর্তন করা হবে।

আরও তথ্যের জন্য ক্লিক এখানে

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