আপনি ব্যাখ্যা করতে পারেন কেন একক কোর সিপিইউতে একাধিক থ্রেডের লক দরকার?


18

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


কারণ সফ্টওয়্যার লেনদেনের মেমরি এখনও মূলধারার নয়।
ড্যান_ওয়াটারওয়ার্থ

@ উদ্যান_ ওয়াটারওয়ার্থ যেহেতু সফ্টওয়্যার লেনদেনের মেমরি অ-তুচ্ছ জটিল পর্যায়ে খারাপভাবে ব্যর্থ হয়, তাই? ;)
ম্যাসন হুইলারের

আমি বাজি ধরব রিচ হিকি এর সাথে একমত নয়।
রবার্ট হার্ভে

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

উত্তর:


32

এটি একটি উদাহরণ দিয়ে সবচেয়ে ভাল চিত্রিত করা হয়।

মনে করুন আমাদের একটি সাধারণ কাজ রয়েছে যা আমরা সমান্তরালভাবে একাধিকবার সম্পাদন করতে চাই এবং আমরা বিশ্বব্যাপী এই কার্যটি কতবার সম্পাদিত হয়েছে তার উদাহরণ রাখতে চাই, উদাহরণস্বরূপ, ওয়েব পৃষ্ঠায় হিট গণনা করা।

যখন প্রতিটি থ্রেড সেই বিন্দুতে পৌঁছে যায় যেখানে এটি গণনা বাড়িয়ে তুলছে, এর কার্যকরকরণটি এরকম দেখতে পাবেন:

  1. প্রসেসরের রেজিস্ট্রারে মেমরি থেকে হিট সংখ্যা পড়ুন
  2. সংখ্যাটি বৃদ্ধি করুন।
  3. সেই নম্বরটি স্মৃতিতে ফিরে লিখুন

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

এ ছাড়া, থ্রেড এ স্থগিতের সময়ে অন্য যে কোনও সংখ্যক থ্রেড চলতে পারে, সুতরাং শেষে কাউন্ট থ্রেড লিখতে পারে সঠিক গণনার নীচে।

এই কারণে, এটি নিশ্চিত করা দরকার যে কোনও থ্রেড যদি পদক্ষেপ 1 সম্পাদন করে তবে অন্য কোনও থ্রেডকে ধাপ 1 সম্পাদন করার অনুমতি দেওয়ার আগে এটি অবশ্যই 3 পদক্ষেপটি সম্পাদন করবে, যা এই প্রক্রিয়াটি শুরু করার আগে সমস্ত থ্রেড একক লক পাওয়ার জন্য অপেক্ষা করতে সক্ষম হবে can , এবং প্রক্রিয়াটি সম্পূর্ণ হওয়ার পরেই লকটি মুক্ত করা, যাতে কোডটির এই "সমালোচনা বিভাগ" ভুলভাবে আন্তঃবিভক্ত করা যায় না, ফলস্বরূপ একটি ভুল গণনা ঘটে।

তবে অপারেশনটি যদি পারমাণবিক হত?

হ্যাঁ, যাদুকরী ইউনিকর্ন এবং রামধনুদের জমিতে, যেখানে ইনক্রিমেন্ট অপারেশনটি পারমাণবিক, তবে উপরের উদাহরণের জন্য লকিং প্রয়োজনীয় হবে না।

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

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

উদ্বায়ী ভেরিয়েবল

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

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

সুতরাং অস্থির হিসাবে চিহ্নিত একটি পরিবর্তনশীল আমাদেরকে পারমাণবিক বৃদ্ধি ক্রিয়াকলাপের দেশে নিয়ে যাবে না, এটি কেবল আমাদের ততই কাছাকাছি পৌঁছেছিল যা আমরা ভেবেছিলাম যে আমরা ইতিমধ্যে ছিলাম were

বর্ধিত পারমাণবিক তৈরি করা

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

197       /**
198        * Atomically increments by one the current value.
199        *
200        * @return the updated value
201        */
202       public final int incrementAndGet() {
203           for (;;) {
204               int current = get();
205               int next = current + 1;
206               if (compareAndSet(current, next))
207                   return next;
208           }
209       }

