যখন শিশু প্রক্রিয়া এক্সিকিউটিভ () বা প্রস্থান () নির্ধারণের সাথে সাথে কল করে তখন কেন ভোরক () ব্যবহারের উদ্দেশ্যে?


11

অপারেটিং সিস্টেম ধারণা এবং এপিইউ বলে UE

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

vfork () ব্যবহারের উদ্দেশ্যে যখন শিশু প্রক্রিয়াটি এক্সিকিউটিভ () বা প্রস্থান () নির্ধারণের সাথে সাথে কল করে।

আমি শেষ বাক্যটি কীভাবে বুঝব?

একটি শিশু প্রক্রিয়া vfork()কল দ্বারা তৈরি করা হলে, নতুন প্রোগ্রামটি লোড করে, পিতামাতার প্রক্রিয়ার ঠিকানা স্থানটি সংশোধন exec()করে না exec()?

একটি শিশু প্রক্রিয়া vfork()কল দ্বারা তৈরি করা হয় exit(), exit()যখন সন্তানের সমাপ্ত করার সময় পিতামাতার প্রক্রিয়া ঠিকানা ঠিকানা পরিবর্তন করে না?

আমার লিনাক্সের পছন্দ আছে।

ধন্যবাদ।

উত্তর:


15

একটি শিশু প্রক্রিয়া vfork()কল দ্বারা তৈরি করা হলে, নতুন প্রোগ্রামটি লোড করে, পিতামাতার প্রক্রিয়ার ঠিকানা স্থানটি সংশোধন exec()করে না exec()?

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

যখন ভিফোর্কের () দ্বারা নির্ধারিত একটি শিশু প্রক্রিয়া প্রস্থানটি কল করে (), তখন কি প্রস্থান () প্রস্থান প্রক্রিয়াটির ঠিকানা স্থানটি শিশুকে বন্ধ করার সময় পরিবর্তন করে না?

সমতল exit()শক্তি - এটি চলমান প্রোগ্রামের দ্বারা ইনস্টল করা প্রস্থান হুকগুলি চালায় (এর পাঠাগারগুলি সহ)। vfork()আরও সীমাবদ্ধ; সুতরাং, লিনাক্সে এটি ব্যবহারের আদেশ দেয় _exit()যা সি লাইব্রেরির ক্লিন-আপ ফাংশনগুলিকে কল করে না

vfork()ডান পেতে বেশ কঠিন হয়ে উঠেছে; এটি পসিক্স স্ট্যান্ডার্ডের বর্তমান সংস্করণগুলিতে সরানো হয়েছে এবং posix_spawn()পরিবর্তে ব্যবহার করা উচিত।

যাইহোক, আপনি যা করছেন তা যদি আপনি সত্যিই না জানেন তবে আপনার উচিত হয় নাvfork() বা ব্যবহার করা উচিত posix_spawn(); ভাল পুরানো fork()এবং exec()

উপরে লিঙ্কযুক্ত লিনাক্স ম্যানপেজ আরও প্রসঙ্গ সরবরাহ করে:

তবে, পুরানো দিনগুলিতে fork(2) একজনকে কলারের ডেটা স্পেসের একটি সম্পূর্ণ অনুলিপি তৈরি করা প্রয়োজন, প্রায়শই প্রয়োজনহীনভাবে, যেহেতু সাধারণত তত্ক্ষণাত্ পরে exec(3)তা সম্পন্ন হয়। সুতরাং, বৃহত্তর দক্ষতার জন্য, বিএসডি vfork() সিস্টেম কল প্রবর্তন করেছিল , যা পিতামাতার প্রক্রিয়ার ঠিকানা স্থানটিকে সম্পূর্ণ অনুলিপি করে না, তবে কোনও কল আসে execve(2)বা প্রস্থান না হওয়া পর্যন্ত পিতামাতার স্মৃতি ও নিয়ন্ত্রণের থ্রেড ধার নিয়ে থাকে । শিশু যখন তার সংস্থানগুলি ব্যবহার করছিল তখন অভিভাবক প্রক্রিয়া স্থগিত করা হয়েছিল। এর ব্যবহারটি vfork()জটিল ছিল: উদাহরণস্বরূপ, প্যারেন্ট প্রসেসে ডেটা পরিবর্তন না করা কোনও রেজিস্টারে কোন পরিবর্তনশীল ছিল তা জানার উপর নির্ভর করে।


