সাধারণভাবে থ্রেডগুলি কী ভাগ করে নেয়?


20

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

আমি একক প্রক্রিয়া একাধিক থ্রেড থাকতে পারে পড়তে। একই প্রক্রিয়াটির একাধিক থ্রেড তাদের মধ্যে জিনিস ভাগ করে। তারা কী ভাগ করে নেয় এবং কী না তা আমি জানতে চাই। বিবেচনার প্রক্রিয়াটি অ্যাড্রেসের স্থান, স্ট্যাক, হিপ, গ্লোবাল ভেরিয়েবল, কোড, ডেটা, ওএস রিসোর্স নিয়ে গঠিত, যার মধ্যে থ্রেডগুলি ভাগ করে নেওয়া হয়েছে? আমার অনুমানগুলি নিম্নলিখিত:

  1. গ্লোবাল ভেরিয়েবল - আমি থ্রেড শেয়ার গ্লোবাল ভেরিয়েবল পড়েছি। এছাড়াও জাভা এবং সি # তে প্রোগ্রাম করার সময় আমি শ্রেণি স্তরের ভেরিয়েবলগুলি ভাগ করতে থ্রেড তৈরি করেছি। সুতরাং আমি বিশ্বাস করি যে থ্রেডগুলি বিশ্বব্যাপী ভেরিয়েবলগুলি ভাগ করে (যদিও উচ্চ স্তরের প্রোগ্রামিং ভাষার ধারণাগুলি কম অপারেটিং সিস্টেমের স্তরের তথ্যগুলিতে অনুবাদ করে কিনা তা নিশ্চিত নয়)।

  2. হিপ - যেহেতু গ্লোবাল ভেরিয়েবল হিপগুলিতে সঞ্চিত থাকে, তাই স্তূপগুলি থ্রেডগুলির মধ্যে ভাগ করা হয়।

  3. স্ট্যাক - যেহেতু প্রতিটি থ্রেডের নিজস্ব এক্সিকিউশন সিকোয়েন্স / কোড থাকতে পারে, তার অবশ্যই এটির নিজস্ব স্ট্যাক থাকতে হবে যার উপর এটি তার প্রোগ্রামের কাউন্টার সামগ্রীগুলি ধাক্কা / পপ করতে পারে (যখন ফাংশন কল এবং রিটার্ন ঘটে তখন বলুন) say সুতরাং একই প্রক্রিয়াটির থ্রেডগুলি স্ট্যাক ভাগ করে না।

এখন আমি নীচের জিনিসগুলি ভাগ করে নেওয়ার বিষয়ে অনিশ্চিত

  1. ঠিকানার স্থান - ঠিকানার জায়গার নিচে ঠিক কী গণনা করা যায় তা নিশ্চিত নয়। তবে আমি অনুমান করি ঠিকানার স্থানটি সাধারণত থ্রেড নয় প্রসেসের প্রসঙ্গে ব্যবহৃত হয়। এবং যেহেতু একই প্রক্রিয়াটির সমস্ত থ্রেড পিতামাতার প্রক্রিয়া হিসাবে একই ঠিকানা স্পেসে থাকে তাই বলা হয় যে থ্রেডগুলি ঠিকানা স্থান ভাগ করে দেয়। (তবে তারপরে তারা একই ঠিকানা জায়গার ভিতরে বিভিন্ন স্ট্যাক বজায় রাখবে?)

  2. ওএস সংস্থানসমূহ - আমি অনুমান করি এটি খুব বাস্তবায়ন নির্দিষ্ট হতে পারে। উদাহরণস্বরূপ, পিতামাতার প্রক্রিয়াটি তার কয়েকটি থ্রেডকে একই ফাইলের হ্যান্ডেল নির্বাচন করে এবং সমস্তকেই নির্বাচন করতে পারে। বা আমি ভুল করছি এবং ওএস রিসোর্স মানে ফাইল ছাড়া অন্য কিছু?

  3. কোড - থ্রেডগুলিতে আলাদা আলাদা কোড থাকতে পারে, তাই শেয়ারিং কোডটি সর্বদা ক্ষেত্রে হয় না।

  4. ডেটা - ডেটার অধীনে কী বিবেচনা করা উচিত সে সম্পর্কে অনিশ্চিত। তবে নিশ্চিত হয়ে নিন যে গ্লোবাল ভেরিয়েবলগুলি থ্রেডগুলির মধ্যে ভাগ করা আছে। এবং নিশ্চিত হোন যে স্থানীয় ভেরিয়েবলগুলি একইভাবে ভাগ করা হয়নি।

