چندریسمانی همزمان

چند ریسمانی همزمان (به انگلیسی: Simultaneous Multithreading یا SMT) ، روشی برای افزایش بهره‌وری کل سیستم که به طراحی پردازنده‌ هایی اشاره دارد که می‌ توانند بیش از یک دستورالعمل را به‌ صورت همزمان اجرا کنند. این مجموعه از پردازنده‌ ها به سوپر اسکالر (به انگلیسی: superscalar) معروف هستند. آنها در کنار سخت‌ افزار با قابلیت «چند ریسمانی سخت‌ افزاری» عمل میکنند. فناوری SMT این امکان را فراهم میکند که ریسه‌ هایِ مستقل، از منابعی که در طراحیِ پردازنده در اختیار آنها قرار داده شده است، بهتر استفاده کنند.[۱]

پردازنده‌ های اسکالر سوپر اسکالر به گونه‌ای طراحی شده‌ اند که میتوانند چندین دستورالعمل را در هر چرخه ساعت اجرا کنند. با این حال، در عمل، بسیاری از واحدهای اجرایی پردازنده ممکن است در هر چرخه به‌طور کامل مورد استفاده قرار نگیرند، زیرا همه دستور العمل‌ ها به منابع یکسانی نیاز ندارند. اینجاست که فناوری SMT (چند ریسمانی همزمان) وارد عمل میشود و بهبود های قابل توجهی را ارائه میدهد.[۲].

اصول کارکرد SMT

ویرایش

در فناوری SMT، چندین ریسه (thread) یا فرایند (process) میتوانند به‌ طور همزمان بر روی یک پردازنده اجرا شوند. این ریسه‌ها از منابع سخت‌ افزارهای مشترک پردازنده، مانند واحدهای محاسباتی، ثبات‌ ها (registers)، و حافظه نهان (cache) استفاده میکنند. هدف اصلی SMT بهبود بهره‌ وری از منابع پردازنده است که به‌ طور معمول ممکن است در یک ریسه منفرد، به‌ طور کامل استفاده نشوند.

فناوری SMT این امکان را فراهم میکند که اگر یک ریسه به دلیل انتظار برای دسترسی به حافظه یا سایر منابع معطل شود، ریسه‌ های دیگر بتوانند از منابع بیکار استفاده کنند و بدون وقفه به اجرای خود ادامه دهند. این ویژگی به بهبود بازدهی کلی پردازنده و کاهش زمان تأخیر کمک میکند[۳].

یکی از مثال‌ های برجسته استفاده از فناوری SMT ، در پردازنده‌ های مدرن، پردازنده‌ های سری Intel Hyper-Threading است. این پردازنده‌ ها با استفاده از فناوری SMT قادرند دو ریسه را به‌ طور همزمان بر روی هر هسته فیزیکی اجرا کنند. این به معنای این است که یک پردازنده چهار هسته‌ ای با Hyper-Threading می‌ تواند به‌ طور همزمان هشت ریسه را اجرا کند. این موضوع منجر به بهبود چشمگیر عملکرد در برنامه‌ هایی میشود که قابلیت اجرای موازی دارند.[۲]

پردازنده‌ های AMD نیز از فناوری مشابهی به نام Simultaneous Multi-Threading (چند رشته ای همزمان) بهره می‌ برند. این فناوری در پردازنده‌ های Ryzen این شرکت به کار گرفته شده و عملکرد بالاتری را در برنامه‌ های چند ریسمانی ارائه می‌ دهد.

چالش‌ ها و ضرورت‌ های SMT

ویرایش

فناوری SMT نیازمند تغییرات و بهبود های قابل توجهی در طراحی سخت‌ افزاری پردازنده‌ ها است. از جمله این تغییرات می‌توان به مدیریت پیچیده‌ تر ثبات‌ ها، افزایش تعداد واحدهای اجرایی، و بهبود سیستم حافظه نهان اشاره کرد. علاوه بر این، نرم‌ افزار نیز باید به گونه‌ ای طراحی شود که بتواند از مزایای SMT بهره‌ برداری کند. این به معنای برنامه‌ نویسی برای اجرای موازی و بهینه‌ سازی الگوریتم‌ ها برای استفاده از چندین ریسه به‌ طور همزمان است.

