자격증/리눅스마스터 1급

리눅스 마스터 1급 동기식 vs 비동기식 이벤트

CodeMuscle 2024. 9. 3. 16:25
반응형

안녕하세요.

오늘은 동기식 이벤트와 비동기식 이벤트에관해 알아보려합니다.

바쁘신 분들을 위해 우선 요약본과 표를 먼저 보고 자세한 설명하겠습니다.

 

 

 

요약

  • 동기식 이벤트는 작업이 완료될 때까지 기다리는 방식으로, 순차적 처리와 작업 순서 보장이 특징입니다.
  • 비동기식 이벤트는 작업 완료를 기다리지 않고 다음 작업을 즉시 수행하는 방식으로, 높은 동시성과 효율성을 제공합니다.
  • 동기식 이벤트의 예로는 동기식 파일 I/O 전통적인 웹 서버(Apache Prefork 모드) 등이 있습니다.
  • 비동기식 이벤트의 예로는 비동기식 파일 I/O, Nginx 웹 서버, Node.js 등이 있습니다.
  • 리눅스 시스템에서 동기식 및 비동기식은 시스템 호출, 네트워크 프로그래밍, 커널 I/O 처리 방식에서 중요한 역할을 합니다.

 

동기식은 순차적, 비동기식은 병렬적

 

이제 표를 통해 공통적이거나 차이점을 대충 알아본 뒤 본문으로 넘어가겠읍니다.

동기식 vs 비동기식 이벤트 정리 표

구분 동기식 이벤트 (Synchronous Event) 비동기식 이벤트 (Asynchronous Event)
설명 이벤트가 발생하면 해당 이벤트가 완료될 때까지 기다린 후 다음 작업을 수행하는 방식입니다. 이벤트가 발생하면 해당 이벤트의 완료 여부와 관계없이 다음 작업을 즉시 수행하는 방식입니다.
작동 방식 한 번에 하나의 작업만 진행하며, 현재 작업이 완료될 때까지 다른 작업을 시작하지 않습니다. 여러 작업을 동시에 진행할 수 있으며, 이벤트 완료를 기다리지 않고 다른 작업을 진행합니다.
장점 - 작업 순서가 보장되어 예측 가능성이 높습니다.
- 코드 작성과 이해가 용이합니다.
- 작업이 비효율적인 대기 시간 없이 병렬로 진행되어 성능이 높아집니다.
- 시스템 자원의 활용도를 극대화할 수 있습니다.
단점 - 이벤트 완료를 기다리는 동안 시스템 자원이 낭비될 수 있습니다.
- 응답성이 떨어질 수 있습니다.
- 작업 순서가 보장되지 않아 복잡도가 증가할 수 있고, 예측이 어려울 수 있습니다.
- 디버깅이 어렵고 코드가 복잡해질 수 있습니다.
예시 - 동기식 파일 I/O: 파일을 읽거나 쓸 때 작업이 완료될 때까지 기다림
- 동기식 네트워크 요청: 클라이언트가 서버 응답을 받을 때까지 대기
- 비동기식 파일 I/O: 파일을 읽거나 쓰는 동안 다른 작업을 동시에 수행
- 비동기식 네트워크 요청: 서버에 요청을 보낸 후 응답을 기다리지 않고 다른 작업을 수행
실제 사용 사례 - 전통적인 웹 서버: Apache HTTP Server의 기본 설정에서 요청을 순차적으로 처리 (Prefork 모드)
- SQL 데이터베이스: MySQL, PostgreSQL의 동기식 쿼리 처리 방식
- 비동기 이벤트 기반 서버: Nginx 웹 서버는 비동기 이벤트 기반 아키텍처로 많은 클라이언트 요청을 동시에 처리
- NoSQL 데이터베이스: MongoDB, Cassandra는 비동기식 네트워크 처리와 I/O를 지원하여 높은 성능을 제공
리눅스 시스템 호출 - read() 및 write(): 동기식으로 파일을 읽고 씀, 호출이 완료될 때까지 대기
- wait(): 자식 프로세스가 종료될 때까지 부모 프로세스가 대기
- epoll 및 select, poll: 비동기식으로 여러 파일 디스크립터를 감시하고, 하나 이상이 준비되었을 때 비동기적으로 처리
- aio_read() 및 aio_write(): 비동기식 I/O 시스템 호출을 통해 비동기 작업 수행
코드 예시 동기식 파일 읽기 (Python):
with open('file.txt', 'r') as f: content = f.read()
비동기식 파일 읽기 (JavaScript):
fs.readFile('file.txt', (err, data) => { console.log(data); });
리눅스 명령어 - cp (동기식 복사): 파일을 복사할 때 작업이 완료될 때까지 대기 - rsync (비동기 동작 가능): 파일을 복사하는 동안 네트워크를 통해 데이터 전송을 비동기적으로 수행
네트워크 프로그래밍 - 동기식 소켓 프로그래밍: 서버와 클라이언트가 데이터 전송을 완료할 때까지 대기 - 비동기식 소켓 프로그래밍: 서버와 클라이언트가 비동기적으로 데이터를 송수신, 데이터를 보내거나 받는 동안 블로킹되지 않음
리눅스 커널 특징 - 단일 프로세스 커널 호출: 특정 작업이 완료될 때까지 커널이 프로세스를 블로킹 - 커널 비동기 I/O 스케줄링: 여러 프로세스와 작업을 동시에 처리하기 위해 비동기 I/O 큐를 관리하여 효율적인 시스템 자원 사용을 지원
웹 서버 기술 - Apache HTTP Server (Prefork 모드): 각 요청을 개별 프로세스에서 동기적으로 처리 - Nginx, Node.js: 비동기 이벤트 기반 아키텍처로, 높은 동시성을 요구하는 웹 서버에서 효율적으로 클라이언트 요청을 처리
데이터베이스 처리 - MySQL, PostgreSQL (동기식 트랜잭션): 트랜잭션 처리 시 동기적으로 데이터베이스와의 상호작용을 수행 - MongoDB (비동기식 I/O 지원): 비동기적으로 데이터를 읽고 쓰며, 높은 성능과 확장성을 제공
프로그래밍 언어 지원 - Python (동기식 처리 기본): 대부분의 파일 I/O 및 네트워크 작업이 동기적으로 수행 - JavaScript (Node.js의 비동기 처리): 콜백 함수와 Promise를 사용하여 비동기 작업을 관리하며, 이벤트 루프를 통해 비동기적으로 실행

