অ্যাসিঙ্ক প্রক্রিয়াগুলির জন্য কি স্ট্যাক কাঠামো ব্যবহার করা হয়?


10

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

তার উত্তর থেকে:

স্ট্যাকটি কর্টিনগুলি ছাড়াই কোনও ভাষায় ধারাবাহিকতার পুনঃসংশোধনের অংশ।

বিশেষত, এর কর্টাইনগুলি ছাড়া অংশটি আমাকে ভাবছে

তিনি এখানে আরও কিছু ব্যাখ্যা করেছেন:

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

এটি স্ট্যাকের ক্ষেত্রে দুর্দান্ত, তবে আমাকে যখন কাঠামোটি আরও উন্নত ডেটা কাঠামোর প্রয়োজন হয় এমন ভাষা বৈশিষ্ট্যগুলি পরিচালনা করতে খুব সহজ হয় তখন কী কাঠামোগত ব্যবহার করা হয় সে সম্পর্কে আমাকে একটি উত্তরহীন প্রশ্ন রেখে যায়?

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

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

উত্তর:


14

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

হ্যাঁ হ্যাঁ

ধরুন আমাদের আছে

async void MyButton_OnClick() { await Foo(); Bar(); }
async Task Foo() { await Task.Delay(123); Blah(); }

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

আপনি বোতামটি ক্লিক করুন। একটি বার্তা সারিবদ্ধ করা হয়েছে। বার্তাটির লুপ বার্তাটি প্রসেস করে এবং ক্লিক হ্যান্ডলারকে কল করে বার্তাটির সারির ফেরতের ঠিকানাটি স্ট্যাকের উপরে রাখে। এটি হ্যান্ডলারটি সম্পন্ন করার পরে যে জিনিসটি ঘটে তা হ'ল বার্তাটির লুপটি চলতে থাকবে। সুতরাং হ্যান্ডলারের ধারাবাহিকতাটি লুপ।

ক্লিকের হ্যান্ডলারটি ফু () কে কল করে, নিজের ফেরতের ঠিকানাটি স্ট্যাকের মধ্যে রেখে। অর্থাৎ ফু এর ধারাবাহিকতা হ্যান্ডলারের অবশিষ্ট অংশ।

ফু তার নিজের ফিরতি ঠিকানাটি স্ট্যাকের মধ্যে রেখে, টাস্ককে ডেকে ডেকে দেয়।

টাস্ক.ডেলি তাত্ক্ষণিকভাবে কোনও টাস্ক ফেরত দেওয়ার জন্য যা কিছু যাদু করার প্রয়োজন তা করে। স্ট্যাকটি পপ করা হয়েছে এবং আমরা ফু-এ ফিরে এসেছি।

Foo এটি সম্পন্ন হয়েছে কিনা তা দেখানোর জন্য ফেরত টাস্কটি পরীক্ষা করে। এইটা না. ধারাবাহিকতা এর অপেক্ষায় রয়েছেন তাই ফু একটি প্রতিনিধি যা বাজে (কল) তৈরি করে, এবং লক্ষণ যে কাজের ধারাবাহিকতা হিসেবে দায়িত্বপ্রাপ্ত, বাজে কথা (কল) হয়। (আমি কেবলমাত্র একটি সামান্য ভুল বক্তব্য দিয়েছি; আপনি কি এটি ধরেন? যদি তা না হয় তবে আমরা এটি মুহূর্তের মধ্যে প্রকাশ করব))

তারপরে ফু তার নিজস্ব টাস্ক অবজেক্ট তৈরি করে, এটিকে অসম্পূর্ণ হিসাবে চিহ্নিত করে এবং স্ট্যাকটিকে ক্লিক হ্যান্ডলারের কাছে ফিরিয়ে দেয়।

ক্লিক হ্যান্ডলার ফু এর কাজ পরীক্ষা করে এবং এটি অসম্পূর্ণ আবিষ্কার করে। হ্যান্ডলারের অপেক্ষার ধারাবাহিকতাটি বার () কে কল করা হয়, তাই ক্লিক হ্যান্ডলারটি একটি প্রতিনিধি তৈরি করে যা বার () কে কল করে এবং এটি ফু () দ্বারা ফিরে আসা টাস্কের ধারাবাহিকতা হিসাবে সেট করে। এরপরে এটি স্ট্যাকটিকে বার্তা লুপে ফিরিয়ে দেয়।

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

এখন কি হয়? এখানে জটিল কিছু। বিলম্ব কাজের ধারাবাহিকতা নেই শুধুমাত্র বাজে কল ()। এটি বার () তে একটি কলও ট্রিগার করতে হবে , তবে সেই কাজটি বার সম্পর্কে জানে না!

ফু প্রকৃতপক্ষে একটি প্রতিনিধি তৈরি করেছিল যা (1) ব্লেহ () কে ডাকে এবং (2) ফু যে কার্য সম্পাদন করেছে এবং ইভেন্ট হ্যান্ডলারের কাছে ফিরিয়ে দিয়েছে সেই কাজটির ধারাবাহিকতাটিকে কল করে। এভাবেই আমরা একটি প্রতিনিধিকে কল করি যা বার () বলে।

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

এই পরিস্থিতিতে একটি স্ট্যাকের জন্য খুব উন্নত যে সঠিক ধারণা দেয়, কিন্তু স্ট্যাকটির পরিবর্তে কী?

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

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

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

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

