ইউএনআইএক্স-এ ফাইল অ্যাপেন্ডিক পারমাণবিক?


106

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

উত্তর:


65

'PIPE_BUF' আকারের অধীনে এমন একটি লেখা পারমাণবিক বলে মনে করা হচ্ছে। এটি কমপক্ষে 512 বাইট হওয়া উচিত, যদিও এটি সহজেই বড় হতে পারে (লিনাক্স এটি 4096 সেট করে বলে মনে হচ্ছে)।

এটি ধরে নেওয়া হয় যে আপনি সমস্ত পসিক্স-কমপ্লায়েন্ট কম্পোনেন্টের সাথে কথা বলছেন। উদাহরণস্বরূপ, এনএফএসে এটি সত্য নয়।

তবে ধরেই নেওয়া যে আপনি 'ও_এপপেন্ডে' মোডে খোলার লগ ফাইলটিতে লিখেছেন এবং আপনার লাইনগুলি (নিউলাইন সহ) 'পিআইপি৯বিউএফ' বাইটের অধীনে রাখবেন, আপনার কোনও দুর্নীতির সমস্যা ছাড়াই লগ ফাইলে একাধিক লেখক থাকতে সক্ষম হওয়া উচিত। কোনও বাধা লেখার আগে বা পরে আসবে, মাঝখানে নয়। আপনি যদি পুনরায় বুট থেকে বাঁচতে ফাইলের অখণ্ডতা চান তবে আপনাকে fsync(2)প্রতিটি লেখার পরেও কল করতে হবে , তবে এটি কার্য সম্পাদনের জন্য ভয়ানক terrible

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


11
বুদ্ধিমান ফাইল সিস্টেমে, fsync(2)যতটা গ্যারান্টি দেয় ততটা sync(2)দেয় এবং পারফরম্যান্সে যতটা বড় হাতুড়ি প্রভাব পড়ে তার ততটা নেই।
প্রথম

4
আপনি কি এ ব্যাপারে নিশ্চিত? আপনি কি আচরণ সম্পর্কে কিছু লিঙ্ক সরবরাহ করতে পারেন? আমি বর্ণনাটি পাইপ কিনা তা নিশ্চিত করে দেখতে পেয়েছি তবে এটি কোনও ফাইলের জন্য কাজ করে এমন প্রমাণ আমি পাইনি । সাধারণ, নন-এনএফএস ফাইল অবজেক্ট সহ।
অ্যালান ফ্রানজোনি

6
ঠিক কোথায় ... / Writ.html? ও_এপিএপিএন্ডের জন্য, আমি পিআইপি-বিইউএফ-এর কোনও উল্লেখ দেখতে পাই না এবং আমি প্রতিশ্রুতি দেখছি যে " ফাইল অফসেট এবং লেখার ক্রিয়াকলাপের মধ্যে কোনও হস্তক্ষেপকারী ফাইল পরিবর্তন অপারেশন ঘটবে না " তবে আমি নিশ্চিত নই যে তার লেখার অপারেশনটি নিজেই হয় কিনা নিরবচ্ছিন্ন ...
আকাশে

6
যেমন এই উত্তরটি উল্লেখ করেছে, সেই PIPE_BUFপৃষ্ঠায় থাকা বিবৃতিটি কেবল পাইপ এবং FIFO- এ প্রয়োগ হয়, নিয়মিত ফাইল নয়।
গ্রেগ ইনোজজেটসেভ

3
সিগন্যাল আসার সাথে সাথে আরও খারাপ হতে পারে: bugzilla.kernel.org/show_bug.cgi?id=55651 । কেন এটি এমনকি একটি উত্তর হিসাবে চিহ্নিত করা হয়? PIPE_BUF ফাইলগুলির সাথে কিছু করার নেই।
পাতলা

35

সম্পাদনা করুন: সর্বশেষ উইন্ডোজ ফলাফলের সাথে আগস্ট 2017 আপডেট হয়েছে।

আমি আপনাকে প্রস্তাবিত বুস্ট.এফআইওর লেখক হিসাবে পরীক্ষার কোড এবং ফলাফলগুলির লিঙ্কগুলির সাথে একটি উত্তর দিতে যা যা একটি অ্যাসিঙ্ক্রোনাস ফাইল সিস্টেম এবং ফাইল i / o সি ++ লাইব্রেরি প্রয়োগ করে।

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

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


কোনও O_DIRECT / FILE_FLAG_NO_BUFFERING নেই:

মাইক্রোসফ্ট উইন্ডোজ 10 এনটিএফএস সহ: অ্যাটমিকটি = 1 বাইট আপডেট করুন এবং 10.0.10240 অন্তর্ভুক্ত করে 10.0.14393 থেকে কমপক্ষে 1 এমবি, সম্ভবত অসীম (*)।

