সিস্টেম কল নির্বাচন করার জন্য প্রথম যুক্তির উদ্দেশ্য কী?


25

থেকে man select

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);

এনএফডিএস হ'ল তিনটি সেট এর যেকোন একটিতে সর্বাধিক সংখ্যাযুক্ত ফাইল বর্ণনাকারী 1

উদ্দেশ্য কি nfds, যখন আমরা ইতিমধ্যে আছে readfds, writefdsএবং exceptfds, যা থেকে ফাইল বর্ণনাকারী নির্ধারিত করা যেতে পারে?


আমি এসও সম্পর্কে জিজ্ঞাসা করতে যাচ্ছিলাম, তবে এটি এখানে আরও কেন্দ্রিয় করা হয়েছে, এবং সিপিআই কলগুলি বিষয়বস্তু হিসাবে বিবেচিত হয়
ফুনেহে

উত্তর:


25

ইন "UNIX পরিবেশে উন্নত প্রোগ্রামিং" , লে রিচার্ড স্টিভেনস বলেছেন একটি কার্যকারিতা অপ্টিমাইজেশান হল:

আমাদের আগ্রহী সর্বোচ্চ বর্ণনাকারী উল্লেখ করে, কার্নেলটি তিনটি বর্ণনাকারী সেটগুলিতে চালু না হওয়া বিটগুলির সন্ধানে তিনটি অব্যবহৃত বিটের মধ্য দিয়ে যাওয়া এড়াতে পারে।

(প্রথম সংস্করণ, পৃষ্ঠা 399)

আপনি যদি কোনও ধরণের ইউনিক্স সিস্টেম প্রোগ্রামিং করে থাকেন তবে এপিইউ বইটি সুপারিশ করা হয়।


হালনাগাদ

একটি fd_setসাধারণত 1024 ফাইল বিবরণকারী ট্র্যাক করতে সক্ষম হয়।

কোনটি fdsসেট করা আছে 0এবং কোনটি সেট করা আছে তা ট্র্যাক করার সর্বাধিক কার্যকরী উপায় 1বিটসেট হতে পারে, তাই প্রতিটিতে fd_set1024 বিট থাকে।

একটি 32-বিট সিস্টেমে একটি দীর্ঘ ইনট (বা "শব্দ") 32 বিট হয়, যার অর্থ প্রতিটি fd_setহ'ল
1024/32 = 32 শব্দ।

যদি nfds8 বা 16 এর মতো ছোট কিছু হয় তবে এটি এটি অনেক অ্যাপ্লিকেশনগুলিতে হবে তবে কেবলমাত্র 1 ম শব্দের ভিতরে এটি দেখতে হবে যা স্পষ্টতই সমস্ত 32 এর ভিতরে দেখার চেয়ে দ্রুত হওয়া উচিত।

(দেখুন FD_SETSIZEএবং __NFDBITSথেকে /usr/include/sys/select.hআপনার প্ল্যাটফর্মে মানের জন্য।)


আপডেট 2

কেন ফাংশন স্বাক্ষর নয়

int select(fd_set *readfds, int nreadfds,
           fd_set *writefds, int nwritefds,
           fd_set *exceptfds, int nexceptfds,
           struct timeval *timeout);

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

সুতরাং অন্য কথায়, selectএকটি বাস্তবায়ন বিশদটি প্রকাশ করা হচ্ছে যাতে এটি আরও দ্রুত হতে পারে।



এপিইউ সম্প্রতি আপডেট হয়েছিল। দ্বিতীয় সংস্করণ: amazon.com/gp/aw/d.html/ref=aw_d_detail?pd=1&a=0201433079
মাইকেল

@ ক্রিস আমি লিনাক্স প্রোগ্রামিং ইন্টারফেস চেক করব। ধন্যবাদ।
মাইকেল

তথ্যের জন্য ধন্যবাদ, আমি কিছুটা সময় নেওয়ার সময় আমি বইগুলি পরীক্ষা করব।
ফুনেহে

এপিইউ ২ য় এড: ২ 27 শে জুন, ২০০ ((লিনাক্স -২.৪.২২ অন্তর্ভুক্ত) টিএলপিআই: অক্টোবর ২০১০ (লিনাক্স -২.6.৩৫ কভার)
ক্রিস

6

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

মনে রাখবেন যে 80 এর দশকের গোড়ার দিকে, যখন নির্বাচন () পরিচয় করানো হয়েছিল, তাদের সাথে কাজ করার জন্য মাল্টি-গিগাবার্টজ, মাল্টি-প্রসেসর ছিল না। একটি 25 মেগাহার্টজ ভ্যাক্স দ্রুত ডগগন দ্রুত ছিল। এছাড়াও, আপনি () কাজ করতে পারলে দ্রুত কাজ করতে বাছাই করতে চেয়েছিলেন: যদি কিছু I / O প্রক্রিয়াটির জন্য অপেক্ষা করছিল, তবে কেন প্রক্রিয়াটি অপেক্ষা করবেন?


আপনার যুক্তি দিয়ে আমি বলতে চাই আমাদের প্রয়োজন nreadfds, nwritefdsএবং nexceptfdsকেবল একটির পরিবর্তে nfds
ফুনেহে

nfdsদ্রুত এটি অ্যাক্সেসের জন্য একটি রেজিস্টার যেতে পারে তাই এটি হতে পারে । যদি এটির অন্যান্য সমস্ত যুক্তি সহ তিনটি সংখ্যা ট্র্যাক করতে হয়, তবে সিপিইউতে পর্যাপ্ত রেজিস্ট্রার না থাকত। অবশ্যই, nfdsআপনার অনুমানিক 3 ভেরিয়েবলের উপর ভিত্তি করে কার্নেলটি নিজস্ব তৈরি করতে পারত । সুতরাং আমার ধারণা এটি দক্ষতা অর্জনের জন্য একটি বাস্তবায়ন বিশদটি প্রকাশ করছে।
মিকেল

@ মাইকেল, ফুনেহে: পৃথক nfdsযুক্তি দিয়ে খুব অল্প লাভ হবে। বেশিরভাগ সময়, এই প্রক্রিয়াটি খুব কম প্রসেসের সাথে সম্পর্কিত হয়েছে FD_SETSIZE। একটি সাধারণ ক্ষেত্রে 1024 এর মধ্যে (4,4,2) থাকতে পারে; কার্নেল চেক (4,4,4) তৈরি করা (1024,1024,1024) ওভারে একটি বড় জয়, তবে (4,4,2) এ নামিয়ে আনাই হবে অকেজো।
গিলস

@ গিলস: লাভটি ক্লিনার এপিআই হবে। (যেমনটি হ'ল, হয় প্রোগ্রামারকে গণনার জন্য অতিরিক্ত কাজ করতে nfdsহবে, বা অলস হতে হবে এবং কল select(FD_SETSIZE, ...)করতে হবে, যা ধীর হবে))
মাইকেল

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