CS Study/운영체제

동기와 비동기

danalee252 2022. 4. 11. 22:53

동기 (Synchronous)

작업들이 순차적으로 진행되는 방식이다.

작업이 진행되고 있을 때 다른 작업이 동시에 진행될 수 없다.

비동기(Asynchronous)

응답에 관계없이 다음 작업이 시작된다.

작업이 들어온 순서대로 진행되지 않을 수 있다.

'동기 실행'에 비해 더 빠른 시간 안에 작업들을 처리할 수 있다.

자바로 동기 비동기 구현해보기

아래와 같은 메소드가 있다고 할 때,

public class SyncAsync {
    public static void main(String[] args) {
    	...
    }

    public static void dough(String dish) {
        System.out.println(dish + " >> Dough");
    }

    public static void sauce(String dish) {
        System.out.println(dish + " >> Sauce");
    }

    public static void cheese(String dish) {
        System.out.println(dish + " >> Cheese");
    }

    public static void ham(String dish) {
        System.out.println(dish + " >> Ham");
    }

    public static void bread(String dish) {
        System.out.println(dish + " >> Bread");
    }

    public static void sausage(String dish) {
        System.out.println(dish + " >> Sausage");
    }

    public static void patty(String dish) {
        System.out.println(dish + " >> Patty");
    }
}

 

  • 동기방식
    피자, 핫도그, 햄버거를 만드는 메소드를 순서대로 호출하면, 순차적으로 메소드가 실행되며 이것이 동기방식이다.
public class SyncAsync {
    public static void main(String[] args) {
        pizza();
        hotdog();
        hamburger();
    }
    
    ...
    
    public static void pizza() {
        dough("Pizza");
        sauce("Pizza");
        cheese("Pizza");
        ham("Pizza");
    }

    public static void hotdog() {
        bread("Hotdog");
        sausage("Hotdog");
        sauce("Hotdog");
    }

    public static void hamburger() {
        bread("Hamburger");
        patty("Hamburger");
        cheese("Hamburger");
        sauce("Hamburger");
    }
}

동기방식 출력 결과

동기 방식으로 메소드를 호출했을 때, pizza 메소드를 모두 마친 후에 hotdog 메소드가 실행되며, hotdog 메소드를 모두 마친 후에 hamburger 메소드가 실행된다.

  • 비동기 방식
    피자, 핫도그, 햄버거를 만드는 명령을 메소드가 아닌 스레드로 호출하면, 비동기 방식으로 처리된다.
public class SyncAsync {
    public static void main(String[] args) {
        Thread pizza = new Thread(() -> {
            dough("Pizza");
            sauce("Pizza");
            cheese("Pizza");
            ham("Pizza");
        });

        Thread hotdog = new Thread(() -> {
            bread("Hotdog");
            sausage("Hotdog");
            sauce("Hotdog");
        });

        Thread hamburger = new Thread(() -> {
            bread("Hamburger");
            patty("Hamburger");
            cheese("Hamburger");
            sauce("Hamburger");
        });

        pizza.start();
        hotdog.start();
        hamburger.start();
    }
    
    ...
    
}

비동기방식 출력 결과

비동기 방식으로 실행하면, 세 개의 스레드가 동시에 실행되기 때문에, 세 요리가 섞여서 실행되는 것을 볼 수 있다.

'CS Study > 운영체제' 카테고리의 다른 글

멀티 프로세스와 멀티 스레드  (0) 2022.05.02
CPU 스케줄링  (0) 2022.03.28
프로세스란?  (0) 2022.03.10
프로그램, 프로세스, 스레드의 차이  (0) 2022.03.03