답변: 동기는 하나의 작업이 순차적으로 진행되 끝날때까지 다른 작업이 대기하는 방식이고 비동기는 작업 완료 여부와 상관없이 다른 작업을 처리하는 방식입니다.
1. 동기(Synchronous)와 비동기(Asynchronous)란 무엇인가요?
동기(Synchronous):
- 정의: 작업이 순차적으로 실행되며, 이전 작업이 완료될 때까지 다음 작업이 대기하는 방식입니다.
- 특징:
- 작업 순서가 명확하고 직관적입니다.
- 느린 작업(예: 네트워크 요청, 파일 I/O)으로 인해 전체 프로세스가 멈출 수 있습니다.
- 비유:
"동기는 카페에서 커피를 주문하고 그 자리에 서서 커피가 나올 때까지 기다리는 것과 같습니다."
비동기(Asynchronous):
- 정의: 작업이 요청된 후 바로 다음 작업으로 넘어가며, 작업 완료 여부와 상관없이 다른 작업을 처리하는 방식입니다.
- 특징:
- 느린 작업 중에도 다른 작업을 병렬로 처리합니다.
- 작업 완료 후 콜백(callback) 또는 이벤트를 통해 결과를 처리합니다.
- 비유:
"비동기는 카페에서 커피를 주문하고, 커피가 준비되면 호출받아 가는 것과 같습니다."
2. 동기와 비동기의 차이는 무엇인가요?
구분동기(Synchronous)비동기(Asynchronous)처리 방식 | 작업 완료 전까지 대기 | 대기하지 않고 다음 작업 진행 |
속도 | 느린 작업으로 전체 지연 가능 | 작업 중 병렬 처리 가능 |
구현 복잡도 | 구현이 단순 | 상대적으로 복잡(콜백, 비동기 제어) |
사용 사례 | CPU 중심 작업, 단순한 작업 처리 | I/O 중심 작업, 네트워크 통신 |
3. 어떤 상황에서 동기/비동기를 사용하나요?
동기(Synchronous):
- 작업 순서가 중요하고, 결과가 즉시 필요할 때.
- 예:
- 금융 애플리케이션에서 잔액 확인 후 출금 처리.
- CLI(Command-Line Interface) 도구에서 단계별 작업 처리.
비동기(Asynchronous):
- 느린 작업(I/O, 네트워크 등)이 다른 작업을 방해하지 않아야 할 때.
- 예:
- 웹 애플리케이션에서 사용자 요청 처리(API 호출).
- GUI 애플리케이션에서 데이터 로딩 중 UI 반응성 유지.
4. 동기와 비동기의 장단점은 무엇인가요?
동기의 장단점:
- 장점:
- 직관적이고 디버깅이 쉽습니다.
- 코드가 단순합니다.
- 단점:
- 느린 작업이 전체 성능을 저하시킬 수 있습니다.
비동기의 장단점:
- 장점:
- 효율적인 자원 사용.
- 사용자 경험(UX)이 개선됩니다.
- 멀티태스킹이 가능해 작업 병렬 처리에 유리합니다.
- 단점:
- 구현 및 디버깅이 복잡합니다.
- 비동기 흐름 제어가 어렵습니다(예: 콜백 헬).
5. Java에서 동기와 비동기를 구현하는 방법은?
동기 방식 구현 예시:
public String fetchData() {
String data = database.query(); // 데이터베이스 응답 대기
return data; // 작업 완료 후 실행
}
비동기 방식 구현 예시 (CompletableFuture):
public void fetchDataAsync() {
CompletableFuture.supplyAsync(() -> database.query())
.thenAccept(result -> System.out.println(result));
System.out.println("다른 작업 수행 중...");
}
6. 면접에서 추가적인 질문에 대비하기 위한 팁
- 동기와 비동기를 선택할 때의 기준은?
- 응답 속도와 작업 우선순위에 따라 결정.
- 비동기는 주로 I/O 중심 작업에 적합하고, 동기는 연속성이나 작업 결과가 중요한 경우 적합.
- 비동기와 멀티스레드는 같은 것인가?
- 비동기는 멀티스레드와 관련이 있지만 반드시 멀티스레드를 사용하지 않아도 구현 가능합니다. 예를 들어, 비동기 작업은 이벤트 루프를 사용하는 단일 스레드에서도 동작합니다.
심화 - 비동기와 멀티스레드
스레드 개수 | 하나의 스레드만 사용 | 여러 스레드 사용 |
작업 처리 방식 | 이벤트 루프와 비동기 작업 큐를 사용하여 논블로킹 방식으로 작업 처리 | 각 스레드가 독립적으로 작업을 실행 |
컨텍스트 스위칭 | 없음 (단일 스레드로 모든 작업 처리) | 있음 (스레드 간 전환 발생) |
I/O 바운드 작업 | 효율적 (OS가 작업 완료를 알리면 이벤트 루프가 처리) | 효율적이지만 스레드 리소스 관리 필요 |
CPU 바운드 작업 | 비효율적 (단일 스레드만 사용하므로 병렬 처리 불가) | 효율적 (스레드 간 병렬 처리 가능) |
사용 사례 | Node.js, Python asyncio (I/O 중심 시스템) | Java Thread, ExecutorService, Spring Async (CPU와 병렬 처리가 필요한 경우) |
리소스 소모 | 스레드가 하나이므로 메모리와 CPU 사용량이 적음 | 여러 스레드 생성 및 관리로 메모리와 CPU 소모 증가 |
병렬 처리 | 없음 (논리적으로 비동기 작업이 처리되지만 실제 병렬 처리는 아님) | 있음 (여러 스레드가 동시에 실행) |
심화2 - 하드웨어와 소프드웨어에서의 스레드
**"4코어 16스레드"**라는 표현은 CPU의 하드웨어 수준의 스레드 병렬 처리 능력을 나타냅니다. 이는 CPU가 동시에 처리할 수 있는 하드웨어 스레드의 수를 의미하며, 소프트웨어에서 생성할 수 있는 소프트웨어 스레드의 수와는 다릅니다.
4코어 16스레드의 의미
- 4코어: 물리적인 CPU 코어가 4개 있다는 뜻입니다.
- 16스레드: 각 코어가 하이퍼스레딩 (Hyper-Threading) 또는 SMT (Simultaneous Multi-Threading) 기술을 지원하여 1개의 물리적 코어가 2개 이상의 하드웨어 스레드를 처리할 수 있다는 뜻입니다.
- 즉, 4코어 × 4스레드 = 총 16개의 하드웨어 스레드가 있습니다.
하드웨어 스레드와 소프트웨어 스레드의 차이
하드웨어 스레드
- CPU가 동시에 실행할 수 있는 병렬 작업 단위.
- 물리적 CPU 코어와 연관되며, 하이퍼스레딩 기술로 인해 물리적 코어보다 많은 스레드를 처리할 수 있음.
- CPU의 설계에 따라 고정된 숫자(예: 4코어 16스레드).
소프트웨어 스레드
- 운영 체제(OS)와 소프트웨어에서 생성한 논리적인 실행 단위.
- 운영 체제의 스케줄러가 하드웨어 스레드를 사용해 소프트웨어 스레드를 실행함.
- 소프트웨어 스레드의 수는 CPU의 하드웨어 스레드 수와 무관하게 더 많이 생성할 수 있음. 하지만, 하드웨어 스레드보다 많은 소프트웨어 스레드가 생성되면 컨텍스트 스위칭으로 인해 성능이 저하될 수 있음.
하드웨어 스레드 수와 소프트웨어 스레드 수의 관계
- **하드웨어 스레드(16개)**는 소프트웨어 스레드의 병렬 처리 능력을 제한합니다.
- CPU가 동시에 실행할 수 있는 스레드는 최대 16개입니다.
- 소프트웨어 스레드는 이를 넘어설 수 있으며, 100개, 1000개 이상의 스레드를 생성할 수도 있습니다.
- 하지만 하드웨어 스레드 수(16개)를 초과하는 소프트웨어 스레드는 큐에 대기하며, CPU는 이를 순차적으로 처리합니다.
'백엔드 기술면접' 카테고리의 다른 글
백엔드 개발자 면접 질문 #3 - 객체지향이 뭐에요? (0) | 2024.12.12 |
---|