Zero to Hero
코딩을 지탱하는 기술 03
Review 2021. 1. 23. 14:35

병행처리 복수의 처리를 시간축 상에 오버랩에서 실행하는 것 협력적 멀티태스크 한 프로세스가 처리가 완료되는 시점에 자발적으로 처리 교대를 하는 방법 모든 처리가 최적의 간격으로 교대한다는 이상적인 상황을 기반으로 성립하는 시스템. 일반적으로는 기아 상태가 발생한다. Windows 3.1, Mac OS 9이 이 방식을 채택했다. 프로그램이 버그로 인해 무한 반복되는 상황이 되면 동시에 실행한 다른 프로그램에게는 처리 기회가 가지 않고 전부 묶어서 백업을 해버렸다. 선점적 멀티태스크 개별 프로그램과 다른 또 다른 프로그램인 "스케줄러"를 통해 일정 시간마다 지금 실행되고 있는 처리를 강제적으로 중단시켜서 다른 프로그램이 실행될 수 있도록 하는 방법 선점적(preemptive) 멀티태스크라고도 한다. Wind..

코딩을 지탱하는 기술 02
Review 2021. 1. 23. 14:12

함수 몇 개의 행(코드라인)을 하나의 그룹으로 묶어 이름을 붙인 것 장점 1. 프로그램이 정량적으로 짧아진다. 2. 소스코드를 읽는 사람이 동일한 소스코드를 반복해서 읽지 않아도 된다. 3. 프로그램을 쉽게 이해할 수 있다. 4. 재사용을 통해 소모되는 비용(시간 및 메모리)을 감소시킬 수 있다. 일반적인 흐름 1. 코드가 진행된다 2. 함수를 만난다. 3. 함수가 저장된 메모리 공간으로 점프를 한다 4. 점프한 뒤 메모리 공간의 코드를 수행한다 5. 수행한 뒤 함수를 호출했던 메모리 주소로 다시 돌아간다. 돌아갈 목적지를 기록해두는 전용 메모리를 만들어 "돌아갈 목적지 메모리(레지스터)에 적어둔 번지로 점프하는 명령"을 준비해 "돌아가는 명령어의 위치"를 파악해둘 필요가 없어졌다. 거기에 스택을 이용해..

코딩을 지탱하는 기술 01
Review 2021. 1. 23. 13:47

Stack Machine 작동 및 연산에 스택을 사용하는 장치 혹은 기법 -> 후위 표기법(postorder) 1과 2를 더한 것에 3을 곱하다 -> 1 2 + 3 * 2와 3을 곱한 후 1을 더한다 -> 2 3 * 1 + Java, Python의 VM 형태도 스택 머신의 형태를 띤다. Python의 dis 라이브러리를 이용하면 VM이 실행할 명령 열을 출력할 수 있다. LISP 괄호로 시작해서 명령어가 맨 앞에 나온다. 그다음 공란으로 간격을 만들고 무엇을 더할 것인지를 기술한다. -> 전위 표기법(preorder) 1과 2를 더한다 -> (+ 1 2) 1과 2를 더한 후 3을 곱한다 -> (* (+ 1 2) 3 ) Python의 ast 라이브러리를 이용하면 특정 코드가 어떤 구문 트릴로 구성되어 있는..

대규모 서비스를 지탱하는 기술 04
Review 2021. 1. 12. 17:45

클라우드의 장단점 장점 확장의 유연성 저가로 사용하면서 확장해나갈 수 있다. 단점 획일적인 호스트 사양(메모리 상한선, 느린 I/O) 애매한 로드밸런서 때때로 멈춘다 자체 구축 인프라의 장단점 장점 하드웨어 구성을 유연하게 할 수 있다. 서비스로부터의 요청에 유연하게 대응할 수 있다. 병목현상을 제어할 수 있다. 다중성 확보 원리 서버를 여러 대 늘어놓는다. 1, 2대 정지하더라도 충분히 처리할 수 있도록 해둔다. 로드밸런서로 페일오버 / 페일백 멀티 마스터 VRRP(Virtual Router Redundancy Protocol) 기반으로 감시하면서 다중의 마스터를 두는 MySQL 기법 Active 마스터와 Stanby 마스터를 운용해 Active 마스터에 장애가 나면 Stanby 마스터를 Active ..

대규모 서비스를 지탱하는 기술 03
Review 2021. 1. 12. 17:31

B+ 트리 vs 이분 트리 1. 이분 트리는 노드가 반드시 하나로 정해져 있다. 반면에 B트리는 유동적으로 개수를 조정할 수 있다. 2. 노드의 데이터 개수를 유동적으로 조정해 노드 하나의 크기를 4KB 등으로 고정할 수 있다. 즉 각 노드의 크기를 적당한 사이즈로 정할 수 있다. 3. 다시 말해서 노드 1개를 디스크 1블록만큼 할당하면 B트리로 디스크에 저장했을 때 각 노드를 딱 한 블록만큼으로 해서 저장할 수 있다. 이는 디스크 Seek을 줄여 탐색 속도를 빠르게 한다. 4. 결론적으로 인덱스 트리를 순회할 때 디스크 Seek 발생 횟수를 최소화할 수 있다. 한번 읽은 데이터는 메모리에 캐싱되기 때문에 같은 노드 내의 데이터는 디스크 Seek 없이 탐색할 수 있다. 5. 반면에 이분 트리는 특정 노드..

대규모 서비스를 지탱하는 기술 02
Review 2021. 1. 12. 17:20

I/O 부하를 줄이는 방법 1. 캐시를 전제로 한 I/O 줄이는 방법 데이터 규모 CPU 부하분산은 단순히 스케일 업 하는 것으로 해결이 가능하다. -> I/O 분산에는 국소성을 고려한다. 3. 단순히 대수만 늘려서는 확장성을 확보할 수 없다. 애초에 캐시 용량이 부족해서 늘렸는데 그 부족한 부분도 그대로 동일하게 늘려가게 된다. 결국 액세스 한 순간에 느려지는 것은 변함이 없다. 캐싱할 수 없는 비율은 변함없이 그대로 간다. 국소성을 고려한 분산 액세스 패턴을 고려한 분산, 캐싱할 수 없는 부분이 사라진다. ..