মাল্টি-থ্রেডড ব্লকিং I / O এর চেয়ে অ-ব্লকিং I / O আসলেই কি দ্রুত? কিভাবে?


118

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

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

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

  1. কোনও ফাইলের বিষয়বস্তু লোড করার জন্য, একটি অ্যাপ্লিকেশন এই টাস্কটিকে ইভেন্ট-ভিত্তিক আই / ও ফ্রেমওয়ার্কে প্রতিনিধি করে একটি ফাইল নাম সহ কলব্যাক ফাংশনটি পাস করে
  2. ইভেন্ট ফ্রেমওয়ার্কটি অপারেটিং সিস্টেমে প্রতিনিধিত্ব করে, যা ফাইলটি সরাসরি মেমরিতে লেখার জন্য হার্ড ডিস্কের একটি ডিএমএ নিয়ামককে প্রোগ্রাম করে
  3. ইভেন্ট ফ্রেমওয়ার্কটি আরও কোড চালানোর অনুমতি দেয়।
  4. ডিস্ক-টু-মেমরি অনুলিপিটি শেষ হওয়ার পরে, ডিএমএ নিয়ামক একটি বিঘ্ন ঘটায়।
  5. অপারেটিং সিস্টেমের বাধাপ্রাপ্ত হ্যান্ডলারটি ফাইলটি সম্পূর্ণরূপে মেমরিতে লোড হওয়ার বিষয়ে ইভেন্ট-ভিত্তিক i / o কাঠামোটি অবহিত করে। কীভাবে তা করে? সিগন্যাল ব্যবহার করছেন ??
  6. ইভেন্টটি আই / ও কাঠামোর সমাপ্তির মধ্যে বর্তমানে কোডটি চলছে।
  7. ইভেন্ট-ভিত্তিক i / o ফ্রেমওয়ার্কটি তার সারিটি পরীক্ষা করে এবং পদক্ষেপ 5 থেকে অপারেটিং সিস্টেমের বার্তাটি দেখে এবং এটি 1 ধাপে পাওয়া কলব্যাকটি কার্যকর করে।

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


5
সংক্ষিপ্ত উত্তর: এটি সংযোগ প্রতি থ্রেড থাকার ওভারহেড সম্পর্কে আরও বেশি। অ-ব্লকিং আইও একজনকে সংযোগ প্রতি থ্রেড এড়াতে দেয়।
ড্যান ডি

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

@ অলিভারপ্লো, আমারও তাই মনে হয়, কারণ আইও ব্লক করার অর্থ সাধারণত আমরা টাস্কের সারি এবং এ জাতীয় ব্যবহার না করে সিস্টেমটিকে "সমান্তরাল পরিচালনা" পরিচালনা করি।
পেসারিয়ার

1
@ ড্যানডি।, এবং থ্রেড থাকার ওভারহেড যদি না-ব্লকিং আইও সম্পাদন করার ওভারহেডের সমান হয়? (সবুজ রঙের থ্রেডের ক্ষেত্রে সাধারণত সত্য)
পেসেরিয়র

"স্ট্যাকটি অনুলিপি করা" ঘটে না। বিভিন্ন থ্রেডের বিভিন্ন ঠিকানায় তাদের স্ট্যাক রয়েছে। প্রতিটি থ্রেডের নিজস্ব স্ট্যাক পয়েন্টার সহ অন্যান্য রেজিস্টার রয়েছে। একটি প্রসঙ্গে স্যুইচ কেবল আর্কিটেকচারাল স্টেট (সমস্ত রেজিস্টার সহ) সংরক্ষণ / পুনরুদ্ধার করে, তবে মেমরিটি নয়। একই প্রক্রিয়াতে থ্রেডের মধ্যে, কার্নেলটিকে এমনকি পৃষ্ঠা সারণীগুলি পরিবর্তন করতে হবে না।
পিটার কর্ডেস

উত্তর:


44

নন-ব্লকিং বা অ্যাসিঙ্ক্রোনাস আই / ও-এর সবচেয়ে বড় সুবিধাটি হ'ল আপনার থ্রেড সমান্তরালভাবে এর কাজ চালিয়ে যেতে পারে। অবশ্যই আপনি একটি অতিরিক্ত থ্রেড ব্যবহার করে এটি অর্জন করতে পারেন। যেমন আপনি সর্বোত্তম সামগ্রিক (সিস্টেম) পারফরম্যান্সের জন্য বলেছিলেন আমি অনুমান করি যে অ্যাসিঙ্ক্রোনাস আই / ও ব্যবহার করা ভাল এবং একাধিক থ্রেড নয় (সুতরাং থ্রেড স্যুইচিং হ্রাস করা)।