표에 대한 추가 설명

  1. 동기식 이벤트의 기술 및 도구:
    •  Apache HTTP Server (Prefork 모드): 각 요청을 독립된 프로세스로 처리하며, 요청이 완료될 때까지 프로세스가 블로킹됩니다.
    •  MySQL, PostgreSQL: 전통적인 관계형 데이터베이스는 쿼리와 트랜잭션을 동기적으로 처리합니다. 클라이언트가 쿼리 요청을 보내면 결과를 반환받을 때까지 대기합니다.
    •  Python: 파일 I/O 및 네트워크 작업이 동기적으로 수행되며, 작업이 완료될 때까지 기다립니다.
  2. 비동기식 이벤트의 기술 및 도구:
    •  Nginx: 비동기 이벤트 기반 웹 서버로, 높은 동시성을 지원하며 수많은 클라이언트의 요청을 효율적으로 처리합니다.
    •  Node.js: 비동기 I/O와 이벤트 기반 프로그래밍을 지원하는 JavaScript 런타임 환경으로, 웹 서버와 같은 네트워크 애플리케이션을 효율적으로 구축할 수 있습니다.
    •  MongoDB: NoSQL 데이터베이스로, 비동기식 네트워크 처리와 I/O를 지원하여 고성능을 제공합니다.

 

이제 동기식과 비동기식 이벤트로 자세히 알아보겠읍니다.

 

1. 동기식 이벤트 (Synchronous Event)

개념

  • 동기식 이벤트 처리는 이벤트가 발생하면 해당 이벤트가 완료될 때까지 기다린 후 다음 작업을 수행하는 방식입니다.
  • 이벤트와 작업이 순차적으로 진행되며, 이벤트가 완료되기 전까지 다음 이벤트나 작업을 진행하지 않습니다.

작동 방식

  • 단일 스레드 단일 프로세스에서 주로 사용됩니다.
  • 프로그램은 작업을 요청한 후, 해당 작업이 완료될 때까지 블로킹 상태로 대기합니다.
  • 시스템 호출, 파일 I/O, 네트워크 I/O 등의 작업을 수행할 때 동기적으로 처리할 수 있습니다.

장점

  • 작업 순서가 보장됩니다. 작업이 순차적으로 실행되기 때문에 디버깅과 코드의 이해가 쉽습니다.
  • 복잡도가 낮아, 단순한 작업에서는 적합합니다.

단점

  • 대기 시간이 발생할 수 있습니다. 예를 들어, 파일을 읽거나 네트워크 응답을 기다리는 동안 시스템 자원이 낭비될 수 있습니다.
  • 응답성이 낮아질 수 있습니다. 특히 I/O 작업이 많은 경우 시스템 성능이 저하될 수 있습니다.

