동기화란 무엇일까? (synchronization)

kwon_yongil_·2021년 5월 3일
0

면접 준비

목록 보기
8/12

동기화의 정의는?

  • 공유 리소스에 대한 스레드 액세스를 제어하는 것을 동기화라고 한다.

동기화의 방법은 무엇이 있을까?

  • 상호 배제를 이용한 방식인 세마포어, 뮤텍스 등이 있음

  • Java의 Synchronized 문법 사용

동기화없이 데이터를 공유해서 쓰면 어떤 문제가 발생할까?

  • 경쟁 상태 : 스레드가 공유 리소스에 액세스하는 순서를 알 수 없는 상태, 결과 예측이 불가능

  • 기아 상태 : 스레드가 공유 리소스에 장기적으로 액세스할 수 없는 상태

세마포어와 뮤텍스의 차이는?

  • 세마포어 : 락을 획득하지 않은 스레드 및 프로세스가 세마포어의 카운터 변경 가능

  • 세마포어는 wait과 signal을 이용해서 구현

  • 세마포어는 공유 리소스를 카운터만큼 사용할 수 있으며, 공유 리소스내 작업 대상은 구분

  • 뮤텍스 : 락을 획득한 스레드 및 프로세스만 해제 가능

  • 세마포어는 뮤텍스처럼 쓸 수 있지만, 뮤텍스는 세마포어처럼 쓸 수 없다.

소비자 생산자 문제(불완전한 방법)

 do {
     ...
     아이템을 생산한다.
     ...
     wait(empty);  //버퍼에 빈 공간이 생길 때까지 기다린다.
     wait(mutex); //임계 구역에 진입할 수 있을 때까지 기다린다.
     ...
     아이템을 버퍼에 추가한다.
     ...
     signal(mutex); //임계 구역을 빠져나왔다고 알려준다.
     signal(full);  //버퍼에 아이템이 있다고 알려준다.
 } while (1);
 do {
     wait(full);    //버퍼에 아이템이 생길 때까지 기다린다.
     wait(mutex);
     ...
     버퍼로부터 아이템을 가져온다.
     ...
     signal(mutex);
     signal(empty); //버퍼에 빈 공간이 생겼다고 알려준다.
     ...
     아이템을 소비한다.
     ...
 } while (1);
  • 아이템을 소비해야 아이템을 생산할 수 있는 구조(비효율적)

소비자 생산자 문제(모니터링 방법)

monitor ProducerConsumer
{
    int itemCount = 0;
    condition full;
    condition empty;

    procedure add(item)
    {
        if (itemCount == BUFFER_SIZE)
        {
            wait(full);
        }

        putItemIntoBuffer(item);
        itemCount = itemCount + 1;

        if (itemCount == 1)
        {
            notify(empty);
        }
    }

    procedure remove()
    {
        if (itemCount == 0)
        {
            wait(empty);
        }

        item = removeItemFromBuffer();
        itemCount = itemCount - 1;

        if (itemCount == BUFFER_SIZE - 1)
        {
            notify(full);
        }


        return item;
    }
}

procedure producer()
{
    while (true)
    {
        item = produceItem();
        ProducerConsumer.add(item);
    }
}

procedure consumer()
{
    while (true)
    {
        item = ProducerConsumer.remove();
        consumeItem(item);
    }
}
  • 아이템을 소비하지 않아도, 아이템을 만들어 놓을 수 있음

  • itemCount로 효율적인 생산 소비가 가능

관심 있을 만한 포스트

0개의 댓글