본문 바로가기
자격증/리눅스마스터 1급

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

by CodeMuscle 2024. 9. 3.
반응형

안녕하세요.

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

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

 

 

 

요약

  • 동기식 이벤트는 작업이 완료될 때까지 기다리는 방식으로, 순차적 처리와 작업 순서 보장이 특징입니다.
  • 비동기식 이벤트는 작업 완료를 기다리지 않고 다음 작업을 즉시 수행하는 방식으로, 높은 동시성과 효율성을 제공합니다.
  • 동기식 이벤트의 예로는 동기식 파일 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

 

반응형