카카오톡 플러스 친구에 좋은 채널이 있어 추가하였다. 하루에 한 개씩 CS 공부를 할 수 있도록 질문을 보내주고 , 답변자에 한하여 그 날이 마무리될때쯤 베스트 답변을 취합하여 다시 알려주는 좋은 채널이라 덕분에 나도 틈날때마다 개념을 정리하려 한다.

Reference : CS 공부 비서, 동기와 비동기의 개념, 동기와 비동기의 개념과 차이


Q&A

Q.  동기(Synchronous)와 비동기(Asynchronous), 블로킹(Blocking)과 논-블로킹(Non-blocking)에 대해 설명해주세요

A. 나의 답변

* 동기는 요청을 보내는 동시에 결과값을 받을 수 있도록 동시에 일어나는 것에 초점을 맞춘 방식이다. 비동기는 반대로 요청과 결과가 동시에 일어나지 않는다.

* 블로킹은 원래는 스포츠(농구)용어인데 수비수가 공격수로부터 방어하는 것을 의미한다. 컴퓨터용어로 사용하게 되며 비슷한 듯 다른 의미로 변경되었다. 블로킹은 호출함수가 호출당한 함수에게 제어에 대한 권한을 넘기는 것이다. 호출당한 함수의 작업이 끝나야 돌려받을 수 있기 때문에 호출함수는 그동안은 아무것도 할 수 없다. 논블로킹은 호출함수가 호출당한 함수를 호출은 하지만, 제어 권한을 넘겼다가 바로 돌려받기 때문에 호출함수는 다른 작업을 할 수 있다.

 

 


Best Answers


★ㅇ*님의 답변
동기식 - submit
: 리로드 방식. 로딩을 계속 하는 것.
동기는 요청과 결과가 동시에 일어난다는 약속인데, 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어져야 합니다. = 그 동안 다른 처리를 할 수 없음.

비동기 - ajax
: 로딩을 하지 않는 상태로 데이터만 이동
화면은 고정적으로 있고 데이터만 이동하며, 호출한 화면으로 다시 돌아감.
비동기는 동시에 일어나지 않는다는 의미로 요청한 결과가 반환되지 않은 상태에서도 다른 작업을 처리할 수 있습니다.

비동기식은 동기식보다 설계가 더 복잡하지만 자원을 효율적으로 사용할 수 있다는 장점을 가지고 있습니다.

——

블로킹과 논블로킹의 차이는 처리되어야 하는 작업이 전체적인 작업의 흐름을 막느냐 안막느냐의 관점의 차이로 즉, 제어권이 누구에게 있느냐로 판단합니다.

블로킹은 호출한 함수에게 제어권을 넘겨주어 해당 함수의 작업이 끝나 다시 제어권을 돌려주기 전까지 실행을 멈춥니다.

논블로킹은 함수를 호출해도 제어권은 그대로 유지한 상태로 계속 실행할 수 있습니다.


★한*님의 답변
동기 (Synchronous)   

- 요청과 결과가 동시에 일어남
- 요청을 했을 경우 시간이 얼마나 걸리던지에 상관없이 요청한 자리에서 바로 결과값을 받아야 함
- 설계가 매우 간단하고 직관적임
- 결과가 주어질 때까지 아무것도 못하고 대기하면서 결과를 기다려야 함

비동기(Asynchronous) 
- 요청과 결과가 동시에 일어나지 않음
- 요청했을 경우에 지금 바로 혹은 당장 응답받지 않아도 됨 
- 동기에 비해 설계가 복잡함
- 결과가 주어지는데 시간이 걸리더라도 기다리는 시간동안 다른작업을 진행할 수 있으므로 자원을 효율적으로 사용

제어권   
- 함수를 실행시킬 수 있는 권리 

결과값 
- 함수의 리턴 값

블로킹(blocking)
- 요청자(부모함수) 는 요청한 작업이 끝날 때까지 다른 작업을 하지 않고 기다림
- 다른 함수를 호출할 때, 제어권도 함께 넘겨주며 그 작업이 끝난 후에 돌려받기 때문 (제어권이 없는상태)
- 요청받은 함수는 모든 실행을 마치고 최종 결과값을 돌려줌

논블로킹(non-blocking) 
- 요청자(부모함수) 는 요청한 작업이 수행되는 동안 다른작업을 진행할 수 있음
- 다른함수를 호출할 때, 제어권을 넘겨주지만 바로 돌려 받음 
- 제어권을 바로 돌려받기 때문에 다른 작업을 진행할 수 있음


