[CS] 동기vs비동기, 블로킹vs논블로킹

2023. 11. 16. 05:21· 공부/CS 스터디
목차
  1. 0. 들어가기전
  2. 1. 동기(Sync) vs 비동기(Async)
  3. 2. 블로킹(Blocking) vs 논블로킹(Non-Blocking)
  4. 3. 동기/비동기 + 블로킹/논블로킹 조합
반응형

0. 들어가기전

동기/비동기 와 블로킹/논블로킹 의 개념은 비슷해 보일지라도 서로 다른 차원에서 작업의 수행 방식을 설명하는 개념이다.

 

동기/비동기 : 처리해야 할 작업들을 수행 방식(완료 여부)의 차이

블로킹/논블로킹 : 처리해야할 작업의 과정의 제어권 처리 방법의 차이

 

그렇기 때문에 동기 != 블로킹, 비동기 != 논블로킹 이다.

 

1. 동기(Sync) vs 비동기(Async)

동기와 비동기를 구분하는 방법은 처리해야 할 작업들에 대한

작업 순서 처리의 차이이다

.

요청한 작업에 대해 완료 여부를 따져 순차대로 처리한다면 동기,

요청한 작업에 대해 완료 여부를 따지지 않는다면 비동기이다.

 

1. 동기

호출된 작업의 리턴하는 시간과 결과를 반환하는 시간이 일치하는 경우를 말한다.

작업 A의 종료시간과 작업 B의 시작시간이 같으면 동기적이라고 한다.

2. 비동기

호출된 작업의 리턴하는 시간과 결과를 반환하는 시간이 일치하지 않는 경우를 말한다.

동기와 반대로 대상이 작업시간이 같지 않을 때 비동기적이라고 한다.

2. 블로킹(Blocking) vs 논블로킹(Non-Blocking)

블로킹과 논블로킹의 차이는 다른 요청의 작업을 처리하기 위해 현재 작업을 block(차단, 대기) 하냐, 안 하냐의 유무를 나타내는 프로세스의 실행 방식이다.

 

1. 블로킹(Blocking)

블로킹은 A함수가 B함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨주는 것이다.

1. A가 B를 호출하면, A가 B에게 제어권을 넘긴다.

2. 제어권을 넘겨받은 B는 함수를 실행한다. A는 함수 실행을 멈춘다. (Block)

3. B는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.

 

2. 논블로킹(Non-Blocking)

논블로킹은 A함수가 B함수를 호출해도 제어권은 그대로 자신이 가지고 있는 것이다.

1. A가 B를 호출하면, B는 실행되지만 제어권은 A가 그대로 가지고 있는다.

2. A가 계속 제어권을 가지고 있기 때문에 B를 호출한 이후에도 자신의 코드를 계속 실행한다.

 

3. 동기/비동기 + 블로킹/논블로킹 조합

동기/비동기 와 블로킹/논블로킹 은 유사하지만 엄연히 다른 개념이다.

그래서 프로그램 아키텍쳐에서는 이 두 개념이 함께 조합되어 사용된다.

 

1. Sync Blocking (동기 + 블로킹)

2. Async Blocking (비동기 + 블로킹)

3. Sync Non-Blocking (동기 + 논블로킹)

4. Async Non-Blocking (비동기 + 논블로킹)

 

1. Sync Blocking (동기 + 블로킹)

다른 작업이 진행되는 동안 자신의 작업을 처리하지 않고(Blocking), 다른 작업의 완료 여부를 바로 받아 순차적으로 처리(Sync)하는 방식이다.

1. A는 B의 리턴값을 필요로 한다. (Sync)

2. 제어권을 B에게 넘겨준다.

3. A는 B가 실행을 완료하여 리턴값과 제어권을 돌려줄 때까지 기다린다. (Blocking)

 

주로 다른 작업의 결과가 자신의 작업에 영향을 주는 경우에 활용할 수 있다.

Sync Blocking 조합은 코드가 순차적으로 실행되는 특성을 가지고 있기 때문에, 작업이 간단하거나 작업량이 적은 경우에 사용된다.