স্ট্যাক কেবল ফ্রেমের একটি অ্যারে, যেখানে ফ্রেমগুলি (1) ফাংশনের মাঝখানে পয়েন্টার (যেখানে কলটি ঘটেছিল) এবং (2) স্থানীয় ভেরিয়েবল এবং টেম্পসের মান থাকে। কাজের ধারাবাহিকতা একই জিনিস: প্রতিনিধি ফাংশনটির জন্য নির্দেশক এবং এতে একটি রাষ্ট্র রয়েছে যা ফাংশনের মাঝখানে একটি নির্দিষ্ট পয়েন্ট উল্লেখ করে (যেখানে প্রতীক্ষাটি ঘটেছিল), এবং সমাপনীতে প্রতিটি স্থানীয় পরিবর্তনশীল বা অস্থায়ী জন্য ক্ষেত্র রয়েছে । ফ্রেমগুলি এখন আর একটি সুন্দর ঝরঝরে অ্যারে গঠন করে না, তবে সমস্ত তথ্য একই।


1
অনেক সহায়ক, ধন্যবাদ আমি যদি উভয় উত্তরকে আমি স্বীকৃত উত্তর হিসাবে চিহ্নিত করতে পারি তবে আমি এগুলি ফাঁকা রাখতে পারি না (তবে, কেউ
চাইবেনা

3
@ জেডিএল 134679: আমি আপনাকে পরামর্শ দিচ্ছি যে যদি আপনি মনে করেন যে আপনার প্রশ্নের উত্তর এসেছে তবে আপনি উত্তরটিকে কিছু হিসাবে চিহ্নিত করেছেন; এটি একটি সংকেত প্রেরণ করে যে লোকেরা এখানে লেখার চেয়ে ভাল উত্তর পড়তে চাইলে তাদের এখানে আসা উচিত । (অবশ্যই ভাল উত্তর লেখার জন্য সর্বদা উত্সাহ দেওয়া হয়)) কে চেকমার্ক পায় সেদিকে আমার খেয়াল নেই।
এরিক লিপার্ট

8

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

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

ব্যবহারিকভাবে বলতে গেলে, কল স্ট্যাকগুলি এখনও এখানে রয়েছে। তবে আমাদের কাছে এখন তাদের মধ্যে অনেকগুলি রয়েছে এবং কখনও কখনও কল স্ট্যাকটি অনেক ছোট ছোট বিভাগে বিভক্ত হয় (উদাহরণস্বরূপ প্রতিটি 4Kbytes এর কয়েকটি পৃষ্ঠার), যা কখনও কখনও আবর্জনা সংগ্রহ করা হয়, বা বরাদ্দকৃত স্তূপ হয়। এই স্ট্যাক সেগমেন্টগুলি কিছু লিঙ্কযুক্ত তালিকায় সংগঠিত করা যেতে পারে (বা আরও কিছু জটিল ডেটা কাঠামো, যখন প্রয়োজন হবে)। উদাহরণস্বরূপ, জিসিসি কম্পাইলার আছে একটি -fsplit-stackবিকল্প (go, এবং তার "goroutines" এবং তার "ASYNC প্রসেস" জন্য উল্লেখযোগ্য হল দরকারী)। বিভক্ত স্ট্যাকের সাহায্যে আপনি লক্ষ লক্ষ ছোট স্ট্যাক সেগমেন্ট দিয়ে তৈরি হাজার হাজার স্ট্যাক (এবং সহ-রুটিনগুলি প্রয়োগ করা সহজ হয়ে উঠতে পারেন) এবং "অনিচ্ছাকৃত" স্ট্যাকটি দ্রুততর হতে পারে (বা কমপক্ষে প্রায় একগুণ হিসাবে দ্রুততর স্ট্যাক)।

(অন্য কথায়, স্ট্যাক এবং হিপগুলির মধ্যে পার্থক্য ঝাপসা হয়ে যাচ্ছে, তবে পুরো প্রোগ্রামের রূপান্তর প্রয়োজন হতে পারে, বা কলিং কনভেনশন এবং সংকলককে অসম্পূর্ণভাবে পরিবর্তন করতে পারে)

আরও দেখুন এই & যে এবং অনেক কাগজপত্র (যেমন এই ) আলোচনা সিপিএস রূপান্তর। এএসএলআর এবং কল / সিসি সম্পর্কেও পড়ুন । ধারাবাহিকতা সম্পর্কে আরও পড়ুন (& STFW) ।

.CLR এবং .NET বাস্তবায়নগুলি অনেকগুলি বাস্তব কারণে, অত্যাধুনিক জিসি এবং সিপিএস রূপান্তর করতে পারে না। এটি পুরো প্রোগ্রাম ট্রান্সফর্মের সাথে সম্পর্কিত (এবং নিম্ন-স্তরের সি রুটিনগুলি ব্যবহার করার সহজ উপায় এবং সি বা সি ++ তে একটি রানটাইম কোডড রয়েছে) সম্পর্কিত একটি বাণিজ্য is

চিকেন স্কিমটি সিপিএস রূপান্তরকরণের সাথে মেশিন (বা সি) স্ট্যাকটি অপ্রচলিত উপায়ে ব্যবহার করছে: প্রতিটি বরাদ্দ স্ট্যাকের উপর ঘটে এবং যখন এটি একটি প্রজন্মের জিসি অনুলিপি এবং ফরোয়ার্ডিং পদক্ষেপটি ঘটে থাকে সাম্প্রতিক স্ট্যাক বরাদ্দকৃত মানগুলি (এবং সম্ভবত বর্তমান ধারাবাহিকতা) গাদা থেকে এবং তারপরে স্ট্যাকটি বড় আকারের সাথে মারাত্মকভাবে হ্রাস পেয়েছে setjmp


এছাড়াও পড়ুন SICP , ভাষা Pragmatics প্রোগ্রামিং , ড্রাগন বুক , পাতার মর্মর ছোট টুকরা


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