리눅스 환경에서의 예시

  • 파일 I/O: 동기식 파일 읽기/쓰기 작업은 프로그램이 파일 작업이 완료될 때까지 대기하게 합니다.
  • 시스템 호출: 동기식 시스템 호출은 작업이 완료될 때까지 호출하는 프로세스를 블로킹합니다. 예를 들어, read() 호출은 데이터가 준비될 때까지 대기합니다.

코드 예시 (C 언어)

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main() {
    int fd = open("example.txt", O_RDONLY);
    char buffer[128];
    int bytesRead = read(fd, buffer, sizeof(buffer)); // 동기식 호출: 파일 읽기가 끝날 때까지 대기
    printf("Read %d bytes\n", bytesRead);
    close(fd);
    return 0;
}

 

 

2. 비동기식 이벤트 (Asynchronous Event)

개념

  •  비동기식 이벤트 처리는 이벤트가 발생한 후 해당 이벤트의 완료 여부와 관계없이 다음 작업을 즉시 수행하는 방식입니다.
  •  이벤트가 처리되는 동안 다른 작업을 계속 진행할 수 있어 병렬 처리가 가능합니다.

작동 방식

  •  이벤트 루프(Event Loop) 또는 콜백 함수를 이용하여 이벤트가 완료되면 별도로 결과를 처리합니다.
  •  비동기식 방식은 주로 멀티스레드 이벤트 기반 프로그래밍에서 사용됩니다.
  •  리눅스에서 비동기 I/O는 커널이 I/O 작업을 비동기로 처리하고, 작업이 완료되면 응용 프로그램에 알립니다.

장점

  •  응답성이 높습니다. 작업이 병렬로 진행되기 때문에 하나의 작업이 블로킹되지 않습니다.
  •  효율적 자원 사용이 가능합니다. CPU와 I/O 작업이 동시에 진행될 수 있어 시스템 자원을 최대로 활용할 수 있습니다.

단점

  •  복잡도가 증가할 수 있습니다. 비동기식으로 처리되기 때문에 작업 순서가 보장되지 않으며, 디버깅이 어렵습니다.
  •  이벤트 관리가 필요합니다. 이벤트 큐나 콜백 함수의 사용으로 코드가 복잡해질 수 있습니다.

리눅스 환경에서의 예시

  •  비동기 I/O: aio_read(), aio_write() 함수는 파일 읽기/쓰기를 비동기적으로 처리하여 호출이 즉시 반환되도록 합니다.
  •  epoll: 대규모의 파일 디스크립터를 비동기적으로 관리할 수 있는 API입니다. 이벤트 기반 네트워크 프로그래밍에 주로 사용됩니다.
  •  select/poll: 다중 I/O 비동기 처리를 위해 파일 디스크립터의 상태를 비동기적으로 확인할 수 있는 함수들입니다.

코드 예시 (C 언어)

#include <stdio.h>
#include <aio.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd = open("example.txt", O_RDONLY);
    struct aiocb cb;
    char buffer[128];

    // AIO 컨트롤 블록 설정
    cb.aio_fildes = fd;
    cb.aio_buf = buffer;
    cb.aio_nbytes = sizeof(buffer);
    cb.aio_offset = 0;

    aio_read(&cb); // 비동기 읽기 요청: 즉시 반환됨

    while (aio_error(&cb) == EINPROGRESS) {
        printf("작업 진행 중...\n"); // 비동기 작업이 진행되는 동안 다른 작업 수행 가능
        sleep(1);
    }

    int bytesRead = aio_return(&cb); // 비동기 작업 완료 후 결과 가져오기
    printf("Read %d bytes\n", bytesRead);
    close(fd);
    return 0;
}

3. 동기식 및 비동기식 이벤트와 리눅스마스터 1급 관련 주요 개념

리눅스 커널에서의 동기식 vs 비동기식 I/O

  • 동기식 I/O: 시스템 호출이 블로킹되며, 데이터가 완전히 전송되거나 수신될 때까지 대기합니다. 일반적인 파일 읽기/쓰기와 같은 전통적인 I/O 방식입니다.
  • 비동기식 I/O: 시스템 호출이 비블로킹 모드로 설정되며, 데이터가 준비될 때까지 호출이 즉시 반환되고, 준비가 완료되면 비동기적으로 데이터가 처리됩니다. O_NONBLOCK 플래그를 사용하는 파일 디스크립터가 예시입니다.

