পাইপলাইনগুলি কীভাবে মেমরির ব্যবহার সীমিত করে?


36

ব্রায়ান কর্নিগান এই ভিডিওটিতে ব্যাখ্যা করেছেন যে স্মৃতি সীমাবদ্ধতার ভিত্তিতে ছোট্ট ভাষা / প্রোগ্রামগুলিতে প্রাথমিক বেল ল্যাবসের আকর্ষণ

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

তবে আমি বুঝতে পারি না কীভাবে এটি প্রোগ্রামগুলির মধ্যে সঞ্চারের জন্য ডেটা র‍্যামে সংরক্ষণ করতে হবে তা বিবেচনা করে মেমরির ব্যবহার সীমিত করতে পারে।

উইকিপিডিয়া থেকে :

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

এটি আমাকে আরও বিভ্রান্ত করে, কারণ এটি ছোট প্রোগ্রামগুলির উদ্দেশ্যকে পুরোপুরি পরাভূত করে (যদিও তারা একটি নির্দিষ্ট স্কেল পর্যন্ত মডুলার হবে)।

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

টেম্প ফাইলগুলি ব্যবহার করা হলে এগুলি সমস্ত কিছু বোঝার সুযোগ করে দেবে, তবে এটি আমার বোধগম্য যে পাইপগুলি ডিস্কে লেখেন না (যদি না অদলবদ ব্যবহার না করা হয়)।

উদাহরণ:

sed 'simplesubstitution' file | sort | uniq > file2

আমার কাছে এটি স্পষ্ট যে sedফাইলটি পড়ছে এবং লাইন ভিত্তিতে একটি লাইনে থুতু দিচ্ছে। তবে sort, লিঙ্কযুক্ত ভিডিওতে বিকে যেমন বলা হয়েছে, সম্পূর্ণ স্টপ, সুতরাং সমস্ত ডেটা মেমোরিতে পড়তে হবে (বা এটি হয়?), তারপরে এটি দেওয়া হয়েছে uniq, যা (আমার মনে) এটি হবে -লাইন-এ-এ-টাইম প্রোগ্রাম। তবে প্রথম এবং দ্বিতীয় পাইপের মধ্যে সমস্ত ডেটা মেমোরিতে থাকতে হবে, না?


1
unless swap is usedপর্যাপ্ত র‍্যাম না থাকলে সর্বদা অদলবদল ব্যবহৃত হয়
edc65

উত্তর:


44

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

আপনার উদাহরণে,

sed 'simplesubstitution' file | sort | uniq > file2

sedfileপ্রয়োজনীয় হিসাবে ডেটা পড়েন , তারপরে যতক্ষণ না sortএটি পড়ার জন্য প্রস্তুত থাকে ততক্ষণ এটি লেখেন ; যদি sortপ্রস্তুত না হয়, লেখার ব্লক। ডেটা প্রকৃতপক্ষে স্মৃতিতে বেঁচে থাকে, তবে এটি সুনির্দিষ্ট sortএবং sortকোনও সমস্যা মোকাবেলা করতে প্রস্তুত (এটি অস্থায়ী ফাইলগুলি ব্যবহার করবে এটি সাজানোর জন্য ডেটার পরিমাণ খুব বড়))

আপনি দৌড়াদৌড়ি দ্বারা অবরুদ্ধ আচরণ দেখতে পাবেন

strace seq 1000000 -1 1 | (sleep 120; sort -n)

এটি পর্যাপ্ত পরিমাণে ডেটা তৈরি করে এবং এমন একটি প্রক্রিয়াতে পাইপ দেয় যা প্রথম দুই মিনিটের জন্য কোনও কিছু পড়তে প্রস্তুত নয় । আপনি বেশ কয়েকটি writeঅপারেশন দেখতে পাচ্ছেন , তবে খুব তাড়াতাড়ি seqবন্ধ হয়ে যাবে এবং কার্নেল দ্বারা ব্লক হওয়া ( writeসিস্টেম কল অপেক্ষা করে) দুটি মিনিট সময় কাটানোর জন্য অপেক্ষা করবে ।


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

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

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

