উত্তর:
আমি মনে করি যে এই আপনার প্রশ্নের উত্তর:
রিচার্ড স্টিভেনস থেকে (rstevens@noao.edu):
মূল পার্থক্য হ'ল সিলেক্ট () এর fd_set কিছুটা মাস্ক এবং তাই কিছু নির্দিষ্ট আকার রয়েছে size কার্নেলটি সঙ্কলিত হওয়ার পরে কার্নেলটি এই আকারটিকে সীমাবদ্ধ না করা সম্ভব হবে, অ্যাপ্লিকেশনটি एफডি_এসটিএসআইজেইএস যা চান তা সংজ্ঞায়িত করতে সক্ষম করে (যেমন সিস্টেমের শিরোনামে আজ মন্তব্যগুলি বোঝায়) তবে এটি আরও কাজ করে। 4.4BSD এর কার্নেল এবং সোলারিস লাইব্রেরি ফাংশন উভয়েরই এই সীমাবদ্ধতা রয়েছে। তবে আমি দেখতে পাচ্ছি যে BSD / OS 2.1 এখন এই সীমাটি এড়ানোর জন্য কোড করা হয়েছে, তাই এটি কার্যক্ষম, কেবল প্রোগ্রামিংয়ের একটি ছোট বিষয়। :-) কারও উচিত এই সম্পর্কে একটি সোলারিস বাগ রিপোর্ট দায়ের করা উচিত এবং এটি কখনই ঠিক হয়ে যায় কিনা তা দেখুন।
পোল () এর সাহায্যে তবে ব্যবহারকারীকে অবশ্যই পোল্ফড স্ট্রাকচারের একটি অ্যারে বরাদ্দ করতে হবে এবং এই অ্যারেটিতে প্রবেশের সংখ্যাটি পাস করতে হবে, সুতরাং কোনও মৌলিক সীমা নেই। ক্যাস্পার নোট হিসাবে, কম সিস্টেমে নির্বাচনের চেয়ে বেশি পোল () রয়েছে, সুতরাং আধুনিকগুলি আরও বহনযোগ্য। এছাড়াও, মূল বাস্তবায়ন (এসভিআর 3) এর সাহায্যে আপনি কার্নেলকে পোল্ফড স্ট্রাকচারে কোনও এন্ট্রি উপেক্ষা করার জন্য বলার জন্য -1 এ সেট করতে পারেননি, যার ফলে অ্যারে থেকে এন্ট্রিগুলি সরিয়ে নেওয়া শক্ত হয়ে পড়ে; এসভিআর 4 এটিকে ঘিরে। ব্যক্তিগতভাবে, আমি সর্বদা নির্বাচন () এবং খুব কমই পোল () ব্যবহার করি কারণ আমি আমার কোডটি বিএসডি পরিবেশেও পোর্ট করি। কেউ এই পরিবেশের জন্য জরিপ () নির্বাচন করুন () ব্যবহার করে এমন একটি বাস্তবায়ন লিখতে পারে, তবে আমি এর আগে কখনও দেখিনি। নির্বাচন () এবং জরিপ () উভয়ই POSIX 1003.1g দ্বারা প্রমিত করা হচ্ছে।
উপরে বর্ণিত ইমেলটি কমপক্ষে 2001 এর মত পুরানো; poll()
বাসদ সহ - কমান্ড NOW (2017) সমস্ত অধুনিক অপারেটিং সিস্টেম জুড়ে সমর্থিত। আসলে, কিছু লোক বিশ্বাস করে যে select()
এটিকে অবমূল্যায়ন করা উচিত । মতামতগুলি বাদ দিয়ে, চারপাশের বহনযোগ্যতার সমস্যাগুলি poll()
আধুনিক সিস্টেমগুলির জন্য আর উদ্বেগের বিষয় নয়। তদ্ব্যতীত, epoll()
এর পর থেকে বিকাশ করা হয়েছে (আপনি ম্যান পৃষ্ঠাটি পড়তে পারেন ), এবং জনপ্রিয়তায় বাড়তে থাকে
আধুনিক বিকাশের জন্য আপনি সম্ভবত ব্যবহার করতে চান না select()
, যদিও এর সাথে স্পষ্টতই কিছু ভুল নেই। poll()
, এবং এটি আরও আধুনিক বিবর্তন epoll()
, select()
এতে সীমাবদ্ধতা ভোগ না করে একই বৈশিষ্ট্যগুলি (এবং আরও অনেকগুলি) সরবরাহ করে।
select
বা poll
:(
select()
কল আপনি কোন সকেট এবং ফাইল বর্ণনাকারী পড়ার জন্য আপনাকে দেখার জন্য, লেখা চান চিহ্ন তিনটি bitmasks, এবং ত্রুটি, এবং তারপর অপারেটিং সিস্টেম চিহ্ন যা আসলে বেশী কার্যকলাপ কিছু ছিল তৈরি আছে; poll()
আপনি কি বর্ণনাকারী আইডিগুলির একটি তালিকা তৈরি করেছেন এবং অপারেটিং সিস্টেমটি প্রতিটি ঘটেছে কি ধরনের ইভেন্টের সাথে চিহ্নিত করে ।
select()
পদ্ধতি বরং ক্লাঙ্কি এবং অদক্ষ হয়।
একটি প্রক্রিয়াটিতে সাধারণত এক হাজারেরও বেশি সম্ভাব্য ফাইল বর্ণনাকারী উপলব্ধ। যদি দীর্ঘ-চলমান প্রক্রিয়াটিতে কেবল কয়েকটি সংখ্যক বর্ণনাকারী খোলা থাকে তবে তাদের মধ্যে কমপক্ষে একজনকে একটি উচ্চ সংখ্যা অর্পণ করা হয়েছে, তবে select()
বিটমাস্ককে সেই সর্বোচ্চ বর্ণনাকারীর জন্য যথেষ্ট পরিমাণে থাকতে হবে - সুতরাং শত শত বিটগুলির পুরো রেঞ্জগুলি হবে অপসেট থাকুন যে অপারেটিং সিস্টেমটি কেবলমাত্র select()
সেগুলি আনসেট করা আছে না তা আবিষ্কার করতে প্রতিটি কলই লুপ করতে হয়।
একবার select()
ফিরে আসার পরে , কলকারীকে কী ঘটেছে তা নির্ধারণ করতে তিনটি বিটমাস্কের উপর দিয়ে লুপ করতে হবে। খুব সাধারণ অ্যাপ্লিকেশনগুলিতে কেবল একটি বা দুটি ফাইল বর্ণনাকারী যে কোনও মুহুর্তে নতুন ট্র্যাফিক পাবেন, তবুও তিনটি বিটমাস্কগুলি অবশ্যই কোন বর্ণনাকারী তা আবিষ্কার করতে শেষ পর্যন্ত সমস্তভাবে পড়তে হবে।
অপারেটিং সিস্টেম বিটমাস্কগুলি পুনরায় লিখে আপনার ক্রিয়াকলাপের সংকেত দেয় বলে সেগুলি নষ্ট হয়ে গেছে এবং আপনি যে ফাইল বিবরণী শুনতে চান তার তালিকায় আর চিহ্নিত হবে না। হয় আপনি স্মৃতিতে রাখে এমন কিছু অন্য তালিকা থেকে পুরো বিটমাস্কটি পুনর্নির্মাণ করতে হবে, বা memcpy()
প্রতিটি বিটমাস্কের নকল অনুলিপি এবং প্রতিটি select()
কলের পরে নষ্ট বিটমাস্কের উপরে আপনাকে ডেটা ব্লক রাখতে হবে ।
সুতরাং poll()
পদ্ধতিটি আরও ভালভাবে কাজ করে কারণ আপনি একই ডেটা কাঠামোটি পুনরায় ব্যবহার করতে পারেন।
প্রকৃতপক্ষে, poll()
আধুনিক লিনাক্স কার্নেলগুলিতে আরও একটি প্রক্রিয়া অনুপ্রেরণা জাগিয়ে তুলেছে : epoll()
যা স্কেলাবিলিটিতে আরও একটি লাফিয়ে উঠার মেকানিজমকে আরও উন্নত করে, কারণ আজকের সার্ভারগুলি প্রায়শই একসাথে কয়েক হাজার সংযোগ পরিচালনা করতে চায়। এটি প্রয়াসের একটি ভাল ভূমিকা:
http://scotdoyle.com/python-epoll-howto.html
যদিও এই লিঙ্কটিতে কিছু উপকারিতাগুলি প্রদর্শন করার জন্য কিছু দুর্দান্ত গ্রাফ রয়েছে epoll()
(আপনি খেয়াল করবেন যে select()
এই বিন্দুটি এতটা অক্ষম এবং পুরানো ধরণের হিসাবে বিবেচিত যে এটি এই গ্রাফগুলিতে একটি লাইনও পায় না!):
http://lse.sourceforge.net/epoll/index.html
আপডেট: এখানে আরেকটি স্ট্যাক ওভারফ্লো প্রশ্ন, যার উত্তরগুলি পার্থক্য সম্পর্কে আরও বিশদ দেয়:
উভয়ই ধীরে ধীরে এবং বেশিরভাগই একই , তবে আকারে এবং কিছু ধরণের বৈশিষ্ট্যগুলি পৃথক!
আপনি যখন একটি পুনরুক্তি লেখেন, আপনাকে select
প্রতিবারের সেটটি অনুলিপি করতে হবে ! যদিও poll
নির্ধারণ করেছে সমস্যা এই ধরনের সুন্দর কোড আছে। আর একটি পার্থক্য হ'ল poll
ডিফল্টরূপে 1024 টিরও বেশি ফাইল বর্ণনাকারী (এফডি) পরিচালনা করতে পারে। poll
এই ধরণের কাজটি পরিচালনা করার জন্য প্রচুর ভেরিয়েবলের পরিবর্তে প্রোগ্রামটিকে আরও পঠনযোগ্য করে তোলার জন্য বিভিন্ন ইভেন্ট হ্যান্ডেল করতে পারে। মধ্যে অপারেশনস poll
এবং select
রৈখিক এবং কারণ চেক অনেকটা থাকার ধীর।