অ্যাটমিকআইন্টিজার অলস সেট বনাম সেট


116

এর পদ্ধতি lazySetএবং setপদ্ধতির মধ্যে পার্থক্য কীAtomicInteger ? ডকুমেন্টেশন অনেক সম্পর্কে বলার নেই lazySet:

অবশেষে প্রদত্ত মান সেট করে।

দেখে মনে হচ্ছে সঞ্চিত মানটি তাত্ক্ষণিকভাবে পছন্দসই মানটিতে সেট করা হবে না তবে পরিবর্তে ভবিষ্যতে কিছু সময় নির্ধারিত হবে। তবে, এই পদ্ধতির ব্যবহারিক ব্যবহার কী? কোন উদাহরণ?

উত্তর:


114

"JDK-6275329 থেকে সরাসরি উদ্ধৃত : পারমাণবিক ক্লাসে আলস্য সেট পদ্ধতি যুক্ত করুন" :

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

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

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


14
কেউ কি আমাদের বাকী অংশের জন্য এটি নিস্তেজ করতে পারে? :(
গৌরব

14
অলসটি হ'ল অ-উদ্বায়ী সংস্করণ (যেমন, রাষ্ট্রের পরিবর্তনটি সমস্ত থ্রেডের কাছে দৃশ্যমান হওয়ার গ্যারান্টিযুক্ত নয় যার Atomic*সুযোগ রয়েছে)।
ভোর

63
যা আমি বুঝতে পারি না তা হল জাভাদোক কেন এটি সম্পর্কে এতটা দুর্বল।
ফিলিপ

8
আমি নিশ্চিত যে তারা শেষ পর্যন্ত এটিকে পরিবর্তন করবে। বুম বুম.
এমএমজেজেড

3
যারা স্টোর / লোড বাধা সম্পর্কে আরও জানতে চান এবং কেন স্টোর-স্টোর বাধা স্টোর-লোড বাধার চেয়ে সস্তা। এটি সম্পর্কে একটি নিখরচায় বুঝতে সহজ এখানে। যান্ত্রিক-
কিন চেং

15

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

http://sc.tamu.edu/systems/eos/nehalem.pdf নেহালেমের জন্য যা একটি মাল্টি-প্রসেসর প্ল্যাটফর্ম, প্রসেসরগুলিতে সিস্টেম প্রসেসি এবং অন্যান্য প্রসেসরের অ্যাক্সেসের জন্য অ্যাড্রেস বাসকে "স্নুপ" (ইভাসড্রপ) করার ক্ষমতা রয়েছে এবং তাদের অভ্যন্তরীণ ক্যাশে। তারা সিস্টেমের মেমরির সাথে এবং অন্যান্য আন্তঃসংযুক্ত প্রসেসরের ক্যাশেগুলির সাথে উভয় ক্ষেত্রেই তাদের অভ্যন্তরীণ ক্যাশেগুলি সামঞ্জস্য রাখতে এই স্নুপিং ক্ষমতাটি ব্যবহার করে। স্নুপিংয়ের মাধ্যমে যদি কোনও প্রসেসর সনাক্ত করে যে অন্য প্রসেসরটি বর্তমানে ভাগ করা অবস্থায় ক্যাশ করেছে এমন মেমরির স্থানে লিখতে চায়, তবে স্নুপিং প্রসেসরের পরের বার একই মেমরির অবস্থানটি অ্যাক্সেস করার পরে ক্যাশে লাইন সম্পাদন করতে বাধ্য করা তার ক্যাশে ব্লকটি অকার্যকর করবে will ।

x86 সিপিইউ আর্কিটেকচার-> এর জন্য ওরাকল হটস্পট জেডিকে

অলসেট == অনিরাপদ.পুট অর্ডারডলং == এক্সচজিআরডাব্লু (এসএমএল নির্দেশ যা নেলিম ইন্টেল সিপুতে 20 চক্রের জন্য নরম বাধা হিসাবে কাজ করে)

x86 (x86_64) এ এই ধরনের বাধা অস্থায়ী বা অ্যাটমিকলং getAndAdd এর চেয়ে অনেক কম দক্ষতার ভিত্তিতে

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

সিপিপি কোডটিতে অলস সেটটির সঠিক ম্যাপিংয়ের জন্য আমি হটস্পট উত্স কোডের পরে সনাক্ত করেছি: http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/prims/unsafe। সিপিপি অনিরাপদ_সেটঅর্ডার্ডলং -> SET_FIELD_VOLATILE সংজ্ঞা -> অর্ডারঅ্যাক্সেস: রিলিজ_স্টোর_ফেন্স ence X86_64 এর জন্য, অর্ডারঅ্যাক্সেস: রিলিজ_স্টোর_ফেন্স xchg নির্দেশ ব্যবহার করে সংজ্ঞায়িত করা হয়েছে।

আপনি দেখতে পাবেন যে এটি কীভাবে জে ডি কে in এ সংজ্ঞায়িত করা হয়েছে (ডগ লিয়া জেডিকে 8 এর জন্য কিছু নতুন স্টাফের উপর কাজ করছে): http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/4fc084dac61e/src/os_cpu/ linux_x86 / VM / orderAccess_linux_x86.inline.hpp

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

আরও একটি সম্পর্কিত প্রশ্ন রয়েছে: xchg ব্যবহার করার জন্য আমাদের কি mfence দরকার?


5
আপনি এখানে কী পাচ্ছেন তা বোঝা শক্ত। আপনি দয়া করে আপনার বক্তব্য স্পষ্ট করতে পারেন?
পল বেলোরা 2

3
"অলসসেট == অনিরাপদ.পুট অর্ডারডলং == এক্সচজিআরডব্লিউ (এসএমএস নির্দেশনা যা নেহলেম ইন্টেল সিপিইউতে 20 চক্রের জন্য নরম বাধা হিসাবে পরিবেশন করে) xx (x86_64) এ জাতীয় বাধা অস্থির বা অ্যাটমিকলং getAndAdd এর তুলনায় অনেক কম পারফরম্যান্স ভিত্তিক" -> এটি আমার জ্ঞানের সেরাটির সাথে সত্য নয়। অলস্যাসিট / পুটআর্ডার্ড কোনও ঠিকানার একটি এমওভি, তাই জেএমএম কুকবুক এটিকে x86 এর কোনও অপ-বিকল্প হিসাবে বর্ণনা করে।
নিতসান ওয়াকার্ট

11

অলস সেট এবং অন্তর্নিহিত পুটঅর্ডার এর উত্স এবং ইউটিলিটির একটি বিস্তৃত আলোচনা এখানে পাওয়া যাবে: http://psy-lob-saw.blogspot.co.uk/2012/12/atomiclazyset-is-performance-win-for.html

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

মানটি পড়ার সময় আপনি সর্বদা একটি অস্থির পড়া (কোনও ক্ষেত্রে একটি পারমাণবিক * .get () সহ) পড়া শেষ করেন।

অলস সেট একটি একক লেখককে একটি সামঞ্জস্যপূর্ণ উদ্বায়ী লেখার ব্যবস্থা দেয়, অর্থাত্ কোনও এক লেখকের পক্ষে কাউন্টার বাড়ানোর জন্য অলস সেটটি ব্যবহার করা পুরোপুরি বৈধ, একই কাউন্টারকে বাড়ানোর একাধিক থ্রেডকে সিএএস ব্যবহার করে প্রতিযোগিতামূলক লেখার সমাধান করতে হবে, যা ঠিক তেমনটি ঘটায় IncAndGet এর জন্য পারমাণবিক * এর কভার।


ঠিক, কেন আমরা বলতে পারি না যে এটি একটি সাধারণ StoreStoreবাধা, তবে একটি নয়StoreLoad ?
ইউজিন

8

থেকে সমসাময়িক-পারমাণবিক প্যাকেজ সারসংক্ষেপ

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

আপনি যদি অলস সেট সম্পর্কে আগ্রহী হন তবে আপনার নিজের অন্যান্য ব্যাখ্যাও ণী

অ্যাটিক্সের অ্যাক্সেস এবং আপডেটের জন্য মেমরি প্রভাবগুলি সাধারণত জাভা ™ ল্যাঙ্গুয়েজ স্পেসিফিকেশনের ১ 17.৪ অনুচ্ছেদে বর্ণিত হিসাবে অস্থির জন্য নিয়মগুলি অনুসরণ করে।

পেতে একটি উদ্বায়ী পরিবর্তনশীল পড়া স্মৃতির প্রভাব রয়েছে।

সেটটিতে একটি অস্থির ভেরিয়েবল লেখার মেমোরি এফেক্ট থাকে (নির্ধারণ করা)।

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

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

তুলনাঅ্যান্ডসেট এবং getAndIncrement এর মতো অন্যান্য সমস্ত পঠন-আপডেট আপডেটের অস্থির ভেরিয়েবলগুলি পড়া এবং লেখার উভয়ের স্মৃতি প্রভাব রয়েছে।


4

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


1
মানে না compareAndSet?
ডেভ মোটেন

2

পুনঃ এটিকে নিস্তেজ করার চেষ্টা করুন -

আপনি এটিকে কোনও উদ্বোধনী ক্ষেত্রের চিকিত্সার উপায় হিসাবে ভাবতে পারেন যেন এটি কোনও নির্দিষ্ট স্টোরের (যেমন: রেফ = নাল;) ক্রিয়াকলাপের জন্য উদ্বায়ী নয়।

এটি পুরোপুরি সঠিক নয়, তবে এটি যথেষ্ট হওয়া উচিত যে আপনি "ঠিক আছে, আমি সত্যিই যত্নশীল নই" এবং "হুম, আমাকে কিছুটা জন্য এটি সম্পর্কে ভাবতে দিন" এর মধ্যে সিদ্ধান্ত নিতে পারেন।

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