오늘은 부트캠프 15일차이다. 오늘은 오전에 어제 파일을 다 날려서 복습한다는 마음으로 자바 강의를 들었고 오후에는 프로그래머스 코딩테스트 문제를 풀었고 저녁 먹은 이후에는 컴퓨터 기초에 대한 강의를 들었다. 오늘은 뭔가 오후에 풀었던 코딩테스트가 이상하게 아이디어가 잘 생각나지 않았고 구글링이 유독 많은 날이었다. 어쩐 날에는 바로바로 아이디어가 떠올렸는데.... 아무래도 내가 기본기가 아직 부족한거 같다. 주말에 쉴 때 틈틈이 봐야 겠다라는 생각이 드는 하루였다.
오늘 배운 것
1. 프로세스
-메모리에 적재되어 실행되고 있는 프로그램의 인스턴스
-인스턴스란 설계된 것을 바탕으로 구현된 구체적인 실체
-운영체제로부터 시스템 자원을 할당받은 작업의 단위
-시스템 시간이란 cpu시간 또는 실행되기 위해 필요한 독립된 메모리 영역1-1. 프로세스의 특징
-프로세스는 독립된 메모리를 할당 받는다.
-프로세스가 메모리를 관리하기 위해 이 공간들을 어떤 구조로 관리하는데. 이를 프로세스 주소 공간이라고 부른다.
-프로세스 주소 공간은 Code, Data, Stack, Heap으로 구성된다.
-code란 코드 자체를 구성하는 메모리 영역(프로그램 명령)
-Data란 전역변수, 정적변수 등
-Stack이란 지역변수, 함수 매개변수, 리턴 값(임시 메모리 영역)
-Heap이란 동적 할당 시 사용(nwe() 등)
-기본적으로 프로세스마다 최소 1개의 메인 스레드를 갖는다.2. 스레드
-프로세스 내에서 프로세스의 자원을 이용하는 여러 실행 흐름의 단위
2-1. 스레드의 특징
-스레드는 프로세스 내의 Code, Date, Heap 영역은 다른 스레드와 공유하고 Stack 영역을 따로 할당받는다.
-프로세스와 해당 프로세스 내의 다른 스레드와 자원과 공간을 공유하면서 사용3. 멀티 프로세스
-하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것
3-1. 장점
여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.
3-2. 단점
-문맥 교환에서의 오버헤드
-문맥 교환이란 CPU는 한번에 하나의 프로세스만 처리할 수 있기에, 여러 프로세스를 처리해야 하는 상황에서는 돌아가면서 여러 프로세스 작업을 처리하는 과정4. 멀티 스레드
하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것
4-1. 장점
-프로세스에 비행 메모리 공간과 시스템 자원 소모가 줄어들게 된다.
-스레드 간 통신시, Data Heap 메모리 영역을 이용해 데이터를 주고 받으므로 통신 방법 간단
-문맥 교환 시 PCB 및 캐시 메모리를 비울 필요가 없기 때문에 비용이 적고 더 빠르다.4-2. 단점
-서로 다른 스레드가 Data, Heap 등을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 엉뚱한 값을 읽어오거나 수정할 수 있다. 즉 자원 동기화 문제가 발생한다.
-하나의 스레드에 문제가 생기면 전체 프로세스란 영향을 받는다.5. 동기
-시작과 종료를 동시에 하거나, 하나의 작업이 끝나는 동시에 다른 주체가 작업을 시작하면 이는 동기 작업이라고 볼 수 있습니다.
6. 비동기
-두 주체가 서로의 시작, 종료시간과는 관계 없이 별도의 수행 시작/종료시간을 가지고 있을 때를 뜻합니다. 서로 다른 주체가 하는 작업이 자신의 작업 시작, 종료시간과는 관계가 없을 때 비동기라고 부를 수 있습니다.
8.블로킹
-자신의 작업을 하다가 다른 작업 주체가 하는 작업의 시작부터 끝까지 기다렸다가 다시 자신의 작업을 시작한다면 이는 블로킹
9.논블로킹
-다른 주체의 작업과 관계없이 자신의 작업을 계속한다면 이를 논블로킹이라고 할 수 있습니다.
7. Java의 비동기(비동기, 논블로킹 조합)
-'다른 작업과 시작, 종료 시간을 맞추지 말 것', '다른 작업의 주체가 작업하는동안 기다리지 말 것' 을 만족하는 비동기, 논블로킹 조합은 자원이 충분하다면 효율이 좋은 조합입니다. 자신의 작업이 멈추지도 않고, 다른 주체가 하는 작업의 결과가 나왔을 때 콜백을 설정하기도 합니다. 다른 주체에게 작업을 맡겨놓고 자신이 하던 일을 계속할 수 있기 때문에 해야 할 작업이 대규모이고, 동기가 필요하지 않을 때 효과적입니다.
-대규모 사용자에게 푸시메세지 전송
-다양한 외부 API를 한번에 호출할 때