উপরের লুপটি বারবার নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করে, 3 তম পদক্ষেপটি সফল না হওয়া পর্যন্ত:

  1. সরাসরি মেমরি থেকে একটি উদ্বায়ী ভেরিয়েবলের মান পড়ুন।
  2. যে মান বৃদ্ধি।
  3. মানটি (মূল স্মৃতিতে) পরিবর্তন করুন এবং কেবল যদি প্রধান মেমরিতে তার বর্তমান মান আমরা প্রথমে একটি বিশেষ পারমাণবিক ক্রিয়াকলাপ ব্যবহার করে যে মানটি শুরুতে পঠিত হয় তার সমান হয়।

যদি পদক্ষেপ 3 ব্যর্থ হয় (কারণ মান 1 ধাপের পরে আলাদা থ্রেড দ্বারা পরিবর্তিত হয়েছিল), এটি আবার মূল স্মৃতি থেকে সরাসরি পরিবর্তনশীলটি পড়ে এবং আবার চেষ্টা করে।

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

সুতরাং, আমরা তুলনা এবং অদলবদলের মাধ্যমে প্রকৃত লক ব্যবহার না করে পারমাণবিক বর্ধনের (বা একক ভেরিয়েবলের অন্যান্য ক্রিয়াকলাপের) দেশে যেতে পারি।

সুতরাং যখন লকিং কঠোরভাবে প্রয়োজনীয়?

যদি আপনাকে পারমাণবিক ক্রিয়াকলাপে একাধিক ভেরিয়েবল পরিবর্তন করতে হয়, তবে লক করা প্রয়োজনীয় হবে, আপনি তার জন্য কোনও বিশেষ প্রসেসরের নির্দেশ খুঁজে পাবেন না।

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

আসুন একটি উদাহরণ বিবেচনা করুন যেখানে প্রতিটি থ্রেড প্রথমে ভেরিয়েবল এক্সে 2 যোগ করে এবং তারপরে এক্সটিকে দুটি দ্বারা গুণিত করে।

যদি এক্স প্রাথমিকভাবে এক হয় এবং দুটি থ্রেড চলতে থাকে তবে আমরা ফলাফলটি আশা করি (((1 + 2) * 2) + 2) * 2 = 16)।

যাইহোক, যদি থ্রেডগুলি আন্তঃবিভক্ত হয় তবে আমরা সমস্ত ক্রিয়াকলাপকেও পারমাণবিক করে তুলতে পারতাম, পরিবর্তে উভয় সংযোজন আগে ঘটতে পারে এবং গুণগুলি পরে আসে, যার ফলস্বরূপ (1 + 2 + 2) * 2 * 2 = 20 হয়।

এটি ঘটে কারণ গুণ এবং সংযোজন ক্রমবর্ধমান ক্রিয়াকলাপ নয়।

সুতরাং, অপারেশনগুলি নিজেরাই পারমাণবিক হওয়াই যথেষ্ট নয়, আমাদের অবশ্যই অপারেশনের পারমাণবিক সমন্বয় তৈরি করতে হবে।

প্রক্রিয়াটি সিরিয়ালাইজ করার জন্য লক ব্যবহার করে আমরা এটি করতে পারি, অথবা আমরা যখন আমাদের গণনা শুরু করি, তখন মধ্যবর্তী পদক্ষেপের জন্য দ্বিতীয় স্থানীয় ভেরিয়েবল এবং এক্স এর মান সঞ্চয় করতে আমরা একটি স্থানীয় ভেরিয়েবল ব্যবহার করতে পারি এবং তারপরে তুলনা-ও-অদলবদল ব্যবহার করতে পারি এক্সের বর্তমান মানটি যদি এক্সের মূল মানের সমান হয় তবেই একটি নতুন মান সেট করুন we যদি আমরা ব্যর্থ হই তবে এক্স পাঠ করে আবার গণনা সম্পাদন করে আবার শুরু করতে হবে।

