diff --git "a/Java/img/\355\224\204\353\246\274\352\263\274_\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274_\354\260\250\354\235\264.jpg" "b/Java/img/\355\224\204\353\246\274\352\263\274_\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274_\354\260\250\354\235\264.jpg"
new file mode 100644
index 0000000..5deeb24
Binary files /dev/null and "b/Java/img/\355\224\204\353\246\274\352\263\274_\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274_\354\260\250\354\235\264.jpg" differ
diff --git "a/Java/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274(Dijkstra) \354\225\214\352\263\240\353\246\254\354\246\230.md" "b/Java/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274(Dijkstra) \354\225\214\352\263\240\353\246\254\354\246\230.md"
new file mode 100644
index 0000000..265bc3c
--- /dev/null
+++ "b/Java/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274(Dijkstra) \354\225\214\352\263\240\353\246\254\354\246\230.md"
@@ -0,0 +1,51 @@
+# 다익스트라(Dijkstra) 알고리즘
+
+## 요약
+
+>다익스트라 알고리즘이란 하나의 정점에서 그래프 상에 존재하는 다른 모든 정점, 즉 **두 정점 사이의 최단거리**를 구하는 알고리즘이다.
+
+## 정의
+
+- 다이나믹 프로그래밍을 활용한 대표적인 **최단 경로(Shortest Path) 탐색 알고리즘**
+ - 최단 경로란 **간선의 가중치가 있는 그래프**에서 두 정점 사이의 경로들 중에 **간선의 가중치 합이 최소**인 경로
+- 하나의 정점에서 **다른 모든 정점으로 가는 최단 경로**를 구하는 알고리즘
+ - 즉, **두 정점 사이의 최단거리를 구하는 알고리즘**
+- 음의 가중치를 허용하지 않는다. (오로지 **양의 가중치**)
+- 현실 세계에 사용하기 매우 적합한 알고리즘 중 하나
+ ex) 인공위성 GPS 소프트웨어
+
+- **그리디 기법을 사용**한 알고리즘으로 **MST의 프림 알고리즘과 유사**하다.
+
+- 의사코드
+
+ ```
+ s: 시작 정점, A: 인접 행렬, D: 시작정점에서의 거리
+ V: 정점 집합, U: 선택된 정점 집합
+
+ Dijkstra(s, A, D)
+ U = {s};
+ FOR 모든 정점 v
+ D[v] = A[s][v]
+ WHILE U != V
+ D[w]가 최소인 정점 w ∈ V-U를 선택
+ U = U ∪ {w}
+ FOR w에 인접한 모든 미방문 정점 v
+ D[v] = min(D[v], D[w] + A[w][v])
+ ```
+
+
+
+## 프림과 다익스트라 차이
+
+
+
+- **프림은 다익스트라와 달리 두 노드 사이가 최단거리가 아닐 수도 있다.**
+- 프림이 다익스트라를, 다익스트라가 프림을 보장해주지 않는다.
+
+| 프림 알고리즘 | 다익스트라 알고리즘 |
+| ------------------------------------------------------ | ------------------------------------------------------ |
+| 최소 신장 트리 | 최단경로 알고리즘 |
+| 전체 그래프 관점에서의 모든 정점들을 최소비용으로 연결 | 정점 간의 최단 거리 연결 |
+| 정점 간의 최소 비용을 보장X | 정점 간 최소 비용을 보장 |
+| 무향그래프에서만 사용 | 무향,유향 그래프에서 모두 사용(단, 양의 가중치인 경우) |
+
diff --git "a/Java/\354\265\234\354\206\214\353\271\204\354\232\251 \354\213\240\354\236\245\355\212\270\353\246\254(MST).md" "b/Java/\354\265\234\354\206\214\353\271\204\354\232\251 \354\213\240\354\236\245\355\212\270\353\246\254(MST).md"
new file mode 100644
index 0000000..92e329b
--- /dev/null
+++ "b/Java/\354\265\234\354\206\214\353\271\204\354\232\251 \354\213\240\354\236\245\355\212\270\353\246\254(MST).md"
@@ -0,0 +1,88 @@
+# 최소비용 신장트리(MST)
+
+## 요약
+
+>신장 트리를 구성하는 간선들의 가중치의 합이 최소가 되는 트리를 최소 신장 트리라 하며 , 대표적으로 크루스칼 알고리즘, 프림 알고리즘이 있다.
+>
+>크루스칼 알고리즘은 **간선 선택 기반 알고리즘**으로, 가중치가 최소인 간선을 하나씩 선택해서 MST를 만드는 알고리즘이다.
+>
+>프림 알고리즘은 정점 선택 기반 알고리즘으로, 하나의 정점에서 연결된 간선들 중 가중치가 최소인 간선을 가진 정점을 하나씩 선택해서 MST를 만드는 알고리즘이다.
+
+## 정의
+
+- 신장 트리
+
+ N개의 정점으로 이루어진 무향 그래프에서 N개의 정점과 N-1개의 간선으로 이루어진 트리
+
+- **최소 신장 트리 (Minimum Spanning Tree)**
+
+ 무향 가중치 그래프에서 신장 트리를 구성하는 **간선들의 가중치의 합이 최소**인 신장 트리
EX) 크루스칼 알고리즘, 프림 알고리즘
+
+## 크루스칼 알고리즘
+
+- 매 차례마다 **가중치가 최소인 간선을 선택**하면서 MST를 만드는 알고리즘
+ 1. 간선을 **오름차순으로 정렬**하여 선택한다.
+ 2. 사이클이 생성되지 않게 매번 **사이클 생성 여부를 판단**하면서 가중치가 가장 낮은 간선을 선택한다.
+ - 사이클이란 A, B, C 정점이 있을 때 A-B, B-C, A-C로 그래프가 서로 연결되어 있는 상태를 의미
+ 3. N-1개의 간선이 선택될 때까지 2번 과정 반복
+- **서로소(union-find) 알고리즘**과 **그리디 알고리즘 방법** 이용
+
+- 의사코드
+
+ ```groovy
+ MST-KRUSKAL(G, w)
+ FOR vertex v int G.V //G.V: 그래프의 정점 집합
+ Make_Set(v) //G.E: 그래프의 간섡 집합
+
+ G.E에 포함된 간선들을 가중치 w에 의해 오름차순 정렬
+
+ FOR 가중치가 가장 낮은 간선 (u, v) ∈ G.E 선택 (n-1개만큼)
+ IF Find_Set(u) != Find_Set(v) // 사이클 생성 여부 판단
+ A = A ∪ {(u, v)}
+ Union(u, v) // 간선 연결
+ ```
+
+- 시간복잡도
+ - 사실상 정렬 알고리즘과 Union-Find 알고리즘의 합이기 때문에 정렬 알고리즘의 시간 복잡도와 동일하다고 판단 가능
+ - 가중치순으로 정렬하는데 E * logE 만큼의 시간이 소요되었으므로
**시간복잡도는 O(ElogE)**
+
+## 프림 알고리즘
+
+- **하나의 정점**에서 연결된 간선들 중에 하나씩 선택하면서 MST를 만들어 가는 방식
+
+ 1. 임의의 정점 하나 선택
+ 2. 선택한 정점과 인접하는 선택되지 않은 정점들 중 **가중치가 최소인 간선**으로 연결된 정점을 새로 선택
+ 3. 모든 정점이 선택될 때까지 2번 과정 반복
+
+- 이미 선택된 정점을 다시 선택하지 않기 때문에, 사이클 생성 여부 판단하지 않음
+
+- 의사코드
+
+ ```groovy
+ MST_PRIM(G, r) //G: 그래프, r: 시작 정점
+ result = 0, cnt = 0; //result: 신장트리 최소비용, cnt:처리한 정점수
+ FOR u in G.V
+ miniEdge[u] = MAX_VALUE // miniEdge[]: 각 정점기준으로 다른 정점과의 간선 중 최소비용
+ miniEdge[r] = 0 //시작 정점 r의 최소 비용 0처리
+ WHILE true
+ u = Extract_MIN( ) //방문하지 않은(최소신장트리에 포함되지 않는 정점) 최소비용 정점 찾기
+ visited[u] = true
+ result = result + miniEdge[u]; //비용 누적
+ if(++cnt == N) break;
+ FOR v in G.Adj[u] //u의 인접 정점들
+ IF visited[v] == false AND w(u, v) < miniEdge[v] //u에서 v로의 비용이 v의 최소비용보다 작다면 갱신
+ miniEdge[v] = w(u, v)
+ return result
+ end MST_PRIM
+ ```
+
+- 시간복잡도
+
+ - 우선순위 큐를 어떻게 구현하느냐에 따라 다르지만
일반적으로 **binary heap**으로 구현했을 경우 **O(ElogV)**
**unsorted arrary**로 구현헀을경우 **O(|V²|)**
+
+## 크루스칼 vs 프림 알고리즘 차이점
+
+**크루스칼 알고리즘**은 정렬을 반드시 동반하기 때문에 **간선의 개수가 증가**하먼 정렬 소요 시간이 증가한다.
+
+> 즉, **크루스칼 알고리즘은 간선의 개수가 많지 않은 경우에 적합하며, 간선의 개수가 많을 때는 프림 알고리즘을 사용한다.**
+
diff --git a/Network/WebSocket.md b/Network/WebSocket.md
new file mode 100644
index 0000000..e533b09
--- /dev/null
+++ b/Network/WebSocket.md
@@ -0,0 +1,73 @@
+# WebSocket
+
+## 요약
+
+> 웹소켓이란 서버와 클라이언트 간의 효율적인 양방향 통신이 가능한 방법으로, 기본적으로 stateful protocol 방식이다.
+>
+> 정보를 실시간 교류할 수 있디 때문에 채팅, 주식과 같은 즉각적인 변화를 감지해야 하는 서비스에 좋다.
+>
+> 그러나 개발이 복잡하고 서버와 클라이언트 간의 소켓 연결을 유지하는 것 자체가 비용이 크기 때문에 트래픽 양이 많은 서버의 경우 CPU에 부담을 줄 수 있다. 또한 HTML5 이전 브라우저에서는 지원되지 않아 작동하지 않는다. 마지막 문제를 해결하기 위해 나온 기술 중 하나가 node.js 기반으로 만들어진 socket.io라는 프레임워크이다.
+
+## Socket이란?
+
+- 프로그램이 네트워크 상에서 데이터를 송신과 수신을 하기 위한 연결부 (통신을 위한 일종의 통로)
+- 일반적으로 TCP/IP (또는 UDP) 프로토콜을 이용하거나, WebSocket을 이용한다.
+ - TCP/IP: **연결형 소켓**. 신뢰할 수 있는 통신
+ - UDP: **비연결형 소켓**. 몇가지 신뢰도는 포기하되 좀더 직접적인 통신을 한다
+
+## WebSocket이란?
+
+- HTML5의 표준 기술
+- Transport protocol의 일종으로 서버와 클라이언트 간의 효율적인 **양방향 통신**을 실현하기 위한 구조
+
+- 단순한 API로 구성
+- 웹소켓을 이용하면 **하나의 HTTP 접속**으로 **양방향 메시지**를 자유롭게 주고받을 수 있다.
+
+> 웹소켓 이전의 기존 HTTP 통신은 단방향 통신으로, 클라이언트의 요청이 없다면 서버로부터 응답을 받을 수 없는 구조였다.
이 문제를 극복하기 위해 등장한 것이 WebSocket!!
+
+## 특징
+
+- **양방향 통신(Full-Duplex)**
+ - 데이터 송수신을 동시에 처리할 수 있는 통신 방법
+ - 클라이언트와 서버가 서로에게 원할 때 데이터를 주고 받는다
+- **실시간 통신/성능(Real Time-Networking)**
+ - 웹 환경에서 연속된 데이터를 빠르게 노출한다.
+ - 여러 단말기에 데이터를 빠르게 교환한다.
+ - ex) 채팅, 주식, 비디오 데이터
+
+## 작동 원리
+
+- 웹소켓 연결은 HTTP 프로토콜을 통해 이루어짐
+- handshake 과정이 성공적으로 끝나면 HTTP를 웹소켓 프로토콜로 바꾸는 protocol switching 과정이 진행됨
+- 이후 웹소켓을 위한 새로운 소켓이 만들어지고 이 소켓을 이요해 통신한다.
+
+
+
+> 웹소켓 주소는 ws나 wss로 시작하는데 ws는 일반 웹소켓, wss는 SSL이 적용된 웹소켓
+
+## 문제점
+
+- 프로그램 구현에 보다 많은 복잡성 초래
+- Stateful Protocol 특성
+ - 웹소켓은 HTTP와 다르게 **항상 클라이언트와 서버 간의 연결을 유지**해야 함
+ - 비정상적으로 연결이 끊어졌을 경우에 대한 대응 필요
+- 서버와 클라이언트 간의 Socket 연결을 유지하는 것 자체가 자원 소모 (특히 트래픽 양이 많은 서버의 경우)
+- HTML5의 기술이기 때문에 이전 버전의 웹 브라우저에서 지원이 되지 않는다.
+ - 이 문제를 해결하기 위해 나온 기술 중 하나가 바로 `Socket.io` 라는 웹소켓 프레임워크
+ - 웹페이지가 열리는 브라우저가 웹 소켓을 지원하면 웹 소켓 방식으로 동작하고, 지원하지 않는다면 일반 HTTP를 이용하여 실시간 통신을 흉내 내는 것
+
+## 대표적인 사용 예
+
+- 페이스북, 인스타와 같은 SNS APP
+- 위치 기반 APP
+- 화상 채팅 APP
+- 증권 거래 정보 사이트 및 APP
+- 구글 Doc 같이 여러 명이 동시 접속해서 수정할 수 있는 Tool
+- LOL 같은 멀티플레이어 Game
+
+## 참고
+
+- https://choseongho93.tistory.com/266
+- https://kyleyj.tistory.com/59
+- https://d2.naver.com/helloworld/1336
+- https://dailyscat.gitbook.io/twis/network/undefined
\ No newline at end of file
diff --git "a/Network/img/\354\233\271\354\206\214\354\274\223_\354\236\221\353\217\231\354\233\220\353\246\254.jpg" "b/Network/img/\354\233\271\354\206\214\354\274\223_\354\236\221\353\217\231\354\233\220\353\246\254.jpg"
new file mode 100644
index 0000000..cb7f478
Binary files /dev/null and "b/Network/img/\354\233\271\354\206\214\354\274\223_\354\236\221\353\217\231\354\233\220\353\246\254.jpg" differ
diff --git "a/OS/\355\224\204\353\241\234\352\267\270\353\236\250 vs \355\224\204\353\241\234\354\204\270\354\212\244 vs \354\212\244\353\240\210\353\223\234.md" "b/OS/\355\224\204\353\241\234\352\267\270\353\236\250 vs \355\224\204\353\241\234\354\204\270\354\212\244 vs \354\212\244\353\240\210\353\223\234.md"
new file mode 100644
index 0000000..e627822
--- /dev/null
+++ "b/OS/\355\224\204\353\241\234\352\267\270\353\236\250 vs \355\224\204\353\241\234\354\204\270\354\212\244 vs \354\212\244\353\240\210\353\223\234.md"
@@ -0,0 +1,156 @@
+# 프로그램, 프로세스, 스레드
+
+> - 프로그램이란 특정 작업을 수행하기 위한 실행파일이다. 실행파일을 클릭했을 때 메모리 할당이 이루어지고, 이 메모리공간으로 코드가 올라간다. 이 순간부터 프로세스이다.
+> - 프로세스는 OS로부터 자원을 할당받는 실행되고 있는 프로그램의 인스턴스이다. 각각 독립된 메모리 영역(Code, Data, Stack, Heap 구조) 등을 할당받는다.
+> - 스레드는 프로세스의 가장 작은 실행단위로, 프로세스가 할당받은 자원을 이용한다. 프로세스 내에서 각각 stack과 PC 레지스터만 따로 할당받고 Code, Data, Heap 영역은 프로세스 내에 쓰레드끼리 공유하면서 실행된다.
+> - 스레드를 사용하면 응답시간 단축, 빠른 통신과 비용적음, 빠른 문맥 교환, 시스템 처리량을 향상시킬 수 있지만, 스레드의 자원 공유는 동기화 문제에 신경을 써야하며 멀티스레드 프로그래밍은 구현과 디버깅이 어렵다는 문제점이 있다.
+
+## 프로그램(Programe)이란?
+
+- **특정 작업을 수행하기 위해** 작성된 일련의 지침을 포함하는 **실행 파일**
+
+- 컴퓨터의 주 메모리에 저장되지 않고, 디스크 또는 컴퓨터의 **보조 메모리에 저장**된다.
+
+- 프로그램은 주 메모리에서 읽고 커널에 의해 실행된다
+
+ ex) chrome.exe (웹 페이지 보기), notepad.exe (텍스트 파일 편집)
+
+- **특징**
+ - **수동적(정적) 개체(passive entity)**. 실행할 명령어 그룹을 저장.
당장 실행파일을 열어보면 다양한 명령어가 적혀있는 것을 알 수 있다. 이러한 명령어를 그룹으로 모아저 저장하는 것이 프로그램!
+ - 수동으로 **삭제할 때까지 메모리에 저장**된다.
+ - 프로그램은 **실행 없이 어떤 작업도 수행 불가능.**
+
+## 프로세스(Process)란?
+
+> program is in execution (실행 중인 프로그램)
+
+- 메모리에 올라와 **실행되고 있는 프로그램의 인스턴스(독립적인 개체)**
+
+- 프로그램이 실행되는 실행 단위
+
+- 프로그램 실행 중에 생성되어 **주 메모리에 load**된다.
+
+ ex) google 크롬 아이콘을 더블 클릭하면 크롬 프로그램을 실행하는 프로세스가 시작된다.
+
+- **특징**
+
+ - **능동적(동적) 개체(active entity)**. 응용 프로그램의 목적을 수행함
+ - **수명이 매우 제한적**. 작업이 완료되면 종료된다.
+ - 프로세스에는 OS로부터 **실행에 필요한 자원을 할당**받는다.
ex) 파일 디스크립터(file descriptors), 네트워크 포트, cpu시간, 메모리 영역(Code, Data, Stack, Heap 구조)
+ - 여러 프로세스가 동일한 프로그램과 관련될 수 있다.
ex) 메모장 프로그램의 여러 인스턴스 실행 가능 (각 인스턴스 = 프로세스)
+ - 프로세스에 대한 정보는 **PCB(Process Control Block)**에 저장된다.
+
+### PCB(Process Control Block)
+
+> 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조
+
+- 사용자가 프로세스를 생성할 때마다 운영체제는 해당 프로세스에 해당하는 PCB를 생성한다.
+
+- **[PCB]에 저장되는 정보**
+
+| 이름 | 정의 |
+| -------------------------------------- | ------------------------------------------------------------ |
+| 프로세스 식별자 (Process-Id, PID) | 프로세스 식별 번호 |
+| 프로세스 상태 (Process state) | new, ready, running, waiting, terminated 등의 상태를 저장 |
+| 프로세스 우선순위 (Process Priority) | 수명, 소비한 자원 등으로 우선순위 나눔
숫자 값이 작을수록 해당 프로세스의 우선 순위 증가 |
+| 회계정보 (Accounting Information) | 사용된 CPU 양과 시간, 시간 제한, 계정 번호 등 제공 |
+| 프로그램 카운터 (Program Counter, PC) | 프로세스가 다음에 실행할 명령어의 주소 저장 |
+| CPU 레지스터 (CPU Registers) | 인터럽트 발생 or 프로세스 간 문맥 교환 발생 시 임시 정보 저장. |
+| PCB 포인터 (PCB Pointers) | 프로세스 상태가 ready인 다음 PCB 주소 저장 |
+| 열린 파일 목록 (List of Open Files) | 프로그램이 실행되는 동안 필요한 모든 파일 정보 저장 |
+| I/O 상태 정보 (I/O status Information) | 프로세스에 할당된 입출력 장치 목록 저장 |
+
+## 프로세스 상태 (Process State)
+
+
+
+- **New** : 프로세스가 생성중인 상태
+
+- **Running** : CPU를 잡고 명령어(instruction)를 수행중인 상태
+- **Ready** : CPU를 기다리는 상태 (다른 조건을 다 만족하고 CPU만 얻으면 되는 상태를 의미)
+- **Blocked(wait, sleep)** : CPU를 주어도 당장 명령어(instruction)을 수행할 수 없는 상태
+ - Process 자신이 요청한 event(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태
+ - ex) 디스크에서 file을 읽어와야 하는 경우
+- **Terminated** : 수행(execution)이 끝난 상태
+
+## 프로그램과 프로세스 차이점
+
+| | 프로그램 | 프로세스 |
+| --------- | ------------------------------------------------ | -------------------------------- |
+| 정의 | 프로그래밍 목표를 달성하기 위해 정렬된 작업 그룹 | 실행 중인 프로그램 |
+| 상주 위치 | 디스크 or 보조 메모리 | 주 메모리 |
+| 개체 유형 | 정적, 수동적 개체(passive entity) | 동적, 능동적 개체(active entity) |
+| 자원 관리 | 명령어 저장을 위한 메모리만 필요 | 리소스 요구사항이 매우 높음 |
+| 수명 | 수명이 길다. (삭제 전까지 저장됨) | 수명이 짧고 매우 제한적 |
+
+
+
+## 스레드(Thread)
+
+> 프로세스 내의 실행 흐름
+
+
+
+- 프로세스의 **실행 가능한 가장 작은 단위**
+
+- 프로세스는 동시에 실행되는 여러 스레드를 가질 수 있다.
+
+ - 이러한 프로세스를 경량 프로세스(Lightweight Process) 라고도 부른다.
+
+- **분류**
+
+ | User Threads | Kernal Threads |
+ | ----------------------- | --------------------- |
+ | 사용자에 의해 구현 | OS에 의해 구현 |
+ | 구현이 쉬움 | 구현 복잡 |
+ | 종속 스레드로 설계 | 독립 스레드로 설계 |
+ | 문맥 교환 시간이 짧음 | 문맥 교환 시간이 길다 |
+ | 하드웨어 지원 필요 없음 | 하드웨어 지원 필요 |
+
+### 멀티 스레딩
+
+**하나의 프로세스를 다수의 실행 단위로 구분**하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 **수행 능력을 향상시키는 것**
+
+- 즉, 하나의 프로그램에 동시에 여러개의 일을 수행할수 있도록 해주는 것
+- 하나의 프로세스 내 **메모리와 자원을 공유**한다.
+- 메모리의 **code, data, heap 영역은 공유**하고, **stack과 PC 레지스터는 따로 할당**받는다.
+ - **각 스레드는 독립적으로 수행**되어야 하기 때문.
+- **장점**
+ - **응답시간 단축** : 여러 스레드로 분할되면 하나의 스레드가 실행을 완료될 때 즉시 출력 반환 가능
+ - **빠른 통신** : 동일한 메모리 영역을 공유해서 여러 쓰레드 간 통신이 원활함
+ - **빠른 문맥 교환** : 프로세스에 비해 캐시 메모리를 비울 필요가 없기 때문.
+ - **시스템 처리량 향상** : 각 스레드 기능을 하나의 작업으로 간주하면서 단위 시간당 완료되는 작업 수 증가함
+- **문제점**
+ - **동기화 문제**
+ - 공유하는 자원에 동시에 접근하는 경우, 프로세스와 달리 **데이터와 힙 영역**을 공유하기 때문에 어떤 쓰레드가 다른 쓰레드에서 사용중인 변수나 자료 구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 따라서 동기화가 필요!
+ - 동기화를 통해 작업 처리 순서와 공유 자원에 대한 접근을 컨트롤할 수 있다. 그러나 불필요한 부분까지 동기화를 하면 과도한 lock으로 인해 병목 현상이 병목 현상이 발생해 성능 저하 가능성 높다.
+ - 구현이 어려움
+ - 테스트, 디버깅하기 어려움
+ - 하나의 스레드의 문제가 발생하면 전체 프로세스에 영향을 끼침
+- 사용 사례
+ - 영상통신 : 영상을 받아 화면에 출력하는 작업과 영상을 생성하여 보여주는 작업이 동시에 발생
+ - 웹 브라우저 : UI를 처리하는 작업과 표시할 데이터를 가져오는 작업이 동시에 발생
+ - 게임 : 그래픽을 실행하는 작업과 UI를 그리는 서버통신을 담당하는 소켓 작업이 동시에 발생
+
+## 프로세스와 스레드 차이점
+
+| | 프로세스 | 스레드 |
+| -------------- | ------------------ | -------------------------------------- |
+| 정의 | 프로그램이 실행 중 | 프로세스의 세그먼트 |
+| 프로세스 타입 | 중량 프로세스 | 경량 프로세스 |
+| 종료 시간 | 많은 시간 소요 | 적은 시간 소요 |
+| 생성 시간 | 많은 시간 소요 | 적은 시간 소요 |
+| 문맥 교환 시간 | 많은 시간 소요 | 적은 시간 소요 |
+| 메모리 공유 | 비공유 | 공유. 단, stack과 PC 레지스터는 비공유 |
+
+
+
+## Reference
+
+- https://javaconceptoftheday.com/differences-between-program-vs-process-vs-threads/
+- https://www.guru99.com/program-vs-process-difference.html#3
+- https://binaryterms.com/process-control-block-pcb.html
+- https://www.geeksforgeeks.org/thread-in-operating-system/?ref=lbp
+- https://www.guru99.com/difference-between-process-and-thread.html
+- https://goodgid.github.io/What-is-Multi-Thread/
+