From c99fcdb05126b0618fa372b2b0693fe0df59ccc9 Mon Sep 17 00:00:00 2001 From: hsgh085 Date: Tue, 23 Jan 2024 21:06:21 +0900 Subject: [PATCH 1/9] =?UTF-8?q?[=EC=9A=B4=EC=98=81=EC=B2=B4=EC=A0=9C]=20?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=EC=99=80=20=EB=B9=84=EB=8F=99=EA=B8=B0?= =?UTF-8?q?=EC=9D=98=20=EC=B0=A8=EC=9D=B4=20-=20heehee/4=EC=A3=BC=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "4\354\243\274\354\260\250/heehee.md" | 45 +++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 "4\354\243\274\354\260\250/heehee.md" diff --git "a/4\354\243\274\354\260\250/heehee.md" "b/4\354\243\274\354\260\250/heehee.md" new file mode 100644 index 0000000..e7ad2f0 --- /dev/null +++ "b/4\354\243\274\354\260\250/heehee.md" @@ -0,0 +1,45 @@ +# 동기와 비동기의 차이 + +## 동기(Synchronous)와 비동기(Asynchronous) + +### 정의 + +작업의 진행 방식 처리 방법으로, 작업들이 함께 시작되고, 끝나는 지 여부로 구분한다. + +### 동기(Synchronous)란? + +동기는 작업들이 같이 시작해 같이 끝나는 방식이다. + +![sync](https://github.com/CHZZK-Study/cs-study/assets/84820008/25172ba3-3015-4e72-8219-3d098f03c2e1) + +### 비동기(Asynchronous)란? + +비동기는 작업들의 시작과 끝이 다른 방식이다. + +![async](https://github.com/CHZZK-Study/cs-study/assets/84820008/6df75858-85f4-4e0c-b84a-c550c2a25d97) + +### 각 방식의 장단점 + +동기는 업무가 단순하지만 자원을 비효율적으로 사용하고, 비동기는 업무가 복잡해질 수 있지만(콜백지옥, 에러 처리 등등) 자원을 효율적으로 사용한다. + +## 블로킹(Blocking) 과 논블로킹(Non-Blocking) + +### 정의 + +제어할 수 없는 대상의 처리 방법으로, 다른 작업의 실행이 현재 작업의 실행을 막는지 여부로 구분한다. + +### 블로킹(Blocking)이란? + +Blocking은 호출자가 직접 제어할 수 없는 대상에게 제어권을 넘김으로써 해당 대상의 작업이 끝날때까지 기다려야하는 방식이다. + +![blocking](https://github.com/CHZZK-Study/cs-study/assets/84820008/032cddfa-1920-422c-9c62-9315534b4de6) + +### 논블로킹(Non-Blocking)이란? + +Non-Blocking은 직접 제어할 수 없는 대상의 작업이 완료되기 전에 제어권을 넘김으로써 새로운 작업을 수행할 수 있는 방식이다. + +![non-blocking](https://github.com/CHZZK-Study/cs-study/assets/84820008/426d0c31-9b28-4a40-a9a2-64b02b6e483f) + +## 동기, 비동기, 블로킹, 논블로킹의 목적 + +CPU 자원을 효율적으로 사용하고 성능을 향상시키기 위함이다. \ No newline at end of file From fd3c0d030500077ac15b57aa4be33337e9628738 Mon Sep 17 00:00:00 2001 From: hsgh085 Date: Tue, 23 Jan 2024 22:42:08 +0900 Subject: [PATCH 2/9] =?UTF-8?q?docs:=20=EB=8F=99=EA=B8=B0=EC=99=80=20?= =?UTF-8?q?=EB=B9=84=EB=8F=99=EA=B8=B0=20=EB=82=B4=EC=9A=A9=20=EB=B3=B4?= =?UTF-8?q?=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "4\354\243\274\354\260\250/heehee.md" | 36 +++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git "a/4\354\243\274\354\260\250/heehee.md" "b/4\354\243\274\354\260\250/heehee.md" index e7ad2f0..d78e60f 100644 --- "a/4\354\243\274\354\260\250/heehee.md" +++ "b/4\354\243\274\354\260\250/heehee.md" @@ -20,7 +20,20 @@ ### 각 방식의 장단점 -동기는 업무가 단순하지만 자원을 비효율적으로 사용하고, 비동기는 업무가 복잡해질 수 있지만(콜백지옥, 에러 처리 등등) 자원을 효율적으로 사용한다. +동기는 업무가 단순하지만 자원을 비효율적으로 사용하고, 비동기는 업무가 복잡해질 수 있지만(작업들의 시작과 끝이 달라 콜백지옥, 에러 처리 등등을 신경써야함) 자원을 효율적으로 사용한다. + +### 동기와 비동기 방식의 선택 기준 + +- 동기 + +1. 순차적인 처리가 필요한 경우 +2. 간단하고 짧은 계산이나 로직 + +- 비동기 + +1. I/O 작업이 많은 경우 +2. 대규모 데이터 처리나 병렬 처리가 필요한 경우 +3. 비동기적으로 실행되는 업무가 결과를 기다리지 않는 경우 ## 블로킹(Blocking) 과 논블로킹(Non-Blocking) @@ -42,4 +55,23 @@ Non-Blocking은 직접 제어할 수 없는 대상의 작업이 완료되기 전 ## 동기, 비동기, 블로킹, 논블로킹의 목적 -CPU 자원을 효율적으로 사용하고 성능을 향상시키기 위함이다. \ No newline at end of file +CPU 자원을 효율적으로 사용하고 성능을 향상시키기 위함이다. + +## 자바와 자바스크립트는 동기 vs 비동기, 블로킹 vs 논블로킹 중 어디에 해당할까? + +- 자바 : 블로킹 동기 형태의 언어로, 자바의 I/O작업은 주로 블로킹 방식으로 수행되기 때문에 한 작업이 완료될 때까지 다음 작업이 기다려야한다. + +- 자바스크립트 : 논블로킹 비동기 형태의 언어로 콜백 함수, Promise, async/await등을 사용하여 비동기적인 코드를 작성할 수 있다. 이렇게 함으로써 여러 작업을 동시에 처리하고, 작업이 완료될 때까지 다른 코드를 차단하지 않는다. + +## 선택의 기준 + +### 성능 + +- 논블로킹 비동기 방식이 가장 성능(처리량/시간)이 좋은가? + +블로킹 동기 + 멀티 쓰레딩 방식으로도 성능을 올릴 수 있다. 이 때, 쓰레드 관리 비용이 존재하는데, 짧게 끝나는 작업이 여러 번이라면 쓰레드 할당 오버헤드가 많아 논블로킹 방식이 유리하다. + +### 다른 개발자들의 인지 비용 + +실행 순서, 순차적 처리를 신경써야 하는 비용으로 블로킹 동기는 직관적이기 때문에 해당 비용이 낮다. + From 0d3c55c10667615457b61a8985f4ca777366846e Mon Sep 17 00:00:00 2001 From: hsgh085 Date: Tue, 30 Jan 2024 21:00:46 +0900 Subject: [PATCH 3/9] =?UTF-8?q?[=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4]=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20-=20heehee/5=EC=A3=BC=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "5\354\243\274\354\260\250/heehee.md" | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 "5\354\243\274\354\260\250/heehee.md" diff --git "a/5\354\243\274\354\260\250/heehee.md" "b/5\354\243\274\354\260\250/heehee.md" new file mode 100644 index 0000000..b72b27d --- /dev/null +++ "b/5\354\243\274\354\260\250/heehee.md" @@ -0,0 +1,50 @@ +# 데이터베이스 + +## 데이터베이스를 사용하는 이유 + +### 기존 파일 시스템의 문제 + +1. 데이터 중복 및 불일치 문제:
+데이터가 여러 필드 형식으로 저장되므로 서로 다른 파일에 정보가 중복
+ +2. 데이터에 접근하기 어려움:
+새로운 작업을 수행하기 위해 새로운 프로그램을 작성해야함. 다양한 파일과 포맷이 있어 데이터가 작동하는 곳이 있고 안되는 곳이 있음.
+ +3. 무결성 문제:
+무결성을 제약하는 조건이 묻혀있어 프로그래밍을 명시적으로 해줘야하므로 새로운 제약 조건을 넣기에 어려움
+ +➡️ 위의 모든 문제를 해결하기 위해서 데이터베이스 사용 + +### 데이터베이스의 특징 + +1. 데이터의 독립성: +- 물리적 독립성 : 데이터베이스 크기를 늘리거나 성능 향상을 위해 데이터 파일을 늘리거나 새롭게 추가해도 관련 애플리케이션을 수정할 필요가 없다. +- 논리적 독립성 : 데이터베이스는 논리적인 구조로 다양한 애플리케이션의 논리적 요구를 만족시켜준다.
+ +2. 데이터의 무결성: +- 데이터는 여러 경로를 통해서 들어오는데, 데이터에서 발생하는 경우의 수를 방지하는 기능으로 데이터의 유효성을 검사해서 무결성을 구현한다.
+ +3. 데이터의 보안성: +- 인가된 사용자들만 데이터베이스나 데이터베이스 내에 자원을 접근할 수 있도록 계정 관리 또는 접근 권한을 설정
+ +4. 데이터의 일관성: +- 연관된 정보를 논리적인 구조로 관리해서, 어떤 하나의 데이터만 변경했을 경우에 발생할 수 있는 불일치성을 배제할 수 있다. +- 또 작업 중에 일부 데이터만 변경되서 나머지 데이터와 일치하지 않는 경우를 방지한다.
+ +5. 데이터의 중복 최소화: +- 데이터베이스는 데이터를 통합해서 관리함으로써, 파일 시스템의 단점 중 하나인 자료의 중복과 데이터 중복성 문제를 최소화할 수 있다. + +## 데이터베이스 성능 + +### 성능 결정 요인 +디스크 I/O를 어떻게 줄이느냐에 달려있다.