Ext4 সহ লিনাক্স 4.2.6: অ্যাটমিকটি আপডেট করুন = 1 বাইট

জেডএফএস সহ ফ্রিবিএসডি 10.2: আপডেট পারমাণবিকতা = কমপক্ষে 1 এমবি, সম্ভবত অসীম (*)

O_DIRECT / FILE_FLAG_NO_BUFFERING:

মাইক্রোসফ্ট উইন্ডোজ 10 এনটিএফএস সহ: অ্যাটমিকটি আপডেট করুন = অবধি 10.0.10240 পর্যন্ত 4096 বাইট পর্যন্ত পৃষ্ঠায় প্রান্তিককরণ থাকলে, অন্যথায় 512 বাইট যদি FILE_FLAG_WRITE_THROUGH বন্ধ থাকে, অন্যথায় 64 বাইট। মনে রাখবেন যে এই পারমাণবিকতাটি সম্ভবত ডিজাইনের পরিবর্তে পিসিআই ডিএমএর একটি বৈশিষ্ট্য 10

Ext4 সহ লিনাক্স 4.2.6: আপডেট পারমাণবিকতা = কমপক্ষে 1Mb, সম্ভবত অসীম (*)। নোট করুন যে ext4 সহ পূর্ববর্তী লিনাক্সগুলি অবশ্যই 4096 বাইটের বেশি ছিল না, এক্সএফএস অবশ্যই কাস্টম লকিং ব্যবহার করত তবে দেখে মনে হচ্ছে সাম্প্রতিক লিনাক্স এটি শেষ করে দিয়েছে।

জেডএফএস সহ ফ্রিবিএসডি 10.2: আপডেট পারমাণবিকতা = কমপক্ষে 1 এমবি, সম্ভবত অসীম (*)


আপনি কাঁচা পরীক্ষামূলক পরীক্ষার ফলাফল https://github.com/ned14/afio/tree/master/program/fs-probe এ দেখতে পারেন । দ্রষ্টব্য, আমরা ছেঁড়া অফসেটগুলি কেবল 512 বাইট গুণকেই পরীক্ষা করি, তাই আমি বলতে পারি না যে 512 বাইট সেক্টরের আংশিক আপডেটটি রিড-মডিফাই-রাইটিং চক্রের সময় ছিঁড়ে যায়।

সুতরাং, ওপি-র প্রশ্নের জবাব দেওয়ার জন্য, ও_এপপেন্ড লেখার ফলে একে অপরের সাথে হস্তক্ষেপ করবে না, তবে ও_এপিপিএএনডি-র সমষ্টি পড়লে সম্ভবত লিনাক্সে এক্সট 4 দিয়ে ছেঁড়া লেখাগুলি দেখা যাবে যদি না O_DIRECT চালু না থাকে, তারপরে আপনার O_APPEND লেখার ক্ষেত্রে খাত আকারের একাধিক হওয়া প্রয়োজন।


(*) "সম্ভবত অসীম" পজিক্স অনুচ্ছেদে এই ধারাগুলি থেকে উদ্ভূত:

নিম্নলিখিত নিয়মিত ফাইল বা প্রতীকী লিঙ্কগুলিতে অপারেট করার সময় নিচের সমস্ত ফাংশন একে অপরের প্রতি সম্মানের সাথে পরমাণু হতে হবে ... [অনেকগুলি ফাংশন] ... পড়ুন () ... লিখুন (লিখুন) ) ... যদি দুটি থ্রেড প্রতিটি কল করে এই ফাংশনগুলির মধ্যে একটি, প্রতিটি কল হয় অন্য কলটির নির্দিষ্ট প্রভাবগুলি দেখতে পাবে, বা সেগুলির কোনওটিই নয়। [উৎস]

এবং

লেখাগুলি অন্য পাঠ ও লেখার প্রতি শ্রদ্ধাশীল করে সিরিয়াল করা যেতে পারে। যদি ফাইলের ডেটা পড়ার () কোনও উপাত্তের লেখার () পরে (কোনও উপায়ে) প্রমাণিত হতে পারে, তবে অবশ্যই কলটি বিভিন্ন প্রক্রিয়া দ্বারা করা হলেও, সেই রাইটটি () প্রতিফলিত করতে হবে। [উৎস]

তবে বিপরীতভাবে:

POSIX.1-2-2008 এর এই ভলিউম একাধিক প্রক্রিয়া থেকে কোনও ফাইলকে সমবর্তী লেখার আচরণ নির্দিষ্ট করে না। অ্যাপ্লিকেশনগুলিতে একযোগে নিয়ন্ত্রণের কিছু ফর্ম ব্যবহার করা উচিত। [উৎস]

আপনি এই উত্তরে এর অর্থ সম্পর্কে আরও পড়তে পারেন


29

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