const fs = require('fs'); // 파일 시스템 모듈 불러오기

// 동기적으로 파일 읽기
const data1 = fs.readFileSync('file1.txt', 'utf8'); // file1을 sync으로 read 함
console.log(data1); // 파일 내용 출력하고 적절한 처리를 진행

const data2 = fs.readFileSync('file2.txt', 'utf8'); 
console.log(data2); 

const data3 = fs.readFileSync('file3.txt', 'utf8'); 
console.log(data3);

 

 

예를 들어, C나 Java의 코드 실행 후 cmd에서 입력을 받는 경우가 해당된다.

사용자로부터 입력을 받아야 그 입력값을 가지고 내부 처리를 하여 결과값을 콘솔에 출력해주기 때문에 순차적인 작업이 요구된다.

또한, 실행 코드가 콘솔창을 띄우고, 텍스트를 치고 난 다음 사용자로부터 리턴값을 필요로하기 때문에 제어권을 시스템에서 사용자로 넘겨 사용자가 값을 입력할 때까지 기다리는 것이다.

2. Async Blocking (비동기 + 블로킹)

다른 작업이 진행되는 동안 자신의 작업을 멈추고 기다리는(Blocking), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는 (Async) 방식이다.

1. A는 B의 리턴값에 신경쓰지 않고 콜백함수를 보낸다. (Async)

2. A는 B의 작업에 관심없음에도 불구하고, B에게 제어권을 넘긴다. (Blocking)

3. A는 자신과 관련 없는 B의 작업이 끝날 때까지 기다린다.

 

Async Blocking 조합은 비효율적이라서 사용되는 모델이 많지 않다.

3. Sync Non-Blocking (동기 + 논블로킹)

다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non Blocking), 다른 작업의 결과를 바로 처리하여 작업을 순차대로 수행(Sync)하는 방식이다.

1. A는 B를 호출한다.

2. 이때 A는 B에게 제어권을 주지 않고, 자신의 코드를 계속 실행한다. (Non-Blocking)

3. A는 B의 리턴값이 필요하기 때문에 중간중간 B에게 함수 실행을 완료했는지 물어본다. (Sync)

 

Sync Non-Blocking 조합의 예를 들자면, 게임에서 맵을 이동할 때 뜨는 로딩 화면과 같다. 맵을 불러오기 위한 맵 데이터를 다운 받는 동안 로딩 스크린은 로딩바가 채워지는 프로그램을 수핸한다. 즉, 제어권은 여전히 나한테 있어 화면에 로드율이 표시되는 것이다. 그리고 끊임없이 맵 데이터가 어느정도 로드 됐는지 조회한다.

4. Async Non-Blocking (비동기 + 논블로킹)

다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non-Blocking), 다른 작업의 결과를 바로 처리하지 않아 작업 순서가 지켜지지 않는 (Async) 방식이다.

1. A는 B를 호출한다.

2. 이때 A는 B에게 제어권을 주지 않는다(Non-Blocking)

3. A는 B를 호출한 이후에도 멈추지 않고 자신의 코드를 계속 실행한다.

4. A는 B를 호출할 때 콜백함수도 함께 넘긴다.

5. B는 자신의 작업이 끝나면 A가 준 콜백 함수를 실행한다(Async)

 

Async Non-Blocking 조합은 다른 작업의 결과가 자신의 작업에 영향을 주지 않는 경우에 활용할 수 있다.

// 비동기적으로 파일 읽기
const fs = require('fs'); // 파일 시스템 모듈 불러오기

fs.readFile('file.txt', 'utf8', (err, data) => { // 파일 읽기 요청과 콜백 함수 전달
  if (err) throw err; // 에러 처리
  console.log(data); // 파일 내용 출력
});

fs.readFile('file2.txt', 'utf8', (err, data) => {
  if (err) throw err; 
  console.log(data);
});

fs.readFile('file3.txt', 'utf8', (err, data) => { 
  if (err) throw err; 
  console.log(data);
});

console.log('done'); // 작업 완료 메시지 출력

 