ধন্যবাদ। "এক্সিকিউট () নতুন প্রোগ্রামের জন্য একটি নতুন ঠিকানা স্থান সরবরাহ করে;" প্রক্রিয়াটির ঠিকানা জায়গাতে কোনও প্রোগ্রাম লোড করা এক্সিকিউটিভ () এর স্বাভাবিক আচরণ? আমি দুটি লিঙ্কে পাইনি যেখানে এটি সাধারণত বা বিশেষত ভিফোর্কের () জন্য একটি নতুন ঠিকানার স্থান তৈরি করে।
টিম

1
মজার বিষয়টি হল vfork () এখন প্রায় সমস্ত কিছুর বিরুদ্ধে জিতছে। যখন আপনার কাছে লিখনযোগ্য মেমরির একটি গিগাবাইট থাকে তখন এটি কাঁটাচামচ () এর চেয়ে হাস্যকরভাবে দ্রুত faster
জোশুয়া

2
দয়া করে লোকদের ব্যবহার করতে বলবেন না posix_spawn। এটি উল্লেখযোগ্যভাবে কঠিন সঠিক কোড ব্যবহার লিখতে হয় posix_spawnপ্লেইন পুরোনো সঙ্গে তুলনায় fork, এবং যদি আপনি চেষ্টা করুন, আপনি সেখানে একটি ফাইল কর্ম বা গুণ যা জিনিস আপনি মধ্যে মধ্যে সম্পন্ন প্রয়োজন আছে হচ্ছে না ইটের প্রাচীর পরতে পারেন forkএবং exec। এবং এটি ভিফোর্কের মতো দক্ষতার গ্যারান্টিযুক্ত নয়, তাই এটি সমস্যার সমাধানও করে না লোকেদের এটি সমাধান করতে চায়।
zwol

1
@ জওয়োল: এটি সত্যিই খারাপ পরামর্শ। যদিও posix_spawnযথাসাধ্য অভাব কার্যকারিতা যদি আপনি চান (আপনি মধ্যস্থতার সাহায্যকারী প্রোগ্রাম, C অথবা ইনলাইন-অন-cmdline- র শেল স্ক্রিপ্ট লেখা মাধ্যমে এই সমাধান করতে পারে), কোনো প্রয়াস অর্জন করা কি আপনার সাথে চান vforkপূজা বিপজ্জনক অনির্ধারিত আচরণ। এর স্পেসিফিকেশনটি vforkশিশুটির উত্তরাধিকার সূত্রে স্থির করার জন্য এলোমেলো ক্রিয়াকলাপগুলি কল করার অনুমতি দেয় না execveএবং এর চেষ্টা করার ফলে পিতামাতার অবস্থার ক্ষতি হতে পারে।
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

1
@ জোশুয়া: একটি আধুনিক বাস্তবায়ন posix_spawnপ্রায়শই প্রায়শই একই vforkঅবস্থা সম্পাদন করে most যে জায়গাগুলির মধ্যে পার্থক্য রয়েছে সেগুলি হুবহু vforkহু হু করে এমন ক্ষেত্রে দেখা যায় যেখানে অত্যন্ত অনিরাপদ: যেখানে সিগন্যাল হ্যান্ডলারগুলি ইনস্টল করা থাকে যা posix_spawnমৃত্যুদন্ড কার্যকর করার আগে শিশুকে চালানো থেকে দমন করতে হয়।
আর .. গীটহাব বন্ধ করুন ICE