مدیریت منابع مشترک: یکی از چالش‌ های اصلی SMT مدیریت منابع مشترک بین ریسه‌ ها است. اگرچه این فناوری می‌ تواند بهبود های بزرگی در عملکرد ایجاد کند، اما در صورت مدیریت نادرست منابع، ممکن است به کاهش عملکرد یا تداخل بین ریسه‌ ها منجر شود. بنابراین ریسه‌ ها باید به طور موثری مدیریت شوند تا رقابت بر سر منابع مشترک به حداقل برسد تا منجر به کاهش عملکرد سیستم نشود[۴]. به عنوان مثال، اگر دو ریسه ب طور همزمان به یک منبع خاص نیاز داشته باشند، ممکن است باعث ایجاد تأخیر در اجرا شوند.

طراحی الگوریتم‌ها: برنامه‌نویس‌ها باید الگوریتم‌های خود را برای استفاده از مزایای چندریسمانی بهینه‌سازی کنند تا عملکرد بهتری در برنامه‌های موازی داشته باشند[۵].

مزایای استفاده از SMT شامل افزایش بازدهی پردازنده، بهبود عملکرد در برنامه‌ های چند ریسمانی، و کاهش زمان تأخیر است. این فناوری به ویژه در برنامه‌ هایی که به شدت به پردازش موازی متکی هستند، مانند شبیه‌ سازی‌ ها، محاسبات علمی، و پردازش داده‌ های بزرگ، بسیار مؤثر است.

با این حال، همه برنامه‌ ها نمیتوانند از مزایای SMT بهره‌ برداری کنند. برنامه‌ هایی که به صورت ترتیبی اجرا می‌ شوند و نیاز به پردازش موازی ندارند، ممکن است بهبود قابل توجهی در عملکرد مشاهده نکنند. به همین دلیل، توسعه‌ دهندگان نرم‌افزار باید به‌ طور دقیق نیازها و الگوهای کاری برنامه‌ های خود را بررسی کنند تا بتوانند از فناوری SMT بهره‌ برداری کنند.

در نتیجه، فناوری چند ریسمانی همزمان یک ابزار قدرتمند برای بهبود عملکرد پردازنده‌ ها و افزایش بازدهی سیستم‌ های کامپیوتری است. این فناوری با به‌ کارگیری همزمان چندین ریسه در یک پردازنده، می‌ تواند بهره‌ وری از منابع سخت‌ افزاری را به حداکثر برساند و عملکرد سیستم را در برنامه‌ های چند ریسمانی بهبود ببخشد. با این حال، بهره‌ برداری بهینه از این فناوری نیازمند طراحی دقیق سخت‌ افزار و نرم‌ افزار و مدیریت مؤثر منابع مشترک بین ریسه‌ ها است.

جزئیات

ویرایش

نام چند رشتگی مبهم است چون چندین رشته و وظیفه (با جداول صفحهٔ مختلف، سطح‌ های وضعیت وظیفهٔ مختلف، حلق ه‌های حفاظت مختلف، اجازه‌ های ورود و خروج مختلف و …) میتوانند به‌ طور همزمان روی یک هستهٔ س ی‌پی‌ یو اجرا شوند. علیرغم اجرا شدن روی یک هسته، پردازندهٔ آنها کاملاً از یکدیگر جدا و مستقل است. چند رشتگی از نظر مفهومی مشابه چند وظیفهٔ مختلف انحصاری است، ولی در سطح رشته اجرا در پردازنده‌ های ابر مقیاس‌ پذیر جدید پیاده‌ سازی شده است.

چند رشتگی همزمان یکی از دو مورد از پیاد ه‌سازی اصلی چند رشتگی است، و شکل دیگر آن چند رشتگی زمانی است. در چند رشتگی زمانی، در هر سطح زمانی داده شده، تنها یک رشتهٔ دستور العمل‌ها قابل اجرا است. در چند رشتگی همزمان، دستورهای بیش از یک رشته در هر سطح زمانی داده شده قابل اجرا هستند. این، بدون تغییرات عمده‌ ای نسبت به معماری پایهٔ پردازنده انجام شده است. ضمائم اصلی مورد نیاز، شامل توانایی واکشی (حمل) دستور العمل‌ ها از چند رشتگی در یک دوره زمانی و یک فایل رجیستر (ثبت‌ کننده) بزرگ‌تر برای نگه‌داری داده‌ ها از طرف چند رشتگی است. تعداد رشته‌ های متقارن (همزمان)، توسط طراحان تراشه قابل تصمیم‌ گیری است. دو رشته متقارن در هر هسته CPU نوع رایج آن است، اما بعضی از پردازنده‌ ها ۸ رشته متقارن را در یک هستهٔ خود دارند.

