#49. 큐와 배타적 제어

박현재·2022년 3월 7일
0
post-thumbnail

<그림으로 공부하는 IT 인프라 구조>라는 책을 통해 IT 인프라의 하드웨어, 소프트웨어적 구조는 어떻게 되어 있는지 복습하고 있다.
처음 코딩을 접하고 익힌 것은 To Do List 만들기 즉, CRUD(Create, Read, Update, Delete)이다. 사용자가 요청한 데이터를 처리해서 생성하고, 생성한 것을 읽어오고, 수정하고, 삭제하는 애플리케이션을 만들어 보는 것이다. CRUD를 익히면서 대체 컴퓨터는 이 과정들을 어떻게 처리해나갈까? 네트워크를 통해 흘러다니는 데이터는 어떻게 처리될까? 그런 것들이 궁금했다. 이번에는 그 처리 과정의 일부인 '큐'와 '배타적 제어'에 대해서 알아보자.

1. 큐(Queue)의 개념

큐는 다른 말로 '대기 행렬'이다. 마트의 계산대에 줄을 서있는 행렬은 마치 CPU의 계산을 기다리는 '프로세스' 또는 '스레드'의 행렬과 같다.

먼저 계산대 앞에 선 사람이 먼저 계산대를 통과하는 방식을 FIFO(First In First Out)방식이라고 한다. 큐는 FIFO 방식으로 작동한다. 데이터 전송을 시작하는 노드에서 가까운 노드부터 우선 탐색하는 BFS(Breadth First Search) 알고리즘에 '큐' 방식이 적용된다. 반대로는 DFS(Depth First Search)라는 '깊이 우선 탐색' 알고리즘이 있다.

2. 큐의 쓰임

  1. CPU 처리를 기다리고 있는 프로세스나 스레드 행렬
  2. 하드 디스크 등의 저장소 읽기 처리를 기다리고 있는 I/O 요구 행렬
  3. 네트워크 접속 성립을 기다리고 있는 접속 요구 행렬

CPU를 기다리고 있는 프로세스 행렬을 런큐(Run-queue)라고 하는데 런큐에 쌓인 프로세스 수를 코어 수로 나누어서 1이면 문제 없다고 하는 것이 일반적이다. 계산대 행렬로 빗대어 보면, 한 명이 계산대에서 정산 중이고 자신은 그 뒤에 서 있는 상태이다. Unix 계열의 PC인 경우의 프로세스나 스레드 수는 다음과 같은 방법으로 확인할 수 있다.
1. Spotlight검색(Command + Space bar)에서 '활성 상태 보기'를 입력한다.

  1. 터미널 창에 iostat을 입력한다.

iostat 2 를 입력하면 2초마다 IO 상태를 볼 수 있는데, 이 때 아무 프로그램이나 실행해보면 트래픽이 몰리면서 어떤 변화를 살펴볼 수 있다.

대기행렬의 길이는 다른 말로 Queue Length이다. 줄이 길면 처리가 느려지기 때문에 초당 처리횟수나 병렬화가 중요한 개념으로 작동하는 이전 직렬/병렬 또는 동기/비동기의 개념도 적용된다.

3. 배타적 제어의 개념

직역하면 '다른 것을 배제하는 제어'다. 도서관에서 공공 물건인 책의 경우, 누군가 빌려가면 나는 다음 차례를 기다려야 한다. 계산대가 하나인 직렬의 경우 필요가 없지만 계산대가 여러대인 병렬 처리의 경우 필요하다.

4. 배타적 제어를 사용하는 이유와 쓰임

CPU가 계산을 처리중이면 프로세스 스케줄을 관리하는 OS커널은 '사용중'이라는 표시를 해준다. 하나의 처리가 끝나면 비었다고 알려준다. 이런 배타적 제어를 사용하는 이유는 공유 자원(CPU, 메모리, 디스크)에 동시에 여러 처리가 액세스(주로 수정)하면 불일치가 발생할 수 있기 때문이다. 메모리의 데이터를 수정할 때 또 다른 수정작업이 겹치면 시스템에 오류가 생길 것이다. 이를 방지해주는 제어 (데이터 보호)라고 생각하면 된다.

5. 배타적 제어의 치명적인 단점과 극복방안

배타적 제어를 늘리면 병렬 처리가 안 된다. CPU가 여러 개 있어도 여러 개를 다 사용할 수 없게된다. 데이터 보호의 댓가는 쓰다.. 그렇기 때문에 정말 필요한 곳에만 배타적 제어를 해서 이런 병목현상을 제거해야한다. 병렬 처리로 처리속도를 높이자!

6. Cluster DB의 배타적 제어

CPU를 '서버'로, 프로세스나 스레드를 '애플리케이션'으로 바꿔서 생각하자.

서버 간 배타적 제어가 많아지면 대기 처리가 늘어나서 많은 서버도 무용지물이 될 수 있다. 결론적으로 클러스터(Cluster) DB에서 중요한 점은 1. 서버 간 데이터 교환을 얼마나 줄일 수 있는지 2. 배타적 제어에 의한 대기 상태를 얼마나 줄일 수 있는가 이다.

7. 정리

'큐'는 데이터 처리를 기다리는 '대기행렬'이며, 선입선출(FIFO)로 처리한다.
'대기행렬'이 적을수록 처리가 빠르므로 애플리케이션을 설계할 때 고려할 부분이다.
'배타적 제어'는 병렬처리를 하는 OS, DBMS, Cluster DB 등에서 적용되는데, 동시작업(데이터 수정 작업 등)을 제어해서 데이터를 보호할 수 있다. 배타적 제어가 많을 경우 동시에 일처리하는 '계산대'가 없어지는 셈이므로 병목현상이 생기기 때문에 필요한 곳에만 사용해야한다.

profile
바로 하자, Right Now!

0개의 댓글