diff --git a/README.md b/README.md
index dca62b99d911b17ae3ba36d53f3e371c8688b733..b2727bf1f34f3f20fbeaf932744f3f5a88e7c8cf 100644
--- a/README.md
+++ b/README.md
@@ -654,3 +654,106 @@ mul_float 코드
 * 그리고는 다시 255를 곱해주고 int로 변환하여 두 rgb의 곱한 rgb값을 return 하는 형태이다. 
 
 
+
+## lesson 13
+
+* 곱셈과 나눗셈은 함수로 만들어서 성능과 정밀도 체크하기.
+* 어떨 때 오버플로우가 생기는지도 생각해 보아야 한다.
+
+1. thread 와 system call 에 대해
+>* $ps : 현재 실행중인 Process 들을 보여준다.
+>* 프로세스 상태에는 run, kill, stop 이 있다.
+>* run 상태에는 fg(for ground), bg(back ground)가 있다.
+>* fg : 그냥 그 작업을 바로 다시 하게 한다. (ex)잠깐 bg로 다른 것을 실행 했다가 fg를 통해 다시 원래로 돌아올 수 있다. 
+>* bg : 현재 실행중인 것은 그대로 돌게 냅두고 다른 것을 동시에 돌게 한다.
+>> * stdin은 여러개의 bg와 하나만 존재하는 fg에서 어디로 갈지 정해야하므로 항상 fg로만 간다. 따라서 stdin을 사용하는 vi는 bg가 불가하다. 
+
+>* core 각각에 thread가 여러개 달려 있으면 cpu의 개수가 그만큼 있는 것으로 보인다. 
+>* context switching :
+>>* 운영체제 입장에서는 memory에 system process를 하는 것이고 tty에서는 user pocess를 하는 것 이다. 
+>>* cpu는 개수가 한정되어 있지만 context switching은 동시에 여러 일을 할 수 있게 한다. 
+
+* core는 다양하게 thread를 쪼개서 사용가능하며 os의 작업 스케쥴러가 그것을 알아서 정하게 된다. 
+* system call : kernel 위의 system call 과는 조금 다른데 ":r!ls" 를 통해 ls결과물을 vi에서 읽거나 ":!cc test.c" 를 통해 test.c 를 vi에서 바로 컴파일 가능하게 해주는 등의 일을 한다.
+
+2. fork 와 clone
+>* fork가 없는 시스템에서는 clone을 사용하면 fork를 실행 할 수 있다. 
+>* fork를 하게 되면 pid가 다른 프로세스가 생성된다.
+>* 따라서 fork한 뒤부터는 똑같은 것이 copy가 된 채 서로 다르게 사용가능하게 된다. 
+>* fork를 할 때에는 아래의 사항들이 필수이다.
+>> * #include <sys/types.h>
+>> * #include <unistd.h>
+>* fork 후에는 static이든 뭐든 process가 새로 생성되므로 서로 수정한 것이 서로에게 영향을 주지 못한다. 
+>* fork한 것 끼리 통신하기 위해서는 pipe를 이용해야한다.(ipc)
+>* 아래는 fork에 대한 실습인 forktest.c 파일의 코드이다.
+```C
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int main()
+{
+	int a = 0; 
+	pid_t pid ,pid2;
+    pid = fork(); 
+	pid2 = fork(); 
+	for (int i = 0; i < 100; i++)
+	{
+		sleep(1); 
+		if(pid == 0)
+			printf("PID %d : PID2 %d : A=%d : i=%d : \n", pid,pid2, a++, i);
+	}
+}
+
+```
+>* 위의 코드에서 보면 fork를 두 번 실행하는데 ps시 process는 4개가 뜨는 것을 확인 할 수 있다. 이러한 이유는 처음 fork시 process가 1개 에서 2개가 되었고, 두 번재 fork시 2개 모두 fork가 되어 2배인 4개가 되었기 때문이다.
+>* 이처럼 fork 시에는 현재 process의 개수만큼 copy가 되어 2배씩 개수가 증가하는 것을 알 수 있다. 
+
+3. thread 와 pthread
+>* thread는 꼭!!! 컴파일 시에 명령어 맨 뒤에 -lpthread를 붙여 컴파일 해야한다. 
+
+>* thread.h (c11) : 해당 버전에서는 함수 포인터를 파라메터로 받을 때 별달리 설정을 하지 않아도 된다.
+>* pthread.h (POSIX) : 해당 버전에서는 함수 포인터를 파라메터로 받을 때에 해당 함수명앞에도 직접 *를 붙여야 한다. 
+>> * pthread_exit 사용시 함수를 중간에 끝낼 수 있다.
+>> * pthread_join 은 동기화(synchronuzation)시 사용한다. 
+>> * pthread_self 이용시 내 thread의 번호를 알 수 있다.
+>> * pthread_equal 사용시 두 thread가 같은지 비교할 수 있다. 
+* 아래는 thread에 관한 실습 코드이다.
+```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++);
+}
+
+
+void *run (void *arg)
+{
+    printf("Hello world of POSXI threads.%d\n", (int) (0) ); // 버퍼를 잡아주기 위해 \n을 넣는다. 
+    for (int i = 0; i < 10; i++)
+	{
+		sleep(1); 
+		fn_s(); 
+	}
+    return 0;
+
+}
+
+int main()
+{
+	int result1;
+   	char bufff[10];
+   	setvbuf(stdout,bufff, _IOFBF, 10);
+	run((void *) 0); 
+	sleep(10);
+
+	run((void *) 0); 
+	printf("Thread return %d at the end\n", result1);
+}
+```