리눅스의 비동기 I/O 모델

  • epoll 및 select, poll: 고성능 네트워크 서버에서 효율적으로 많은 클라이언트 연결을 처리할 수 있는 방법들입니다. 이벤트 기반 서버 구현 시 비동기 방식으로 많이 사용됩니다.

리눅스 시스템 호출 및 스케줄링

  • fork()와 exec(): 새로운 프로세스를 생성하는 방식에서 fork()는 동기적으로 새로운 프로세스를 생성하고, exec()는 호출 후 즉시 반환되지 않으며 비동기적으로 새로운 프로세스로 전환됩니다.
  • 스케줄링과 멀티태스킹: 리눅스는 여러 프로세스를 동시 실행할 수 있지만, CPU는 시간 슬라이스를 이용하여 각 프로세스를 빠르게 전환합니다. 이는 비동기식 작업과 유사한 동작입니다.

리눅스에서 동기식 및 비동기식 프로그래밍의 중요성

  • 리눅스 서버 관리 및 최적화: 시스템 리소스를 효율적으로 사용하고, 여러 작업을 동시에 처리하며, 서버의 성능을 최적화하는 데 필수적입니다.
  • 성능 향상 및 확장성: 비동기 프로그래밍을 통해 리눅스 서버는 대규모 연결과 작업을 효율적으로 처리할 수 있습니다.

 

 

최종 요약본

  1. 동기식 이벤트 (Synchronous Event):
    • 이벤트가 발생하면 해당 작업이 완료될 때까지 기다리는 방식으로, 순차적 처리와 작업 순서 보장이 특징입니다.
    • 주로 단일 스레드나 프로세스에서 사용되며, 작업이 완료될 때까지 블로킹 상태로 대기합니다.
    • 장점은 작업 순서가 예측 가능하고 코드 작성이 쉽다는 점이며, 단점은 응답성이 낮고 자원이 낭비될 수 있다는 점입니다.
    • 리눅스에서 동기식 I/O(read(), write()), 동기식 네트워크 요청, Apache HTTP Server (Prefork 모드) 등이 예시입니다.
  2. 비동기식 이벤트 (Asynchronous Event):
    • 이벤트가 발생하면 해당 작업의 완료 여부와 관계없이 다음 작업을 즉시 수행하는 방식으로, 높은 동시성과 효율성을 제공합니다.
    • 멀티스레드나 이벤트 기반 프로그래밍에서 사용되며, 이벤트 루프와 콜백 함수를 통해 작업 완료 여부를 처리합니다.
    • 장점은 높은 응답성과 자원 효율성이며, 단점은 복잡한 코드 관리와 디버깅 어려움이 있습니다.
    • 리눅스에서 비동기 I/O(aio_read(), aio_write()), epoll, Nginx, Node.js 등이 예시입니다.
  3. 리눅스 커널에서의 동기식 vs 비동기식 I/O:
    • 동기식 I/O는 블로킹되어 데이터 전송이 완료될 때까지 대기하며, 일반적인 파일 읽기/쓰기 방식입니다.
    • 비동기식 I/O는 비블로킹 모드로 데이터가 준비될 때까지 기다리지 않고 즉시 반환되며, 준비가 완료되면 비동기적으로 처리됩니다.
  4. 리눅스의 비동기 I/O 모델:
    • epoll, select, **poll**는 고성능 서버에서 많은 클라이언트 연결을 효율적으로 관리하며 비동기 이벤트 처리를 지원합니다.
  5. 리눅스에서 동기식 및 비동기식 프로그래밍의 중요성:
    • 시스템 자원을 효율적으로 사용하고 여러 작업을 동시에 처리하여 서버 성능을 최적화하고, 대규모 연결과 작업을 효율적으로 관리하는 데 필수적입니다.

 

이상 입니다!!!

 

 

참조 ) 

https://dev-coco.tistory.com/46

 

동기와 비동기의 개념과 차이

1. 동기(Synchronous: 동시에 일어나는) - 동기는 말 그대로 동시에 일어난다는 뜻이다. 요청과 그 결과가 동시에 일어난다는 약속이다. 바로 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서

dev-coco.tistory.com

https://velog.io/@effypark/JS-%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%B0%A9%EC%8B%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

[JS] - 동기와 비동기방식의 차이점

출처 : https://learnjs.vlpt.us/async/서버에서 요청을 보낸 후 응답을 받아야만 다음 동작이 이루어지는 방식모든 일은 순차적으로 진행되며, 어떤 작업이 실행 중이라면 다음 작업은 대기하게 된다.직

velog.io

 

반응형