# 강남_O_Day14
## 참가자
김유준, 김태홍 김재원, 권혁
## 1. 코드 동작 이해
### index.html
- input tag 및 button으로 barista 인원수와 아메리카노, 라떼, 프라프치노 주문을 입력하고
- document.querySelector를 이용하여 input tag의 value를 얻어온다.
### index.js
- web worker(manager)를 생성하고 barista 인원수를 알려준다.
- 전체 주문내용을 order queue에 저장한다
### manager.js
- manager용 web worker 소스
- barista 인원수 만큼 web worker(barista)를 생성한다.
- order queue에 주문이 남아 있는 동안 idle 상태인 barista에게 주문을 전달한다.
- barista로부터 주문 완료된 메세지를 출력하는 곳 innerHTML에 추가한다.
### barista.js
- barista용 web worker 소스
- 주문 커피의 종류에 따라 setTimeout을 이용해서 timer를 설정한 후에 완료되면 barista id, 커피종류, 완료시간을 manager에게 메세지를 전달한다.
## 2. 코드 동작 개선
### 김태홍
- 의미단위로 적절히 구분되어 있지 않아 코드의 직관적인 해석이 잘 이루어지지 않았습니다.
- 좀더 추상화를 하기위하여 의미단위로 함수들을 묶고 같은 자료구조를 공유하는 함수들끼리는 객체로 묶어 추상화를 하여야 좀더 읽기 좋을 것 같다.
### 김재원
- Thread pool 을 사용하는 방식 자체를 추상화해서 여러 manager 생성에 응용할 수 있으면 좋겠다고 생각한다. 현재 방식은 바리스타를 핸들링하는 데 최적화된 디자인
- Thread pool 의 maximum pool count 를 설정해서, 프로그램에 걸리는 부하를 조절할 필요가 있다.
### 김유준
- web worker를 wrapping 하여 onStart, onTerminate 같은 이벤트들에 대하여 리스너들 더욱 세분히 하면 좋을 것 같습니다.
- manager나 barista 코드에서 importscripts를 이용하여 모듈화를 하면 더 좋을 것 같습니다.
### 권혁
- html에서 span과 input element를 align 하기 위해 table을 사용한다.
- barista 관리를 위해 idle queue, busy queue를 사용했는데, pool queue 하나만으로 구현하면 훨씬 효율적이고 동일한 효과를 얻을 수 있다.
- manager가 order가 남아 있는동안 계속 barista에게 일을 시켜야 하는 동작을 setTimeout을 통해 구현했는데, 좀 더 개선할 사항이 있어 보인다.
## 3. Consideration
### setTimeout 이 외에 timer를 구현하기 위한 여러 방식에 대해 학습한다.
setInterval, clearInterval을 이용하여 timer를 구현할 수 있다.
### 멀티 스레드가 공용 리소스에 접근할 때 임계구역을 다루는 방식에 대해 학습한다. (Semaphore, Mutex 등)
#### spinlock
하나의 스레드만 임계구역에 접근할 수 있도록 만드는 락이다. polling 방식이기 때문에 cpu 리소스를 많이 사용한다.
#### mutex
mutex는 하나의 스레드만 임계구역에 접근할 수 있도록 만드는 락이다.
하나의 스레드가 먼저 임계구역에 들어갔다면 다른스레드는 먼저들어간 스레드가 임계구역에서 나올때까지 대기한다.
#### semaphore
semaphore는 여러개의 스레드가 임계구역에 접근 할수 있도록 만드는 락이다.
최대 n 개의 스레드가 접근할 수 있으며 n개 의 스레드가 임계구역에 접근 했을경우 다른 스레드는 자리가 빌떄까지 대기한다.
#### moniter
semaphore과 동일한 방식이지만 임계구역에 들어가거나 나가는경우 락을 걸거나 푸는 코드 없이 자동으로 해준다
### 멀티 스레드 작업을 그룹으로 묶어서 동기화하는 방식에 대해 학습한다.
스레드 그룹은
- 애플리케이션에서 많은 스레드 생성시 관리가 힘든 경우,
- 스레드가 동일한 작업을 할떄 그룹으로 묶어서 사용하는 것이 편리한경우
- 그룹안의 스레드를 제어하기 위한 지원메소드 부족한경우
과 같은 경우에 사용한다.
## 4. 개인 학습 내용
### 김태홍
- html 사용법 해드와 바디로 나누어져 있고 여러 테그들을 사용할 수있다 태그는 머리와 꼬리로 나누어져있다.
- DOM을 이용하여 html 문서를 이용하여 조작하는 방법을 배웠다.
- getElementById 로 특정 id의 테그들을 가져올 수 있다.
- addEventListener 로 특정 동작에 대한 이벤트를 설정할 수 있다.
- createElement 로 특정 테그들을 생성할 수 있고 appendChild로 원하는 테그의 자식으로 추가시킬 수 있다.
- web work에 대해 학습하였다.
- html 백그라운드에서 실행되는 스레드를 만들어넣을 수 있다.
- 만들어진 워커들은 워커들끼리도 통신이 가능하다.
- 스레드를 만드는 작업들은 컴퓨터 입장에서 매우 무거운 일이기 때문에 미리 필요한 만큼을 한번에 할당하여 재사용하는 방식을 이용하며 이를 Thead Pool 이라고 한다.
### 김재원
#### 프로세스(Process)
1. **프로세스란 무엇인가?**
운영체제로부터 시스템 자원을 할당을 받는 작업단위를 의미하기에 독립적인 프로그램 인스턴스라고 말할 수 있다. 또한 기본적으로 1개 이상의 스레드를 가진다.
2. **프로세스의 메모리 영역**
운영체제에서 할당해주는 메모리 영역으로 *Stack*, *Heap*, *Data*, *Bss*, *Code* 5개 영역이 있다.
- **Stack**
프로그램이 자동으로 사용하는 임시 메모리영역이다. 지역변수와 매개변수, 리턴값 등이 일시적으로 저장되며, 함수 호출시 생성되고 종료시 반환됩니다.
- **Heap**
컴파일러가 동적으로 메모리할당을 할 때 사용하는 영역이다. c 언어에서는 `malloc`을 통해 동적할당 하지만 javascript 에서는 컴파일러가 필요한 부분에서 동적으로 할당하고 해제한다.
- **Data**
프로그램 종료시 반환되는 메모리 영역으로 전역변수, static 변수, 배열, 구조체등이 저장된다. 단 초기화된 데이터만 저장된다.
- **Bss**
Data 영역과 동일한 역할을 하나 초기화가 되지 않은 데이터가 저장된다.
- **Code**
코드 자체를 구성하는 메모리 영역으로 프로그램 명령이 위치하게 된다.
3. **프로세스의 통신**
프로세스는 운영체제로부터 독립된 공간을 할당받기 때문에, 서로 다른 프로세스의 변수나 자료구조 등에 접근이 불가하다. 따라서 IPC(InterProcess Communication)를 이용해서 통신하는데 크게 **공유메모리 모델**, **메세지 전달 모델** 등이 있다.
- **공유메모리(Shared Memory) 모델**
둘 이상의 프로세스가 메모리영역을 공유하는 방법으로, 커널의 관여없이 통신하므로 속도가 빠른 장점이 있지만 구현하기 까다롭다.
- **메세지 전달(Message Parsing) 모델**
둘 이상의 프로세스가 커널을 경유해서 메세지를 주고 받는 방식으로 구현하기 간단하지만 속도가 느리다.
#### 스레드(Thread)
1. **스레드란 무엇인가?**
프로세스 내에서 실행되는 여러 실행의 단위라고 할 수 있다. 시간이 오래걸리는 작업들을 병렬처리 해야하는 경우, 스레드를 여러개로 나눠 관리하는 멀티 스레딩을 활용할 수 있을 것이다.
2. **스레드의 메모리 영역과 통신**
**Stack**을 제외한 메모리영역을 모든 스레드가 공유한다. 따라서 스레드 간의 통신의 쉽고 빠르지만, Interruption 에 다양한 고민을 하며 설계해야한다.
3. **스레드의 스케줄링**
멀티 스레드 환경에서 스레드의 개수가 코어 개수보다 많을 때 어떻게 **동시성**을 만족시킬 것이냐 하는 과제이다. 크게 두가지 방식이 있으며 **선점형 스레드 스케줄링**과 **협력형 스레드 스케줄링**이라고 부른다.
- **선점형 스레드 스케줄링**
우선순위가 높은 스레드를 먼저 수행시키는 방식이다. 시분할을 통한 Round-Robin 방식을 일반적으로 많이 사용한다.
- **협력형 스레드 스케줄링**
스레드가 CPU 사용권을 다른 스레드에게 넘길 때까지 대기하는 스케줄링 방식이다.
#### 세마포어와 뮤텍스
1. **세마포어**
공유된 데이터에 여러 프로세스가 접근하는 것을 막고, 다중 프로세스를 조정하거나 동기화하는 기술이다. 일종의 리소스의 상태를 나타내는 카운터라고 말할 수도 있을 것이다. 세마포어는 시스템 범위에서 동작하기에 특정 스레드가 소유할 수 없다.
2. **뮤텍스**
0과 1만 가지는 Binary 세마포어라고 볼수 있으며, 쓰레드에 한정되어 사용된다. 세마포어는 특정 스레드가 소유할수 없는 반면, 뮤텍스는 스레드가 소유하고 lock 을 사용할 수 있다.
#### 웹 워커
웹앱의 백그라운드 스레드를 활용하는 방식이다. 기본적으로 메인스레드만 사용하며 싱글콜스택으로 비동기처리만 수행하는 자바스크립트는 대규모 연산에 취약할 수 밖에없다. 이를 보완하기 위해서 `Worker API`가 존재하며, 스크립트를 백그라운드 스레드로 동작시킬 수 있다.
- 웹 워커는 `messaging api`를 활용해서 컨텍스트 간 공유를 한다.
- 컨텍스트 간 공유에 사용되는 객체는 참조값까지 완전히 복사된다. 따라서 Interruption 위험이 존재한다.
### 김유준
- webworker를 이용하여 클라이이언트 단에서 멀티 스레딩을 할 수 있음을 알게 되었다.
- 크롬의 보안 정책은 개발자에게는 성가시다
- document를 이용하여 DOM의 element를 접근 하는 방법을 알게 되었다.
- 클라이언트 단에서 js가 실행되는 시점은 DOM이 완전히 로드 된시점이 아닐 수 있으므로 windows.onLoad 이벤트 리스너를 등록 하는 방법을 알게 되어었다.
### 권혁
- web worker란 개념을 처음으로 배웠다.
- web worker가 다시 web worker를 생성해도 된다는 것을 알았다.
- 단순히 html page를 브라우저에서 볼때는 web worker가 동작하지 않았고 server를 통해 띄워야만 web worker가 동작한다는 것을 알았다.
- idle, busy queue 대신 pool을 이용해서 thread pool 을 구현하면 효율적이다.
- html table을 이용해서 span과 input을 align하면 된다.