প্রকৃত সর্বাধিক পারমাণবিক সংযোজন আকার কেবল ওএস দ্বারা নয়, ফাইল সিস্টেমের দ্বারাও পরিবর্তিত হয়।

লিনাক্স + এক্সট্রুমে আকারটি 4096 এবং উইন্ডোজ + এনটিএফএসে আকার 1024 হয় more আরও আকারের জন্য নীচের মন্তব্য দেখুন।


লিনাক্সে আপনি কোন ফাইল সিস্টেমের মাধ্যমে পরীক্ষা করেছেন? আমি ভাবছি এটি সম্ভবত ফাইল সিস্টেম ব্লক আকারের উপর ভিত্তি করে আছে।
ফ্রেইহিট

@ ফ্রেইহইট আমি যখন এক্সট্রোনটিতে পরীক্ষা করেছি তখন আমি বিশ্বাস করি। আপনি যদি এটি অন্য এফএসে চালান এবং অন্যরকম ফলাফল পান তবে দয়া করে একটি মন্তব্য পোস্ট করুন।
ওজ সলোমন

3
@ ওসোলোমন, আমি আপনার স্ক্রিপ্টটি দেবিয়ান 8.৮ এ ব্যবহার করেছি এবং আমি কেবল আমার এক্সট্রোল পার্টিশন এবং একটি টিএমপিএফস মাউন্ট উভয়তেই 1008 বাইট (1024 - 16 বাইট ওভারহেড?) সহ অ্যাটমিক লিখতে সক্ষম হয়েছি। এর বাইরে যে কোনও কিছুই প্রতিবার দুর্নীতির ফলস্বরূপ।
এরিক প্রুইট

6
আপনার পরীক্ষাটি ধরে নিয়েছে বলে মনে হচ্ছে এর আকার নির্বিশেষে echo $line >> $OUTPUT_FILEএকটি কলের ফলাফল হবে । write$line
টমাস

16

মানকটি যা বলে তা এখানে: http://www.opengroup.org/onlinepubs/009695399/function/pwrite.html

যদি O_APPENDফাইলের স্থিতির পতাকাগুলির পতাকাটি সেট করা থাকে তবে ফাইল লেখার আগে প্রতিটি লেখার আগে ফাইলের অফসেটটি ফাইলের শেষের দিকে সেট করা হবে এবং ফাইল অফসেট এবং রাইটিং ক্রিয়াকলাপ পরিবর্তন করার মধ্যে কোনও হস্তক্ষেপকারী ফাইল পরিবর্তন অপারেশন ঘটবে না।


20
"মাঝে" - তবে লেখার সময় হস্তক্ষেপগুলি সম্পর্কে কী , যা আমার বোঝার জন্য "মধ্যবর্তী" পরে ঘটে? (যেমন: <মুদ্রা_অফসেট_অ্যাকশন> ... "দ্য_বেটুইন_পিরিয়ড" ... <রাইটার_অ্যাকশন>) - আমি কি বুঝতে পারি যে সে সম্পর্কে কোনও গ্যারান্টি নেই?
আকাভেল

@ কাকাভেল একমত হয়েছেন; লেখার নিজেই পরমাণু রয়েছে এমন কোনও গ্যারান্টি নেই। তবে আমি বিভ্রান্ত: আপনার উদ্ধৃতিতে সরবরাহ করা গ্যারান্টির উপর ভিত্তি করে, মনে হচ্ছে আমরা একই সিদ্ধান্তে পৌঁছাতে পারি যে একই ফাইল যুক্ত একটি বহুবিধ অ্যাপ্লিকেশন বিভিন্ন লিখিত রেকর্ডের অংশগুলিকে মিশ্রিত করবে না। যাইহোক, ওসসোলোমন দ্বারা রিপোর্ট করা পরীক্ষাগুলি থেকে আমরা দেখতে পাই যে এমনকি অনুমান লঙ্ঘিত হয়েছে। কেন?
সর্বাধিক

@max দুঃখিত, আমি ভীত আমি তোমার প্রশ্ন পাবেন না আছি: প্রথমত, OzSolomon এর পরীক্ষা মাল্টি- হয় প্রক্রিয়া , না একটি মাল্টি- থ্রেডেড (একক প্রক্রিয়ার মধ্যে) অ্যাপ্লিকেশন; দ্বিতীয়ত, আমি বুঝতে পারছি না কিভাবে আপনি উপসংহার আঁকা যে "একটি মাল্টি অ্যাপ্লিকেশন [...] মিশ্রিত করা না" - যে ঠিক কি আমি Bastien থেকে উদ্ধৃতি দ্বারা নিশ্চিত দেখি না, আমি আমার মন্তব্যে উল্লেখ করুন। আপনি আপনার প্রশ্ন পরিষ্কার করতে পারেন?
উকভেল

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