[OS] 주소 공간의 동적 재배치
·
OS
사람들이 컴퓨터를 더 많이 사용하길 원하면서 시분할, 대화식 이용의 개념이 등장하였다.시분할을 구현하는 가장 고전적인 방법은 프로세스를 짧은 시간동안 실행시키고, 중단한 후 중단 시점의 모든 상태를 디스크에 저장하고, 다른 프로세스를 또 탑재해서 실행시키는 것을 반복하는 방법이 있다. 하지만 알다시피 디스크 입출력은 엄청나게 느리기 때문에 이 방식은 비효율적이였다. 따라서 프로세스 전환 시 프로세스를 메모리에 그대로 유지하면서 운영체제가 시분할을 할 수 있도록 하는 개념이 등장하였다.말은 좋지만, 결국 여러 프로그램이 메모리에 동시에 존재하려면 한 프로세스의 메모리를 다른 프로세스의 메모리로부터 보호해야하는 문제가 생겼다.그런 위험에 대비해서 운영체제가 사용하는 메모리 개념이 주소 공간이다. 주소 공간은..
[MySQL] 클러스터링 인덱스
·
Database
프라이머리 키 값이 비슷한 레코드끼리 묶어서 저장하는 것을 클러스터링 인덱스라고 한다.중요한 점은 프라이머리 키 값에 의해 레코드의 저장 위치가 결정된다. 따라서 프라이머리 키 값의 변경은 레코드의 물리적 저장위치의 변경을 뜻한다.클러스터링 인덱스는 사실 인덱스라기 보단 레코드의 저장 방식으로 보는게 편하다. (클러스터링 테이블이라고 부름)일반적으로 우리가 사용하는 InnoDB 테이블은 항상 클러스터링 인덱스로 저장되기 때문에 키 기반의 검색이 매우 빠르지만,그에따라 레코드의 저장이나 프라이머리 키의 변경이 상대적으로 느리다. 클러스터링 인덱스 구조 자체는 일반 B-Tree와 비슷하지만, 세컨더리 인덱스를 위한 B-Tree의 리프 노드와는 달리, 클러스터링 인덱스의 리프 노드에는 모든 칼럼이 같이 저장되..
[MySQL] B-Tree 인덱스 - 2
·
Database
인덱스를 적재적소에 활용하려면, 결국 MySQL이 어떻게 인덱스를 타고 실제 레코드를 읽어내는지에 대해 좀 더 깊이 살펴봐야 한다. 인덱스 레인지 스캔인덱스 레인지 스캔은, 인덱스의 접근 방법 가운데 가장 대표적인 접근 방식이다.B-Tree 인덱스의 필요한 영역을 스캔하는데에는 어떤 작업이 필요할까 ? 다음 쿼리를 예제로 살펴보자SELECT * FROM employees WHERE first_name BETWEEN 'Ebbe' AND 'Gad'; 인덱스 레인지 스캔은, 검색해야할 범위가 결정되었을 때 사용하는 방식이다.위 그림은 "인덱스"를 읽는 경우에 대한 그림인데, 크게 두 가지 과정이 수반된다. 이는 먼저 브랜치 노드를 거쳐 리프노드의 레코드 시작지점을 찾는 과정, 그리고 해당 시작 지점부터 리프노..
[OS] IPC
·
OS
IPC는 프로세스간 소통하는 방법이다. 프로세스는 independent 이거나 cooperating한다.independent한 프로세스의 경우 다른 프로세스에 영향을 주지 않지만,cooperating이 필요한 프로세스의 경우, 다른 프로세스에 영향을 주고받을 수 있다. 프로세스간 소통이라는게 말은 쉽지만, 일반적으로 프로세스에 할당된 메모리 공간은 해당 프로세스에 고유하기 때문에다른 프로세스가 접근할 수 없다. 이를 문제를 해결하는 방법이 IPC이다. IPC의 두 가지 모델공유 메모리 (Shared Memory Model)프로세스끼리 공유할 수 있는 메모리 공간을 생성하고 이 메모리를 통해 정보를 교환한다.(조금더 자세히 말하면, 어떤 프로세스가 공유하고싶은 실제 메모리 공간을 참조하는 메모리 공간을 생..
[MySQL] B-Tree 인덱스-1
·
Database
B-Tree는 데이터베이스의 인덱싱 알고리즘 중 가장 일반적으로 사용된다.B-Tree는 칼럼의 원래 값을 변형시키지 않고 인덱스 구조체 내에서는 항상 정렬된 상태로 유지한다. 페이지인덱스의 저장방식에 대해 이해하려면 페이지에 대한 이해가 필수이다.페이지는 디스크와 메모리(버퍼풀)에 데이터를 읽고 쓰는 최소 작업 단위이다. 일반적인 인덱스를 포함해 PK와 테이블 등은 모두 페이지 단위로 관리된다.따라서 페이지에 저장되는 개별 데이터의 크기를 최대한 작게 하여, 1개의 페이지에 많은 데이터들을 저장할 수 있도록 하는 것이 중요하다.페이지에 저장되는 데이터가 크기가 클수록 디스크 I/O가 많아지고, 메모리에 캐싱할 수 있는 페이지의 수가 줄어들 수 있다.(디스크I/O를 통해 페이지를 읽어오면 버퍼 풀이라는 메..
[MySQL] 인덱스
·
Database
인덱스는 데이터베이스 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분이다. 디스크 읽기 방식그전에 인덱스에만 의존적인 용어는 아니지만 자주 언급되는 디스크 읽기 방식인 랜덤 I/O, 순차 I/O에 대해 간단히 알아보자. 컴퓨터의 CPU나 메모리처럼 전기적 특성을 띤 장치는 빠르게 성장했지만 디스크같은 기계식장치의 성능은 제한적으로 발전했다.최근 SSD드라이브가 활용되고 있지만 여전히 데이터 저장 매체는 컴퓨터에서 가장 느린 부분이다.따라서 데이터베이스의 성능 튜닝은 디스크 I/O를 얼마나 줄이느냐가 관건일 때가 상당히 많다. 디스크의 헤더를 움직이지 않고 한 번에 많은 데이터를 읽는 순차 I/O의 경우 SSD가 하드디스크에 비해 거의 비슷한 성능을 보이지만,결국 SSD의 장점은 랜덤 I/O가 빠르다는 것이..
[Java] 콜백 패턴과 적용
·
JAVA
java에서의 콜백에 대해 알게되면서 동기, 비동기를 차치하고도 작업의 참조를 전달(위임)한다는 부분이 인상적깊었다. 기본적으로 콜백 패턴의 정의와 원리에 대해 알아보자. 콜백은 한마디로 피호출자 (Callee)가 호출자 (Caller)를 다시 호출하는 것을 의미한다.특정 이벤트가 발생하거나 특정 작업이 완료되면 특정 메서드를 실행하는 방법인데,비동기 처리나, 작업완료 시나리오에서 유용하게 사용된다. 간단한 웹 어플리케이션을 예시로 들어보자. 프런트 서버가 작업 서버에 일정 시간이 소요되는 작업을 요청했을 때, 사용자가 그동안 가만히 있을 순 없기 때문에작업 완료 시간을 하염없이 기다리기보단 작업 완료 신호가 오기 전까지 다른 일을 하면서 작업 완료 여부를 알고 싶을 것이다. 그렇다면 프런트 서버가 작업..
[MySQL] 인덱스와 잠금, MySQL의 격리 수준
·
Database
인덱스와 잠금InnoDB 엔진의 레코드 락 부분을 보면, 사실 InnoDB는 레코드를 잠그는 것이 아니라, 인덱스를 잠그는 방식으로 처리하는걸 볼 수 있다.즉, 변경해야 할 레코드를 찾기 위해 검색한 인덱스의 레코드를 모두 잠궈야한다. 이는 인덱스 설계가 중요한 이유와 연결되는데, 예시를 통해 알아보자.SELECT COUNT(*) FROM employees WHERE first_name = "jin"; //253SELECT COUNT(*) FROM employees WHERE first_name = "jin" AND last_name = "hyogyeom; //1 만약 employees 테이블이 first_name 컬럼만을 멤버로 가지는 인덱스를 가지고 있다고 가정해보자.first_name = jin 인..
[OS] 스케줄링
·
OS
CPU 스케줄링에 대해 알아보기 전,지금의 CPU 스케줄링이 있기 전까지 어떤 방식의 스케줄링이 있었고, 결국에 어떤 평가 항목이 지금의 스케줄링을 만들었는지 알아보았다. 먼저 시스템에 실행중인 프로세스에 대해 가장 이상적인 가정을 하고 가정을 하나씩 제거하면서 스케줄링에 대한 역사를 알아보겠다.가정모든 작업은 같은 시간동안 시행모든 작업은 동시에 도착각 작업은 시작되면 완료될 때 까지 수행모든 작업은 CPU만 사용 (입출력 x)각 작업의 실행시간은 사전에 알려져있음 스케줄링 평가항목반환 시간이라는 개념을 도입한다. 반환시간은 작업이 완료된 시간 ~ 작업이 시스템에 도착한 시간의 차이다.공정성이라는 개념은, 성능과는 상충되는 개념으로 성능 극대화를 위해 몇몇 작업을 중지시키면 공정성이 악화된다. 선입선출..
[MySQL] InnoDB 스토리지 엔진 잠금
·
Database
InnoDB 스토리지 엔진은 이전에 봤던 MySQL 엔진 레벨의 잠금과 별개로, 스토리지 엔진 내부에서 레코드 기반의 잠금방식을 지원한다. 이전에는 InnoDB 스토리지 엔진에서 사용되는 잠금에 대한 정보가 얻기 어려웠는데최근 버전에는 MySQL 서버에 존재하는 information_schema 데이터베이스에 존재하는INNODB_TRX, INNODB_LOCKS, INNODB_LOCK_WATES 라는 테이블을 조인해서 조회 시 확인할 수 있다. InnoDB는 기본적으로 MVCC를 이용한 낙관적인 동시성 제어를 지원하지만특정 상황에 S-Lock, X-Lock을 이용해 비관적인 동시성 제어를 사용한다.X-Lock배타적 락이라고도 불리는 이 잠금은, read/write에 대한 잠금이다.SELECT .. FOR ..