به دلیل آن که روش فنی راه‌ حل بسیار سودمندی است، و درگیری رو به افزایش اجتناب‌ ناپذیر در اشتراک‌ گذاری منابع، اندازه‌ گیری یا تأیید اثربخشی راه‌ حل می‌ تواند دشوار باشد. به هر حال اندازه‌ گیری اثربخشی انرژی اس‌ ام‌ تی(SMT) توسط بومی موازی و مدیریت میزان کار در تاریخ از 130nm به 32nm در پیاده‌ سازی اس‌ ام‌ تی(SMT) شرکت اینتل به این رسیدند که در پیاده‌ سازی در 45nm و 32nm ,SMT در انرژی بسیار کارآمد است. حتی در مورد پردازنده‌ های اتمی در سیستم‌ های مدرن، اس‌ ام‌ تی به‌ طور هم‌ زمان همراه با یک نیروی پویای کوچک اضافی کار می‌ کند و حتی زمانی که بازده حداقل است، می‌ توان به صرفه‌ جویی در مصرف برق توجه داشت.

برخی از محققان نشان دادند که رشته‌های اضافی می‌تواند به عنوان عنصری فعال منبع اشتراک‌گذاری همانند مخزن مورد استفاده قرار بگیرند. برای بهبود کارایی تک رشته دیگر و این ادعا نشان می‌دهد که اس‌ام‌تی(SMT) تنها یک راه حل مفید نیست. استفاده دیگر از اس‌ام‌تی (SMT) ارائه محاسبات اضافی برای برخی سطوح کشف خطا و ترمیم آن است.

در هر حال، در بسیاری از موارد متداول، اس‌ ام‌ تی (SMT) برای پوشاندن تأخیر در کار حافظه، افزایش کارایی و افزایش توان محاسبات در هر مدت استفاده از سخت‌ افزار می‌ باشد.

طبقه‌ بندی

ویرایش

در طراحی پردازنده، دو روش برای تقارن تراشه با کمترین منابع مورد نیاز وجود دارد: یک روش سوپر است، که سعی بر به‌کارگیری سطح دستورالعمل به‌طور موازی (ILP) و دیگر رویکرد چند رشتگی در به‌کارگیری سطح رشته به‌طور موازی است (TLP).

سوپر به معنای اجرای چندین دستورالعمل می‌ باشد، در حالی که سطح رشته موازی (TLP) اجرای دستو رالعمل‌ ها در چندین رشته همراه با یک تراشهٔ پردازنده به‌ طور همزمان میباشد.

  • قرار دادن چند رشته در یک لایه: این عمل در چند دستورالعمل از چندین رشته، به چند رشته زمانی نیز اشاره دارد که بیشتر می‌ تواند به ریز و درشت بخش‌ های چند رشتگی مربوط به فرکانس عمل در یک لایه قرار دادن تقسیم شود. چند رشتگی ریز بخش -برای مثال در پردازنده در بسته – دستورالعمل‌ ها را برای رشته‌ های مختلف بعد از هر دوره زمانی انجام می‌ دهد، در حالی که چند رشتگی درشت بخش تنها زمانی برای انجام دستورالعمل از دیگر رشته تغییر می‌کند که رشته عملیاتی فعلی باعث ایجاد تأخیر زیادی شده‌باشد (مانند صفحه گسل و غیره). چند رشتگی درشت بیشتر برای حداقل تغییرات زمینه بر روی رشته‌ ها به‌کار برده می‌شود. برای مثال پردازنده مُنتسیتو شرکت اینتل از چند رشتگی درشت استفاده میکند در حالی که UltraSPARC T1 شرکت سان از چند رشتگی ریز استفاده می‌کند. برای چنین پردازنده‌ هایی که تنها یک خط لوله (pipeline) در هر هسته دارد، قرار دادن چند رشته در یک لایه تنها راه ممکن است، به دلیل آن که میتواند بر روی حداکثر یک دستورالعمل در دوره زمانی کار کند.
  • چند رشتگی هم‌ زمان (SMT): عملیات چند دستورالعملی را از چندین رشته در یک دورهٔ زمانی انجام میدهد. پردازنده باید بسیار بزرگ (سوپر) باشد تا بتواند انجام دهد.
  • چند پردازشگری در سطح تراشه (CMP یا چند هسته‌ ای): دو یا چند پردازنده را در یک تراشه ادغام می‌ کند. در این حالت هر عملیات به‌ طور مستقل انجام می‌دهد.
  • هر صورت دیگری از ترکیب چند رشتگی SMT/CMP.

فاکتور کلیدی تشخیص دادن آن‌ها، توجه به تعداد دستورالعمل‌هایی که یک پردازنده می‌تواند در یک دوره زمانی انجام دهد و تعداد رشته‌هایی که از هر دستورالعمل به عمل می‌آید. ریزسیستم UltraSPARC T1 شرکت سان (شناخته شده با عنوان «نیاگارا» تا زمان پخش آن در ۱۴ نوامبر ۲۰۰۵) یک پردازنده چندهسته‌ای است که به جای چند رشتگی هم‌زمان با روش چند رشتگی درشت ترکیب شده است به دلیل آن که هر هسته در یک لحظه تنها می‌تواند یک دستورالعمل را انجام دهد.

پیاده‌سازی در طول تاریخ

ویرایش

مادامی که چند رشتگی CPUها که از حدود سال ۱۹۵۰ وجود دارند، چند رشتگی همزمان اولین تحقیق شرکت IBM به عنوان بخشی از پروژهٔ ACS-360 در سال ۱۹۶۸ بود. اولین تجارت بزرگ ریز پردازنده‌ ها توسعه یافته توسط SMT, Alpha 21464 (EV8) میباشد. این ریز پردازنده توسط DEC با هماهنگی دین تُلسن ازدانشگاه کالیفرنیا در سن دیگو و سوزان ایگرز و هنری لِوی از دانشگاه واشینگتن توسعه یافت. از زمانی که خط Alpha ریز پردازنده‌ها به‌ مدت کوتاهی متوقف شد، ریز پردازنده هیچگاه عرضه نشد؛ قبل از اینکه HP, Compaq را به‌ دست‌ آورد DEC را به‌دست آورده بود. کار دین تُلسن همچنین توسعه دادن نسخه‌ های فوق رشته‌ای (تکنولوژی فوق رشته‌ای یا HTT) ریز پردازندههای پنتیوم ۴ شرکت اینتل بود، به عنوان مثال"Northwood" و "Prescott ".[نیازمند منبع]

پیاده‌سازی مدرن تجاری

ویرایش

پنتیوم ۴ شرکت اینتل اولین پردازنده میزی مدرن برای پیاده‌سازی چند رشتگی هم‌زمان بود، که با ۳٫۰۶ گیگاهرتز در سال ۲۰۰۲ به‌دست آمد و در آن زمان تعدادی از پردازنده‌هایشان را معرفی کردند. اینتل آن را عملکرد فوق رشته‌ای می‌نامد و موتور دو رشته‌ای اس‌ام‌تی را تدارک دید. اینتل تا افزایش ۳۰ درصدی سرعت در مقایسه با موارد یکسان در پنتیوم بدون SMT پیش رفت. دید نسبت به بهبود عملکرد بسیار وابسته به نرم‌افزار است؛ در حالی که دو برنامه را اجرا می‌کنید که به توجه کامل پردازنده نیاز دارید که امکان دارد بنظر برسد یک یا هر دو برنامه زمانی که فوق رشته‌ای روشن شده، به‌طور محسوسی (سرعتشان) پایین آمده است؛ که این ناشی از بسته شدن منابع اجرایی ارزشمند سیستم پاسخ‌دهی پنتیوم ۴ است. افزایش مغایرت منابع مثل پهنای باند، مخزن (cache), TLBها، دوباره مرتب کردن ورودی‌های بافر، تساوی منابع پردازنده بین دو برنامه که میزان زمان متغیر برای اجرا را اضافه می‌کند. پنتیوم ۴ با هسته پرساکت صف پاسخگویی به‌دست‌آورد، که زمان اجرا مورد نیاز برای سیستم پاسخگویی را افزایش می‌دهد. این کافی است تا به‌طور کامل در برابر عملکرد تصادم‌ها غلبه کند.

آخرین طراحی در معماری MIPS شامل سیستم اس‌ام‌تی است که با عنوان MIPS MT شناخته شده است. MIPS MT، وزن سنگین عناصر پردازش مجازی و وزن کم ریزرشته‌های سخت‌افزار بهبود داد. RMI، راه انداز برپایهٔ کوپرتینو، اولین فروشنده MIPS برای بهبود پردازنده برپایهٔ SOC بر روی ۸ هسته می‌باشد که هرکدام ۴ رشته را اجرا می‌کند. رشته‌ها می‌توانند در حالت ریز بخش اجرا شوند که یک سری رشته مختلف می‌توانند در یک دوره زمانی انجام شوند. رشته‌ها می‌توانند به یک سری اولویت‌ها اختصاص داده شوند. تکنولوژی تصوری MIPS در CPU دارای 2 SMT رشته در یک هسته می‌باشند. [چه زمانی؟]

IBM ژن آبی / Q دارای ۴ راه SMT است.

5 IBM POWER، معرفی شده در ماه مه سال ۲۰۰۴، هم به عنوان ماژول دو هسته‌ای دو تراشه‌ای (DCM) و هم به عنوان ماژول چهار یا هشت هسته‌ای دو تراشه‌ای (MCM)، همراه هر هسته دو رشته موتور SMT است. پیاده‌سازی IBM بسیار پیچیده‌تر از قبلی‌هایش است، به دلیل اینکه می‌تواند عملیات مختلفی را به رشته‌های متفاوت اعمال کند، بیشتر ریز بخش است و موتور SMT به صورت پویا می‌تواند خاموش و روشن شود تا بهتر آن ظرفیت کاری را که پردازنده SMT نمی‌تواند افزایش کارایی دهد، اجرا کند. این دومین پیاده‌سازی چند رشتگی سخت‌افزاری در دسترس عموم شرکت IBM است. در ۲۰۱۰، شرکت آی‌بی‌ام سیستمی بر پایهٔ پردازنده 7POWER با هشت هسته معرفی کرد که هر هسته دارای ۴ رشته هوشمند هم‌زمان می‌باشد. این جابه‌جایی‌ها (تغییرات) در رشته‌ها بین یک رشته، دو رشته و چهار رشته به تعداد رشته‌های فرایند (پروسه) ای که زمان‌بندی شده‌اند بستگی دارد. این کار، استفاده از هسته را در پاسخگویی در حداقل زمان یا برای حداکثر خروجی بهینه می‌کند. 8IBM POWER دارای ۸ رشتهٔ هم‌زمان هوشمند می‌باشد. (SMT8).

IBM Z13 دارای ۲ رشته در هر هسته می‌باشد (SMT-2).

