ফাইলের পরিবর্তে একটি নামক পাইপ ব্যবহার করবেন কেন?


42

আমি সম্প্রতি নামযুক্ত পাইপগুলি সম্পর্কে পড়েছি এবং সেগুলি কেন বিদ্যমান তা আমি বুঝতে পারি নি।
আমি কোথাও পড়েছি যে একটি নামক পাইপ ব্যবহার করা কোনও ফাইল ব্যবহারের চেয়ে সময় সাশ্রয়ী কম।

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

তাহলে সুবিধা কোথায় থাকে?


এটি কোনও শ্রেণিকক্ষের অ্যাসাইনমেন্টের অংশ নয়, তাই না?
don.joey

6
না ... আসলে যখন আমি এই প্রশ্নটি পেয়েছিলাম তখন আমি কিছু বক্তৃতা নোটগুলি সন্ধান করছিলাম এবং আমি এর উত্তর দিতে পারতাম না ... এবং যদি এটি কোনও অ্যাসাইনমেন্ট হয় তবে আমি দেখতে পাই না যে এটি কীভাবে প্রাসঙ্গিক হবে ... এটি পছন্দ নয় আমি এটি না পাওয়া পর্যন্ত উত্তরটির সন্ধান করব না
user3122885

উত্তর:


41

লিনাক্সের প্রায় প্রতিটি জিনিসই একটি ফাইল হিসাবে বিবেচনা করা যায় , তবে নিয়মিত ফাইল এবং নামযুক্ত পাইপের মধ্যে প্রধান পার্থক্য হ'ল নামক পাইপ একটি ফাইলের একটি বিশেষ উদাহরণ যা ফাইল সিস্টেমে কোনও বিষয়বস্তু নেই।

এখানে থেকে উদ্ধৃতি দেওয়া হয় man fifo:

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

কার্নেল প্রতিটি FIFO বিশেষ ফাইলের জন্য ঠিক একটি পাইপ অবজেক্ট রক্ষণ করে যা কমপক্ষে একটি প্রক্রিয়া দ্বারা খোলা হয়। ডেটা পাস করার আগে উভয় প্রান্তে (পড়া এবং লেখা) ফিফো খুলতে হবে। সাধারণত, অন্য প্রান্তটি না খোলার আগে পর্যন্ত ফিফো ব্লকগুলি খোলার।

সুতরাং প্রকৃতপক্ষে একটি নামক পাইপ কিছুই না করে যতক্ষণ না কোনও প্রক্রিয়া এটি পড়ে এবং এটি লিখে দেয়। এটি হার্ড ডিস্কে কোনও স্থান নেয় না (কিছুটা মেটা তথ্য বাদে), এটি সিপিইউ ব্যবহার করে না।

এটি করে আপনি এটি পরীক্ষা করতে পারেন:

একটি নামী পাইপ তৈরি করুন

$ mkfifo /tmp/testpipe

উদাহরণস্বরূপ কিছু ডিরেক্টরিতে যান /home/user/Documentsএবং এর ভিতরে থাকা পাইপ ব্যবহার করে এর ভিতরে থাকা সমস্ত কিছুকে জিপ করুন।

$ cd /home/user/Documents
$ tar cvf - . | gzip > /tmp/testpipe &
[1] 28584

এখানে আপনার জিজিপ প্রক্রিয়াটির পিআইডি দেখতে হবে। আমাদের উদাহরণে এটি ছিল 28584।

এখন এই পিআইডি কি করছে তা পরীক্ষা করে দেখুন

$ ps u -P 28584
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
c0rp     28584  0.0  0.0  29276  7800 pts/8    S    00:08   0:00 bash

আপনি দেখতে পাবেন যে এটি কোনও সংস্থান ব্যবহার করছে না । 0% সিপিইউ ব্যবহার, 0% মেমরির ব্যবহার।

ফাইল স্পেস ব্যবহার সম্পর্কিত হান্চ যাচাই করুন

$ du -h /tmp/testpipe
0   testpipe

এবং আবার 0, কিছুই না। প্রয়োজন হলে টেস্টপাইপ আবার ব্যবহার করা যেত।

জিজিপ মারতে ভুলবেন না, ব্যবহার করে kill -15 28584। এবং আমাদের নামক পাইপ ব্যবহার করে সরানrm /tmp/testpipe

ব্যবহারের উদাহরণ

নামযুক্ত পাইপ ব্যবহার করে আপনি প্রায় সবকিছু পুনর্নির্দেশ করতে পারেন। উদাহরণস্বরূপ আপনি এই এক লাইন প্রক্সি দেখতে পারেন ।

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


14

এটি সত্য যে আপনি সিস্টেমের মেমোরি ব্যবহার করবেন না তবে আপনি উদাহরণটিতে সিপিইউ ব্যবহার করেন না এটি কেবল কারণ আপনি পাইপটি পড়েন না তাই প্রক্রিয়াটি অপেক্ষা করছে।

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

mkfifo /tmp/testpipe
tar cvf - / | gzip > /tmp/testpipe

এখন একটি নতুন কনসোল খুলুন এবং চালান:

