---
# System prepended metadata

title: 5/26 스터디

---

# 5/26 스터디
## 임태현
### RedBlack Tree
https://zeddios.tistory.com/237
- Binary Search Tree에서 색깔 규칙을 추가한 트리
- Binary Search Tree는 왼쪽 자식이 더 작고 오른쪽 자식이 더 크다.
- Binary Search Tree가 편향 트리가 되면 최악의 경우 순회를 O(n)이 되는 단점을 극복하기 규칙을 추가한 것이다.

#### Rule
1. Root Property: 루트의 색깔은 Black이다.
2. External Property: 모든 Leaf는 Black이다.
    - Leaf는 실질적으로 데이터를 갖는 Node가 아니다.
4. Internal Property: Red의 자식 방향으로 연속해서 나올 수 없다.
5. Depth Property: 모든 Leaf의 Black Depth는 같다.

#### 삽입
- Binary Search Tree의 삽입처럼 자리를 찾아 Leaf에 들어간다.
- 처음 Default 색깔은 Red로, 부모와 Double Red일 경우 조정된다.
    1. Restructuring
        - 삼촌이 Black일 경우
        - 자신, 부모, 조부모를 오름차순으로 정렬한 뒤, 중간 값을 부모로, 나머지 자식으로 매단다.
        - 이 때 부모는 Black, 자식들은 Red가 된다.
        - Restructuring이 일어난 후의 다른 작업은 Chaining되지 않는다. 왜냐하면 Black Depth가 바뀌지 않았기 때문이다.
        - 시간복잡도는 O(1)
    3. Recoloring
        - 삼촌이 Red일 경우
        - 부모와 삼촌을 Black으로 만들고 조부모를 Red로 만든다.
        - Recoloring 자체의 연산은 O(1)
        - Recoloring은 한번의 조정 후 또 다른 Recoloring이나 Restructuring이 일어날 수 있는데, 최악의 상황엔 루트까지 거치므로 O(logn)
- 삽입의 총 시간 복잡도는 Binary Search Tree만의 O(logn) + O(logn) = O(logn)

### Amortized Analysis
- 최악의 경우가 발생하도록 연속된 연산을 수행하고, 연산할 때 그 한번의 연산에 대한 평균수행시간을 분석하는것
- 최선의 상황만 발생하다 아주 가끔씩 최악의 상황이 발생할 때 Asymptotic analysis(점근적 분석)은 최악의 상황으로 복잡도를 수행한다.
    - 예를 들어, 거의 O(1)로 연산하는 작업이 가끔 O(n) 연산을 해도 점근적 분석 방법으론 O(n)이 된다.
- 최악의 경우를 발생시키는 한 번의 연산에 대한 평균 비용(Amortized Cost)을 구함
```
Amortized Cost = actual cost + accounting cost
```
#### Array Doubling
- 크기 n의 Array가 있다고 가정
- push를 기본 연산으로 적용해 연산 시간을 1로, 원소를 옮기는 시간을 t로 설정
- actual cost: 당장 필요한 에너지
    - ArrayDoubling이 일어난 경우: 1+tn
    - ArrayDoubling이 일어나지 않은 경우: 1 
- accounting cost: 피로 누적도
    - ArrayDoubling이 일어난 경우: -tn+2t-1
        - 2t-(tn+1)
        - 2t가 ArrayDoubling에 대한 보험인데, 이유는 아래에 있는 ArrayDoubling이 일어나지 않는 경우에 서술했음
        - -(tn+1)은 actual cost에 필요한 연산 수로 쌓아둔 비용에서 빼낼 필요가 있음
    - ArrayDoubling이 일어나지 않은 경우: 2t
        - ArrayDoubling이 일어난다고 가정했을 때 당장 옮기는 시간 tn+1만큼 시간이 필요하다.
        - 여기서, n을 2n으로 늘린 상황인데, n 또한 n/2 크기에서 늘린 결과이고 이것들이 재귀적으로 쌓아진 결과이다.
        - (tn + tn/2 + tn/4 + tn/8 + .... + 1) = 2tn
        - 즉, 전체 상황을 놓고 따졌을 때 2tn의 비용이 든 것이다.
        - 그래서 최악의 상황에서의 비용 2tn을 n+1번째 원소를 넣는 기회만큼 수를 나눈 것이다.
        - 2tn/(n+1) = 2t
- 즉, ArrayDoubling이 일어난 경우는 (1+tn) + (-tn+2t-1) = 2t = O(1)
- ArrayDoubling이 일어나지 않은 경우는 (1) + (2t)
- 최종적으로 1+2t가 ArrayDoubling에 대한 Amortized Cost이다.

## 최지수

### 프로세스란?
프로그램이 메모리에 적재되면 프로세스가 된다. 실행 중인 프로그램

운영체제로부터 주소 공간, 파일, 메모리 등을 할당받으며 이것들을 총칭하여 프로세스라고 한다.

CPU는 한 순간에 하나의 프로세스만 실행할 수 있는데 빠르게 프로세스를 교체하고 있기 때문에 동시에 실행되는 것 처럼 느낀다.

### 프로세스 제어 블록PCB
프로세스에 대한 정보는 프로세스 제어 블록(PCB, Process Control Block)에 저장된다.
운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB 를 생성한다.

프로세스는 CPU 를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU 를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB 에 저장하게 된다. 그리고 다시 CPU 를 할당받게 되면 PCB 에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.

