동기(synchronous)
- 요청과 결과가 동시에 일어나는 것으로, 요청을 하게되면 결과가 나올때까지 아무것도 못하고 대기해야하는 작업입니다.
- 하나의 작업이 완전히 끝난 후에만 또 다른 작업을 진행할 수 있습니다.
- 얘를 들어 컴퓨터를 킨다고 가정해보자. 컴퓨터가 켜지기 전까지 사용자는 인터넷을 사용하거나 다른 프로그램들을 실행시킬 수 없다. 컴퓨터가 완전히 켜지기 전까지 기다리기만 해야하는 것이다.
비동기(asynchronous)
- 요청과 결과가 동시에 일어나지 않는 것으로, 요청을 한 후에 결과를 기다리지 않고 다른 요청이나 활동을 해도 되는 작업입니다.
- 요청을 한 후에 결과가 도출되는 시간 동안 다른 작업을 수행할 수 있습니다.
동기(synchronous)와 비동기(asynchronous)의 차이점
- 처리해야 할 작업들을 어떤 흐름으로 처리할 것인가에 따라 구분됩니다.
- 작업 완료 여부로 구분할 수 있으며, 완료가 되었으면 동기, 완료 여부가 상관이 없으면 비동기로 구분합니다.
동기(synchronous) | 비동기(asynchronous) | |
장점 | 설계가 간단하며 직관적입니다. | 자원을 효율적으로 사용할 수 있습니다. |
단점 | 요청에 대한 결과가 나올때까지 아무것도 할 수 없다. | 동기보다 설계가 복잡하다. |
블로킹(blocking)
- 동기의 개념에서 만들어진 상태입니다.
- 하나의 작업을 진행하는 동안 다른 작업을 할 수 없는 상태를 말합니다.
논블로킹(non_blocking)
- 비동기의 개념에서 만들어진 상태입니다.
- 하나의 작업을 진행하는 동안 다른 작업을 할 수 있는 상태를 말합니다.
블로킹(blocking)과 논블로킹(non_blocking)의 차이점
- 처리해야하는 작업이 전체적인 작업 흐름을 막는지, 안막는지에 따라 구분됩니다.
- 예시를 들어보자면 다음과 같습니다.
- 학생이 시험을 본 후에 시험지를 선생님에게 갖다 주었습니다. 이 때에 학생이 취할 행동은 두 가지로 나뉩니다.
- 시험지를 돌려받을 때 까지 아무것도 하지 않고 대기한다. ( = 블록 상태)
- 시험지를 돌려받기 전까지 다른 과목을 공부하거나 다른 행위를 한다. (= 논블록 상태)
- 학생이 시험을 본 후에 시험지를 선생님에게 갖다 주었습니다. 이 때에 학생이 취할 행동은 두 가지로 나뉩니다.
동기(synchronous)와 블로킹(blocking) = Sync_Blocking
- 우리가 알고있던 일반적인 동기와 비슷합니다.
- A라는 작업이 시작되면 B라는 작업은 A라는 작업이 끝나기 전까지는 아무것도 할 수 없습니다.
- 함수 A 와 함수 B 가 있다고 가정했을때 다음과 같습니다.
- 함수 A는 함수 B의 리턴값을 필요로 합니다. ( = 동기)
- 그렇기에 제어권을 함수 B에게 넘겨주고 함수 B가 리턴값과 제어권을 돌려줄때 까지 대기합니다. ( = 블로킹)
- EX ) 리눅스나 CMD 등을 사용할 때에, 명령어를 입력한 후에 해당 명령에 대한 결과가 나오기까지 기다려야합니다.
동기(synchronous)와 논블로킹(non_blocking) = Sync_NonBlocking
- 모든 실행과 흐름이 순차적으로 진행되기에 개발자가 프로그렘을 제어하기 쉽고, 가장 많이 쓰이는 조합 중 하나입니다.
- 함수 A 와 함수 B 가 있다고 가정했을때 다음과 같습니다.
- A가 B 함수를 호출합니다.
- 이 때, A 함수는 B 함수에게 제어권을 주지 않은 상태로 자신의 작업을 계속해서 수행합니다. ( = 논블로킹)
- 하지만 결국 B 함수의 리턴값이 필요하기에 계속해서 B 함수에게 작업을 다 완료했는지 물어봅니다. ( = 동기)
- EX) 로딩이 뜨는 화면에서 화면을 보여주는 함수를 호출했지만, 화면을 다 그리지 못했기에 정상적인 화면을 보여주지 못하고 로딩창을 보여주는 것을 예시로 들 수 있습니다.
비동기(asynchronous)와 논블로킹(non_blocking) = Async_NonBlocking
- 성능과 자원의 효율 등에서 가장 우수하여 많이 쓰이는 조합 중 하나입니다.
- 함수 A 와 함수 B 가 있다고 가정했을때 다음과 같습니다.
- A 함수는 B 함수를 호출합니다.
- 이 때 A 함수는 제어권을 B 함수에게 넘겨주지 않은 상태로 자신의 작업을 계속해서 수행합니다. ( = 논블로킹)
- 단, B 함수를 호출할 때에 콜백함수를 함께 줍니다. 이로 인해 B 함수는 자신의 작업이 끝난 후에 A 함수가 준 콜백함수를 실행합니다. ( = 비동기)
- EX) 대리 A 가 사원 B 에게 작업할 업무를 나눠줍니다. 그 후에 대리 A 는 사원 B 가 작업을 완료할 때 까지 아무런 신경도 쓰지 않고 자신의 업무를 수행합니다.
비동기(asynchronous)와 블로킹(blocking) = Async_Blocking
- 사용하는 경우가 거의 없으며 비동기+논블로킹 방식을 사용하는 과정에서 의도치 않게 발생하기도 한다.
- 함수 A 와 함수 B 가 있다고 가정했을때 다음과 같습니다.
- A 함수는 B 함수의 리턴값을 신경쓰지 않고 콜백함수를 보냅니다. ( = 비동기)
- 이 때 A 함수는 B 함수에게 제어권을 같이 넘깁니다. ( = 블로킹)
- 이로 인해 A 함수는 B 함수가 작업이 끝나고 제어권을 돌려줄 때 까지 기다려야 합니다.
- EX) A 대리가 B 사원에게 업무를 분담했는데, 분담한 업무가 동일한 분야이기 때문에 B 사원이 작업한 결과를 가지고 A 대리가 추가 작업을 해야합니다. 그렇기 때문에 A 대리는 B 사원이 작업을 끝낼때 까지 대기해야 합니다.
출처
https://private.tistory.com/24
'기초이론 > 운영체제' 카테고리의 다른 글
파일시스템(File System) (0) | 2022.10.17 |
---|