লিনাস টরভাল্ডস (torvalds@cs.helsinki.fi)
মঙ্গল, 6 আগস্ট 1996 12:47:31 +0300 (ইইটি ডিএসটি)
বার্তাগুলি সাজানো হয়েছে: [তারিখ] [থ্রেড] [বিষয়] [লেখক]
পরবর্তী বার্তা: বার্ন্ড পি জিলার: "পুনরায়: get_hash_table- এ উফস"
পূর্ববর্তী বার্তা: লিনাস টরভাল্ডস: "পুনরায়: I / O অনুরোধের আদেশ"
সোমবার, 5 আগস্ট 1996-এ পিটার পি। আইসরলো লিখেছেন:
থ্রেডগুলির ধারণাটি আমাদের পরিষ্কার রাখতে হবে। অনেক লোক মনে হয় কোনও প্রক্রিয়া দিয়ে একটি থ্রেড বিভ্রান্ত করছে। নিম্নলিখিত আলোচনাটি লিনাক্সের বর্তমান অবস্থাকে প্রতিফলিত করে না, বরং এটি একটি উচ্চ পর্যায়ের আলোচনায় থাকার চেষ্টা।
না!
"থ্রেড" এবং "প্রক্রিয়াগুলি" পৃথক সত্তা বলে ভাবার কোনও কারণ নেই। এটি traditionতিহ্যগতভাবে এটি হয়ে গেছে তবে আমি ব্যক্তিগতভাবে মনে করি যে এটি মনে করা বড় ভুল। এই উপায়টি মনে করার একমাত্র কারণ হ'ল historicalতিহাসিক লাগেজ।
উভয় থ্রেড এবং প্রক্রিয়া সত্যই একটি জিনিস: একটি "মৃত্যুর প্রসঙ্গ"। বিভিন্ন ক্ষেত্রে কৃত্রিমভাবে আলাদা করার চেষ্টা করা কেবল স্ব-সীমাবদ্ধ।
এখানে "সিইই" নামে পরিচিত "মৃত্যুদণ্ডের প্রসঙ্গ", সেই সিওইর সমস্ত রাজ্যের একত্রিত। সেই রাজ্যে সিপিইউ স্টেট (রেজিস্টার ইত্যাদি), এমএমইউ স্টেট (পৃষ্ঠা ম্যাপিংস), অনুমতি রাষ্ট্র (ইউআইডি, জিআইডি) এবং বিভিন্ন "যোগাযোগের রাজ্য" (ওপেন ফাইল, সিগন্যাল হ্যান্ডলার ইত্যাদি) এর মতো জিনিস অন্তর্ভুক্ত রয়েছে। Ditionতিহ্যগতভাবে, একটি "থ্রেড" এবং "প্রক্রিয়া" এর মধ্যে পার্থক্যটি মূলত ছিল যে কোনও থ্রেডের সিপিইউ স্টেট থাকে (সম্ভবত সম্ভবত কিছু অন্যান্য ন্যূনতম রাজ্য) থাকে, অন্য সমস্ত প্রসঙ্গ প্রক্রিয়া থেকেই আসে। তবে,
এটি সিওইর মোট রাজ্যকে ভাগ করার একমাত্র উপায়, এবং এটি করার সঠিক উপায় এটি বলে যে কিছুই নেই। নিজেকে এই ধরণের চিত্রের মধ্যে সীমাবদ্ধ করা কেবল সাধারণ বোকা।
লিনাক্স যেভাবে এটি সম্পর্কে চিন্তা করে (এবং যেভাবে আমি জিনিসগুলি কাজ করতে চাই) তা হ'ল "প্রক্রিয়া" বা "থ্রেড" বলে কিছুই নেই। এখানে কেবল সিওইর সম্পূর্ণতা রয়েছে (লিনাক্স দ্বারা "টাস্ক" বলা হয়)। বিভিন্ন সিওই তাদের প্রসঙ্গের অংশগুলি একে অপরের সাথে ভাগ করতে পারে এবং সেই ভাগ করে নেওয়ার একটি উপসেট হ'ল প্রথাগত "থ্রেড" / "প্রক্রিয়া" সেটআপ, তবে এটি সত্যই কেবল একটি উপসেট হিসাবে দেখা উচিত (এটি একটি গুরুত্বপূর্ণ উপসেট, তবে সেই গুরুত্ব আসে নকশা থেকে নয়, মানদণ্ড থেকে: আমরা লিনাক্সের শীর্ষেও মান-অনুসারে থ্রেড প্রোগ্রাম চালাতে চাই ob
সংক্ষেপে: থ্রেড / চিন্তাভাবনার পদ্ধতির চারপাশে ডিজাইন করবেন না। কার্নেলটি সিওই চিন্তাভাবনা পদ্ধতির চারপাশে নকশা করা উচিত এবং তারপরে পাইথ্রেডস লাইব্রেরি সীমিত পাইথ্রেড ইন্টারফেসটি এমন ব্যবহারকারীদের কাছে রফতানি করতে পারে যারা সিওইর দিকে তাকানোর সেই পদ্ধতিটি ব্যবহার করতে চায়।
থ্রেড / প্রক্রিয়াটির বিপরীতে সিওই ভাবেন যখন কী সম্ভব হয় তার উদাহরণ হিসাবে:
- আপনি একটি বাহ্যিক "সিডি" প্রোগ্রাম করতে পারেন, এটি ইউনিক্স এবং / অথবা প্রক্রিয়া / থ্রেডে traditionতিহ্যগতভাবে অসম্ভব (নিখুঁত উদাহরণ, তবে ধারণাটি হ'ল আপনার এই ধরণের "মডিউল" থাকতে পারে যা প্রচলিত ইউনিক্সের মধ্যে সীমাবদ্ধ নয়) / থ্রেড সেটআপ)। একটি করুন:
ক্লোন (CLONE_VM | CLONE_FS);
চাইল্ড: এক্সিকিউট ("বাহ্যিক-সিডি");
/ * "এক্সিকিউট ()" ভিএমকে বিচ্ছিন্ন করবে, সুতরাং ক্লোনিংয়ের কাজটি দ্রুত করার জন্য আমরা কেবলমাত্র ক্লোন_ভিএম ব্যবহার করেছি * /
- আপনি প্রাকৃতিকভাবে "vfork ()" করতে পারেন (এটি ন্যূনতম কার্নেল সমর্থনকে মেইড করে তবে এই সমর্থনটি সিউএ-র পুরোপুরি চিন্তাভাবনার ক্ষেত্রে ফিট করে):
ক্লোন (CLONE_VM);
শিশু: চালিয়ে যেতে চালিয়ে যাও, শেষ পর্যন্ত ()
মা: মৃত্যুর জন্য অপেক্ষা করুন
- আপনি বাহ্যিক "আইও ডিমনস" করতে পারেন:
ক্লোন (CLONE_FILES);
শিশু: ফাইল বিবরণী খুলুন ইত্যাদি
মা: এফডি ব্যবহার করুন শিশুটি খোলা এবং ভিভি।
উপরের সমস্তটি কাজ করে কারণ আপনি থ্রেড / চিন্তার পদ্ধতিতে আবদ্ধ নন। উদাহরণস্বরূপ একটি ওয়েব সার্ভারের কথা চিন্তা করুন, যেখানে সিজিআই স্ক্রিপ্টগুলি "কার্যকর করার থ্রেড" হিসাবে সম্পন্ন হয়। আপনি এটি প্রচলিত থ্রেডের সাহায্যে করতে পারবেন না, কারণ traditionalতিহ্যবাহী থ্রেডগুলি সর্বদা পুরো ঠিকানা স্থানটি ভাগ করে নিতে হয়, তাই আপনাকে ওয়েব সার্ভারে নিজেই যা করতে চাইত তার সমস্ত কিছু লিঙ্ক করতে হবে ("থ্রেড" চলতে পারে না আরেকটি এক্সিকিউটেবল)।
সমস্যা একটি "মৃত্যুদন্ড প্রেক্ষাপটে" হিসাবে এই কথা ভাবছেন পরিবর্তে আপনার কর্ম এখন বহিরাগত প্রোগ্রামসমূহ চালানোর (= পিতা বা মাতা থেকে অ্যাড্রেস স্পেস আলাদা) ইত্যাদি বেছে পারেন তারা চায় বা তারা পিতা বা মাতা সঙ্গে উদাহরণস্বরূপ ভাগ সবকিছুর জন্য যা করতে পারেন ব্যতীত জন্য ফাইল বর্ণনাকারী (যাতে সাব-থ্রেডগুলি "পিতামাতাকে তাদের চিন্তার দরকার না করে প্রচুর ফাইল খুলতে পারে: সাব-থ্রেড" প্রস্থান করার সময় এগুলি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়, এবং এটি প্যারেন্টে এফডি ব্যবহার করে না) ।
উদাহরণস্বরূপ একটি থ্রেডযুক্ত "inetd" এর কথা ভাবেন। আপনি লো ওভারহেড কাঁটাচামচ + এক্সিকিউট চান, সুতরাং লিনাক্সের সাহায্যে আপনি "কাঁটাচামচ ()" ব্যবহার করার পরিবর্তে একাধিক-থ্রেডেড ইননেড লিখতে পারেন যেখানে প্রতিটি থ্রেড তৈরি করা হয় কেবল CLONE_VM দিয়ে (অংশ স্পেস শেয়ার করুন, তবে ফাইলটি ভাগ করবেন না) বর্ণনাকারী ইত্যাদি)। তারপরে বাচ্চা নির্বাহ করতে পারে যদি এটি বাহ্যিক পরিষেবা (উদাহরণস্বরূপ), বা সম্ভবত এটি অভ্যন্তরীণ ইনটড পরিষেবাদিগুলির মধ্যে একটি ছিল (প্রতিধ্বনি, টাইমোফডে) যে ক্ষেত্রে এটি কেবল এটি কাজ করে এবং প্রস্থান হয়।
আপনি "থ্রেড" / "প্রক্রিয়া" দিয়ে এটি করতে পারবেন না।
লিনাস