جاوا

جلسه ۷۳: معرفی برنامه نویسی چند نخی در جاوا

معرفی

در این جلسه دلایل وجود نخ ها (thread ها) و فواید آنها را می آموزید. همچنین درمورد مشکلاتی که در کار کردن با نخ های پیش می آید نیز نکات مهمی را بیان خواهیم کرد. موارد زیر را بیان خواهیم کرد:

  • چندنخی چیست؟
  • مزایای نخ ها
  • چندنخی باعث افزایش کارایی می شود
  • مشکلات استفاده از نخ ها

چندنخی چیست؟

درک نحوه کار کردن نخ (Thread) و آگاهی از اصول برنامه نویسی همروند ، دانش فنی برنامه نویس را نشان می دهد و فرصت های شغلی او را بیشتر می کند. در ابتدا ، بررسی می کنیم که چرا روش های چندنخی وجود دارند و چه فایده ای دارند؟ نخ ها مانند اکثر مفاهیم علوم رایانه اشیای فیزیکی نیستند. نزدیکترین نمود ملموس نخ ها را می توان در زمان دیباگ (اشکال زدایی) مشاهده کرد. اسکرین شات زیر ، نخ های برنامه ما را که در زمان دیباگ به حالت تعلیق (suspend) درآمده است ، نشان می دهد.

ساده ترین مثال برای فکر کردن در مورد یک سیستم همروند، یک سیستم تک پردازنده است که IDE (محیط برنامه نویسی) مورد علاقه شما را اجرا می کند. فرض کنید یکی از فایل های کد خود را ویرایش کرده و روی دکمه ذخیره کلیک کردید، با کلیک روی این دکمه ، فرایندی شروع می شود که در نهایت باعث نوشته شدن بایت ها در دیسک فیزیکی می شود. با این حال ، IO (کار با فایل) یک عملیاتی پرهزینه است و هنگام نوشتن بایت ها در دیسک ، پردازنده مرکزی (CPU) بیکار خواهد بود. در حالی که IO اتفاق می افتد ، CPU ی بیکار می تواند روی یک چیز مفید کار کند و کاربرد نخ ها همین جاست – وقتی نخ IO منتظر کامل شدن فرایند IO است ، نخ IO از CPU خارج و نخ UI (نخ رابط کاربری) وارد CPU می شود به همین دلیل است که اگر روی مکان دیگری از صفحه کلیک کنید ، IDE شما همچنان پاسخگو است و هنگ یا گیری ندارد. نخ ها می توانند توهمی از چند وظیفه ای بودن سیستم برای کاربر ایجاد کنند حتی اگر در هر زمان مشخصی CPU فقط یک نخ را اجرا کند. هر نخ برشی از زمان CPU را می گیرد و سپس از CPU خارج می شود چون کاری را درخواست کرده که نیاز به منتظر بودن و بیکار شدن CPU دارد یا برش زمانی آن در CPU کامل شده. نکات و ظرافتهای بسیار بیشتری در مورد زمانبندی نخ ها وجود دارد ، اما آنچه ما توضیح دادیم ، اساس آن را تشکیل می دهد. با پیشرفت در فن آوری سخت افزار ، اکنون استفاده از سیستم های چند هسته ای امری عادی است. برنامه ها می توانند از این معماری چند هسته ای استفاده کرده و هر نخ را به پردازنده ای خاص اختصاص دهند.

مزایای نخ ها

  1. توان عملیاتی بالاتر ، اگرچه در بدترین حالت ممکن است سربار ناشی از جابجایی CPU بین نخ ها ، هرگونه مزیت حاصل از چند نخی بودن را بی اثر کند و حتی عملکرد بدتری نسبت به حالت تک نخی داشته باشد. ولی چنین حالاتی غیرمعمول و استثنا هستند و به ندرت پیش می آیند.
  2. برنامه هایی پاسخگو که توهم چند وظیفه ای را ایجاد می کنند.
  3. استفاده بهینه از منابع. توجه داشته باشید که ایجاد نخ در مقایسه با ایجاد پروسه جدید ، خیلی سبک تر است. وب سرورهایی که هنگام پاسخ گویی به درخواست های جدید ، از نخ ها به جای ایجاد پروسه جدید استفاده می کنند ، منابع بسیار کمتری مصرف می کنند.

