그림으로 공부하는 IT인프라 구조 - 3

2021. 9. 28. 17:39이론 공부

이어서 이번에도 "그림으로 공부하는 IT 인프라 구조" 라는 책을 읽으면서, 해당 책에서 소개되는 여러 구조 들을 정리해보겠습니다.

 

직렬 병렬 구조

- 도로를 예로 들어서 1차선 도로를 직렬 , 2차선 도로 이상을 병렬 이라고 한다. 이를 CPU에 적용하면 클럭 수는 직렬 , 코어 수는 병렬 이라고 볼 수 있다.

- 하나의 CPU 로 처리를 하는 데에는 한계가 있기 때문에, 다수의 CPU 를 배치해서 처리한다.

- 병렬화해서 데이터를 처리한 후 집약할 때 오버헤드가 걸리는데, 이 오버헤드를 감안하더라도 효과가 있을 때 병렬화 처리를 한다.

- 웹 서버는 복수의 프로세스 , AP 서버는 1개의 프로세스 내에서 복수의 스레드를 사용한다.

 

동기 / 비동기

- 특정 요청을 했을 때, 해당 요청이 끝날 때까지 기다리는 것을 동기 , 기다리지 않고 다른 처리를 수행하는 것이 비동기 이다.

- 동기의 장점 : 구현난이도가 낮고 , 요청한 일이 끝났는지 즉각 확인 할 수 있다.

- 동기의 단점 : 요청한 일이 끝날때까지 다른 것을 할 수 없다.

- 비동기의 장점 : 요청한 일이 처리되고 있는 동안 , 다른 업무를 수행할 수 있다. ( 시간을 효율적으로 사용해서 병렬화 할 수 있다 )

- 비동기의 단점 : 구현난이도가 상대적으로 높다. 요청한 일이 끝났는지 확인하지 않으면 , 해당 요청이 끝났는지 알 수 없기 때문에, 불필요한 확인 작업이 필요하다.

 

- 우리말로 대기 행렬이라고 한다.

- 이는 하드웨어, OS, 데이터베이스, 애플리케이션 등 거의 모든 곳에서 사용되는 구조 로써, 먼저 들어온 데이터(요청) 이 먼저 처리 되는 것이 특징이며 이를 FIFO(First In First Out) 선입선출 방식이라고 한다.

- CPU 처리를 기다리고 있는 프로세스나 스레드 행렬 / 하드 디스크 등의 저장소 읽기 처리를 기다리고 있는 I/O 요구 행렬 / 네트워크 접속 성립을 기다리고 있는 접속 요구 행렬 등에 사용 된다. ( 여러 처리가 동시에 진행되는 경우에 자주 사용된다 )

 

배타적 제어

- 여러 사람이 공유하는 물건일 경우, 누군가가 그 물건을 사용하고 있으면 다른 사람은 그것을 사용할 수 없도록 하는 것이다.

- 동시에 사용하게 되면 고장이 날 수도 있기 때문에, 배타적 제어가 필요하다.

- 공유 자원을 사용할 때에 데이터의 불일치를 유발하지 않기 위해서 배타적 제어를 사용한다.

 

상태 저장 / 상태 비저장

- 어떤 작업을 하고 있을 때 현재 어디까지 작업이 진행됐는지를 상태라고 한다.

- 이러한 상태를 저장해서 사용하는 것을 상태 저장’ , ‘상태를 저장하지 않는 것을 상태 비저장이라고 한다.

- 상태 저장은 복잡한 처리가 가능하지만, 시스템 복잡성이 커지며 상태 비저장은 성능이나 안정성 측면에서 우수하다.

- 거의 모든 곳에서 상태 저장이 사용되고 있는데, 네트워크 통신() 에서는 보통 세션이라는 개념을 사용해서 구현하고 있다.

 

가변 길이 / 고정 길이

- 가변 길이는 데이터 크기를 매번 변경하는 것으로, 데이터 전체 양이 준다는 장점이 있다.

- 고정 길이는 모두 같은 크기를 이용해서 처리하는 것으로, 크기가 균일해서 관리가 수월하다는 장점이 있다.

- 효율성을 추구한다면 가변 길이를, 간단한 것을 추구한다면 고정 길이를 사용하는 등 적절하게 선별해서 사용하여야 한다.

 

데이터 구조 ( 배열과 연결 리스트 )

- 배열과 연결리스트 모두 순차적으로 데이터를 처리하는 구조.

- 배열은 같은 크기의 상자를 빈틈 없이 순서대로나열하는 것으로, 몇번 째 상자인지만 알면 해당 상자에 한 번에 액세스할 수 있다.

- 연결 리스트는 상자를 선으로 연결한 형태의 데이터 구조

- 연결 리스트는 다음 상자의 위치 정보를 가지고 있는 것으로 특정 상자를 찾으려면 끝에서부터 순서대로 하나씩 상자 내부를 확인해야 한다.

- 배열은 탐색이 빠르지만, 배열 도중에 상자를 추가 및 삭제가 느린 데이터 구조

- 연결 리스트는 상자를 추가 및 삭제가 빠르며 탐색이 느린 데이터 구조

 

탐색 알고리즘

※ 이 책에서 설명하는 탐색 알고리즘은 코드가 아닌 탐색 알고리즘의 본질에 대해서 설명하고 있다.

ex) 데이터 관리는 어떤 식으로 해야 하는지 , 특정 데이터를 찾기 위해서 어떻게 접근해야 하는지 가 주다

 

- 필요한 때에 필요한 데이터를 빠르게 찾기 위해서 데이터를 정리해 둘 필요가 있다

- 데이터를 찾을 때의 데이터 구조와 데이터 저장 방식(메모리, HDD, SSD 등 ) 특성에 따라 적합한 데이터 정리 방법이 달라진다

- 데이터 정리 방법을 '데이터 구조', 처리 순서를 '알고리즘' 이라고 한다

- 처리 상대에 맞추어 데이터 구조를 정리할 필요가 있기 때문에 '알고리즘과 데이터 구조'는 자주 함께 다루어진다

 

인덱스가 없는 경우

- 특정한 데이터를 찾기 위해서 테이블의 모든 블록을 처음부터 순서대로 읽어나가는 것을 풀 스캔 이라 한다.

- 페이지가 가나다순으로 정렬돼 있지 않았을 때의 풀 스캔은 차례도 색인도 없는 사전에서 단어를 찾는 것과 같다.

 

인덱스가 있는 경우

- 인덱스가 있다면 최소한의 필요 블록만 읽으면 된다.

- 사전을 찾을 때 색인을 이용하는 것과 마찬가지다.

- 인덱스가 있는 경우 검색이 빨라지는 대신에 데이터 추가, 갱신, 삭제 시 테이블 뿐 아니라 인덱스 데이터도 갱신되어야 되기 때문에, 불필요한 오버헤드가 발생할 수 있다.

- 인덱스는 읽을 블록 수를 줄이기 위한 수단이지만, 인덱스를 사용하면 오히려 읽을 블록 수가 늘어날 수도 있다.

ex) 테이블 데이터를 모두 취득해야 하는 경우 등

 

※ 데이터 구조는 데이터를 찾는 방식이나 데이터 저장 위치의 특성을 고려해서 선택할 필요가 있다.

※ DBMS 에서 인덱스를 만들면 검색은 빨라지지만 갱신 시에 오버헤드가 걸린다는 단점도 있기 때문에 함께 고려해야 한다.