পটভূমি:
সিস্টেম কল ওভারহেড ফাংশন কল ওভারহেডের তুলনায় অনেক বড় (আনুমানিক 20-100x হতে পারে) ব্যবহারকারী স্থান থেকে কার্নেল স্পেস এবং পিছনে প্রসঙ্গে স্যুইচ করার কারণে to ফাংশন কল ওভারহেড সংরক্ষণ করার জন্য ইনলাইন ফাংশনগুলি সাধারণ এবং সিস্কলগুলির চেয়ে ফাংশন কলগুলি অনেক সস্তা। এটি যুক্তিতে দাঁড়ায় যে বিকাশকারীরা একটি সিস্টেমে যতটা সম্ভব ইন-কার্নেল অপারেশন যত্ন নিয়ে সিস্টেম কল ওভারহেডের কিছু এড়াতে চান।
সমস্যা:
এই (? অপর্যাপ্ত) -এর মত সিস্টেম কল অনেকটা সৃষ্টি করেছেন sendmmsg () , recvmmsg () : ভাল chdir, খোলা, lseek এবং / অথবা মত সিমবলিক লিঙ্ক সমন্বয় হিসাবে হিসাবে openat
, mkdirat
, mknodat
, fchownat
, futimesat
, newfstatat
, unlinkat
, fchdir
, ftruncate
, fchmod
, renameat
, linkat
, symlinkat
, readlinkat
, fchmodat
, faccessat
, lsetxattr
, fsetxattr
, execveat
, lgetxattr
, llistxattr
, lremovexattr
, fremovexattr
, flistxattr
, fgetxattr
, pread
, pwrite
ইত্যাদি ...
এখন লিনাক্স যুক্ত করেছে copy_file_range()
যা আপাতদৃষ্টিতে লিডিক রিড এবং সিস্কল লেখার সংমিশ্রণ করেছে । এটি fcopy_file_range (), lcopy_file_range (), copy_file_rangeat (), fcopy_file_rangeat () এবং lcopy_file_rangeat () হয়ে ওঠার আগে এটি কেবল সময়ের বিষয় ... তবে যেহেতু এক্স আরও কলগুলির পরিবর্তে 2 টি ফাইল জড়িত রয়েছে, তাই এটি এক্স 2-এ পরিণত হতে পারে আরও অনেক কিছু। ঠিক আছে, লিনাস এবং বিভিন্ন বিএসডি বিকাশকারীরা এটিকে এতদূর যেতে দেয় না, তবে আমার বক্তব্যটি হ'ল যদি কোনও ব্যাচিং সিস্কেল থাকত তবে এগুলির সমস্ত (বেশিরভাগ?) ব্যবহারকারীর জায়গায় প্রয়োগ করা যেতে পারে এবং বেশি কিছু না যুক্ত করে কার্নেলের জটিলতা হ্রাস করতে পারে যদি libc দিকে কোনও ওভারহেড থাকে।
অনেক জটিল সমাধান প্রস্তাব করা হয়েছে যেগুলি ব্যাচ প্রক্রিয়া সিস্কলগুলি অ-ব্লকিং সিস্টাকলগুলির জন্য কিছু ফর্ম বিশেষ সিস্কেল থ্রেড অন্তর্ভুক্ত করে; তবে এই পদ্ধতিগুলি libxcb বনাম libX11 এর মতো একই উপায়ে কার্নেল এবং ব্যবহারকারীর স্থান উভয়ের ক্ষেত্রে উল্লেখযোগ্য জটিলতা যুক্ত করে (অ্যাসিনক্রোনাস কলগুলিকে আরও অনেক সেটআপ প্রয়োজন)
সমাধান ?:
একটি জেনেরিক ব্যাচিং সিস্টেল। এটি বিশেষায়িত কার্নেল থ্রেডের সাথে সম্পর্কিত জটিলতা ছাড়াই সবচেয়ে বড় ব্যয় (একাধিক মোড স্যুইচ) হ্রাস করতে পারে (যদিও সেই কার্যকারিতাটি পরে যুক্ত করা যেতে পারে)।
সকেটকল () সিস্কেলটিতে মূলত প্রোটোটাইপের জন্য ইতিমধ্যে একটি ভাল ভিত্তি রয়েছে। পরিবর্তে আর্গুমেন্টের অ্যারে নেওয়া থেকে এটির পরিবর্তে প্রসারিত করুন, রিটার্নের অ্যারে নিতে পয়েন্টার, আর্গুমেন্টের অ্যারেগুলিতে পয়েন্টার (যার মধ্যে সিস্কাল নম্বর অন্তর্ভুক্ত), সাইককলের সংখ্যা এবং একটি পতাকা আর্গুমেন্ট ... এর মতো কিছু:
batch(void *returns, void *args, long ncalls, long flags);
একটি প্রধান পার্থক্য হ'ল আর্গুমেন্টগুলি সম্ভবত সমস্ত সরলতার জন্য পয়েন্টার হওয়া দরকার যাতে পূর্ববর্তী সাইকেলের ফলাফলগুলি পরবর্তী সিস্টেমে ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ / ফাইলের open()
জন্য ফাইল বর্ণনাকারী read()
/ ব্যবহারের জন্য write()
)
কিছু সম্ভাব্য সুবিধা:
- কম ব্যবহারকারীর স্থান -> কার্নেল স্পেস -> ব্যবহারকারীর স্থান স্যুইচিং
- স্বয়ংক্রিয়ভাবে ব্যাচের চেষ্টা করার জন্য সম্ভাব্য সংকলক স্যুইচ -ফকম্বাইন-সাইক্ল্যাক্স
- অ্যাসিনক্রোনাস অপারেশনের জন্য flagচ্ছিক পতাকা (অবিলম্বে দেখার জন্য এফডি ফিরে)
- ভবিষ্যতে ইউজারস্পেসে সম্মিলিত সিস্টেল ফাংশনগুলি প্রয়োগ করার ক্ষমতা
প্রশ্ন:
একটি ব্যাচিং সিস্টেমটি বাস্তবায়িত করা কি সম্ভব?
- আমি কি কিছু সুস্পষ্ট গোটাচা মিস করছি?
- আমি কি সুবিধাগুলি অত্যধিক বিবেচনা করছি?
ব্যাচিং সিস্কেল (আমি ইন্টেল, গুগল বা রেডহ্যাটে কাজ করি না) বাস্তবায়নে বিরক্ত করা কি আমার পক্ষে সার্থক?
- আমি এর আগে আমার নিজের কার্নেলটি প্যাচ করেছি, তবে এলকেএমএল নিয়ে ভয় দেখাচ্ছি।
- ইতিহাস দেখিয়েছে যে কোনও কিছু "সাধারণ" ব্যবহারকারীদের জন্য (গিট রাইটিং অ্যাক্সেসবিহীন অ-কর্পোরেট শেষ ব্যবহারকারী) পক্ষে ব্যাপকভাবে কার্যকর হলেও এটি কখনও কখনও প্রবাহিত (ইউনিয়নফ, অউফস, ক্রিপ্টোডেভ, টাকসোনাইস, ইত্যাদি) গ্রহণ করতে পারে না)
তথ্যসূত্র:
batch
সিস্কলগুলিতে সিস্কলগুলিকে বাসা বেঁধেbatch
, আপনি স্বেচ্ছাসেবী সাইস্কেলের একটি নির্বিচারে গভীর কল ট্রি তৈরি করতে পারেন। মূলত, আপনি আপনার পুরো অ্যাপ্লিকেশনটিকে একটি একক সিস্টেমে রাখতে পারেন।