diff --git a/README.md b/README.md
index b2727bf1f34f3f20fbeaf932744f3f5a88e7c8cf..e1422bb5e9937b35fb8c91229424f52d345f7a67 100644
--- a/README.md
+++ b/README.md
@@ -757,3 +757,88 @@ int main()
 	printf("Thread return %d at the end\n", result1);
 }
 ```
+
+
+## lesson 14
+
+* 사람들이 많이 이용중이던 unix에서 갑자기 소스코드를 닫고 바꾸었다. 그 뒤 bsc라는 것이 나왔고 ios의 기반이 되었다.
+* 프리소스 운동 중 GNU에서도 unix와 같은 것을 만들었고 그것이 GNU의 공식 OS인 "LINUX"이다.
+* unix계열 os를 쓰지 않으면 POSIX FIPS(연방계정)을 사용하지 못했다.
+* ISO에서 현재 표준화를 했다. (JTC sc22 프로그래밍 랭귀지를 표준화)
+* pthread 는 posix에서 만든 thread이다. 
+
+1. buffer
+> * stack : LIFO 형태
+
+> * 버퍼에서 뽑아가능 3가지 형태
+> 1. buffer full : 버퍼가 꽉 차면 한번에 쏵 뽑아간다.
+> 2. line by line mode : 한 줄씩 enter를 치면 뽑아간다.
+> 3. zero buffer : buffer 사이즈가 0 또는 1로 설정하여 한 글자씩 뽑아가게 만든다. 
+
+> * 제일 중요한 표준 버퍼 stdio
+> 1. stdin
+> 2. stdout
+> 3. stderr
+>> * 리디렉션은 이러한 stdio들의 방향을 리디렉션 해주는 것이다. 
+
+* lec13 실습시간에 버퍼문제로 인해 a.out 이 실행이 잘 되지 않았고 \n을 넣어 버퍼문제를 해결했었는데, 이 것을 다른 방법으로 stdbuf를 이용하여 해결할 수 있다. 
+* buffer control 실행하면서 하기
+>1. stdbuf --output=o a.out : zero buffer를 이용하여 lec13에서 만든 코드를 1초마다 내보내짐 
+>2. stdbuf --output=L a.out : line by line buffer이용
+
+* 프로그램 안에서 버퍼를 짜는 방법 
+```C
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int bbb = 0; 
+
+void fn_s()
+{
+    static int a = 0; 
+    printf("== %d %d ==",a++, bbb++);
+    fflush(stdout);
+}
+
+
+void *run (void *arg)
+{
+    printf("Hello world of POSIX threads.%d\n", (int) (0) );
+    for (int i = 0; i < 10; i++)
+	{
+		sleep(1); 
+		fn_s(); 
+	}
+    return 0;
+
+}
+
+int main()
+{
+	int result1;
+    char bufff[10]; 
+    setvbuf(stdout,bufff,  _IONBF, 10); 
+	run((void *) 0); 
+	printf("Thread return %d at the end\n", result1);
+}
+```
+* 위와 같이 코드를 작성하여 main에서 buffer 를 생성하여 _IONBF, 10 을 주어 내부에서 버퍼 설정이 가능하다.
+* 바로 위의 코드와 같이 설정하고 밖에서 이중으로 $stdbuff --output=L a.out 등과 같이 명령 실행시에는 a.out이 이긴다. 즉, 코드에 짠것대로 나온다.
+* 위의 코드에서 
+>* char bufff[10]; 
+>* setvbuf(stdout,bufff,  _IONBF, 10); 
+* 두 줄 대신 f flush(stdout); 을 해도 같은 결과가 나온다. 
+
+
+2. thread 
+>* thread를 여러개 만들어서 코어를 다 사용할 수 있게 한다면 훨씬 속도가 빨라진다. 하지만 쓰레드가 무조건 다 코어를 사용하는 것은 아니다. 
+
+3. 동기화 문제 
+>* 어떠한 코드에서 a++; 을 하는 중에 cpu에서 memory의 값을 자꾸 가져갔다 돌려주게 된다면 예를 들어 301후 +1은 302가 되어야 하는데 cpu때문에 300으로 다시 덮이는 등 동기화 문제가 발생하게 된다.
+>* 이러한 동기화 문제는 mutex를 이용하여 해결한다.
+```C
+static pthread mutex_t mutex
+= PTHREAD_MUTEX_INITIALIZER;
+```
+