কাঁটাচামচ কল করার সময় থ্রেডগুলি অনুলিপি করা হয়?


31

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

উত্তর:


29

না।

থ্রেডগুলি অনুলিপি করা হয় না fork()। পসিক্স স্পেসিফিকেশন বলে (জোর দেওয়া আমার):

কাঁটাচামচ - একটি নতুন প্রক্রিয়া তৈরি করুন

একটি একক থ্রেড দিয়ে একটি প্রক্রিয়া তৈরি করা হবে । যদি একটি বহু-থ্রেড প্রক্রিয়া কাঁটাচামচ কল করে (), নতুন প্রক্রিয়াটিতে কলিং থ্রেডের একটি প্রতিলিপি এবং এর পুরো ঠিকানা জায়গার উপস্থিতি থাকতে পারে, সম্ভবত মুটেক্স এবং অন্যান্য সংস্থানগুলির রাজ্য অন্তর্ভুক্ত। ফলস্বরূপ, ত্রুটিগুলি এড়ানোর জন্য, শিশু প্রক্রিয়া কেবলমাত্র অ্যাসিঙ্ক-সিগন্যাল-নিরাপদ ক্রিয়াকলাপ সম্পাদন করতে পারে যতক্ষণ না এক্সিকিউটিভ ফাংশনগুলির মধ্যে একটি বলা হয়।

এই সমস্যা থেকে রক্ষা পেতে, pthread_atfork()সাহায্য করার জন্য একটি ফাংশন রয়েছে ।


7

মানুষ কাঁটাচামচ :

শিশু প্রক্রিয়াটি একটি একক থ্রেড দ্বারা তৈরি করা হয় — একে একে কাঁটাচামচ () বলে। পিতামাতার পুরো ভার্চুয়াল ঠিকানার স্থানটি মুটেক্সেস, কন্ডিশন ভেরিয়েবল এবং অন্যান্য pthreads অবজেক্টগুলির রাজ্য সহ শিশুতে প্রতিলিপি করা হয়; pthread_atfork (3) এর ব্যবহার এটির কারণ হতে পারে এমন সমস্যাগুলির মোকাবেলায় সহায়ক হতে পারে।


তবে এটি অদ্ভুত বলে মনে হচ্ছে: আসল থ্রেডগুলি (যা আমি জানি না যে ভার্চুয়াল মেমরির চেয়ে অন্য কোথাও স্টোরেজ ধারণ করে না) যদি প্রসেস কলিং ফর্কটিতে থাকা থ্রেডগুলি অনুলিপি করা হয় তবে কেন?

ভাল কেন এটি সম্পূর্ণরূপে একটি আলাদা প্রশ্ন is আমি বাস্তব নকশার সিদ্ধান্তগুলি জানি না যা সেই বাস্তবায়নের দিকে পরিচালিত করেছিল। আপনি যদি আগ্রহী হন তবে আপনার এটি পৃথক প্রশ্ন হিসাবে জিজ্ঞাসা করা উচিত।
কায়লুম

@ ডিপ কিন্তু অন্যান্য থ্রেডের স্ট্যাক কপি করা হয়নি, কে বলেছে?
জিন-ব্যাপটিস্ট ইউনিস

1
@ জিন-ব্যাপটিস্টইউনস ইউনিক্স সিস্টেমে একটি প্রক্রিয়াটির জন্য ভার্চুয়াল মেমরির প্রতিনিধিত্বকারী একটি কাঠামো রয়েছে। এটিই অনুলিপি করা। কেবল হিপ এবং বিএসএস নয়

6
আপনি পুরো মেমরির স্থান পান - এবং তাই সমস্ত থ্রেডের স্ট্যাকস। আপনার প্রয়োজন যেহেতু বাকী থ্রেডে অ্যাক্সেসযোগ্য স্ট্যাকের মধ্যে থাকা পয়েন্টারগুলি (বা স্থিতিশীল মেমোরিটি) নির্দেশ করছে সেখানে কোনও সীমাবদ্ধতা নেই - তারা খুব ভালভাবে মূল প্রক্রিয়াতে কিছু থ্রেডের স্ট্যাকের মধ্যে থাকা ডেটাগুলিকে নির্দেশ করতে পারে
ডেভিডবাক

4

ওপেন গ্রুপ বেস স্পেসিফিকেশন ইস্যু 7, 2018 সংস্করণের কাঁটাচামচ থেকে :

একটি একক থ্রেড দিয়ে একটি প্রক্রিয়া তৈরি করা হবে। যদি একটি বহু-থ্রেড প্রক্রিয়া কাঁটাচামচ কল করে () , নতুন প্রক্রিয়াটিতে কলিং থ্রেডের একটি প্রতিলিপি এবং এর পুরো ঠিকানা জায়গার উপস্থিতি থাকতে পারে, সম্ভবত মুটেক্স এবং অন্যান্য সংস্থানগুলির রাজ্য অন্তর্ভুক্ত। ফলে, এড়ানোর ত্রুটির, সন্তানের এই প্রক্রিয়াটি কেবল মাত্র ASYNC-সংকেত-নিরাপদ অপারেশন যেমন সময় যেমন এক পর্যন্ত চালানো হতে পারে Exec ফাংশন বলা হয়।

অ্যাপ্লিকেশন যখন সিগন্যাল হ্যান্ডলারের কাছ থেকে কাঁটাচামচ কল করে এবং pthread_atfork দ্বারা নিবন্ধিত কোনও কাঁটাচামচকারী () এমন একটি ফাংশনকে কল করে যা অ্যাসিঙ্ক-সিগন্যাল-নিরাপদ নয়, আচরণটি অনির্ধারিত।


-2

মূলত, "কাঁটাচামচ" কাজটি ডিস্কে লিখে এবং তারপরে, আলাদা থ্রেডে পড়ার পরিবর্তে অর্জন করা হয়েছিল (যা অন্যটি দিয়ে টাস্ক অদলবদলে করা হত), চিত্রটির টাস্ক আইডি পরিবর্তন করে এখনও স্মৃতিতে রয়েছে এবং অবিরত রয়েছে এটি কার্যকর করার সাথে (নতুন কাজ হিসাবে)। এটি বেসিক টাস্ক স্যুইচিং প্রক্রিয়াতে খুব সাধারণ পরিবর্তন ছিল, যেখানে একবারে কেবল একটি কাজ র‌্যাম মেমরি দখল করে।

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


কেন এটিকে নিচে ভোট দেওয়া হয়েছে তা আগ্রহী। ইউনিক্স এটি এভাবেই করেছিল।
হট লিকস

এটি আকর্ষণীয় অন্তর্দৃষ্টি, তবে এটি থ্রেডগুলির উল্লেখ কোথায় করে? আমার কাছে কোনও উত্তরের মতো দেখাচ্ছে না।
wastl
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.