আসুন একটি নেটওয়ার্ক সার্ভার প্রোগ্রামের সম্ভাব্য বাস্তবায়নগুলি দেখুন যা সমান্তরালে সংযুক্ত 1000 ক্লায়েন্টকে পরিচালনা করবে:

  1. সংযোগ প্রতি এক থ্রেড (I / O- কে ব্লক করা হতে পারে, তবে এটি I / O- কে অবরুদ্ধ করাও হতে পারে)।
    প্রতিটি থ্রেডের জন্য মেমরি রিসোর্স প্রয়োজন (কার্নেল মেমরিও!), এটি একটি অসুবিধা। এবং প্রতিটি অতিরিক্ত থ্রেড মানে শিডিয়ুলারের জন্য আরও কাজ।
  2. সমস্ত সংযোগের জন্য একটি থ্রেড।
    এটি সিস্টেম থেকে লোড নেয় কারণ আমাদের থ্রেড কম রয়েছে। তবে এটি আপনাকে আপনার মেশিনের সম্পূর্ণ পারফরম্যান্স ব্যবহার করা থেকেও বাধা দেয়, কারণ আপনি এক প্রসেসরকে 100% এ চালানো এবং অন্য সমস্ত প্রসেসরের চারপাশে নিষ্ক্রিয় থাকতে দিতে পারেন।
  3. কয়েকটি থ্রেড যেখানে প্রতিটি থ্রেড কিছু সংযোগ পরিচালনা করে।
    এটি সিস্টেম থেকে লোড নেয় কারণ কম থ্রেড রয়েছে। এবং এটি উপলব্ধ সমস্ত প্রসেসর ব্যবহার করতে পারে। উইন্ডোজে এই পদ্ধতির থ্রেড পুল এপিআই সমর্থন করে ।

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

উইন্ডোজে আনফারড ফাইল ব্যবহার না করে I / O এর মানে হল যে লেখাগুলি একটি আকারের হতে হবে যা পৃষ্ঠার আকারের একাধিক। আমি এটি পরীক্ষা করে দেখিনি, তবে মনে হচ্ছে এটি বাফার সিঙ্ক্রোনাস এবং অ্যাসিনক্রোনাস লেখার জন্য লেখার পারফরম্যান্সকে ইতিবাচকভাবে প্রভাবিত করতে পারে।

আপনি বর্ণিত 1 থেকে 7 ধাপে এটি কীভাবে কাজ করে তা একটি ভাল ধারণা দেয়। Windows এ অপারেটিং সিস্টেম একটি অ্যাসিঙ্ক্রোনাস ইনপুট / আউটপুট (শেষ হওয়ার সম্পর্কে আপনাকে অবহিত করা হবে WriteFileসঙ্গে OVERLAPPEDগঠন) একটি ইভেন্ট বা কলব্যাক ব্যবহার করে। কলব্যাক ফাংশন শুধুমাত্র যখন আপনার কোড কল উদাহরণস্বরূপ বলা হবে WaitForMultipleObjectsExসঙ্গে bAlertableসেট true

ওয়েবে আরও কিছু পড়া:


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

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

ধন্যবাদ, এটি ওএস অ্যাসিঙ্ক ফাইল আইও সমর্থনকে জড়িত করে তোলে তবে আমি যখন এর বাস্তব প্রয়োগের জন্য কোড লিখি (ওয়েব দৃষ্টিকোণ থেকে) জাভা সার্লেট ৩.০ এনআইও দিয়ে বলি আমি এখনও অনুরোধের জন্য একটি থ্রেড এবং একটি পটভূমি থ্রেড দেখতে পাই ( async) একটি ফাইল, ডাটাবেস বা যা কিছু পড়তে লুপ করা।
জাভিয়েরজে

1
@ পিছুষগিয়াল আমি আমার উত্তরটি পুনরায় লিখেছি আমি আশা করি এটি এখন আরও পরিষ্কার হয়ে গেছে।
ওয়ার্নার হেনজে

1
উইন্ডোজে অ্যাসিক্রোনাস ফাইল আই / ও ব্যবহার করা মানে রাইটগুলি এমন আকারের হতে হবে যা পৃষ্ঠার আকারের একাধিক। - না, তা হয় না। আপনি আনফার্ডড I / O এর কথা ভাবছেন। (এগুলি প্রায়শই একসাথে ব্যবহৃত হয় তবে তাদের হতে হবে না))
হ্যারি জনস্টন

29

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

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

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