*PCB 에 저장되는 정보*
- 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
- 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
- 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
- CPU 레지스터
- CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
- 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
- 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등


### 프로세스 관리
운영체제는 프로세스의 상태를 실행, 준비, 블록 상태로 나눈다.

사용자가 프로그램을 실행하면 프로세스가 생성되고 준비리스트에 추가된다. 그 다음 CPU를 할당받으면서 실행 상태가 된다.
이 과정을 디스패칭이라고 하고 디스패처가 이 일을 수행한다.

연산을 하고 CPU를 반납하게 된다. 작업이 끝나지 않으면 다시 준비상태로 돌아간다.

### 스레드란?
프로세스의 처리속도를 높이기 위해 하나의 프로세스가 수행해야 할 여러 작업들을 나누어 수행할 수 있도록 설계된 것이다.

프로세스가 할당받은 자원을 이용하는 실행의 단위

한 프로세스에 존재하는 모든 스레드들은 프로세스의 상태를 공유한다.

스레드는 각각의 스택 영역을 가지고 있는 하나의 함수라고 생각하면 이해가 쉽다.

### 멀티 스레드
하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 멀티스레딩이라고 한다.

- 멀티 태스킹
하나의 CPU가 여러 프로세스를 번갈아 가면서 실행하는 것
- 멀티 프로세싱
하나의 프로세스를 여러 개의 CPU를 사용해서 실행
- 멀티 스레드
스레드를 여러 개 만들어서 실행

**장점**
- 작업 처리 시간을 향상시킨다
- 프로세스 내의 모든 데이터가 접근 가능하므로 자원 공유가 번거롭지 않다

**단점**
- 하나의 스레드만 문제가 생겨도 전체 프로세스가 영향을 받는다
- 스레드를 너무 많이 생성하면 스케줄링해야하므로 성능 저하가 발생한다



## 문예지
### Redis
- NoSQL의 일종
- in memory 저장소

> 특징
> 
1. 리스트 형식 데이터처리에 특화
    - 데이터형으로 string, 리스트, set, sorted set, hash 사용
    - 리스트형 데이터 입력과 삭제가 MySQL에 비해 빠름
2. 여러 프로세스에서 동시에 같은 key에 대한 갱신을 요청하는 경우 순차적 처리가 가능한 함수를 제공
3. 메모리를 활용하면서 영속적인 데이터보존
    - 명령어로 명시적으로 삭제하거나 만료일을 설정하지 않으면 삭제하지 않음
    - 스냅샷 기능을 제공해 메모리 내용을 저장해놨다가 복구 가능
4. 여러대의 서버 구성 가능
5. DB로도 Cache로도 사용 가능
6. 메모리 파편화 발생 가능
    - Redis는 싱글 스레드라 스냅샷 생성시 자식프로세스를 만들어 낸 후 새로 변경된 내용을 복사해서 사용
    - 실제로 필요한 메모리 양보다 더 많은 메모리를 사용

> Redis-Cluster 구성하기
> 
#### master-slave
master-slave 구조로 cluster 구성
**cluster**: 각기 다른 서버를 묶어 하나의 시스템처럼 동작하게 하는 것

- cluster를 master로만 구성하면 노드 중 하나만 장애가 발생하도 해당 노드의 데이터가 유실 :arrow_right: 데이터 수평확장외 장점은 없음 :arrow_right: slave 구축
    
- Slave를 추가로 구성하면 Master의 내용을 복제하여 가지고 있게 되므로 장애가 나더라도 Slave노드가 Master로 승격 되면서 중단없이 서비스를 제공
    
- 하나의 서버에 동일한 데이터를 가진 마스터와 슬레이브가 동시에 존재하지 않도록 장비를 구성하는 것이 중요 :arrow_right: 서버 하나가 사망했을때 해당 장비에 Master와 백업본 Slave가 같이 있으면 데이터를 복구할 수 없음
    ![](https://i.imgur.com/whzLM91.png)
    

### Express.js
- Node.js 핵심 모듈인 http와 Connect 컴포넌트를 기반으로 하는 웹 프레임워크
- 개발자들이 프로젝트에 필요한 라이브러리를 자유롭게 선택할 수 있음
- MVC 구조 제공

> 작동 방식
> 
main 파일이라고 하는 진입점이 존재

1. controller, modle 등 자체 모듈 + 3rd 파티 모듈을 가져옴
2. 템플릿 엔진과 해당 엔진의 확장자와 같은 express.js 앱 설정을 구성
3. 미들웨어 정의
4. 라우팅 정의
5. 데이터베이스 연결
6. 앱 구동

> Express의 바탕
>
- Middleware: function 배열
    ![](https://i.imgur.com/2Dj1bCn.png)
    - 모든 코드를 실행
    - 요청 및 응답 오브젝트에 대한 변경을 실행
    - 요청-응답 주기를 종료 (res.end())
    - 스택 내의 그 다음 미들웨어 함수를 호출 (next())
    ![](https://i.imgur.com/QR7kSAv.png)
    <br>
    ![](https://i.imgur.com/wGbz79M.png)

- Routing: 미들웨어와 비슷하지만 특정 http method로 특정 url을 방문할 때 호출
- Views: 여러 종류의 view engine 사용 가능
- Extensions to request and response objects: res.redirect, res.sendFile, res.send등 편의를 위한 기능 제공