বেশ কয়েকটি ট্রেড অফ জড়িত রয়েছে: গণনাগুলি দীর্ঘ হওয়ার সাথে সাথে চলমান থ্রেড স্থগিত হয়ে যাওয়ার সম্ভাবনা অনেক বেশি হয়ে যায় এবং আমরা আবার শুরু করার আগেই অন্য থ্রেডের মাধ্যমে মানটি সংশোধন করা হবে যার অর্থ ব্যর্থতা আরও বেশি সম্ভাবনা হয়ে যায়, যার ফলে নষ্ট হয়ে যায় leading প্রসেসরের সময়। খুব দীর্ঘ চলমান গণনা সহ প্রচুর পরিমাণে থ্রেডের চূড়ান্ত ক্ষেত্রে, আমাদের 100 টি থ্রেড চলকটি পড়তে পারে এবং গণনায় জড়িত থাকতে পারে, সেই ক্ষেত্রে কেবলমাত্র প্রথমটি শেষ করা নতুন মান লিখতে সফল হবে, অন্য 99 টি এখনও থাকবে তাদের গণনাগুলি সম্পন্ন করুন, তবে সম্পূর্ণ হওয়ার পরে আবিষ্কার করুন যে তারা মানটি আপডেট করতে পারে না ... যে বিন্দুতে তারা প্রত্যেকেই মানটি পড়বে এবং গণনা শুরু করবে। আমাদের সম্ভবত বাকি 99 টি থ্রেড একই সমস্যার পুনরাবৃত্তি করবে, প্রসেসরের প্রচুর সময় নষ্ট করবে।

লকগুলির মাধ্যমে সমালোচনামূলক বিভাগটির সম্পূর্ণ সিরিয়ালাইজেশন সেই পরিস্থিতিতে আরও ভাল হবে: 99 টি থ্রেডগুলি লকটি না পেলে স্থগিত হয়ে যায় এবং আমরা লকিং পয়েন্টে পৌঁছানোর জন্য প্রতিটি থ্রেড চালাতাম।

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


তবে যদি কাউন্টার ইনক্রিমেন্টটি পারমাণবিক হয় তবে লকটি কী প্রয়োজনীয় ছিল?
অজগর

@ পেথোনি: যদি কাউন্টার ইনক্রিমেন্টটি পারমাণবিক হয়, তবে সম্ভবত তা নয়। তবে যুক্তিসঙ্গত আকারের যে কোনও মাল্টিথ্রেডেড প্রোগ্রামে আপনার অ ভাগ্যসম্পর্কে একটি ভাগ করা সংস্থায় করা হবে।
ডক ব্রাউন

1
যদি না আপনি ইনক্রিমেন্টকে পারমাণবিক করতে একটি সংকলক অভ্যন্তরীণ ব্যবহার করেন, সম্ভবত এটি তা নয়।
মাইক লারসেন

হ্যাঁ, পড়ার / পরিবর্তিত (বৃদ্ধি) / রচনা যদি পারমাণবিক হয় তবে লকটি অপ্রয়োজনীয়, সেই ক্রিয়াকলাপের জন্য। ডিইসি -10 এওএসই (একটি যুক্ত করুন এবং ফলাফল == 0 হলে এড়িয়ে যান) নির্দেশটি বিশেষত পারমাণবিক তৈরি করা হয়েছিল যাতে এটি পরীক্ষা-ও-সেট সেমোফোর হিসাবে ব্যবহার করা যায়। ম্যানুয়ালটিতে উল্লেখ করা হয়েছে যে এটি যথেষ্ট ভাল কারণ এটি পুরোপুরি একটি 36-বিট নিবন্ধকে রোল করতে মেশিনটিকে বেশ কয়েকদিন লাগবে counting তবে এখন, আপনি যা কিছু করেন তা "মেমরিতে একটি যুক্ত হবে" be
জন আর। স্ট্রোহ্ম

আমি এই উদ্বেগগুলির কয়েকটি সমাধান করার জন্য আমার উত্তর আপডেট করেছি: হ্যাঁ, আপনি অপারেশনটিকে পারমাণবিক করতে পারেন, তবে না, এমনকি এটি সমর্থনকারী আর্কিটেকচারগুলিতেও এটি ডিফল্টরূপে পারমাণবিক হবে না এবং এমন পরিস্থিতি রয়েছে যেখানে পারমাণবিকতা নেই isn't পর্যাপ্ত এবং সম্পূর্ণ সিরিয়ালাইজেশন প্রয়োজন। লকিং হ'ল সম্পূর্ণ সিরিয়ালাইজেশন অর্জনের জন্য আমি সচেতন।
থিওডোর মুরডক

4

এই উদ্ধৃতি বিবেচনা করুন:

কিছু লোক, যখন কোনও সমস্যার মুখোমুখি হয়, তখন ভাবেন, "আমি জানি, আমি থ্রেডগুলি ব্যবহার করব" এবং তারপরে দু'জনে তারা দুর্বল হয়ে পড়ে

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


আমি ভাবলাম উদ্ধৃতিটি নিয়মিত প্রকাশ, থ্রেড নয়?
ব্যবহারকারী16764

3
উক্তিটি আমার কাছে থ্রেডের জন্য অনেক বেশি প্রযোজ্য মনে হয়েছে (থ্রেডিংয়ের কারণে শব্দ / অক্ষরগুলি ক্রম থেকে ছড়িয়ে পড়েছে)। তবে আউটপুটে বর্তমানে একটি অতিরিক্ত "এস" রয়েছে যা সূচিত করে কোডটিতে তিনটি সমস্যা রয়েছে।
থিওডোর মুরডক

1
এটি একটি পার্শ্ব প্রতিক্রিয়া। খুব মাঝে মাঝে আপনি 1 প্লাস 1 যুক্ত করতে এবং
4294967295

3

অনেকগুলি উত্তর লকিংয়ের ব্যাখ্যা দেওয়ার চেষ্টা করেছে বলে মনে হয়, তবে আমি মনে করি যে ওপির কী দরকার তা মাল্টিটাস্কিং আসলে কী তার একটি ব্যাখ্যা।

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

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

0

সমস্যা স্বতন্ত্র ক্রিয়াকলাপগুলির সাথে নিহিত নয়, তবে অপারেশনগুলি যে বৃহত্তর কাজগুলি সম্পাদন করে।

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

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

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

আরেকটি জিনিস যা সিঙ্ক্রোনাইজেশন আদিমগুলি কিছু প্ল্যাটফর্মে ফলাফল দেয় তা হ'ল তারা মেমরির বাধা নির্গত করে যা মেমরির আন্তঃ সিপিইউ ধারাবাহিকতা নিশ্চিত করে।


0

'বুল' সেট করা ব্যতীত কোনও গ্যারান্টি নেই (কমপক্ষে সিতে) যে ভেরিয়েবলটি পড়া বা লেখার ক্ষেত্রে কেবল একটি নির্দেশ থাকে - বা এটি পড়ার / লেখার মাঝখানে বাধা দেওয়া যায় না


32-বিট পূর্ণসংখ্যা নির্ধারণের জন্য কতটি নির্দেশনা লাগবে?
DXM

1
আপনি আপনার প্রথম বিবৃতিতে কিছুটা প্রসারিত করতে পারেন। আপনি বোঝাচ্ছেন যে কেবল একটি বোল পরমাণুভাবে পড়া / লিখিত হতে পারে, তবে এটি বোঝা যায় না। একটি "বুল" আসলে হার্ডওয়ারে বিদ্যমান নেই। এটি সাধারণত বাইট বা একটি শব্দ হিসাবে প্রয়োগ করা হয়, সুতরাং কিভাবে কেবল boolএই সম্পত্তি থাকতে পারে ? এবং আপনি কি মেমোরি থেকে লোড, পরিবর্তন এবং মেমরিটিকে আবার ঠেলে দেওয়ার কথা বলছেন, বা আপনি কোনও নিবন্ধী স্তরে কথা বলছেন? নিবন্ধগুলিতে সমস্ত পাঠ / নিবন্ধগুলি নিরবচ্ছিন্ন, তবে মেম লোড তারপর মেম স্টোরটি হয় না (মানটি পরিবর্তন করতে একা যেমন 2 নির্দেশ থাকে তবে কমপক্ষে আরও 1 টি)।
কর্বিন

