백/back-end

[운영체제] Synchronize(동기화)와 Deadlock

연지양갱 2023. 10. 22. 23:51
728x90
반응형
SMALL

Synchronize(동기화)

Synchronize는 동기화라고 영문번역을 할 수 있습니다.

그러면 동기화란 무엇인지 알아야 겠죠?

동기화란 시스템을 동시에 작동하기 위해 여러 사건들을 조화시키는 것을 말합니다.

즉 여러 작업을 동시작업 하기 위해서 조정해주는 과정을 동기화 하는 것입니다.

 

컴퓨터공학적으로 접근했을 때 동기화란, 여러 프로세스나 스레드가 동시에 공유자원에 접근하려고 할 때, 데이터의 일관성을 보장하기 위해 그들 사이의 실행 순서를 제어하는 기법입니다.

여러 작업들이 충돌이 일어나지 않도록 조정하는 게 동기화라는 것입니다.

 

 

예를 들어, 

두 개의 스레드가 같은 메모리 영역에 쓰기 작업을 시도한다면, 어떤 순서로 작업이 이루어지느냐에 따라 결과가 크게 달라질 수 있습니다.

이런 상황에서 동기화 메커니즘은 한 번에 하나의 스레드만 해당 메모리 영역을 변경할 수 있도록 제한함으로써 데이터의 일관성을 유지합니다

 

예를 들어 CPU scheduling에서 나온 것처럼 First-Come, FIrst-Served(FCFS), Shortest Job Next(SJN) / Shortest Job First(SJF), Priority Scheduling 등이 있습니다.

 

 

 

 

Deadlock

Deadlock은 교착상태, 막다른 골목과 같은 의미를 가지고 있습니다.

Deadlock이란 운영체제 또는 소프트웨어의 잘못된 자원 관리로 인하여 둘 이상의 프로세스 또는 스레드들이 아무것도 진행하지 않는 상태로 서로 영원히 대기하는 상황을 말합니다.

 

두 개 이상의 프로세스나 스레드가 서로 다른 프로세스나 스레드가 보유하고 있는 자원을 기다리며 무한정 대기하는 현상입니다. 각각의 프로세스는 다른 프로세스가 자신이 필요로 하는 자원을 반납하기만을 기다리므로, 아무도 진행하지 못하게 되는 상태

 

 

예를 들어,

A와 B 두 개의 프로세스가 있고 각각 R1과 R2라는 리소스를 사용한다고 가정합시다.

만약 A가 R1을 보유하고 B가 R2를 보유한 상태에서 A와 B 모두 서로 소유한 리소르르 요구한다면, 어느 한 쪽이 리소르르 반납하기 전까지 둘 다 진행되지 않는 상황인 데드록이 발생합니다.

 

 

Deadlock 해결 방법

  1. Deadlock Prevention(데드록 예방)
  2. Deadlock Avoidance(데드록 회피)
  3. Deadlock Detection and Recovery(데드록 탐지 및 복구)

 

 

Deadlock 예시코드

Deadlock 예시 코드

public class Main {

    public static Object obj1 = new Object();
    public static Object obj2 = new Object();

    public static void main(String[] args) {
        FirstThread thread1 = new FirstThread();
        SecondThread thread2 = new SecondThread();

        thread1.start();
        thread2.start();
    }


    public static class FirstThread extends Thread{
        @Override
        public void run(){
            synchronized (obj1){
                System.out.println("First Thread has object1's lock");

                try{
                    Thread.sleep(10);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                System.out.println("First Thread want to have object2's lock. so wait");



                synchronized (obj2){
                    System.out.println("First Thread has object2's lock too");
                }
            }
        }
    }

    public static class SecondThread extends Thread{
        @Override
        public void run(){
            synchronized (obj2){
                System.out.println("Second Thread has object2's lock");

                try{
                    Thread.sleep(10);
                }catch(InterruptedException e ){
                    e.printStackTrace();
                }
                System.out.println("Second Thread want to have object1's lock, so wait");

                synchronized (obj1){
                    System.out.println("Second Thread has object1's lock too");
                }

            }
        }
    }
}

 

 

출력 결과

 

출력한 내용처럼

First Thread는 obj1의 락을 가지고 있고 obj2의 락을 원하고

Second Thread는 obj2의 락을 가지고 있고 obj1의 락을 원합니다.

 

First Thread와 Second Thread 모두 대기 상태에 있는 것입니다.

 

 

해당 코드에 대한 설명은 Thread에 대해 공부한 뒤에 코드와 함께 포스팅 하겠습니다!

 

참고

https://math-coding.tistory.com/175

 

[Java] 자바 쓰레드 교착상태(deadlock)

이 글은 "자바 온라인 스터디" 내용을 가지고 공부하여 작성한 글입니다. Thread DeadLock 이란? 멀티 쓰레드 프로그래밍에서 동기화를 통해 락을 획득하여 동일한 자원을 여러 곳에서 함부로 사용하

math-coding.tistory.com

 

반응형