watch -n 1 'ps u -P $(pidof tar)

এবং তৃতীয় কনসোলে:

cat /tmp/testpipe > /dev/null

আপনি যদি ঘড়িটি সিএমডি (২ য় মেয়াদ) দেখেন তবে এটি সিপিইউ খরচ বাড়িয়ে তুলবে!


1
এই উত্তরটি c0rp এর উত্তর
wjandrea

2

এখানে এমন একটি ব্যবহারের কেস রয়েছে যেখানে নামযুক্ত পাইপগুলি I / O কে সরিয়ে আপনাকে অনেক সময় সাশ্রয় করতে পারে।

ধরা যাক আপনার কাছে একটি বড় ফাইল রয়েছে, উদাহরণস্বরূপ 10 জি।

আপনার কাছে এই বিগফিলের বিভাজনগুলি 1G, BigFileSplit_01 থেকে BigFile_Split_10 এ রয়েছে of

এখন আপনার কাছে বিগফাইস্প্লিট_05 এর সঠিকতার বিষয়ে সন্দেহ রয়েছে

নির্লজ্জভাবে, নামযুক্ত পাইপগুলি ছাড়াই, আপনি বিগফাইল থেকে একটি নতুন বিভাজন তৈরি করে তুলনা করবেন:

dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

নাম পাইপ দিয়ে আপনি করতে হবে

mkfifo BigFileSplitOrig_05
dd if=BigFile of=BigFileSplitOrig_05 bs=1G skip=4 count=1 &
diff -s BigFileSplitOrig_05 BigFileSplit_05
rm BigFileSplitOrig_05

এটি প্রথম দর্শনে বড় পার্থক্য বলে মনে হচ্ছে না ... তবে সময়ের মধ্যে পার্থক্য বিশাল!

বিকল্প 1:

  • ডিডি: 1 জি পড়ুন / 1 জি লিখুন (1)
  • পৃথক: 2 জি পড়ুন
  • আরএম: বিনামূল্যে বরাদ্দ ক্লাস্টার / ডিরেক্টরি এন্ট্রি সরান

বিকল্প 2:

  • ডিডি: কিছুই না! (নামযুক্ত পাইপে যায়)
  • পৃথক: 2 জি পড়ুন
  • আরএম: পরিচালনা করার জন্য কোনও বরাদ্দকৃত ক্লাস্টার নেই (আমরা আসলে ফাইল সিস্টেমে কিছুই লিখিনি) / ডিরেক্টরি এন্ট্রি সরান

সুতরাং মূলত নামযুক্ত পাইপ আপনাকে এখানে 1 জি প্লাস কিছু ফাইল সিস্টেম পরিষ্কারের একটি পড়া এবং লেখার জন্য সংরক্ষণ করে (যেহেতু আমরা ফাইল সিস্টেমে খালি ফিফো নোড ছাড়া কিছুই লিখি না)।

I / O না করা, বিশেষত লিখেছেন, আপনার ডিস্কের পোশাক এড়ানো ভাল। যখন আপনি এসএসডি নিয়ে কাজ করেন তখন আরও মজাদার বিষয় যেহেতু কোষগুলি মারা যাওয়ার আগে তাদের সীমিত সংখ্যক লেখাগুলি থাকে।

(1) স্পষ্টতই, অন্য একটি বিকল্পটি র‌্যামের জন্য অস্থায়ী ফাইল তৈরি করা হবে, উদাহরণস্বরূপ যদি / tmp র‌্যাম (tmpfs) এ মাউন্ট করা থাকে। তবুও আপনি র‌্যাম ডিস্কের আকার দ্বারা সীমাবদ্ধ থাকবেন যেখানে "নামক পাইপ ট্রিক" এর কোনও সীমা নেই।


0

আপনি কোনও প্রোগ্রামকে স্থির থাকতে পারেন এবং বাইরের কিছু ইভেন্টের জন্য নামকরণ করা পাইপ শুনতে পারেন। বাইরের ইভেন্টটি হওয়ার সাথে সাথেই (f.ex. কিছু নতুন ডেটার আগমন) এটি অন্য কোনও প্রোগ্রাম দ্বারা সনাক্ত করা যেতে পারে যা পরিবর্তে পাইপের সাথে সম্পর্কিত ইভেন্টের ডেটা লেখার জন্য পাইপটি খোলায় ens যখন নিকটতম বিবৃতি জারি করা হবে, শ্রোতা প্রোগ্রামটি একটি পঠিত বিবৃতি দিয়ে পাইপের মাধ্যমে ডেটা প্রবাহটি গ্রহণ করবে এবং যা পেয়েছে তা প্রক্রিয়া করার জন্য প্রস্তুত। কন্টেন্টটি পড়ার পরে পাইপটি বন্ধ করতে ভুলবেন না। শোনার প্রোগ্রামটি একইভাবে বা অন্য কোনও নামক পাইপের মাধ্যমেও এর প্রসেসিংয়ের ফলাফলগুলি ফিরে আসতে পারে। এই জাতীয় আন্তঃ-প্রোগ্রাম যোগাযোগগুলি অনেক সময়ে খুব সুবিধাজনক।

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