★민*님의 답변
블로킹 Blocking
A 함수가 B 함수를 호출 할 때, B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것

논블로킹 Non-blocking
A 함수가 B 함수를 호출 할 때, B 함수가 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것.

동기 Synchronous
A 함수가 B 함수를 호출 할 때, B 함수의 결과를 A 함수가 처리하는 것.

비동기 Asynchronous
A 함수가 B 함수를 호출 할 때, B 함수의 결과를 B 함수가 처리하는 것. (callback)


★박*님의 답변
동기: 요청-응답이 하나로 묶여서 기다리는 방식, 가령 A라는 작업과 A에 대한 A’ 라는 응답이 있고, B,C,D가 같은 형태로 있다면 갹각의 응답 결과 뒤에 다음 작업들을 요청한다.
비동기: 요청을 응답을 기다리지 않고 실행한다. 요청들은 응답이 오면 별도의 방식으로 순서와 상관없이 처리되어 반환된다. 응답 결과를 확인하는 방식은 비동기를 처리하는 부분을 구현하는 것에 따라 다르다.

블로킹: 특정 작업 동안 프로세스 자원을 점유하며 다른 작업을 하지 못하게 막는다. 가령 파일입출력 같은 작업동안 별도의 커맨드를 수행하지 못하게 한다거나 하는 부분이 이에 해당한다.
논블로킹: 특정 요청이 프로세스 자원을 다른 커맨드에서 활용하는 것을 막지 않는다. 프로세스/스레드 어느쪽 자원이든 커맨드가 실행되고 해당 작업이 종료되지 않아도 다른 작업들을 실행할 수 있게 한다.


★조*님의 답변
[동기 비동기]
- 작업 수행 순서가 직렬로 이어지냐(동기), 병렬로 동시에 진행되냐(비동기)에 대한 문제
동기 : 작업을 순차적으로 진행, 한 작업이 끝날 때까지 다음 작업은 대기하고 있다가 실행된다. 혹은 기존 작업에서 계속 다른 작업의 실행이 끝났는지를 확인하며 체크해야함
비동기 : 스레드 다수개를 이용해 작업을 동시에 병렬로 작업 후, 한 작업이 끝나면 callback 을 받아서 해당 작업을 요청했던 스레드를 호출하는 식으로 동작함.

[블로킹/논블로킹]
- 작업 중간중간에 쉴 때 계속 본인이 점유하고 있을지(블로킹), 혹은 다른 작업에게 주도권을 넘겨줄지(논블로킹)에 대한 문제
블로킹 : 본인의 작업이 끝날 때까지 다른 작업들은 모두 대기함(말 그대로 block, 막고 서있는 느낌). 가령 스레드 A가 일을 하다가 B를 호출했다면, B의 작업이 끝날 때까지 계속 대기하거나 B의 작업 종료를 본인이 함
논블로킹 : 본인의 작업이 끝나지 않았더라도, 다른 작업을 수행해야하거나 작업이 종료되어 콜백이 들어오면 해당 작업이 진행됨. 가령 스레드 A가 일을 하다가 B를 호출했다면, A는 일을 하다가 유휴 상태가 되면 B에게 주도권을 넘겨줄 것임.

★노*님의 답변
### 블로킹(Blocking)

A함수가 B함수를 호출하면 A함수의 제어권을 B함수에 넘긴다.
B에게 제어권이 넘어가면 A는 함수 실행을 멈춘다.
B의 실행이 끝나면 제어권을 A에게 돌려준다.

### 논-블로킹(Non-blocking)

A함수가 B함수를 호출해도 제어권을 A가 가지고있다.
A함수는 B함수를 호출한 이후에도 A함수의 코드를 계속 실행한다.

### 동기(Synchronous)

요청과 응답이 동시에 일어남.
요청이 들어오면 결과가 주어지기까지 다른 요청을 받을 수 없음.

### 비동기(Asynchronous)

요청과 응답이 동시에 일어나지 않음.


★이*님의 답변
동기는 어떤 함수를 호출했을 때 호출된 함수가 완료상태를 전달하기 전까지는 호출한 함수는 다른 작업을 수행할수 없다. 즉, 2개의 함수가 시간을 맞춰 수행하는것.

비동기는 호출된 함수가 콜백함수를 반환하여 자신의 일이 완료가 되지 않아도 호출한 함수가 다른일을 수행할 수 있으며 호출된 함수가 결과를 반환하면 호출한 함수는 해당 결과값을 가지고 관련된 작업을 수행한다. 즉, 2개의 함수가 시간에 맞춰 수행하지 않고 서로의 작업을 수행하는것이다.

