블로킹 vs 논블로킹(Blocking vs Non-blocking)

Ouroboros·2023년 12월 7일
0

네트워크

목록 보기
18/20

0. 동기/비동기 vs 블로킹/논블록킹

동기/비동기는 작업을 순차적으로 진행할건지 아닐건지에 관한 것이다.
블로킹/논블로킹은 현재 작업이 Block 되느냐 아니냐의 관점이다.
즉, 동기/비동기는 출력 순서에 관한 것(전체적인 작업에서 순차적 흐름), 블로킹/논블로킹은 병렬실행(전체작업을 막느냐 안막느냐)과 관련된 것이다.

동기/비동기

Synchronous(동기)를 보면 Syn은 '함께'라는 뜻이다(Chrono는 '시간')
따라서 함께 작업 시간을 맞춰 실행한다는 말이고 작업 순서를 따져 완료 여부를 확인하고 순차적으로 처리하는 것이다.
반면, Asynchronous(비동기)는 A를 붙여 Synchronous와 반대의 뜻을 만들었다. 그러므로 요청한 작업의 완료여부를 따지지 않고 수행하기 때문에, 작업이 순차적으로 진행되지 않을 수 있다.



1. 블로킹/논블록킹

다른 요청처리를 실행하기 위해 현재 작업을 막느냐 막지 않느냐를 나타내는 것이다.
ex) 파일읽는 작업이 있을 때,
블로킹 방식은 파일을 다 읽을 때까지 대기,
논블로킹 방식은 파일을 다 읽지 않아도 다른 작업 가능하다.

제어권

제어권은 자신의 함수 코드를 실행할 권리와 관련있다.
제어권이 넘어가버리면 호출한 함수는 블로킹되고 호출 받은 함수가 실행된다.

1) 블로킹 (제어권 넘겨줌)

  1. A함수가 B함수에게 제어권을 넘겨준다.
  2. A함수는 제어권을 넘겨주었기에 블락되고 B함수가 실행된다.
  3. B함수의 실행이 끝나면 A에게 제어권을 넘겨준다.

2) 논블로킹 (제어권 넘겨주지 않음)

  1. A함수가 제어권을 가지고 있으면서 B함수를 호출한다.
  2. A함수에게 제어권이 있으므로 B함수가 실행되는 중에 A함수도 실행된다.

활용예

1) 동기 + 블로킹 조합

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);

파일을 읽어야 다음 작업을 할 수 있기 때문에 동기+비동기 조합으로 처리한다. 순차성이 중요할 때 사용한다.
이러한 동작은 작업량이 간단하고 적을 때 활용한다. 작업이 시작되면 끝날 때까지 다른 작업을 하지 못하므로, 작업량이 많으면 전체적인 시간이 너무 오래 걸릴 수 있다.

2) 비동기 + 논블로킹 조합

다른 작업이 시작되어도 자신의 작업을 지속하고, 따라서 작업이 순차적으로 이루어지지 않는 논블로킹 비동식 방식이다.

// 비동기적으로 파일 읽기
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'); // 작업 완료 메시지 출력
  
//done 출력 -> 파일 내용들이 출력될 것!

readFileSync(), readFile() 함수 모두 파일을 읽는 함수이다.
다만, readFileSync()는 동기적으로 처리하여 순차적이고, readFile()는 비동기적으로 파일을 읽는다.
위의 코드는 'done'이 먼저 출력될 것이고, 그 이후 파일 data들이 출력될 것이다.
ex) 파일 다운을 할 때, 파일 다운까지 기다리지 않고 웹서핑을 하거나 조회할 수 있다. 이것은 파일 다운로드를 비동기적으로 처리하고, 파일 다운로드 완료 후 콜백 함수로 알려주게 되어있기 때문이다.


<블로킹>

<논블로킹>

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

0개의 댓글