1
হাইপারহ্রেড / মাল্টিকোর / শাখা-পূর্বাভাস / মাল্টি-ক্যাশেড সিপিইউতে একক নির্দেশনার ধারণাটি কিছুটা জটিল - তবে মানকটি বলে যে কেবল 'বুল' একটি পঠন / লেখার মাঝখানে প্রসঙ্গের সুইচের বিরুদ্ধে নিরাপদ হওয়া দরকার একক ভেরিয়েবলের। একটি উত্সাহ আছে :: পারমাণবিক যা অন্য ধরণের চারপাশে মিটেক্সকে আবৃত করে এবং আমার মনে হয় সি ++ 11 আরও কিছু থ্রেডিং গ্যারান্টি যুক্ত করেছে
মার্টিন বেকেট

ব্যাখ্যাটি the standard says that only 'bool' needs to be safe against a context switch in the middle of a read/write of a single variableউত্তরে যুক্ত করা উচিত।
নেকড়ে

0

ভাগ করা মেমরি.

এটি ... থ্রেডগুলির সংজ্ঞা : ভাগ করা মেমরির সাথে একযোগে সমবর্তী প্রক্রিয়াগুলি।

যদি কোনও ভাগ করা মেমরি না থাকে তবে এগুলিকে সাধারণত পুরানো-স্কুল-ইউনিক্স প্রক্রিয়া হিসাবে চিহ্নিত করা হয়।
যদিও কোনও ভাগ করা ফাইল অ্যাক্সেস করার সময় তাদের এখন এবং তারপরে একটি লক দরকার হতে পারে।

(ইউনিক্সের মতো কার্নেলগুলিতে ভাগ করা মেমরিটি সাধারণত ভাগ করে নেওয়া মেমরি ঠিকানার প্রতিনিধিত্ব করে একটি জাল ফাইল বিবরণী ব্যবহার করে বাস্তবায়িত হয়েছিল)


0

একটি সিপিইউ একবারে একটি নির্দেশনা চালায় তবে আপনার যদি দুটি বা ততোধিক সিপিইউ থাকে?

আপনি ঠিক বলেছেন যে লকগুলির দরকার নেই, আপনি যদি প্রোগ্রামটি এমনভাবে লিখতে পারেন যে এটি পারমাণবিক নির্দেশাবলীর সুবিধা গ্রহণ করে: যে নির্দেশাবলী প্রদত্ত প্রসেসরের উপর আটকানো যায় না এবং অন্যান্য প্রসেসরের দ্বারা হস্তক্ষেপ থেকে মুক্ত হয় instructions

যখন তালিকাগুলি হ'ল হস্তক্ষেপ থেকে রক্ষা করা দরকার এবং কোনও সমতুল্য পারমাণবিক নির্দেশনা নেই।

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

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

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

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


এফওয়াইআই, আমি কেবলমাত্র একটি একক তুলনা-ও-স্ব্যাপ ব্যবহার করে দ্বিগুণ-সংযুক্ত তালিকার আপডেটগুলি প্রক্রিয়া করতে লক-মুক্ত অ্যালগরিদমগুলি পড়েছি। এছাড়াও, আমি কোনও সুবিধাসমূহের জন্য একটি সাদা কাগজ পড়েছি যা দেখে মনে হয় এটি হার্ডওয়ারে দ্বিগুণ তুলনা-ও-অদলবদলের তুলনায় অনেক সস্তা হবে (যা 68040 সালে বাস্তবায়িত হয়েছিল তবে অন্যান্য 68XXx প্রসেসরের মাধ্যমে বহন করে নি): লোড বাড়িয়ে দিন দুটি লিঙ্কযুক্ত বোঝা এবং শর্তসাপেক্ষ স্টোরকে অনুমতি দেওয়ার জন্য-সংযুক্ত / স্টোর-শর্তযুক্ত, তবে এই প্রোভিসো দিয়ে যে দুটি স্টোরের মধ্যে ঘটে এমন অ্যাক্সেস প্রথমটি ফিরে আসে না। এটি দ্বিগুণ তুলনা-ও-স্টোরের চেয়ে প্রয়োগ করা অনেক সহজ ...
সুপারক্যাট

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