위의 Sync Blocking 파일 읽기 코드와 다르게 Async Non-Blocking 코드는

'done' 이라는 콘솔이 가장 먼저 찍히고, 그 후에 파일 내용이 출력될 것이다.

 

이처럼 Async Non-Blocking 조합은 작업량이 많거나 시간이 오래 걸리는 작업을 처리해야 하는 경우에 적합하다.

예를 들어, 대용량 데이터를 처리하거나 많은 요청을 처리하는 서비스에서는 비동기 + 논블로킹 방식을 사용하여 한 작업이 처리되는 동안 다른 작업을 처리할 수 있으므로 전체 처리 시간을 줄일 수 있어 어플리케이션 처리 성능을 향상시킬 수 있게 된다.

 

웹 브라우저의 파일 다운로드가 비동기 + 논블로킹 조합의 가장 대표적인 예시이다.

웹 브라우저는 웹 사이트에서 파일을 다운로드할 때, 파일의 전송이 완료될 때까지 다른 작업을 하지 않고 기다리는 것이 아니라, 다른 탭이나 창을 열거나 웹 서핑을 할 수 있다. 이는 웹 브라우저가 파일 다운로드를 비동기적으로 처리하고 콜백 함수를 통해 다운로드가 완료되면 알려주는 방식으로 구현되어 있기 때문이다.

 

 

정리하자면...

우리가 자주 사용하는 javascript의 setTimeout() 함수는 비동기 + 논블로킹 함수이며,

Node.js에서 비동기 방식으로 파일을 읽거나 네트워크 요청을 보낼 때는 비동기 + 논블로킹 방식을 사용하며,

Node.js에서 코드 실행 시점을 늦춰주거나 순차적인 의존성이 있는 작업을 처리할 때는 동기 + 블로킹 방식을 사용한다.

 

이처럼 개념을 이해하고 적절한 조합을 선택한다면 작업의 순서와 타이밍을 제어할 수 있다.

 

 

반응형

'공부 > CS 스터디' 카테고리의 다른 글

[운영체제] 프로세스와 스레드의 차이  (0) 2023.09.22
[운영체제] 디스크 관리와 스케줄링  (0) 2023.03.01
[운영체제] 1. CPU 스케줄링(개념, 알고리즘)  (0) 2023.02.07
[운영체제] 컴퓨터 시스템 구조 및 프로그램의 실행  (0) 2023.01.31
  1. 0. 들어가기전
  2. 1. 동기(Sync) vs 비동기(Async)
  3. 2. 블로킹(Blocking) vs 논블로킹(Non-Blocking)
  4. 3. 동기/비동기 + 블로킹/논블로킹 조합
'공부/CS 스터디' 카테고리의 다른 글
  • [운영체제] 프로세스와 스레드의 차이
  • [운영체제] 디스크 관리와 스케줄링
  • [운영체제] 1. CPU 스케줄링(개념, 알고리즘)
  • [운영체제] 컴퓨터 시스템 구조 및 프로그램의 실행
규투리
규투리
규투리 가보자고 💪😤
반응형
규투리
우당탕탕 규투리의 개발일지
규투리
전체
오늘
어제
  • 분류 전체보기 (66)
    • SSAFY (3)
    • Front-end (20)
      • React (10)
      • 면접 스터디 (6)
      • 에러 (1)
    • 공부 (40)
      • CS 스터디 (5)
      • 면접을 위한 CS 전공지식 노트 (15)
      • 이것이 자바다 (6)
      • 개발 이모저모 (10)
      • 알고리즘 (1)
      • IT기사 (3)
    • 일상 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • mac mysql 설치
  • SSAFY
  • 위코드
  • RDBMS
  • 면접을위한CS전공지식노트
  • 싸피후기
  • 이것이 자바다
  • 너무 어렵다
  • Java
  • homebrew
  • Eclipse
  • 싸피합격
  • 데이터베이스
  • dbms
  • WECODE
  • 이클립스
  • 싸피
  • 관계형데이터베이스
  • 자바
  • 이것이자바다

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
규투리
[CS] 동기vs비동기, 블로킹vs논블로킹
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.