4

আপনি যখন কল করবেন তখন vfork()একটি নতুন প্রক্রিয়া তৈরি হয় এবং সেই নতুন প্রক্রিয়াটি স্ট্যাকটি বাদ দিয়ে পিতামাতার প্রক্রিয়াটির চিত্রটি ধার করে। শিশু প্রক্রিয়াটিকে একটি নতুন স্ট্যাক স্টার দেওয়া হয় তবে returnযে ফাংশনটি ডেকে আনে সেগুলি অনুমতি দেয় না vfork()

শিশু চলমান অবস্থায়, পিতামাতার ঠিকানা স্থান ধার করার সাথে সাথে পিতামাতার প্রক্রিয়াটি অবরুদ্ধ থাকে।

আপনি যা-ই করুন না কেন, কেবল স্ট্যাকটি অ্যাক্সেস করে এমন সমস্ত কিছুই কেবলমাত্র শিশুর ব্যক্তিগত স্ট্যাককেই পরিবর্তন করে। আপনি যদি তবে বিশ্বব্যাপী ডেটা পরিবর্তন করেন তবে এটি সাধারণ তথ্য পরিবর্তন করে এবং এটি পিতামাতাকেও প্রভাবিত করে।

বিশ্বব্যাপী ডেটা সংশোধনকারী জিনিসগুলি হ'ল:

  • কলিং ম্যালোক () বা ফ্রি ()

  • stdio ব্যবহার করে

  • সংকেত সেটিংস পরিবর্তন করে

  • ভেরিয়েবল যে ফাংশন যে নামে স্থানীয় নয় পরিবর্তন vfork()

  • ...

একবার আপনি কল করলে _exit()(গুরুত্বপূর্ণ, কখনও কল করবেন না exit()), সন্তানের সমাপ্তি হবে এবং নিয়ন্ত্রণটি পিতামাতার কাছে ফিরে দেওয়া হবে।

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

নিয়ন্ত্রণটি পিতামাতাকে ফেরত দেওয়া হয়েছে, কারণ এটির ঠিকানা স্থানটি আর কোনও প্রক্রিয়া দ্বারা ব্যবহৃত হয় না।

গুরুত্বপূর্ণ: লিনাক্সে, বাস্তব vfork()বাস্তবায়ন নেই। লিনাক্স বরং ১৯৮৮ সালে সুনোস -৪.০ দ্বারা প্রবর্তিত vfork()কপিরাইট অন রাইটিং fork()ধারণার উপর ভিত্তি করে প্রয়োগ করে users ব্যবহারকারীরা যাতে তারা ব্যবহার করেন তা বিশ্বাস করার জন্য vfork(), লিনাক্স কেবল ভাগ করা ডেটা সেট করে এবং সন্তানের কাছে কল দেয় না _exit()বা কোনও একটি exec*()ফাংশন না দিয়ে পিতামাতাকে সাসপেন্ড করে ।

তাই লিনাক্স এই সত্য থেকে উপকৃত হয় না যে কোনও vfork()বাস্তবের কার্নেলের মধ্যে সন্তানের জন্য ঠিকানা স্থানের বিবরণ স্থাপন করতে হবে না। এর vfork()চেয়ে দ্রুত নয় এমনটির ফলাফল fork()। যে সিস্টেমে কোনও বাস্তব বাস্তবায়িত হয় vfork(), এটি সাধারণত fork()শেলগুলি ব্যবহার করে vfork()- ksh93সাম্প্রতিক Bourne Shellএবং csh

কেন আপনি এড বাচ্চার exit()কাছ থেকে কখনই কল করবেন না vfork()তা exit()হ'ল কল করার আগে থেকেই অবিচ্ছিন্ন ডেটা থাকলে স্টুডিও ফ্লাশ করে vfork()। এটি অদ্ভুত ফলাফলের কারণ হতে পারে।

