2010-06-23 9 views
5

Ostatnio czytałem ciekawy blog porównujące mutex i semafora:
"
http://www.feabhas.com/blog/2009/09/mutex-vs-semaphores-%E2%80%93-part-1-semaphores/
"Czy przełączanie kontekstu odbywa się w krytycznej sekcji?

Cytat z niego:
"
Jeżeli przełącznik kontekst dzieje podczas tego zadania znajduje się w obszarze krytycznym, a inne zadanie również wywołuje P (S), wtedy to drugie zadanie (i wszelkie kolejne zadania) zostanie zablokowane przed wejściem do krytycznego regionu przez umieszczenie go w stanie oczekiwania przez system operacyjny.Po późniejszym terminie pierwsze zadanie zostanie zmienione i dzwoni do V (S), aby wskazać, że opuścił region krytyczny. Drugim zadaniem będzie teraz dozwolony dostęp do krytycznego regionu. "

Jeśli tak jest w przypadku semafora, czy jest to również prawdą w przypadku muteksu? Nie sądzę, że to prawda, ponieważ blok kodu jest zablokowany, powinien być" atomowy ", który nie może być kontekstowo wyłączony lub przerwany Czy mam rację?

Odpowiedz

10

Nie, przełączenie kontekstu może się zdarzyć prawie wszędzie. Chociaż dobrym pomysłem jest trzymanie zamków przez tak krótki czas, jak to tylko możliwe, nie należy blokować całej maszyny tylko dlatego, że jeden proces miał tylu nici, które trzymały zamki, ponieważ są rdzenie, czekając, aż coś się wydarzy, czy nie?

Punkt blokady polega na uniemożliwieniu wykonania kodu, który może zakłócać działanie kodu w zamku - nie jest to powstrzymanie innego kodu przed wykonaniem, w każdym procesie w systemie. (Przestawienie kontekstu na inny proces w dalszym ciągu jest przełącznikiem kontekstowym.)

5

To zależy od wersji "sekcji krytycznej", z którą masz do czynienia. Na przykład w OS/2 (poprzednik obecnego systemu Windows, który najpierw zawierał krytyczne sekcje) wejście do sekcji krytycznej uniemożliwiło przejście do innego wątku w tym samym procesie. W Windows NT zmienili to, więc przełączanie wątków jest dozwolone, więc inne wątki będą blokowane tylko wtedy, gdy/jeśli spróbują wejść w tę samą sekcję krytyczną.

W obu przypadkach sekcja krytyczna jest lokalna dla procesu, więc wątek w innym procesie nigdy nie może próbować wejść do tej samej sekcji krytycznej.

W przypadku innych systemów należy sprawdzić, w jaki sposób sekcja krytyczna (zakładając, że ją posiada) określa, co zezwala/zabrania. Nie ma uniwersalnej definicji.

0

Przełączanie kontekstu jest zawsze możliwe w systemie Linux, nie można zmonopolizować procesora, ale wątki, które nie mogą uzyskać blokady, będą blokować, a tym samym nie będą wybierane przez harmonogram, dopóki blokada nie będzie dostępna ponownie.
Dowód:
Uruchom ten kod, a zobaczysz dane wyjściowe od, a następnie od g, a następnie od f ponownie.

#include <stdio.h> 
#include <pthread.h> 
#include <semaphore.h> 

int global=0; 
sem_t sem; 
void* f(void *a){ 
    sem_wait(&sem); 
    printf("Inside a critical section: %d\n",global++); 
    ++global; 
    sem_post(&sem); 
    return a ; 
} 

void* g(void *a){ 
    printf("Function call to g.\n"); 
    return a ; 
} 

int main(void){ 
    pthread_t tids[10]; 
    sem_init(&sem, 0, 1); 
    int i; 
    pthread_t new_thread; 
    for (i=0; i < 10 ; ++i){ 
    if (i == 8) 
     pthread_create(&new_thread, NULL, g, NULL); 
    pthread_create(&tids[i], NULL, f, NULL); 
    } 
    for (i=0; i < 10 ; ++i){ 
    pthread_join(tids[i], NULL); 
    } 
    pthread_join(new_thread, NULL); 
} 
-1

Większość czasu, nitki czy proces można przełączać przez scheduler dowolnym momencie, nawet jest w sekcji krytycznej. Sekcja krytyczna jest tylko specjalną częścią kodu, która nie powinna być współużytkowana do wykonania przez inny wątek. To nie jest dostęp atomowy. Tylko semafor lub muteks to samo jest dostęp atomowy. Jeśli chcesz, aby wykonanie krytycznego kodu sekcji było atomowe, tylko jeden wątek może uruchomić ten kod nawet w SMP, możesz użyć blokady spinlock z przerwaniem przerwań. Jeśli przerwanie jest wyłączone w procesorze, program planujący przestaje działać, nie uruchamia się isr. Tylko twój wątek uruchamia kod w sekcji krytycznej do momentu zwolnienia spinów wątku.Jest to najwyższa ochrona kodu, która jest używana tylko w jądrze, ponieważ konflikt między wątkiem przerwania i jądra występuje tylko w jądrze. Na przykład, isr odbiera dane z urządzenia, a wątek jądra odczytuje te dane. Wtedy działa spinlock.

Powiązane problemy