অস্পষ্ট শর্তাদি, অপারেটিং সিস্টেমের বইগুলিতে সুপার-জেনারালাইজেশন এবং অনলাইনে সরবরাহিত অতিরিক্ত-প্রয়োগের নির্দিষ্ট বিবরণগুলির কারণে আমি সামগ্রিকভাবেই বিভ্রান্ত হয়ে পড়েছি। তাই আমি এমন কিছু উত্তর খুঁজতে চেষ্টা করছি যা আমাকে সন্তুষ্ট করতে পারে।

উত্তর:


13

সাধারণভাবে প্রতিটি থ্রেডের নিজস্ব রেজিস্টার রয়েছে (নিজস্ব প্রোগ্রামের কাউন্টার সহ), নিজস্ব স্ট্যাক পয়েন্টার এবং নিজস্ব স্ট্যাক। থ্রেডগুলির মধ্যে একটি প্রক্রিয়া ভাগ করে রেখে অন্য কিছু ভাগ করা হয়।

বিশেষত একটি প্রক্রিয়াটি সাধারণত থ্রেডের একটি সেটকে একটি ঠিকানা স্পেস, হিপ, স্ট্যাটিক ডেটা, এবং কোড বিভাগ এবং ফাইল বিবরণকারী * ভাগ করে নিয়ে আসে বলে মনে করা হয়

একটি ঠিকানা স্থান কেবল শারীরিক মেমরির নির্দিষ্ট অংশগুলিতে যৌক্তিক ঠিকানাগুলির ম্যাপিং। সুতরাং যখন আমরা বলি যে কোনও প্রক্রিয়াতে সমস্ত থ্রেড একই ঠিকানা স্থানকে ভাগ করে দেয় আমাদের অর্থ হ'ল fooবৈশ্বিক স্কোপে কোনও চলক অ্যাক্সেস করার সময় সমস্ত থ্রেড একই পরিবর্তনশীল দেখতে পাবে। একইভাবে, থ্রেডগুলি কোনও নির্দিষ্ট সময়ে কোডে পৃথক পয়েন্ট চলতে পারে তবে তাদের সমস্তকে বিশ্বব্যাপী ফাংশন বলার অনুমতি দেওয়া হয় bar(), যা প্রক্রিয়াটির প্রতিটি থ্রেডের জন্য একই ফাংশনের সাথে মিল রাখে।

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

* কোনও প্রক্রিয়াতে সমস্ত থ্রেড দ্বারা ভাগ করা কিছু অতিরিক্ত প্রক্রিয়া অবস্থা রয়েছে, প্রক্রিয়া আইডি, সিগন্যাল হ্যান্ডলিং এবং ফাইল লকগুলির মতো জিনিস। থ্রেড দ্বারা ভাগ করা প্রক্রিয়া রাষ্ট্রের সম্পূর্ণ তালিকার জন্য আপনাকে নির্দিষ্ট থ্রেডিং বাস্তবায়নের জন্য ডকুমেন্টেশন দেখতে হবে। উদাহরণস্বরূপ, pthreads ম্যান পৃষ্ঠা


4

থ্রেড দুটি দৃষ্টিভঙ্গিতে উঠে আসে: অপারেটিং সিস্টেম এবং প্রোগ্রামিং ভাষা। উভয় ক্ষেত্রেই একটি থ্রেডের বৈশিষ্ট্যগুলির মধ্যে কিছু প্রকারভেদ রয়েছে।

কোনও থ্রেডের একটি ন্যূনতম সংজ্ঞা হ'ল এটি এমন জিনিস যা ক্রমানুসারে ঘটে, একের পর এক জিনিস।

একটি সাধারণ মেশিন এক্সিকিউশন মডেলে, প্রতিটি থ্রেডের নিজস্ব-সাধারণ রেজিস্টারগুলির নিজস্ব সেট এবং নিজস্ব প্রোগ্রামের কাউন্টার থাকে। যদি মেশিনটি স্ট্যাক পয়েন্টার হিসাবে একটি নির্দিষ্ট রেজিস্ট্রার সেট করে, প্রতি থ্রেডে একটি অনুলিপি রয়েছে।

অপারেটিং সিস্টেমের দৃষ্টিকোণ থেকে, থ্রেডগুলিকে সমর্থন করতে সর্বনিম্ন একটি অপারেটিং সিস্টেমের দরকার হয় তাদের মধ্যে পরিবর্তন করার একটি উপায় সরবরাহ করা। এটি স্বয়ংক্রিয়ভাবে ঘটতে পারে ( প্রিমিটিভ মাল্টিটাস্কিং বা কেবল যখন থ্রেডটি একটি স্পষ্ট অনুরোধ জানায় (সমবায় মাল্টিটাস্কিং; সেক্ষেত্রে থ্রেডগুলিকে মাঝে মাঝে ফাইবার বলা হয় )। এছাড়াও এখানে উভয় প্রাইমেশন এবং সমবায় ফলন সহ সংকর মডেল রয়েছে, যেমন বিভিন্ন গ্রুপের থ্রেডের মধ্যে প্রিম্পেশন। কাজগুলি বা একই গ্রুপ / টাস্কের থ্রেডের মধ্যে স্পষ্ট ফলন threads

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

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

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

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

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

কিছু ভাষাগুলি থ্রেড-লোকাল স্টোরেজ অফার করে দুটি মডেলকে মিশ্রিত করে, কোনও বিশ্বব্যাপী থেকে থ্রেড-স্থানীয় স্টোরেজ অবস্থানের পার্থক্য করার জন্য টাইপ সিস্টেমের সাথে বা ছাড়াই। থ্রেড-লোকাল স্টোরেজ সাধারণত একটি সুবিধা বৈশিষ্ট্য যা কোনও চলক নামকে বিভিন্ন থ্রেডে বিভিন্ন স্টোরেজের অবস্থান নির্ধারণ করতে দেয়।

কিছু (কঠিন) ফলো-আপগুলি থ্রেডগুলি কী তা বুঝতে আগ্রহী হতে পারে:

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

আমি কয়েক মাস পড়েছি এটি সবচেয়ে আকর্ষণীয় জিনিস।
জেএসএন

2

সেটা নির্ভর করে. আপনি যদি থ্রেডগুলি সংজ্ঞায়িত হিসাবে যেমন পসিক্স (এবং ইউনিক্স সিস্টেম দ্বারা প্রদত্ত) বা উইন্ডোজ দ্বারা (পরবর্তীকালের সাথে পরিচিত নন তবে আপনাকে বিশেষভাবে জিজ্ঞাসা করতে হবে) হিসাবে বিবেচনা করেন, তবে এটি আপনার উত্তর দেয় (মূলত @ ওয়ান্ডারিংলজিক উত্তর ব্যাখ্যা করে)। নন-স্ট্যান্ডার্ড clone(2)সিস্টেম কলটি ব্যবহার করে লিনাক্সের থ্রেডগুলির নিজস্ব ধারণা রয়েছে । এটি পিতামাতা এবং সন্তানের ভাগ ভাগ করে নেওয়ার পরিবর্তে সূক্ষ্ম-নিয়ন্ত্রণযুক্ত নিয়ন্ত্রণ সরবরাহ করে। এটা যায় যতদূর তার হিসাবে fork(2)এবং vfork(2)মূলত অভ্যন্তরীণ প্রায় চাদরে clone(2), নির্দিষ্ট পতাকা এটা আহ্বান, অর্থাত্, আপনি "থ্রেড" তৈরি করতে পারে পিতা বা মাতা সঙ্গে কিছুই পরের ভাগ। বিশদগুলির জন্য এর ম্যানুয়াল পৃষ্ঠাটি সন্ধান করুন, তারা এখানে অনলাইনে উপলব্ধ । হ্যাঁ, লিনাক্স পসিক্স স্টাইলের থ্রেড সরবরাহ করে তবে আরও অনেক কিছু।


0

থ্রেড শেয়ার:

  • ঠিকানার স্থান
  • গাদা
  • স্ট্যাটিক ডেটা
  • কোড বিভাগসমূহ
  • ফাইল বর্ণনাকারী
  • গ্লোবাল ভেরিয়েবল
  • শিশু প্রক্রিয়া
  • মুলতুবি মুলতুবি
  • সিগন্যাল এবং সংকেত হ্যান্ডলারগুলি
  • হিসাব সংক্রান্ত তথ্য

থ্রেডগুলির নিজস্ব রয়েছে:

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