From cb554226e98cb3da6f0a66a3cd8f05a71f99d45b Mon Sep 17 00:00:00 2001
From: KangHyun Kim <kimhyun98@ajou.ac.kr>
Date: Wed, 26 Jan 2022 07:06:46 +0000
Subject: [PATCH] add report14.md

---
 lec14/report14.md | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/lec14/report14.md b/lec14/report14.md
index 2fcd6d5..e0706b8 100644
--- a/lec14/report14.md
+++ b/lec14/report14.md
@@ -2,3 +2,33 @@
 
 #### 배운 것
 
+##### 버퍼
+C언어에서 가장 중요한 버퍼는 stdin, stdout, stderr이다. 이는 stdio.h에 정의되어 있다.
+CPU가 버퍼의 값을 가져가는 방식에는 buffer full, line-by-line, character-by-character 모드 등이 존재한다.
+* buffer full의 경우 버퍼가 꽉 찼을 때 CPU가 버퍼를 읽어가는 형식이다.
+* line-by-line의 경우 뉴라인(\n)이 입력되었을때 CPU가 버퍼를 읽어가는 형식이다.
+* character-by-character의 경우 한 글자 입력 시 CPU가 바로 버퍼를 읽어가는 형식이다. 즉 이는 버퍼를 사용하지 않는 것과 같다. 하지만 이 방식은 CPU가 매번 버퍼를 비워주는 형식이기에 성능 측면에서 그다지 좋은 방식은 아니다.
+
+표준 입출력의 버퍼는 기본적으로 line-by-line을 사용한다. 예를 들어 printf의 경우 뉴라인이 있기 전까지 터미널에 출력을 하지 않는다.
+
+stdbuf 리눅스 명령어를 통해 표준 버퍼를 제어할 수 있다. 버퍼의 크기를 조절할 수 있으며, 버퍼를 사용하지 않을 수도 있다. 버퍼의 크기를 키운다면 CPU가 버퍼를 처리해주는 간격을 키우므로 성능 면에서 향상이 있을 수 있다.
+fflush를 통해 버퍼를 강제적으로 비울 수 있다.
+c언어에서는 setvbuf를 통해 버퍼의 방식과 크기를 조절을 할 수 있다.
+setvbuf와 stdbuf를 동시에 실행한다면 setvbuf가 우선적으로 실행된다. 
+
+리디렉션은 입출력으로 데이터가 버퍼로 향하는 방향을 바꾸는 방식이다.
+
+##### 스레드
+
+스레드는 비동기적으로 작동을 한다. 여기서 말하는 비동기적이란 비순차적이란 의미와도 같은데, 이는 다른 프로세스 혹은 스레드들이 서로 동시에 작동하는 것을 의미한다.
+
+스레드는 프로세스와는 다르게 전역 변수와 static 변수들의 메모리 공간을 서로 공유한다. 따라서 서로 다른 스레드가 전역변수들을 동시에 접근할 수 있다. 이런 상황에서 동기화의 문제가 발생할 수 있다. 따라서 전역 변수와 같이 여러 스레드가 동시에 접근이 가능한 변수들을 변경하는 과정에는 mutual exclusive 방법이 필요하다. mutual exclusive는 mutex로 불리며 pthread 라이브러리에서 사용이 가능하다.
+
+```
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+    pthread_mutex_lock(&mutex);
+    count++;
+    pthread_mutex_unlock(&mutex);
+```
+mutex는 위와 같은 식으로 사용이 가능하다. 위의 식에서 count를 모든 스레드들이 접근가능한 변수라고 할 때, count 값을 변경하는 것은 프로그램의 동기화 측면에서 문제가 발생 할 수 있다. 따라서 count를 변경하는 식 위 아래로 mutex lock을 걸고 푸는 것을 설정하면, count의 값에 대한 비정상적인 연산을 막을 수 있다.
-- 
GitLab