Переключение контекста между несколькими потоками в Java

Что представляет собой переключение контекста? Я знаю, что это может быть иногда с помощью сна (). Я натолкнулся на пример использования комбинации wait() и notify() для связи между потоками, так что один поток (класса Producer) предоставляет набор данных, а затем ожидает, пока другой поток (класса Consumer) не израсходует Это.

Мой вопрос касается влияния на производительность, когда утверждается, что "процессор тратит больше времени на переключение контекста и меньше времени на выполнение реальной работы". Но, глядя на этот пример, я думаю, что переключение контекста происходит только тогда, когда ЦП завершает требуемый набор операций. Тогда какая логика стоит за приведенным выше утверждением? Пожалуйста, найдите прикрепленный пример (Courtesy: Osborne The Complete Reference Java).

/*An implementation of a producer and consumer.*/

class Q {
int n;
boolean valueSet = false;

synchronized int get() {
    if(!valueSet)
    try {
      wait();
    } catch(InterruptedException e) {
      System.out.println("InterruptedException caught");
    }
    System.out.println("Got: " + n);
    valueSet = false;
    notify();
    return n;
}

synchronized void put(int n) {
    if(valueSet)
    try {
        wait();
    } catch(InterruptedException e) {
        System.out.println("InterruptedException caught");
    }
    this.n = n;
    valueSet = true;
    System.out.println("Put: " + n);
    notify();
}
}


class Producer implements Runnable {
    Q q;
    Producer(Q q) {
        this.q = q;
        new Thread(this, "Producer").start();
    }
    public void run() {
        int i = 0;
        while(true) {
            q.put(i++);
        }
    }
}

class Consumer implements Runnable {
    Q q;
    Consumer(Q q) {
        this.q = q;
        new Thread(this, "Consumer").start();
    }
    public void run() {
        while(true) {
            q.get();
        }
    }
}


class PCFixed {
    public static void main(String args[]) {
        Q q = new Q();
        new Producer(q);
        new Consumer(q); 
        System.out.println("Press Control-C to stop."); 
    }
}

1 ответ

Процессор тратит больше времени на переключение контекста и меньше времени на реальную работу.

Это связано с тем, что во время переключения контекста ядро ​​ОС должно сохранять состояние регистров процессора для текущего потока, а затем загружать эти регистры в правильном состоянии для следующего потока, который должен быть выполнен следующим. Это дополнительная работа, которую ядро ​​должно выполнять во время переключения контекста, не связанного с кодом приложения.

Еще один побочный эффект - мы теряем локальность ссылок из-за переключения контекста.

Другие вопросы по тегам