همچنین بسیاری از مردم گزارش کرده‌اند که ریزسیستم UltraSPARC T1 شرکت سان (که در ۱۴ نوامبر سال ۲۰۰۵ با نام "نیاگاراً شناخته شد) و در حال حاضر پردازنده موسوم به "راک" که از بین رفته است (که در سال ۲۰۰۵ به معرف عموم رسید اما بعدی کلی تأخیر در سال ۲۰۰۹ تعطیل شد) پیاده‌سازی SPARC اغلب بر بهره‌برداری از روش SMT و CMP متمرکز شده است، در حالی که "نیاگاراً از SMT استفاده نمی‌کند. شرکت سان تمایل به این رویکرد ترکیبی با نام "CMT" و مفهوم کلی "توان محاسباتی" دارد. "نیاگاراً دارای ۸ هسته می‌باشد، اما هر هسته تنها یک خط لوله (pipeline) داراست، در واقع از چند رشتگی ریز بخش استفاده می‌کند. برخلاف SMT که دستورالعمل‌های چند رشتگی که پنجره عملیات را در هر دوره زمانی به اشتراک می‌گذارد، پردازنده از سیاست دور رابین برای اعمال دستورالعمل‌ها از رشته فعال بعدی در هر دوره زمانی استفاده می‌کند. این باعث می‌شود تا بیشتر شبیه به پردازنده بسته باشد. پردازنده "راک" شرکت سان متفاوت است، دارای چند هسته پیچیده است که دارای بیش از یک خط لوله (pipeline) می‌باشد.

محصول SPARC T3 شرکت اوراکل (Oracle) دارای ۸ رشته ریز بخش در هر هسته می‌باشد ،4 SPARC T ،5 SPARC T،5M SPARC و 6Sparc M دارای ۸ رشته درشت بخش در هر هسته می‌باشد که هر دو می‌توانند به‌طور هم‌زمان عملیات انجام دهند.

شرکت فوجیتسو (FUJITSU) مدل SPARC 64VI دارای چند رشتگی درشت بخش عمودی(VMT) و SPARCVII و جدیدتر دارای اس‌ام‌تی دو روشی هستند.

شرکت اینتل (Intel) در مونته سیتو ایتانیوم خود از چند رشتگی درشت بخش استفاده کرده است و توکویلا و جدیدتر از اس‌ام‌تی دو روشی استفاده می‌کند (همراه با چند رشتگی دو-دامنه‌ای).

شرکت اینتل در زئون فای از SMT 4-روشی (همراه با چند رشتگی زمان تسهیم شده) با سخت‌افزاری که برپایهٔ رشته‌ها است برخلاف فوق رشته‌ای منظم نمی‌تواند غیرفعال شود.

اتمِ اینتل، در سال ۲۰۰۸ معرفی شد، اولین محصول برای آیندهٔ SMT دو روشی (فروخته‌شده به عنوان فوق رشته‌ای) بدون معین کردن مرتب‌سازی دستورالعمل، اجرای حدسی یا تغییر نام رجیستر است. اینتل فوق رشته‌ای را همراه با ریزساختار «نهالم» بعد از غیاب آن در معماری هسته باز معرفی کرد.

معماری بولدوزر AMD، تراشه FLEX TPU و Shared L2 چند رشتگی هستند اما هسته‌های عدد صحیح ماژول، تک‌رشته‌ای هستند، بنابراین این تنها یک پیاده‌سازی جزئی از اس‌ام‌تی می‌باشد.

ریز ساختار «زِن» AMD, SMT دو روشی دارد.

معایب این سیستم

ویرایش

بر اساس طراحی و معماری پردازنده، چند رشتگی هم‌ زمان می‌ تواند کارکرد را کاهش دهد. اگر هر یک از منابع به اشتراک گذاشته شده تنگنا هایی برای کارایی باشند. منتقدان در مورد این موضوع با هم گفتگو کرده‌ اند که بار قابل توجهی وجود دارد که به توسعه دهندگان نرم‌ افزارها بپذیرند که آنها مجبور هستند که چه چند رشتگی هم‌ زمان خوب باشد و چه بد، بر روی نرم‌ افزارش در موقعیت‌ های مختلف و با اضافه کردن (جملات) منطقی به آن، آزمایش انجام دهند تا اگر کارایی را کاهش می‌ دهد. آن را خاموش کنند (از دور خارج کنند). سیستم عامل‌ های نامناسب کنونی API خواستار این مقصود و برای جلوگیری از پردازش همراه با اولویت مختلف با گرفتن منابع از یکدیگر هستند.

همچنین در مورد پیاده‌ سازی چند رشتگی هم‌ زمان کنونی، نگرانی‌ های امنیتی وجود دارد. پیاده‌ سازی فوق رشته‌ ای شرکت اینتل این آسیب‌ پذیری را دارد که یک نرم‌افزار ممکن است کلید رمزنگاری آن از اجرای یک نرم‌ افزار دیگر با پردازنده‌ ای مشابه توسط نظارت بر استفاده تراشه دزدیده شود.

جستارهای وابسته

ویرایش

منابع

ویرایش
  1. Wikipedia contributors, "Simultaneous multithreading,", December 16, 2012.
  2. ۲٫۰ ۲٫۱ Kuck, David. “The Intel Hyper-Threading Technology.” IEEE Computer Society, 2004.
  3. Schmidt, Douglas C., et al. “The Real-Time Strategy for Hyper-Threading.” ACM Transactions on Embedded Computing Systems, 2013.
  4. Patterson, David A., and John L. Hennessy. “Computer Organization and Design: The Hardware/Software Interface.” Morgan Kaufmann, 2017.
  5. Mattson, Tim G., et al. “Patterns for Parallel Programming.” Addison-Wesley, 2004.