+디스크 I/O란 디스크 드라이브의 플레터(원판)을 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것을 의미한다.

+이 때 데이터를 읽는데 걸리는 시간은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다. 즉 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정된다. + +### 성능 향상 방법 +순차 I/O가 랜덤 I/O보다 빠를 수 밖에 없다. 하지만 현실에서는 대부분의 I/O 작업이 랜덤 I/O이기 때문에 이를 순차 I/O로 바꿔서 실행하면 성능을 향상시킬 수 있다.
+ +- 인덱싱 +- 쿼리 최적화 +- 캐싱 및 버퍼링 +- 파티셔닝 \ No newline at end of file From be5565ac6f31179f3bac00f3c13ed9c8486bb612 Mon Sep 17 00:00:00 2001 From: hsgh085 Date: Tue, 30 Jan 2024 22:37:24 +0900 Subject: [PATCH 4/9] =?UTF-8?q?docs:=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=84=B1=EB=8A=A5=20=ED=96=A5?= =?UTF-8?q?=EC=83=81=20=EB=B0=A9=EB=B2=95=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "5\354\243\274\354\260\250/heehee.md" | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git "a/5\354\243\274\354\260\250/heehee.md" "b/5\354\243\274\354\260\250/heehee.md" index b72b27d..21c46d7 100644 --- "a/5\354\243\274\354\260\250/heehee.md" +++ "b/5\354\243\274\354\260\250/heehee.md" @@ -42,9 +42,10 @@ 이 때 데이터를 읽는데 걸리는 시간은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다. 즉 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정된다. ### 성능 향상 방법 -순차 I/O가 랜덤 I/O보다 빠를 수 밖에 없다. 하지만 현실에서는 대부분의 I/O 작업이 랜덤 I/O이기 때문에 이를 순차 I/O로 바꿔서 실행하면 성능을 향상시킬 수 있다.
+순차 I/O가 랜덤 I/O보다 빠를 수 밖에 없다. 하지만 현실에서는 대부분의 I/O 작업이 랜덤 I/O이기 때문에 이를 순차 I/O로 바꿔서 실행하면 성능을 향상시킬 수 있다.

