পোল এবং নির্বাচনের মধ্যে পার্থক্য কী?


উত্তর:


90

আমি মনে করি যে এই আপনার প্রশ্নের উত্তর:

রিচার্ড স্টিভেনস থেকে (rstevens@noao.edu):

মূল পার্থক্য হ'ল সিলেক্ট () এর fd_set কিছুটা মাস্ক এবং তাই কিছু নির্দিষ্ট আকার রয়েছে size কার্নেলটি সঙ্কলিত হওয়ার পরে কার্নেলটি এই আকারটিকে সীমাবদ্ধ না করা সম্ভব হবে, অ্যাপ্লিকেশনটি एफডি_এসটিএসআইজেইএস যা চান তা সংজ্ঞায়িত করতে সক্ষম করে (যেমন সিস্টেমের শিরোনামে আজ মন্তব্যগুলি বোঝায়) তবে এটি আরও কাজ করে। 4.4BSD এর কার্নেল এবং সোলারিস লাইব্রেরি ফাংশন উভয়েরই এই সীমাবদ্ধতা রয়েছে। তবে আমি দেখতে পাচ্ছি যে BSD / OS 2.1 এখন এই সীমাটি এড়ানোর জন্য কোড করা হয়েছে, তাই এটি কার্যক্ষম, কেবল প্রোগ্রামিংয়ের একটি ছোট বিষয়। :-) কারও উচিত এই সম্পর্কে একটি সোলারিস বাগ রিপোর্ট দায়ের করা উচিত এবং এটি কখনই ঠিক হয়ে যায় কিনা তা দেখুন।

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

অক্টোবর 2017 আপডেট:

উপরে বর্ণিত ইমেলটি কমপক্ষে 2001 এর মত পুরানো; poll()বাসদ সহ - কমান্ড NOW (2017) সমস্ত অধুনিক অপারেটিং সিস্টেম জুড়ে সমর্থিত। আসলে, কিছু লোক বিশ্বাস করে যে select() এটিকে অবমূল্যায়ন করা উচিত । মতামতগুলি বাদ দিয়ে, চারপাশের বহনযোগ্যতার সমস্যাগুলি poll()আধুনিক সিস্টেমগুলির জন্য আর উদ্বেগের বিষয় নয়। তদ্ব্যতীত, epoll()এর পর থেকে বিকাশ করা হয়েছে (আপনি ম্যান পৃষ্ঠাটি পড়তে পারেন ), এবং জনপ্রিয়তায় বাড়তে থাকে

আধুনিক বিকাশের জন্য আপনি সম্ভবত ব্যবহার করতে চান না select(), যদিও এর সাথে স্পষ্টতই কিছু ভুল নেই। poll(), এবং এটি আরও আধুনিক বিবর্তন epoll(), select()এতে সীমাবদ্ধতা ভোগ না করে একই বৈশিষ্ট্যগুলি (এবং আরও অনেকগুলি) সরবরাহ করে।


15
স্টিভেন্সের উত্তর কখন লেখা হয়েছিল? বিএসডি তে পোল () না পাওয়া সম্পর্কে মন্তব্যটি কি এখনও প্রয়োগ হয়? ম্যাকোস এক্স (যা আংশিকভাবে BSD এর উপর ভিত্তি করে আছে) এর পোল রয়েছে (), এবং পসিক্স স্ট্যান্ডার্ড (POSIX ২০০৮) এর এটির প্রয়োজন।
জোনাথন লেফলার

12
সমৃদ্ধ স্টিভেনস ১৯৯৯ সালের সেপ্টেম্বরে মারা গেলেন, সুতরাং উত্তরটি তার চেয়ে পুরনো হতে হবে। তিনি বিএসডি / ওএস ২.১-এ একটি নতুন পরিবর্তন দেখার উল্লেখ করেছেন, যা ১৯৯ 1996 সালের জানুয়ারিতে প্রকাশিত হয়েছিল, সম্ভবত তখন প্রায়।
অ্যালাঙ্ক

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

9
@StevenLu হ্যাঁ, কিন্তু দুর্ভাগ্যবশত উপর কিনা AJAX এর / WebSocket ব্যবহার করছে কোন শব্দ selectবা poll:(
ক্রিস্টোফার শুলজ

> কেউ এই পরিবেশের জন্য জরিপ () নির্বাচন () ব্যবহার করে এমন একটি বাস্তবায়ন লিখতে পারে, তবে আমি এর আগে কখনও দেখিনি। জাভা তাই করে ;-)
সের্গেই মাশকভ

229

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

select()পদ্ধতি বরং ক্লাঙ্কি এবং অদক্ষ হয়।

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

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

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

সুতরাং poll()পদ্ধতিটি আরও ভালভাবে কাজ করে কারণ আপনি একই ডেটা কাঠামোটি পুনরায় ব্যবহার করতে পারেন।

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

http://scotdoyle.com/python-epoll-howto.html

যদিও এই লিঙ্কটিতে কিছু উপকারিতাগুলি প্রদর্শন করার জন্য কিছু দুর্দান্ত গ্রাফ রয়েছে epoll()(আপনি খেয়াল করবেন যে select()এই বিন্দুটি এতটা অক্ষম এবং পুরানো ধরণের হিসাবে বিবেচিত যে এটি এই গ্রাফগুলিতে একটি লাইনও পায় না!):

http://lse.sourceforge.net/epoll/index.html


আপডেট: এখানে আরেকটি স্ট্যাক ওভারফ্লো প্রশ্ন, যার উত্তরগুলি পার্থক্য সম্পর্কে আরও বিশদ দেয়:

ট্যুইস্টডে সিলেক্ট / পোল বনাম এপল রিএ্যাক্টরের গুহাত


1
অজগরটিতে এপল ব্যবহারের উদাহরণের সাথে সংযোগের জন্য +1 - দেখে মনে হচ্ছে সেখানে কিছু আকর্ষণীয় উদাহরণ রয়েছে এবং আমি তাদের চেষ্টা করে দেখতে চাই ...
অ্যালেন জর্জ

উত্তরটি ব্যাখ্যা করার জন্য +1; এপোল উল্লেখ করার জন্য -1 তবে কেকিউ নয়
শুভ ব্যক্তি

এই উত্তরটি
এপলটি

0

উভয়ই ধীরে ধীরে এবং বেশিরভাগই একই , তবে আকারে এবং কিছু ধরণের বৈশিষ্ট্যগুলি পৃথক!

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

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