6
প্রোগ্রাম "একই সময়ে" শুরু হয় @malan ধারণার দিক থেকে সব ইউনিক্স সিস্টেম, যথেষ্ট RAM- র সাথে আধুনিক multiprocessor সিস্টেমে তাদের রাখা মানে তারা আক্ষরিক সব একই সময়ে র্যাম অনুষ্ঠিত করছি, যখন একটি সিস্টেম পারে এগুলি সমস্ত একই সময়ে র‍্যামে ধরে রাখবেন না, কেউ কেউ ডিস্কে সরে যায়। আরও মনে রাখবেন যে প্রচুর প্রসঙ্গে "মেমরি" মানে ভার্চুয়াল মেমরি যা ডিস্কের র‌্যাম স্পেস এবং স্ব্যাপ স্পেস উভয়ের যোগফল। উইকিপিডিয়া বাস্তবায়নের বিশদটির পরিবর্তে ধারণার দিকে মনোনিবেশ করছে, বিশেষত কারণ ইউনিক্স কীভাবে বাস্তবে কাজ করেছিল তা এখন কম প্রাসঙ্গিক।
mtraceur

2
@ ম্যালান এছাড়াও, আপনি যে দ্বন্দ্বটি দেখছেন তা "মেমরি" (র্যাম বনাম র‌্যাম + স্ব্যাপ) এর দুটি পৃথক অর্থ থেকে আসে। আমি কেবল হার্ডওয়্যার র‌্যামের কথা বলছিলাম, এবং সেই প্রসঙ্গে কেবলমাত্র সিপিইউ দ্বারা সম্পাদিত কোডটি অবশ্যই র‌্যামের মধ্যে ফিট করা দরকার (যা কর্নিগান যে সিদ্ধান্তগুলির বিষয়ে কথা বলছিলেন সেগুলি প্রভাবিত করছিল), যখন সমস্ত প্রোগ্রামের প্রেক্ষাপটে যুক্তিযুক্তভাবে কার্যকর করা হয়েছিল ওএস দ্বারা একটি নির্দিষ্ট সময়ে (বিস্তৃত স্তরের উপরের বিমূর্ত স্তরে স্লাইসিংয়ের মাধ্যমে) একটি প্রোগ্রামের কেবল ওএসের কাছে উপলব্ধ পুরো ভার্চুয়াল মেমরির মধ্যে ফিট করা দরকার, যার মধ্যে ডিস্কে অদলবদল অন্তর্ভুক্ত রয়েছে।
mtraceur

34

তবে আমি বুঝতে পারি না কীভাবে এটি প্রোগ্রামগুলির মধ্যে সঞ্চারের জন্য ডেটা র‍্যামে সংরক্ষণ করতে হবে তা বিবেচনা করে মেমরির ব্যবহার সীমিত করতে পারে।

এটি আপনার মৌলিক ত্রুটি। ইউনিক্সের প্রাথমিক সংস্করণগুলিতে র‌্যামে পাইপ ডেটা রাখা হয়নি। তারা তাদের ডিস্কে সংরক্ষণ করে। পাইপের আই-নোড ছিল; পাইপ ডিভাইসটি চিহ্নিত করা হয়েছিল এমন একটি ডিস্ক ডিভাইসে । সিস্টেম অ্যাডমিনিস্ট্রেটর /etc/configকোন ডিস্কের ভিত্তিতে পাইপ ডিভাইস, কোন ভলিউমটি রুট ডিভাইস এবং কোনটি ডাম্প ডিভাইস নির্দিষ্ট করার জন্য একটি প্রোগ্রাম চালিয়েছিল (অন্যান্য জিনিসের মধ্যে) ।

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

এই প্রক্রিয়াটি অন্যদের দ্বারা 1980 এর দশকের শেষের দিকে প্রতিস্থাপন করা হয়েছিল। এসসিও এক্সেনেক্স "হাই পারফরম্যান্স পাইপ সিস্টেম" অর্জন করেছে, যা আই-নোডগুলি ইন-কোর বাফারগুলির সাথে প্রতিস্থাপন করেছে। 4BSD সকেটপেইরে নামবিহীন পাইপ তৈরি করেছে। স্ট্রেম মেকানিজম ব্যবহার করে এটি অ্যান্ড টি পুনরায় প্রয়োগ করা পাইপ।

এবং অবশ্যই sortপ্রোগ্রামটি 32KiB খণ্ডগুলির সীমিত অভ্যন্তরীণ ধরণের পরিবেশন করেছে (বা 32KiB উপলব্ধ না হলে মেমরির যা কিছু ক্ষুদ্র পরিমাণে বরাদ্দ করতে পারে), মধ্যবর্তী stmX??ফাইলগুলিতে বাছাই করা ফলাফলগুলি লিখেছিল /usr/tmp/যাতে এটি চূড়ান্ত সরবরাহের জন্য বাছাই করে বাছাই করে আউটপুট।

আরও পড়া

  • স্টিভ ডি পেট (1996)। "আন্ত-প্রক্রিয়া যোগাযোগ"। ইউনিক্স internals: একটি ব্যবহারিক পদ্ধতির । অ্যাডিসন ওয়েসলে। আইএসবিএন 9780201877212।
  • মরিস জে বাচ (1987)। "ফাইল সিস্টেমের জন্য সিস্টেম কল"। দ্য ইউনিক্স অপারেটিং সিস্টেমের ডিজাইন । প্রেন্টিস হল. আইএসবিএন 0132017571।
  • স্টিভেন ভি। ইয়ারহার্ট (1986)। " config(1 এম)"। ইউনিক্স প্রোগ্রামারের ম্যানুয়াল: ৩. সিস্টেম প্রশাসনের সুবিধাদি । হল্ট, রাইনহার্ট এবং উইনস্টন আইএসবিএন 0030093139. পৃষ্ঠা 23-28।

1

আপনি আংশিকভাবে সঠিক, তবে কেবল দুর্ঘটনাক্রমে

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

যাইহোক, পাইপগুলি কীভাবে কাজ করে তার সাথে এর কোনও সম্পর্ক নেই। পাইপের নাম দেওয়া যেতে পারে (traditionতিহ্যগতভাবে সেগুলি সব নামকরণ করা হয়েছিল) যার অর্থ ফাইল সিস্টেমে যেমন ফাইল রয়েছে তেমন কিছুই নেই এবং কিছুই কম নয়। এবং পাইপগুলি একবারে কেবল এটিই ছিল, ফাইলগুলি (লেখাগুলির সাথে শারীরিক মেমরির সহজলভ্যতা যেমন অপ্টিমাইজেশন হিসাবে মঞ্জুর করে) writes

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

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

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


যখন আপনি বলছেন যে 'পাইপের নামকরণ করা হয়েছিল' (জেডিবিপি বলে মনে হচ্ছে একটি 'পাইপ ডিভাইস ছিল') তার মানে কি এই যে পাইপগুলির একটি নির্দিষ্ট সময় ব্যবহার করা যেতে পারে তার সীমা ছিল (যেমন, এখানে একটি সীমা ছিল আপনি |কমান্ডে কতবার ব্যবহার করতে পারেন )?
malan

2
আমি কখনও এই ধরনের সীমা দেখিনি, এবং আমি মনে করি না যে তত্ত্বের মধ্যে কখনও কখনও ছিল। অনুশীলনে, যে কোনও ফাইলের নাম রয়েছে তার জন্য একটি ইনোডের প্রয়োজন হয় এবং অবশ্যই ইনোডের সংখ্যা অবশ্যই সীমাবদ্ধ। কোনও সিস্টেমে শারীরিক পৃষ্ঠাগুলির সংখ্যা যেমন রয়েছে তবে কিছুই না। আধুনিক ব্যবস্থা 4K পারমাণবিক লিখেছেন গ্যারান্টি, তাই প্রতিটি পাইপ আবশ্যক অন্তত নিজের এক সম্পূর্ণ 4K পৃষ্ঠা, যা পাইপ সংখ্যার উপর একটি হার্ড সীমা রাখে আপনি থাকতে পারে। তবে কয়েক গিগাবাইট র্যাম থাকার কথা বিবেচনা করুন ... কার্যতঃ এটি এমন একটি সীমা যা আপনি কখনই মুখোমুখি হতে পারবেন না। চেষ্টা করুন এবং একটি টার্মিনালে কয়েক মিলিয়ন পাইপ টাইপ করুন ... :)
দামন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.