সুতরাং, @ ব্যবহারকারী 1629468 হিসাবে উল্লিখিত হিসাবে, অ্যাসিঙ্ক্রোনাস I / O আরও ভাল পারফরম্যান্স দেয় না বরং আরও ভাল স্কেলিবিলিটি সরবরাহ করে। ওয়েব অ্যাপ্লিকেশনগুলির ক্ষেত্রে এটি যেমন সীমাবদ্ধ সংখ্যক থ্রেড উপলব্ধ প্রসঙ্গে চলে তখন এটি সুস্পষ্ট। ওয়েব অ্যাপ্লিকেশন সাধারণত একটি থ্রেড পুল ব্যবহার করে যা থেকে তারা প্রতিটি অনুরোধে থ্রেড নির্ধারণ করে। দীর্ঘ সময় ধরে চলমান I / O ক্রিয়াকলাপগুলিতে অনুরোধগুলি অবরুদ্ধ করা থাকলে ওয়েব পুলটি কমিয়ে দেওয়া এবং ওয়েব অ্যাপ্লিকেশনকে হিমায়িত করা বা প্রতিক্রিয়া করতে ধীর হওয়ার ঝুঁকি রয়েছে।

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

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


আমি ভাবছি যে এটি সম্পূর্ণরূপে প্রত্যাশিত I / O অপারেশনগুলির মধ্যে একটি পার্থক্য তৈরি করার মতো কী হবে এবং যে জিনিসগুলি [উদাহরণস্বরূপ "সিরিয়াল পোর্টে আগত পরবর্তী চরিত্রটি পান", যেখানে দূরবর্তী ডিভাইস হতে পারে বা নাও পারে কিছু প্রেরণ]। যদি আই / ও অপারেশনটি কোনও যুক্তিসঙ্গত সময়ের মধ্যেই শেষ হওয়ার আশা করা হয়, অপারেশন সম্পূর্ণ না হওয়া পর্যন্ত কেউ সম্পর্কিত সংস্থানগুলি পরিষ্কার করতে বিলম্ব করতে পারে। অপারেশন যদি কখনও সম্পূর্ণ নাও হতে পারে তবে এই জাতীয় বিলম্ব অযৌক্তিক হবে।
সুপারক্যাট

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

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

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

4

এআইও ব্যবহারের মূল কারণটি স্কেলাবিলিটি। কয়েকটি থ্রেডের প্রসঙ্গে দেখা গেলে, সুবিধাগুলি সুস্পষ্ট নয়। কিন্তু যখন সিস্টেমটি থ্রেডের পরিমাণগুলিতে স্কেল করে, এআইও আরও ভাল পারফরম্যান্স সরবরাহ করবে। সতর্কবাণী হ'ল এআইও গ্রন্থাগারের আরও বাধাগুলি প্রবর্তন করা উচিত নয়।


4

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

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

সুস্পষ্ট অনুমান সহ এগুলি সম্পর্কে খুব সহজেই কথা বলা। উদাহরণস্বরূপ, কিছু দাবি করার জন্য দ্রুত "যেমন অ্যাসিনক্রোনাস I / O মাল্টি-থ্রেডেড I / O এর চেয়ে দ্রুত হবে।" এই দাবিটি বিভিন্ন কারণে সন্দেহজনক। প্রথমত, এটি এমন পরিস্থিতিতে হতে পারে যে কিছু দেওয়া অ্যাসিনক্রোনাস আই / ও কাঠামো সঠিকভাবে বহু-থ্রেডিংয়ের সাথে প্রয়োগ করা হয়, এক্ষেত্রে তারা একই রকম হয় এবং একটি ধারণা "অপরের চেয়ে দ্রুত" বলে বোঝা যায় না ।

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

আপনি যে অস্বাভাবিক বা নির্বোধ কোণে চলে যেতে পারেন তার অনেকগুলি ধারণা করা কার্যকর is

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

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

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

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

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

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

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

এটিকে রাখার আরেকটি উপায় হ'ল অপারেটিং সিস্টেমটিকে দুটি কাজের জন্য একটি একক সংস্থান ব্যবহারের অনুমতি দেওয়া অন্য কাজটির অপেক্ষায় থাকা অবস্থায় কেবল একটি কাজকে রিসোর্সটি ব্যবহার করা দেওয়া এবং তারপরে দ্বিতীয় কাজটি সিরিয়ালি শেষ করার অনুমতি দেওয়ার চেয়ে দ্রুত হতে পারে না । তদুপরি, ইন্টারলেভের সময়সূচী ব্যয়ের অর্থ যে কোনও বাস্তব পরিস্থিতিতে এটি আসলে একটি মন্দা তৈরি করে। সিপিইউ, একটি নেটওয়ার্ক রিসোর্স, একটি মেমোরি রিসোর্স, পেরিফেরিয়াল ডিভাইস, বা অন্য কোনও সিস্টেম রিসোর্সের আন্তঃবাহিত ব্যবহার ঘটে কিনা তাতে কিছু যায় আসে না।


