프로세스, 스레드, 멀티태스킹, 멀티스레딩, 멀티프로세싱, 멀티프로그래밍 정리

프로그램
컴퓨터가 실행할  있는 명령어들의 집합

프로세스
컴퓨터에서 실행 중인 프로그램
각각의 프로세스는 독립된 메모리 공간을 할당 받음

CPU
명령어를 실행하는 연산장치

메모리(==메인 메모리)
프로세스가 CPU에서 실행되기 위해 대기하는 

IO
파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 
입출력 장치(마우스,키보드) 데이터를 주거나 받는 

단일 프로세스 시스템
 번에 하나의 프로그램만 실행됨
단점 : cpu의 사용률이 좋지않음
-->p1-->I/O-->p1--I/O ... (IO가 끝나야 p1프로그램 작업을 한다.)

해결책
여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자!
IO작업이 발생하면 다른 프로세스가 CPU에서 실행됨.
-->p1------>p2---->p1---> ... -->p2
이런 종류의 시스템을 멀티프로그래밍이라고 한다.

CPU 사용률을 극대화
단점 : CPU 사용 시간이 길어지면 다른 프로세스는 계속 대기
-->p1-------------------->p2
프로세스는 한번 CPU를 사용할때 아주 짧은 시간만 CPU에서 실행되도록 하자.


-->p1->p2->p1->p2..
이런 종류의 시스템을 멀티태스킹이라고 한다.
cpu타임을 짧게 쪼개서 서로 번갈아 가면서 실행할  있도록 한다
--> 프로세스의 응답시간을 최소화 시키는  목적.
--> 동시성
--> 사용자들이 보기엔 여러 프로그램이 실행되는 느낌을 준다.

남아있는 아쉬운점
- 하나의 프로세스가 동시에 여러 작업을 수행하지는 못함..
- 프로세스의 컨텍스트 스위칭은 무거운 작업이다.
  컨텍스트 스위칭 : 어느  프로세스에서 다른 프로세스로 교체되는 
- 프로세스끼리 데이터 공유가 까다로움
- 듀얼 코어가 등장했는데  쓰고 싶음.
  ( cpu에 2개의 코어를 .)

--> 해결책 : 스레드
스레드의 특징
1. 프로세스는   이상의 스레드를 가질  있다.
2. 같은 프로세스의 스레드들끼리 컨텍스트 스위칭은 가볍다.
3. 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유한다.
   -> 데이터 공유가 쉽다.!

듀얼코어
cpu1-->p1---------------
cpu2-->p2---------------
이게 바로 멀티스레딩이다. (병렬 - 진정하게 동시에 실행되게 .)
하나의 프로세스가 동시에 여러 작업을 실행하는데 목적.

  이상의 프로세서나 코어를 활용하는 시스템을 멀티프로세싱이라고 한다.

스스로 정리를 해보자면,

### 프로세스 & 스레드
.exe -> 이러한 파일들을 프로그램이라고 한다.

프로세스는 메모리 상에서 실행중인 프로그램.

스레드는  프로세스 안에서 실행되는 흐름 단위.

운영체제가 프로세스에게 Code/Data/Stack/Heap 메모리 영역을 할당해 주고 최소 작업 단위로 삼는 반면,
스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스  다른 스레드와 공유한다*
,
**스레드는 프로세스 내에서 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.  **

### 멀티프로세스
공유하는 공간이 없는 멀티 프로세스는 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않고 계속 실행된다는 장점이 있지만,
멀티 쓰레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 있다.

### 멀티쓰레드
멀티 쓰레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만,
공유하는 공간 때문에 하나의 쓰레드에 문제가 생기면 전체 쓰레드가 영향을 받으며 결국 하나의 프로세스가 문제가 생긴다. 동기화 문제도 있다는 단점이 있다.

### 멀티쓰레드의 동시성과 병렬성
동시성은 멀티 작업을 위해 싱글 코어에서 여러 개의 쓰레드가 번갈아 실행하는 것을 말한다.
(동시에 실행하는 것처럼 보이지만 사실은 번갈아가며 실행하고 있는 !)

병렬성은 멀티 작업을 위해 멀티 코어에서   이상의 쓰레드를 포함하는  코어들을 동시에 실행하는 것이다.

스레드 안전(Thread-Safety)
- 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것을 말한다.
  JAVA 프로그래밍에서 Thread-Safe하게 설계하는 방법
  1.java.util.concurrent 패키지 하위의 클래스를 사용한다.
  2.인스턴스 변수를 두지 않는다.
  3.Singleton 패턴을 사용한다.
  4.동기화 (Syncronized) 블럭에서 연산을 수행한다.