تمام مزایای دیگر چند نخی حاصل از گسترش یا فواید غیرمستقیم موارد فوق است.

چندنخی باعث افزایش کارایی می شود

به عنوان یک مثال مشخص ، کد زیر را در نظر بگیرید. هدف این کد محاسبه مجموع تمام اعداد صحیح از ۰ تا Integer.MAX_VALUE است. در سناریوی اول ، ما یک نخ واحد داریم که عملیات جمع را انجام می دهد در حالی که در سناریوی دوم بازه اعداد را به دو قسمت تقسیم می کنیم و برای هر قسمت یک نخ داریم. در پایان ، مجموع دو نیمه را جمع می کنیم تا جمع کل بدست آید. ما زمان لازم برای هر دو سناریو را اندازه گیری و چاپ می کنیم.

class Demonstration {
    public static void main( String args[] ) throws InterruptedException {
        SumUpExample.runTest();
    }
}

class SumUpExample {

    long startRange;
    long endRange;
    long counter = 0;
    static long MAX_NUM = Integer.MAX_VALUE;

    public SumUpExample(long startRange, long endRange) {
        this.startRange = startRange;
        this.endRange = endRange;
    }

    public void add() {

        for (long i = startRange; i <= endRange; i++) {
            counter += i;
        }
    }

    static public void twoThreads() throws InterruptedException {

        long start = System.currentTimeMillis();
        SumUpExample s1 = new SumUpExample(1, MAX_NUM / 2);
        SumUpExample s2 = new SumUpExample(1 + (MAX_NUM / 2), MAX_NUM);

وقتی من برنامه را اجرا کردم، سناریوی دو نخی در ۶۵۲ میلی ثانیه اجرا شد در حالی که سناریوی تک نخی در ۸۸۶ میلی ثانیه اجرا شد. ممکن است اعداد متفاوتی را مشاهده کنید اما زمان صرف شده توسط دو نخ همیشه کمتر از یک نخ است. بسته به در دسترس بودن پردازنده های متعدد و ماهیت مسئله حل شده ، بهبود عملکرد می تواند چندین برابر شود. با این حال ، همیشه مسائلی وجود دارد که به خوبی به یک رویه چند نخی تقسیم نمی شود ولی به خوبی می تواند با استفاده از یک نخ حل شود.

مشکلات استفاده از نخ ها

با این حال ، همانطور که گفته شد ، هیچ چیز رایگان نیست. هزینه استفاده از نخ ها به اشکال زیر نمایان می شود:

  1. خطاهایی که یافتن آنها بسیار دشوار است، برخی از آنها ممکن است فقط در نسخه نهایی برنامه و توسط کاربر دیده شود.
  2. هزینه بالاتر نگهداری کد از آنجا که درک و تفهیم کد چند نخی ذاتاً دشوارتر می شود.
  3. افزایش استفاده از منابع سیستم. ایجاد هر نخی حافظه اضافی و چرخه پردازنده را مصرف می کند همچنین سوئیچ بین نخ ها زمان بر است.
  4. برنامه ها ممکن است کند شوند زیرا هماهنگی بین نخ ها هزینه بر است. به دست آوردن و آزاد شدن قفل ها به زمان اجرای برنامه می افزاید. نخ هایی که بر سر بدست آوردن قفل رقابت می کنند، باعث هدر شدن زمان یا حتی بن بست می شوند.

با این پس زمینه از نخ ها در جلسات بعدی به جزئیات بیشتری از برنامه نویسی همروند می پردازیم و در نهایت در یک آزمون ، مروری می کنیم بر دانسته های خود در این زمینه.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا