diff --git "a/ETC/CI, CD\353\236\200.md" "b/ETC/CI, CD\353\236\200.md"
new file mode 100644
index 0000000..1f556c6
--- /dev/null
+++ "b/ETC/CI, CD\353\236\200.md"
@@ -0,0 +1,62 @@
+# CI/CD란
+
+## 요약
+
+> 애플리케이션의 개발 단계를 자동화하여 짧은 주기로 고객에게 애플리케이션을 제공하는 방법
+
+## CI/CD가 나온 배경
+
+- 모든 개발이 끝난 이후에 코드 품질을 관리하는 고전적 방식의 단점을 해소하기위해 나타난 개념
+- 분업과 협업의 과정에서 코드의 Merge 과정은 까다롭고, 테스트하는데 큰 자원을 소비되게 된다. 이 문제를 해결하기 위해 도입
+- 개발 브랜치가 일정 기간 이상 이용되면, 통합의 어려움은 커지고 충돌 해결에 들어가는 시간이 길어지고 오류 발생 위험이 커진다.
이러한 단점을 극복하고자 변동 내용의 반영 빈도를 늘리는 **자동화**가 등장
+
+## CI의 정의
+
+- **지속적인 통합(Continuous Integration)**
+- 어플리케이션의 **새로운 코드 변경 사항**이 정기적으로 **빌드 및 자동 테스트** 되어 공유 레포지토리에 **통합(병합)**하는 것
+- 개발자를 위한 자동화 프로세스(여러명의 개발자간의 코드 충돌을 방지하기 위한 목적)
+- 자동화된 테스트에서 **동작을 확인**하고 변경으로 인해 문제가 생기는 부분이 발견되면 CI를 통해 빠르게 수정 가능
+- 버그를 신속히 찾아 해결하고 소프트웨어 품질 개선, 새로운 업데이트의 검증 및 릴리즈 시간 단축시키는 것이 핵심 목표
+
+### CI를 만드는 데 필요한 4가지 규칙
+
+- 모든 소스 코드가 있고 누구나 현재 소스(및 이전 버전)를 얻을 수 있는 단일 장소 유지할 것
+- 누구나 단일 명령을 사용하여 소스에서 시스템을 빌드할 수 있도록 빌드 프로세스를 자동화 할 것
+
+- 단일 명령으로 언제든지 시스템에서 우수한 테스트 모음을 실행할 수 있도록 테스트 자동화할 것
+- 누구나 현재 실행 파일을 얻으면 지금까지 가장 완전한 실행 파일을 얻었다는 확신을 하게 할 것
+
+> 이 중 가장 중요한 것이 **테스팅 자동화**!!
지속적인 통합을 하기 위해서는 무엇보다 이 프로젝트가 완전한 상태임을 보장하기 위해 테스트 코드가 구현되어 있어야만 한다.
+
+## CD의 정의
+
+- **지속적인 서비스제공(Continuous Delivery)** or **지속적인 배포(Continuous Deployment)**
+ - **지속적인 서비스제공(Continuous Delivery)**
+ - 공유 레포지토리로 자동으로 Release 하는 것
+ - 운영팀이 보다 빠르고 손쉽게 애플리케이션을 프로덕션으로 배포 가능 (**수동적 배포**)
+ - 프로덕션 환경으로 배포할 준비가 되어 있는 **코드베이스를 확보**하는 것이 목표
+ - **지속적인 배포(Continuous Deployment)**
+ - 프로덱션 레벨까지 자동으로 deploy 하는 것
+ - 애플리케이션을 프로덕션으로 릴리스하는 작업을 **자동화**
+ - 개발자가 애플리케이션에 변경 사항을 작성한 후 몇 분 이내에 애플리케이션을 **자동으로 실행**할 수 있는 것을 의미
+- 간단히 말하면 **배포 자동화 과정**
+- 서버가 많을 경우 개발자가 일일이 배포를 진행하지 않아도 되므로, 리소스가 낭비되지 않는다.
+
+
+
+## CI/CD 종류
+
+- Jenkins
+- CircleCI
+- TravisCI
+- Github Actions
+
+등..
+
+## 참고
+
+- https://www.youtube.com/watch?v=0Emq5FypiMM&t=10s
+
+- https://www.redhat.com/ko/topics/devops/what-is-ci-cd
+- https://devuna.tistory.com/56
+- https://www.martinfowler.com/articles/originalContinuousIntegration.html
\ No newline at end of file
diff --git a/Java/img/desktop.ini b/Java/img/desktop.ini
new file mode 100644
index 0000000..d51c0a2
--- /dev/null
+++ b/Java/img/desktop.ini
@@ -0,0 +1,9 @@
+[LocalizedFileNames]
+image-20210923130536966.png=@image-20210923130536966.png,0
+image-20210923130645978.png=@image-20210923130645978.png,0
+image-20210923130824029.png=@image-20210923130824029.png,0
+image-20210923130903685.png=@image-20210923130903685.png,0
+image-20210923131000378.png=@image-20210923131000378.png,0
+image-20210923131210328.png=@image-20210923131210328.png,0
+image-20210923131320935.png=@image-20210923131320935.png,0
+image-20210923131437386.png=@image-20210923131437386.png,0
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224.png"
new file mode 100644
index 0000000..9ed676b
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224.png" differ
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2601.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2601.png"
new file mode 100644
index 0000000..f52b14a
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2601.png" differ
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2602.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2602.png"
new file mode 100644
index 0000000..dd5682c
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2602.png" differ
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2603.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2603.png"
new file mode 100644
index 0000000..f67a21d
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2603.png" differ
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2604.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2604.png"
new file mode 100644
index 0000000..7d399f1
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2604.png" differ
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2605.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2605.png"
new file mode 100644
index 0000000..da3436d
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2605.png" differ
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2606.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2606.png"
new file mode 100644
index 0000000..ad3e3c3
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2606.png" differ
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2607.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2607.png"
new file mode 100644
index 0000000..bf6619d
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2607.png" differ
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2608.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2608.png"
new file mode 100644
index 0000000..1a1844a
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2608.png" differ
diff --git "a/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2609.png" "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2609.png"
new file mode 100644
index 0000000..0099104
Binary files /dev/null and "b/Java/img/\353\266\200\353\266\204\354\235\274\354\271\230\355\205\214\354\235\264\353\270\224\353\247\214\353\223\244\352\270\2609.png" differ
diff --git "a/Java/kmp-\354\225\214\352\263\240\353\246\254\354\246\230.md" "b/Java/kmp-\354\225\214\352\263\240\353\246\254\354\246\230.md"
new file mode 100644
index 0000000..2ae2994
--- /dev/null
+++ "b/Java/kmp-\354\225\214\352\263\240\353\246\254\354\246\230.md"
@@ -0,0 +1,199 @@
+# KMP 알고리즘
+
+## 💡문자열 매칭 알고리즘이란?
+
+특정한 글이 있을 때 그 글 안에서 하나의 문자열을 찾는 알고리즘이다. 노트패드나 워드파일 또는 웹 브라우저 데이터베이스에서 문자열을 검색할 때 패턴 매칭 알고리즘을 사용하여 검색 결과를 표시한다.
+
+문자열 매칭 알고리즘 종류로는 다음과 같다.
+
+1. Naive Matching (원시적인 매칭)
+2. Rabin-Karp Algorithm (라빈-카프 알고리즘)
+3. Boyer-Moore Algorithm (보이어-무어 알고리즘)
+4. Knuth-Morris-Pratt(KMP) Algorithm (KMP알고리즘)
+
+이 중 Naive 매칭과 KMP 알고리즘에 대해서 알아보자.
+
+## Naive Matching (원시적인 매칭)
+
+**Brute Force 방식**을 이용한 매칭으로, 문자열을 **처음부터 끝까지 차례대로 순회**하면서 패턴 내의 **문자들을 일일이 비교**하는 방식으로 동작한다.
+
+최악의 경우, 텍스트의 모든 위치에서 패턴을 비교해야 한다. 이때 시간 복잡도는 ***O(mn)***
+
+```java
+p[] : 찾을 패턴, t[] : 전체 텍스트
+M : 찾을 패턴의 길이, N : 전체 텍스트의 길이
+
+BruteForce(p[], t[])
+ i = 0, j = 0
+ WHILE j < M AND i < N
+ IF t[i] ≠ p[j]
+ i = i - j
+ j = -1
+ i = i + 1
+ j = j + 1
+
+ IF j == M : RETURN i - M
+ ELSE : RETURN i
+```
+
+효율적이지는 않지만 코드가 직관적이라서 간단하게 사용하기 좋다.
+
+## Knuth-Morris-Pratt(KMP) Algorithm (KMP알고리즘)
+
+접두사와 접미사의 개념을 활용하여 **반복되는 연산을 얼마나 줄일 수 있는지를 판별**하여 매칭할 문자열을 빠르게 점프하는 기법이다. 불일치가 발생한 텍스트 문자열의 앞 부분(=접두사)에 어떤 문자가 있는지를 미리 알고있으므로, 불일치가 발생한 앞 부분에 다시 비교하지 않고 매칭을 수행한다.
+
+KMP 알고리즘을 동작시키기 위해서는 접두사도 되고 접미사도 되는 **문자열의 최대 길이를 저장해주는 pi**을 미리 정의해줘야한다. pi[]은 pattern이 어디까지 일치했는지가 주어질 때 다음 시작 위치를 어디로 해야할지를 말해주기 때문에, 이를 흔히 **부분 일치 테이블**이라고 부른다.
+
+> pi[k] : 처음부터 k 인덱스까지를 끝으로 하는 문자열에서 일치하는 접두사와 접미사가 일치하는 최대 길이
+
+
+
+### 부분일치 테이블 배열 만들기
+
+```java
+private static int[] makeTable(char[] pattern, int size) {
+ int[] pi = new int[size];
+
+ int idx = 0;
+ for (int i = 1; i < size; i++) {
+ // 일치하는 문자가 발생했을 대(idx > 0), 연속적으로 더 일치하지 않으면 idx = table[idx-1]로 돌려준다
+ while (idx > 0 && pattern[i] != pattern[idx]) {
+ idx = pi[idx-1];
+ }
+
+ // 일치하는 경우
+ if (pattern[i] == pattern[idx]) {
+ // i길이 문자열의 공통 길이는 j의 위치 + 1
+ idx += 1;
+ pi[i] = idx;
+ }
+ }
+
+ return pi;
+}
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+### ⭐KMP 알고리즘 구현
+
+전통적인 구현은 이해가 조금 까다롭기 때문에 간결하면서 자주 사용되는 알고리즘을 살펴본다.
+
+시간복잡도는 table생성할 때 반복문 한번, kmp 매칭할 때 한번 해서 ***O(M+N)*** 이다.
+
+```java
+private static void KMP(char[] search, char[] pattern, int s_size, int p_size) {
+ int[] table = makeTable(pattern, p_size);
+
+ int idx = 0; // 현재 대응되는 글자 수
+
+ for (int i = 0; i < s_size; i++) {
+ // idx번 글자와 짚더미의 해당 글자가 불일치할 경우
+ // 현재 대응된 글자의 수를 table[idx-1]번으로 줄인다. (다시 매칭을 시작해야하므로)
+ while(idx > 0 && search[i] != pattern[idx]) {
+ idx = table[idx-1];
+ }
+
+ // 글자가 대응할 경우
+ if (search[i] == pattern[idx]) {
+ // 문자열 매칭 성공
+ if (idx == p_size-1) {
+ idx = table[idx]; // 계속 탐색하기 위해 idx를 돌리기
+ System.out.println(i-idx+1 + "번째에서 찾았습니다. ~" + (i+1) );
+ }
+ // 다음 문자 매칭을 위한 증가
+ else idx += 1;
+ }
+ }
+}
+```
+
+### KMP 알고리즘 탐색과정
+
+> 검색할 문자열(search): `abacababaca`
찾는 문자열(pattern): `ababaca`
부분일치 테이블(table): `[0 0 1 2 3 0 1]`
+
+1) i = 0, idx = 0 → idx 1증가
+
+ a 일치
+
+ | search | a | b | a | c | a | b | a | b | a | c | a |
+ | ------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
+ | pattern | a | b | a | b | a | c | a | | | | |
+ | idx | 0 | | | | | | | | | | |
+
+2. i = 1, idx = 1 → idx 1증가
+
+ b 일치
+
+ | search | a | b | a | c | a | b | a | b | a | c | a |
+ | ------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
+ | pattern | a | b | a | b | a | c | a | | | | |
+ | idx | 0 | 1 | | | | | | | | | |
+
+3. i = 2, idx = 2 → idx 1증가
+
+ a 일치
+
+ | search | a | b | a | c | a | b | a | b | a | c | a |
+ | ------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
+ | pattern | a | b | a | b | a | c | a | | | | |
+ | idx | 0 | 1 | 2 | | | | | | | | |
+
+4. i = 3, idx = 3 → idx = table[idx-1] = table[2] = 1 → idx = table[idx-1] = table[0] = 0
+
+ b != c 불일치
+
+ > 접두사 접미사가 일치하지 않으므로 idx=0부터 재탐색 시작한다.
+
+ | search | a | b | a | c | a | b | a | b | a | c | a |
+ | ------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
+ | pattern | a | b | a | b | a | c | a | | | | |
+ | idx | 0 | 1 | 2 | 1 | | | | | | | |
+
+5. i = 4, idx = 0 → idx 증가
+
+ a 일치
+
+ | search | a | b | a | c | a | b | a | b | a | c | a |
+ | ------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
+ | pattern | | | | | a | b | a | b | a | c | a |
+ | idx | | | | | 0 | | | | | | |
+
+8. i = 5, idx = 1 → idx 증가
+
+ | search | a | b | a | c | a | b | a | b | a | c | a |
+ | ------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
+ | pattern | | | | | a | b | a | b | a | c | a |
+ | idx | | | | | 0 | 1 | | | | | |
+
+9. i = 6 ~ 10
+
+ idx = 6 (pattern 문자열 길이 - 1)에 도달하면서 매칭이 되었으므로 탐색 종료
+
+ > 만약 계속 탐색하려면 idx = table[idx]를 해줘서 idx를 다시 돌려주면 된다.
+
+ | search | a | b | a | c | a | b | a | b | a | c | a |
+ | ------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
+ | pattern | | | | | a | b | a | b | a | c | a |
+ | idx | | | | | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
+
+## Ref
+
+- SSAFY Java 강의
+- https://loosie.tistory.com/192
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/
+