2

I / O- কে অবরুদ্ধকরণের একটি সম্ভাব্য বাস্তবায়ন হ'ল আপনি যা বলেছেন তা হ'ল I / O কে ব্লক করে এমন কিছু পটভূমি থ্রেড যা কিছু কলব্যাক প্রক্রিয়াটির মাধ্যমে I / O এর প্রবর্তকের থ্রেডকে অবহিত করে। আসলে, গ্লিবিকের এআইও মডিউলটি এভাবে কাজ করে। বাস্তবায়ন সম্পর্কে এখানে কিছু অস্পষ্ট বিবরণ দেওয়া আছে।

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


2

আমি বর্তমানে প্রোটোথ্রেডগুলি ব্যবহার করে একটি এম্বেড প্ল্যাটফর্মে async io বাস্তবায়নের প্রক্রিয়াধীন। নন-ব্লকিং আইও 16000fps এবং 160fps এ চলার মধ্যে পার্থক্য তৈরি করে। আইও অবরুদ্ধকরণের সবচেয়ে বড় সুবিধা হ'ল হার্ডওয়্যার যখন কাজ করে তখন আপনি অন্য কোডগুলি করার জন্য আপনার কোডটি গঠন করতে পারেন। এমনকি ডিভাইসগুলির সূচনা সমান্তরালভাবেও করা যেতে পারে।

মার্টিন


1

নোডে, একাধিক থ্রেড চালু করা হচ্ছে, তবে এটি সি ++ রান-টাইমে একটি স্তর ডাউন।

"সুতরাং হ্যাঁ নোডজেএস একক থ্রেডযুক্ত, তবে এটি একটি অর্ধ সত্য, প্রকৃতপক্ষে এটি ইভেন্ট-চালিত এবং ব্যাকগ্রাউন্ড কর্মীদের সাথে একক থ্রেডযুক্ত The মূল ইভেন্ট লুপটি একক থ্রেডযুক্ত তবে বেশিরভাগ আই / ও কাজ পৃথক থ্রেডে চালিত হয়, কারণ ইভেন্টের লুপটি সামঞ্জস্য করার জন্য নোড.জেজে আই / ও এপিআইগুলি ডিজাইন অনুসারে অ্যাসিনক্রোনাস / অ-ব্লকিং রয়েছে ""

https://codeburst.io/how-node-js-single-thread-mechanism-work-understanding-event-loop-in-nodejs-230f7440b0ea

"নোড.জেএস অ-ব্লকিং যার অর্থ হ'ল সমস্ত ফাংশন (কলব্যাকস) ইভেন্ট লুপে অর্পণ করা হয় এবং সেগুলি বিভিন্ন থ্রেড দ্বারা সম্পাদিত হয় (বা এটি হতে পারে) এটি নোড.জেএস রান-টাইম দ্বারা পরিচালিত হয়" "

https://itnext.io/multi-threading-and-multi-process-in-node-js-ffa5bb5cde98 

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


0

যতদূর আমি জানি উন্নতি হ'ল অ্যাসিনক্রোনাস আই / ও ব্যবহার করে (আমি এমএস সিস্টেমের কথা বলছি, কেবল পরিষ্কার করার জন্য) তথাকথিত I / O সমাপ্তি বন্দরগুলি । অ্যাসিনক্রোনাস কলটি ব্যবহার করে কাঠামোটি স্বয়ংক্রিয়ভাবে এই জাতীয় আর্কিটেকচারকে উত্সাহ দেয় এবং মানক থ্রেডিং প্রক্রিয়াটি আরও বেশি দক্ষ হওয়ার কথা। একটি ব্যক্তিগত অভিজ্ঞতা হিসাবে আমি বলতে পারি যে আপনি থ্রেডগুলি ব্লক করার পরিবর্তে অ্যাসিঙ্ককলগুলি পছন্দ করেন তবে আপনি বোধগম্যভাবে আপনার অ্যাপ্লিকেশনটিকে আরও প্রতিক্রিয়াশীল বোধ করবেন।


0

আমি আপনাকে একটি পাল্টা নমুনা দিতে পারি যে অ্যাসিঙ্ক্রোনাস I / O কাজ করে না। আমি নীচে-ব্যবহার বাড়ানো :: asio এর মতো একটি প্রক্সি লিখছি। https://github.com/ArashPartow/proxy/blob/master/tcpproxy_server.cpp

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

সুতরাং এই async I / O ফ্রেমওয়ার্কটি আর কাজ করে না। আমাদের প্রতিটি থ্রেডকে একটি সেশন নির্ধারণ করে সার্ভারে প্রেরণের জন্য একটি থ্রেড পুল দরকার need

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