বিটিডাব্লু: posix_spawn()উপরে প্রয়োগ করা হয়েছে vfork(), সুতরাং vfork()ওএস থেকে সরানো হচ্ছে না। উল্লেখ্য করা হয়েছে যে লিনাক্স ব্যবহার করে না vfork()জন্য posix_spawn()

স্ট্যাকের জন্য, কয়েকটি ডকুমেন্টেশন রয়েছে, সোলারিস ম্যান পেজটি এখানে যা বলেছে:

 The vfork() and vforkx() functions can normally be used  the
 same  way  as  fork() and forkx(), respectively. The calling
 procedure, however, should not return while running  in  the
 child's  context,  since the eventual return from vfork() or
 vforkx() in the parent would be to a  stack  frame  that  no
 longer  exists. 

সুতরাং বাস্তবায়ন এটি পছন্দ করে তা করতে পারে। সোলারিস বাস্তবায়ন ফাংশন কলিংয়ের স্ট্যাক ফ্রেমের জন্য ভাগ করা মেমরি ব্যবহার করে vfork()। কোনও বাস্তবায়ন পিতামাতার কাছ থেকে স্ট্যাকের পুরানো অংশগুলিতে অ্যাক্সেসের অনুমতি দেয় না।


4
posix_spawn()লিনাক্সের উপরে জিএনইউ সি লাইব্রেরি বা ম্যাসল সি লাইব্রেরি প্রয়োগ করা হয় না vfork()। তারা উভয়ই এটি শীর্ষে বাস্তবায়ন করে __clone()
জেডিবিপি

1
@ জেডিবিপি: আপনি কি vfork()ঠিক কলগুলি জানেন clone()? এটি আক্ষরিক অর্থে কার্নেলের এক-লাইনার।
জোশুয়া 18

1
"গুরুত্বপূর্ণ: লিনাক্সে, সত্যিকারের vfork () বাস্তবায়ন নেই।" <- এটি সত্য নয় এবং কমপক্ষে এক দশক ধরে এটি সত্য নয়। যদি আপনার শেল বেঞ্চমার্ক লিনাক্স vforkএবং এর মধ্যে কোনও পারফরম্যান্সের পার্থক্য পর্যবেক্ষণ না forkকরে তবে এটি কিছু ভুল করছে।
zwol

1
এই উত্তরটির দ্বিতীয়ার্ধটি "গুরুত্বপূর্ণ: লিনাক্সে, সত্যিকারের vfork () বাস্তবায়ন নেই" দিয়ে শুরু হয় বেশিরভাগ বা সম্পূর্ণ ভুল।
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

1
দয়া করে যাচাই না করে দাবি করবেন না। বর্তমান বোর্ন শেলটি ভিফোর্ক সমর্থন ছাড়াই এবং ছাড়াই সংকলন করা যেতে পারে, সুতরাং আপনি যদি বিশ্বাস করেন যে লিনাক্স থেকে ডিবাগিং বৈশিষ্ট্যগুলি নির্ভরযোগ্য ফলাফল দিতে অক্ষম, আপনি শেলটিতে ভিফোর্কের সাথে কনফিগার কলের জন্য এক্সিকিউশন সময়কে তুলনা করতে পারেন। আমি 800 টি পরীক্ষা সহ একটি কনফিগার স্ক্রিপ্ট ব্যবহার করি। সোলারিসে, ভিফোর্কের সাহায্যে বোর্ন শেলটির কাঁটা মামলার তুলনায় 30% কম সিস্টেম সিপিইউ সময় প্রয়োজন needs লিনাক্সে, একই পরীক্ষার ফলস্বরূপ 10% কম সিস্টেম সিপিইউর সময় কম হয়। সোলারিসে এটি 3x নয় কারণ অনেকগুলি সংকলক কল অন্তর্ভুক্ত রয়েছে।
schily 20
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.