블로킹은 호출된 함수가 완료상태가 될때까지 제어권을 호출한 함수에게 넘겨주지 않는것이다.

논블로킹은 호출된 함수가 완료상태가 되지 않아도 제어권을 호출한 함수에게 넘겨주어 다른 작업을 할 수 있게 하는것이다.

동기,비동기와 블로킹,논블로킹의 차이점은 전자는 호출되는 함수의 완료여부를 누가 신경쓰는지에 초점을 맞추고 후자는 호출된 함수가 리턴을 바로하는지 아닌지에 초점을 맞추고 있다.


★정*님의 답변
1. 동기/비동기 -> 응답을 받는 순서
2. 블로킹/논블로킹 -> 응답을 받는 타이밍

1.1 동기
한 번에 하나씩 작업하는 것. 작업 순서가 보장된다.
CPU가 점유되지만 실행되고있지않은 블로킹(waiting time)이 생길 수 있다.

1.2 비동기
여러 작업을 동시에! 작업순서보장x
목적: 동기 작업중 cpu속도차로 생기는 블로킹영역의 효율적 사용
:o:독립적 작업
:x:상호의존적작업, 대규모연산 요구되는 작업


2.1 블로킹
작업 완료 후 응답결과를 받는다.
작업완료 전까지 cpu는 점유되지만 실행되지않는다.
해당 쓰레드는 Waiting Queue에 들어감.
비동기모델이라면, 블로킹영역에 수행할 다른 작업을 명시적으로 지정해줘야함.

2.2 논블로킹
응답결과를 기다리지않고 cpu가 다음작업을 계속한다.


:question:더 공부할 점)
- I/O 작업이란?
- kernel이란?
- user space란?
- 쓰레드란?? 멀티쓰레드?
- 웨이팅 큐??


★민*님의 답변

### 동기와 비동기
동기 : 메인업무가 서브업무 작업 완료 후의 결과값을 기다린다.
비동기 : 메인업무는 서브업무의 작업 완료를 신경쓰지 않는다.

### 블로킹과 논블로킹
블로킹은 서브업무에 제어권을 넘기기 때문에 메인업무는 잠시 실행을 멈추고 서브업무 종료 후 실행된다.
논블로킹은 메인업무가 여전히 제어권을 가지고 있기 때문에 서브업무 실행 후에도 메인업무가 계속 실행된다.


### 조합
동기 & 블로킹 : 메인업무가 서브업무 결과값이 필요해서 서브업무 종료 시까지 실행을 멈춘다.
동기 & 논블로킹 : 메인업무가 서브업무의 결과값을 지속적으로 확인하며 실행을 계속한다.
비동기 & 블로킹 : 메인업무가 서브업무의 결과와 상관없는데도 서브업무 종료 시까지 실행을 멈춘다.(거의 없음)
비동기 & 논블로킹 : 메인업무가 서브업무 응답을 기다리지 않고 실행을 계속한다. 서브업무는 업무 종료시 메인업무로 콜백된다.

★염*님의 답변
- 동기 작업이란, 한번에 하나씩 수행되는 것을 의미합니다.
즉, 해당 작업이 끝나기 전까지 현재 진행중인 작업 외의 다른 작업을 수행할 수 없습니다.
ex) HTTP 요청을 하면 무조건 응답을 받음. 동기적이라고 할 수 있다.

- 비동기 작업이란, 한 번에 하나 이상이 수행될 수 있음을 의미합니다
즉, 현재 작업을 진행중이더라도 다른 작업을 수행할 수 있습니다. 또한 작업의 결과를 바로 원하지 않습니다.
ex) 이메일을 보내는 작업은 상대방이 바로 답장하기를 원해 보내는 작업이 아님

- 블로킹은 자신이 Waiting(Blocking) 된 것을 의미합니다.
쓰레드가 블로킹 된다는 것은 CPU 가 점유되어 실행되지 못함을 의미합니다.
요청한 작업이 모두 완료되어 응답과 결과를 반환 받습니다. 그동안 CPU 를 점유합니다.

- 논블로킹은 Wait 하지 않고 그냥 수행합니다.
자신이 호출되었을때, 제어권을 바로 자신을 호출한 쪽으로 넘기며
자신을 호출한 쪽에서 다른 작업을 할 수 있도록 하는것을 의미합니다.
자신은 그대로 작업을 이어나갑니다. 쓰레드가 Waiting 하지 않으므로 CPU 제어는 그대로입니다.

 

위의 답변만 잘 읽어도 개념 정리가 잘 될 것 같다!

+ Recent posts