-- 인덱싱 -- 쿼리 최적화 -- 캐싱 및 버퍼링 -- 파티셔닝 \ No newline at end of file +순차 I/O처럼 성능을 향상시킬 수 있는 방법 +- 인덱싱 : 인덱스를 활용해 데이터를 검색할 때 성능 향상. 특히 where절을 사용되는 column에 인덱스를 생성하는 것이 중요 +- 쿼리 최적화 : 불필요한 연산을 피해서 성능 향상 +- 캐싱 : 자주 사용되는 데이터나 중간 결과를 메모리에 캐시함으로써 빠르게 엑세스할 수 있도록 도움. +- 파티셔닝 : 큰 테이블을 논리적 구조에 맞추어 작은 파티션으로 나누어 데이터의 물리적 배치를 효율적으로 관리할 수 있도록 도움. \ No newline at end of file From b0f5ec7dde4b3e5073ac2cb8116ab9e949b8abac Mon Sep 17 00:00:00 2001 From: hsgh085 Date: Wed, 14 Feb 2024 20:02:53 +0900 Subject: [PATCH 5/9] =?UTF-8?q?docs:=20=EA=B7=B8=EB=9E=98=ED=94=84=20?= =?UTF-8?q?=EC=9A=A9=EC=96=B4=20=EC=A0=95=EB=A6=AC=20=EB=B0=8F=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=A9=EB=B2=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "7\354\243\274\354\260\250/heehee.md" | 68 +++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 "7\354\243\274\354\260\250/heehee.md" diff --git "a/7\354\243\274\354\260\250/heehee.md" "b/7\354\243\274\354\260\250/heehee.md" new file mode 100644 index 0000000..52430ce --- /dev/null +++ "b/7\354\243\274\354\260\250/heehee.md" @@ -0,0 +1,68 @@ +# Graph + +## 정의 + +연결되어 있는 원소들 사이의 다:다 관계를 표현하는 비선형 자료구조 + +-V : 정점(vertex)의 유한집합 +-E : 간선(edges)이라고 하는 정점 쌍들의 집합 + +## Graph 종류 + +### 무방향 그래프 + +두 정점을 연결하는 간선에 방향이 없는 그래프로 간선을 나타내는 쌍에 순서가 없음. + +### 방향 그래프 + +모든 간선은 방향을 가지고, 한쪽 방향으로만 갈 수 있음. + +### 부분 그래프 + +원래의 그래프에서 정점이나 간선을 일부만 제외하여 만든 그래프 + +### 가중 그래프 + +정점을 연결하는 간선에 가중치를 할당한 그래프 + +## Graph 용어 + +### 인접 정점 + +하나의 정점에서 간선에 의해 직접 연결된 정점 + +### 무방향 그래프의 차수 + +- 정점에 연결된 간선 수 +- 무방향 그래프의 모든 차수의 합 = 간선수 \* 2 + +### 방향 그래프의 차수 + +- 정점 v의 진입 차수: 정점 v로 들어오는 간선 수 +- 정점 v의 진출 차수: 정점 v에서 나가는 간선 수 +- 방향 그래프의 모든 진입(진출)차수의 합 = 간선 수 + +### 단순 경로 + +경로 중에서 반복되는 간선이 없는 경로 + +### 사이클 + +시작 정점과 종료 정점이 동일한 단순 경로 + +## Graph 구현 + +### 인접 행렬 + +- 2차원 배열을 사용하는 순차 자료구조 방법 +- 그래프의 두 정점을 연결한 간선의 유무를 행렬로 저장 + - n개의 정점을 가진 그래프: n \* n 행렬 M (행, 열 번호가 정점) + - if 간선(i,j)가 그래프에 존재 : M[i][j] = 1, + - 그렇지 않으면 : M[i][j] = 0 +- 인접 행렬의 대각선 성분(자기 자신)은 모두 0 +- 인접 행렬의 수행 시간: O(n^2) +- 희소 그래프(정점의 수 >> 간선의 수)인 경우에는 인접 행렬에 의한 표현은 비효율적 + +### 인접 리스트 + +- 각 정점(헤드 포인터로 설정)에 대한 인접 정점들을 연결하여 만든 단순 연결리스트 From b5b1697ac1ce7290ef05da8e4cb49c33d8545129 Mon Sep 17 00:00:00 2001 From: hsgh085 Date: Wed, 14 Feb 2024 22:05:19 +0900 Subject: [PATCH 6/9] =?UTF-8?q?docs:=20=EA=B7=B8=EB=9E=98=ED=94=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=A9=EB=B2=95=20=EC=9E=A5=EB=8B=A8?= =?UTF-8?q?=EC=A0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "7\354\243\274\354\260\250/heehee.md" | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git "a/7\354\243\274\354\260\250/heehee.md" "b/7\354\243\274\354\260\250/heehee.md" index 52430ce..bcb2f55 100644 --- "a/7\354\243\274\354\260\250/heehee.md" +++ "b/7\354\243\274\354\260\250/heehee.md" @@ -4,8 +4,8 @@ 연결되어 있는 원소들 사이의 다:다 관계를 표현하는 비선형 자료구조 --V : 정점(vertex)의 유한집합 --E : 간선(edges)이라고 하는 정점 쌍들의 집합 +- V : 정점(vertex)의 유한집합 +- E : 간선(edges)이라고 하는 정점 쌍들의 집합 ## Graph 종류 @@ -60,9 +60,21 @@ - if 간선(i,j)가 그래프에 존재 : M[i][j] = 1, - 그렇지 않으면 : M[i][j] = 0 - 인접 행렬의 대각선 성분(자기 자신)은 모두 0 -- 인접 행렬의 수행 시간: O(n^2) -- 희소 그래프(정점의 수 >> 간선의 수)인 경우에는 인접 행렬에 의한 표현은 비효율적 + +- 장점 + 1. 2차원 배열에 모든 정점들의 간선 정보가 있기 때문에, 간선 조회 시 O(1)의 시간 소요 +- 단점 + 1. 간선의 수와 무관하게 항상 n^2 크기의 2차원 배열이 필요하므로 메모리 공간이 낭비 + > 희소 그래프(정점의 수 >> 간선의 수)인 경우에는 인접 행렬에 의한 표현은 비효율적 + 2. 모든 간선의 수를 탐색하는데 O(n^2)의 시간 소요 ### 인접 리스트 - 각 정점(헤드 포인터로 설정)에 대한 인접 정점들을 연결하여 만든 단순 연결리스트 + +- 장점 + 1. 존재하는 간선만 관리하면 되므로 메모리 사용 측면에서 보다 효율적 + 2. 그래프의 모든 간선의 수를 알아내려면 각 정점의 헤더 노드부터 모든 인접리스트를 탐색해야하므로 O(n+e)의 시간 소요 + > 그래프에 있는 모든 노드를 방문하는 시간 O(n) + 해당 노드와 연결된 모든 간선 탐색하는 시간 O(e) +- 단점 + 1. 간선을 조회하기 위해서는 정점의 인접 리스트를 탐색해야하므로 정점의 차수만큼( = O(v의 차수)) 시간 소요 \ No newline at end of file From 8a31431c4dab4160716a2f6139a041dbb1c41c7e Mon Sep 17 00:00:00 2001 From: hsgh085 Date: Wed, 21 Feb 2024 19:52:06 +0900 Subject: [PATCH 7/9] =?UTF-8?q?docs:=20tcp=203-way=20handshake=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "8\354\243\274\354\260\250/heehee.md" | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 "8\354\243\274\354\260\250/heehee.md" diff --git "a/8\354\243\274\354\260\250/heehee.md" "b/8\354\243\274\354\260\250/heehee.md" new file mode 100644 index 0000000..15e1ac1 --- /dev/null +++ "b/8\354\243\274\354\260\250/heehee.md" @@ -0,0 +1,42 @@ +# TCP 3-way handshake + +## 목적 +TCP의 3-way handshake는 연결을 확립하기 위한 프로세스로, 클라이언트와 서버 간의 신뢰성있는 양방향 통신을 구축하기 위함입니다. + +## TCP 플래그(코드 비트) +- SYN (synchronize sequence number) : TCP 연결 설정을 위한 플래그 +- ACK (acknowledgement) : 데이터 응답을 확인하기 위한 플래그 +- FIN (finish) : TCP 연결을 종료하기 위한 플래그 + +## 동작과정 +![tcp-3way-handshake](https://github.com/CHZZK-Study/cs-study/assets/84820008/669ce95a-b670-4216-b9fb-6389332bda69) + +### 1. 클라이언트 -> 서버 : 연결 확립 요청 +- SYN = 1 : 클라이언트 -> 서버 연결을 확립하기 위해 클라이언트가 서버에게 요청 + +### 2. 서버 -> 클라이언트 : 수락 + 연결 확립 요청 +- ACK = 1 : 클라이언트의 요청을 수락 +- SYN = 1 : 서버 -> 클라이언트 연결을 확립하기 위해 서버가 클라이언트에게 요청 + +### 3. 클라이언트 -> 서버 : 수락 +- ACK = 1 : 서버의 요청을 수락 + +# TCP 4-way handshake + +## 목적 +TCP의 4-way handshake는 TCP 연결 확립 후, 연결을 종료하기 위한 프로세스 + +## 동작과정 +![tcp-4way-handshake](https://github.com/CHZZK-Study/cs-study/assets/84820008/c60e7fc3-bfc5-4ddb-a306-ac2c6ce070bd) + +### 1. 클라이언트 -> 서버 : 연결 종료 요청 +- FIN = 1 : 클라이언트 -> 서버 연결을 종료하기 위해 클라이언트가 서버에게 요청 + +### 2. 서버 -> 클라이언트 : 수락 +- ACK = 1 : 클라이언트의 요청을 수락 + +### 3. 서버 -> 클라이언트 : 연결 종료 요청 +- FIN = 1 : 서버 -> 클라이언트 연결을 종료하기 서버가 클라이언트에게 요청 + +### 4. 클라이언트 -> 서버 : 수락 +- ACK = 1 : 서버의 요청을 수락 \ No newline at end of file From 11be141ff41ba80f51e1823cba00e559048572d0 Mon Sep 17 00:00:00 2001 From: hsgh085 Date: Wed, 21 Feb 2024 20:37:01 +0900 Subject: [PATCH 8/9] =?UTF-8?q?docs:=20time=20wait=EC=9D=B4=20=EC=9E=88?= =?UTF-8?q?=EB=8A=94=20=EC=9D=B4=EC=9C=A0=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "8\354\243\274\354\260\250/heehee.md" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/8\354\243\274\354\260\250/heehee.md" "b/8\354\243\274\354\260\250/heehee.md" index 15e1ac1..dd6a216 100644 --- "a/8\354\243\274\354\260\250/heehee.md" +++ "b/8\354\243\274\354\260\250/heehee.md" @@ -39,4 +39,7 @@ TCP의 4-way handshake는 TCP 연결 확립 후, 연결을 종료하기 위한 - FIN = 1 : 서버 -> 클라이언트 연결을 종료하기 서버가 클라이언트에게 요청 ### 4. 클라이언트 -> 서버 : 수락 -- ACK = 1 : 서버의 요청을 수락 \ No newline at end of file +- ACK = 1 : 서버의 요청을 수락 + +### Time wait이 있는 이유는? +- 연결의 정확한 종료 보장 : 네트워크 상의 이전 패킷이 지연되거나 재전송되는 경우를 대비하기 위함이다. \ No newline at end of file From 4cbaed19c5409923dd87d03d09859ec6cd2d3574 Mon Sep 17 00:00:00 2001 From: hsgh085 Date: Tue, 27 Feb 2024 20:59:58 +0900 Subject: [PATCH 9/9] =?UTF-8?q?docs:=20=EB=8F=99=EA=B8=B0=ED=99=94=20?= =?UTF-8?q?=EC=9D=98=EB=AF=B8=EC=99=80=20=EA=B8=B0=EB=B2=95=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "9\354\243\274\354\260\250/heehee.md" | 69 +++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 "9\354\243\274\354\260\250/heehee.md" diff --git "a/9\354\243\274\354\260\250/heehee.md" "b/9\354\243\274\354\260\250/heehee.md" new file mode 100644 index 0000000..077a4fe --- /dev/null +++ "b/9\354\243\274\354\260\250/heehee.md" @@ -0,0 +1,69 @@ +# 프로세스 동기화 + +## 동기화의 의미 +프로세스들의 수행 시기를 맞추는 것 +- 실행 순서 제어를 위한 동기화 : 프로세스를 올바른 순서대로 실행하기 +- 상호 배제를 위한 동기화 : 한 번에 하나의 프로세스만 접근해야 하는 자원에 동시 접근을 피하기 위한 동기화 + +## 임계 구역(Critical Section) +- 공유 자원: 여러 프로세스 혹은 스레드가 공유하는 자원 + ex. 전역 변수, 파일, 입출력 장치 등등 +- 임계 구역: 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역 + +### 운영체제가 임계구역 문제를 해결하는 세 가지 원칙(= 상호배제를 위한 동기화) +1. 상호배제(Mutual Exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다. +2. 진행(Progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야한다. +3. 유한대기(Bounded Waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어올 수 있어야 한다. + +# 동기화 기법 +## 뮤텍스 락(Mutex Lock) +상호 배제를 위한 동기화 도구(자물쇠 역할) + +- 뮤텍스 락의 단순한 형태: 전역 변수 하나, 함수 2개 + +1. 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock +2. 임계 구역을 잠그는 역할: acquire 함수 +3. 임계 구역의 잠금을 해제하는 역할: release 함수 + +```c +acquire(){ + /* 바쁜 대기(busy waiting): + 임계 구역이 잠겨있는지를 반복적으로 확인하는 작업 */ + while (lock == true) + ; + lock = true; +} + +release(){ + lock = false; +} + +acquire(); // 자물쇠가 잠겨있는지 확인, 잠겨있지 않다면 잠그고 들어가기 +//임계 구역 // 임계 구역에서의 작업 진행 +release(); // 자물쇠 반환 +``` + +## 세마포(Semaphores) +좀 더 일반화된 방식의 동기화 도구로, 공유 자원이 여러개 있는 경우에도 적용 가능 +
+ +- 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기 +- 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입 +- 세마포의 단순한 형태: 전역변수 하나, 함수 두개 + +1. 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S +2. 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수 +3. 임계 구역 앞에서 기다리는 프로세스에 이제 가도 좋다고 신호를 주는 signal 함수 + +### Busy waiting 문제 +- CPU 사이클 낭비 +
+- 해결 방법 + - 사용할 수 있는 자원이 없을 경우 대기 상태로 만듦 + - 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦 + +## 모니터 +세마포어에서 매번 임계 구역 앞뒤로 wait(), signal()을 호출해야하는데 실수한다면?
+그래서 등장한 것이 모니터
+사용자(개발자)가 다루기에 편한 동기화 도구 +- 세마포어는 직접 키 해제와 공유자원 접근 처리를 해주어야 하는 반면, 모니터는 공유자원에 접근할 수 있는 키의 획득과 해제를 모두 함수로 처리해준다. \ No newline at end of file