[CS][OS] Synchronous, Asynchronous

.onNext("Volga")·2022년 11월 1일
2

Computer Science

목록 보기
3/6

Synchronous와 Asynchrounus 에 대해 알아봅시다.

Goal

운영체제(Operating System)에서 사용하는 Synchronous와 Asynchrounus에 대해 공부하고 알아봅니다.

Abstract

흔히, 살다 보면 어떠한 특정 Task 또는 Tasks에 대하여 동기 또는 비동기적으로 처리하겠다. 라는 얘기를 종종 듣곤합니다.
여기서 드는 질문은, 그래서 동기랑 비동기가 뭐야? 라는 것이고
오늘은 이러한 물음에 대한 해답을 간단하게 생각해보고 결론을 내보고자 합니다.

동기(Synchronous)

동기 방식은 클라이언트(Client)인 내가 동작시킨 어떠한 특정 실행 흐름 안에서 서버라고 통칭하는 모든 것 들에 대하여 요청(request)을 보냈을 경우, 이에 대한 응답(response)가 오고 난 것을 확인 한 후에야 다음 동작을 하는 것을 말합니다.

말이 좀 어려운데, 간단한 비유를 들어서 얘기를 좀 해보자.

동기라는 것은 대략 중고등학교때 배식받는 원리와 비슷합니다.
옛 기억을 조금 되살려서 생각해 보건데, 일반적인 배식원리는 다음과 같습니다.

  • 배식을 받기 위해, 배식 줄을 섭니다.
  • 배식 줄을 서고, 차례대로 배식 도우미 어머님들에게 배식을 요청하고 이에 대해 배식을 받습니다.
  • 배식을 받는 경우, 앞 사람의 순서가 지나야만 합니다.

즉 이러한 시스템을 바탕으로 생각 해 보건데, 동기(Synchronous)란, 순차적이고 직렬적으로 주어진 Task를 처리한다는 것입니다.

일반적으로 C언어나 다른 언어에서도 따른 비동기적인 처리를 하지 않은 모든 코드에 대하여 순차적으로 진행하는 모든 경우를 말합니다.

간단하게 C코드로 예를 들어보겠습니다.

void Test1() {
    int ret = 0;
    for(int i = 0; i < 1000; i++) {
        ret += i;
    }
       printf("Hello World");
}

int main() {
    int A = 0, B = 1;
    for (int i = 0; i < 1000; i++) { // -------(1)
        A += i;
    }
    Test1();
    for (int i = 1; i <= 1000; i++) { // ------(2)
        B *= 1;
    }
    return 0;
}

위 코드를 보면 추측 해 볼수 있는 것이, main() 함수가 Call Stack에 쌓여서 실행 흐름에, Test1()이 실행 되는 상황에서
(1)의 흐름이 끝나고 Test1() 함수가 종료가 되어야만 (2)이 실행된다는 것 입니다.
아주 순차적이고 직렬적인 흐름이라는 것 입니다.

비동기(Asynchronous)

비동기 방식은 클라이언트(Client)인 내가 동작하고있는 어떠한 프로그램의 실행 흐름안에서 서버(Server)의 총칭에 대하여 요청(request)를 보낼 경우, 이에 대한 응답(response)가 오는 것을 따로 확인하지 않고 다음 동작을 하는 것을 말합니다.

동기도 어려웠는데, 비동기는 말이 더 어렵습니다.

요청을 보냈는데, 응답을 따로 확인하지 않고 행동을 한다고 하는 것이 무엇일까?

이번에도 간단하게 예를 한번 들어보고 생각 해 보도록 합시다.
비동기라고 하는 것은 사실 우리 일상에 녹아있는 방식이기도하고 어떠한 가게를 들어가서 주문하거나, 주문에 대해 응답을 받는 모든 경우와 동일합니다.

커피집을 생각해보자. 또한, 커피집보다는 고객의 행동을 조금 더 유의하면서 봅시다.

  • 고객은 커피를 마시고싶고, 이러한 의사를 커피집 카운터에 요청(request)합니다.
  • 고객은 요청만 보내고 요청에 대한 응답이 올 때 까지 가만히 확인하면서 기다리는게 아니라, 다른 행위를 하게 됩니다.
  • 커피집 카운터에서 커피 제조가 완료되면, 다른 행위를 하던 고객에게 벨(콜백)같은 것을 통해 요청에 대한 응답(response)을 하게 됩니다.

결론

  • 동기(Synchronous)란, 특정 요청에 대한 응답을 받고 난 뒤에야만 본 흐름이 실행이 가능합니다.
  • 비동기(Asynchronous)란 특정 요청에 대하여 응답을 받고 난 뒤가 아닌, 요청을 보낸 뒤에 본 흐름이 실행 되고 요청에 대한 응답과정까지의 흐름과 본 흐름이 병렬적이라는 것 입니다.
profile
iOS 개발자 volga입니다~

0개의 댓글