하드웨어의 발전과 소프트웨어 개발에 대한 접근성이 낮아지면서 유저들의 눈높이는 높아졌고, 그에 따라 개발자들의 동시성 처리에 대한 업무가 많아졌다.
감으로만, 어떻게 처리하는지에 대한 이해만 가지고 몇년 째 개발을 이어왔고 ‘그로킹 동시성’ 이라는 책 제목을 보자마자 정리하며 읽어보고 동시성에 대한 이해도를 높이고자 하는 욕구가 치솟았다.
그래서 앞으로 13개의 챕터를 하나씩 정리해보고자 한다!
너무 어렵지 않기를….
동시성이란 무엇인가
•
동시성의 중요성
•
시스템의 성능을 측정하는 방법
•
동시성의 서로 다른 계층 파악
동시 컴퓨팅이 없다면 우리가 만든 애플리케이션은 실제 세상의 복잡함을 따라잡기 어렵다.
동시성의 중요성
시스템 성능을 끌어올리기
•
무어의 법칙
◦
“2년마다 소프트웨어 성능은 2배씩 좋아진다.” 라는 법칙은 더이상 기대할 수 없다.
▪
트랜지스터(컴퓨터 회로의 기본 단위)의 개수는 프로세서의 면적으로 제한
→ 프로세서의 클록 속도를 올리는 것만으로 성능 향상을 기대할 수 없다. (프로세서의 온도 제약)
◦
그리하여, 멀티 프로세서 형태의 수평 확장으로 전환하였고, 이러한 설계를 받아들여야 했다.
◦
성능은 어떻게 측정하며, 개선 방법은 무엇일까?
•
지연 시간 vs. 처리율
◦
지연 시간
▪
단일 작업을 시작해 끝날 때 까지 걸리는 시간
◦
처리율
▪
단위 시간당 시스템이 처리하는 작업의 수
높은 처리율을 위해 꼭 지연 시간이 짧을 필요는 없다. 성능을 최적화할 때 처리율을 개선한다고 지연시간이 악화될 수도 있다. Vice Versa.
다음 세 가지 방법으로 시스템 성능을 개선할 수 있다.
•
지연 시간 줄이기(한 가지 작업을 더 빨리 처리하기)
•
지연 시간 숨기기(지연 시간이 긴 작업 중에 다른 일을 함께 처리하기)
•
처리율 개선하기(같은 시간 동안 시스템이 더 많은 작업을 처리하게 된다)
크고 복잡한 문제 풀기
•
확장성(Scalability)
◦
수직 확장성(Scale-up)
▪
프로세서를 더 강력한 것으로 교체
▪
메모리 증설
▪
ex. 서버 한개를 설치했다가, 더 좋은 서버를 설치하기 위해 다 갈아엎고 다시 전체 설치
→ 프로세서 교체 비용이 비싸며, 가격 상승폭도 크다.
◦
수평 확장성(Scale-out)
▪
기존 + 추가 → 부하 분산 방식
▪
ex. 서버 한개를 설치했다가, 동일한 서버를 여러대 설치
→ 수직 확장에 비해 확장성 문제가 일어날 여지가 적다.
업계에서는 수평 확장을 주로 택하고 있다.
(실시간 시스템의 필요성, 대규모 데이터, 이중화를 통한 신뢰성 확보, 자원 효율성 제고를 위한 클라우드 혹은 SaaS 환경으로의 마이그레이션 등)
→ 컴퓨팅 클러스터(서로 연결된 여러 대의 컴퓨터)가 필요하다!
•
느슨한 결합
◦
문제의 크기를 결정하는 또 다른 요소는 문제의 복잡성
▪
복잡성을 낮추기 위해 책임의 분할을 한다.
▪
할 일과 수행 시점; 동시성을 느슨한 결합을 만드는 전략으로 보는 관점도 존재
동시성의 계층
•
책에서는 오케스트라에 비교하였다.
•
애플리케이션 계층
런타임 시스템 계층
하드웨어 계층
애플리케이션 계층 (작곡가가 쓴 곡)
•
현실 세계와 비슷한 정도의 추상화 수준
•
비즈니스 로직이 반영된 복잡한 알고리즘을 구현하는 소스 코드를 작성
런타임 시스템 계층 (각 연주자들이 서로 다른 악기를 가지고 곡의 제각기 다른 부분을 함께 연주하는 것)
•
주로 운영체제에 해당
하드웨어 계층 (각 악기)
•
기계 명령어를 직접 실행
•
애플리케이션 성능을 최적화하려면 하드웨어 구성 요소와 애플리케이션의 상호작용을 깊이 이해해야 한다.
이 책에서 배우게 될 내용
•
1부
◦
기본적인 개념과 동시성 프로그래밍의 기초를 다룸
◦
하드웨어 계층부터 애플리케이션 계층까지 모든 계층 설명
•
2부
◦
동시 애플리케이션의 설계와 자주 쓰이는 설계 패턴을 다룸
◦
동시성을 갖춘 시스템을 만들 때 자주 발생하는 문제를 피할 수 있는 방법도 제시
•
3부
◦
애플리케이션과 네트워크로 연결된 여러 컴퓨터로 확장하는 내용을 다룸
◦
작업 간의 비동기 통신을 살펴보고, 동시 애플리케이션을 작성하는 과정을 단계별로 자세히 설명
•
마지막으로
◦
현대적인 비동기 동시성 프로그래밍과 함께 동시성의 심화 주제를 다룸
책을 읽고 정리하는 건 처음인데,
내가 제대로 이해했는지에 대한 지표가 될 것 같다.
크롤링을 했던 신입 때 부터 지금까지 동시성을 많이 다루었으니,
이제는 누구보다도 더 잘 이해하고 설명할 수 있는 개발자가 되길 바라며..!