diff --git a/README.md b/README.md
index 2d309c7ac414c39231fed7b5d9ea822fd1c845de..311d77a405ec649459564545b0a4a408a8b7ebdd 100644
--- a/README.md
+++ b/README.md
@@ -1893,3 +1893,418 @@ SET (PROJECT_VERSION_MINOR 1)
 ```
 SET (CMAKE_BUILD_TYPE Debug)
 SET (CMAKE_VERBOSE_MAKEFILE true)
+```
+
+## **Lecture 13** [2022.01.25]
+
+### Linux Command
+1. ps
+    * 현재 실행중인 프로세스 목록과 상태를 보여줌
+
+2. ps -l
+    * 더 구체적으로 보여줌
+
+### vi Command
+1. :r
+    * 파일을 읽음
+
+2. :! 
+    * 명령어를 실행
+
+### CPU Code
+* Intel i7-980x
+![cpu](./image/cpu.jpg)
+
+### Context Switching
+* 현재 진행하고 있는 task(process, thread)의 상태를 저장하고 다음 진행할 task의 상태 값을 읽어 적용하는 과정
+* 진행과정
+    * Task의 대부분 정보는 Register에 저장되고 PCB(Process Control Block)로 관리됨
+    * 현재 실행하고 있는 Task의 PCB정보를 저장
+    * 다음 실행할 Task의 PCB 정보를 읽어 Register에 적재하고 CPU가 이전에 진행했던 과정을 연속적으로 수행
+* Context Switching이 발생하면 많은 비용이 소요됨
+
+### Process 상태
+* RUN
+    * fg
+    * bg
+* STOP
+* KILL
+
+### Fork function
+* 프로세스가 자기 자신을 복제하는 동작
+* 시스템 호출의 일종으로 커널 안에서 구현
+* 복제 대상을 부모 프로세스, 결과물을 자식 프로세스라고 함
+* unistd.h를 include하여 사용함
+* 프로세스가 가지는 고유한 번호를 프로세스 ID라고 함
+* fork함수 성공시 부모 프로세스는 자식 프로세스의 프로세스 ID를 리턴
+
+### Thread
+* 프로세스 내에서 실제로 작업을 수행하는 주체
+* 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행함
+* 두개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 함
+* 장점
+    * 프로세스에 비해 생성 및 종료시간, 스레드간 전환시간이 짧음
+    * 프로세스의 메모리, 자원등을 공유하므로 커널의 도움없이 상호간 통신이 가능
+
+### Process vs Thread
+* Process
+    * 운영체제로부터 자원을 할당받는 작업의 단위
+    * 실행 중인 프로그램
+    * 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것
+    * 많은 자원과 시간을 소비
+* Thread
+    * 프로세스가 할당받은 자원을 이용하는 실행의 단위
+    * 프로세스의 실행 단위
+    * 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유
+    * 각각의 쓰레드는 독립적인 작업을 수행하기 때문에 각자의 스택과 PC 레지스터 값을 가짐
+
+### system - system call
+```
+#include <stdlib.h>
+int system(const char *command);
+    execl("/bin/sh", "sh", "-c", command, (char *) 0);
+int execl(const char *path, const char *arg, ... 
+    /* (char *) NULL */);
+```
+
+### popen
+```
+#include <stdio.h>
+
+FILE *popen(const char *command, const char *type);
+```
+실행시킨 명령어와 표준 입력/ 표준 출력을 주고 받기 위한 용도로 사용함.
+(Input/Output pipe를 open하기 위한 용도로 사용함)
+
+### Core vs Thread
+![corethread](./image/corethread.jpg)
+![corethread2](./image/corethread2.jpg)
+
+### thread.h (C11)
+```
+#include <streads.h>
+#include <stdio.h>
+
+int run(void *arg)
+{
+    printf("Hello world of C11 threads.");
+    return 0;
+}
+
+int main(int argc, const char *argv[])
+{
+    thrd_t thread;
+    int result;
+    thrd_create(&thread, run, NULL);
+    thrd_join(&thread, &result);
+    printf("Thread return %d at the end \n", result);
+}
+```
+
+### pthread.h (POSIX)
+```
+#include <pthread.h>
+#include <stdio.h>
+
+void *run (void *arg)
+{
+    printf("Hello world of POSIX threads.");
+    return 0;
+
+}
+
+int main()
+{
+	pthread_t thread;
+	int result; 
+	pthread_create(&thread, NULL, run, NULL );
+	pthread_join(thread, &result);
+	printf("Thread return %d at the end\n", result);
+}
+```
+* POSIX Thread의 약자로 유닉스 계열 POSIX 시스템에서 병렬적으로 작동하는 소프트웨어를 작성하기 위하여 제공하는 API
+* 즉, 스레드를 편하게 만들 수 있게 도와주는 API
+    * API (Application Programming Interface)
+        * 애플리케이션 소프트웨어를 빌드하고 통합하기 위한 정의 및 프로토콜 세트
+        * 구현 방식을 알지 못하는 제품 또는 서비스와도 통신할 수 있음
+        * 애플리케이션 개발을 간소화하여 시간과 비용을 절약할 수 있음
+        * 새로운 툴과 제품을 설계하거나 기존 툴과 제품을 관리할 때 유연성을 높이고 설계, 관리, 사용 방법을 간소화 가능
+        * 리소스에 대한 액세스 범위를 넓히는 동시에 보안과 제어 유지
+
+## **Lecture 14** [2022.01.26]
+
+## **Lecture 15** [2022.01.27]
+
+### Software Testing
+* 실제 결과가 예상 결과와 일치하는지 확인하고 소프트웨어 시스템에 결함이 없는지 확인하는 활동
+* 하나 이상의 관심 속성을 평가하기 위한 소프트웨어 구성 요소 또는 시스템 구성 요소의 실행을 포함
+* 실제 요구 사항과 달리 오류, 결함 또는 누락된 요구 사항을 식별하는데 도움이 됨
+* 수동으로 또는 자동화 된 도구를 사용하여 수행 가능
+* 중요성
+    * 소프트웨어 버그가 비싸거나 위험할 수 있기 때문
+    * 소프트웨어 버그는 잠재적으로 금전적 손실과 인적 손실을 초래할 수 있음
+* 유형
+|테스트 범주|테스트 유형|
+|:---:|:---:|
+|기능 테스트|* 단위 테스트<br>* 통합 테스트<br>* Smoke<br>* UAT(사용자 수용 테스트)<br>* 현지화<br>* 세계화<br>* 상호 운용성|
+|비 기능 테스트|* Performance<br>* Endurance<br>* Load<br>* Volume<br>* 확장성<br>* 유용성|
+|유지|*회귀 분석<br>* 유지|
+* 테스팅 방식(결함을 발견하는 메커니즘)
+    * 정적 테스트
+        * 소프트웨어를 실행시키지 않고 결함을 검출하는 방법
+        * 특징 : 코딩 규칙, 가이드 준수 여부 검사
+        * 장점 : 코드 실행 전 사용
+        * 단점 : 정확도 상대적 낮음
+        * 인스펙션
+            * 공식적 검사
+            * 프로그램을 실행하지 않고 산출물을 대상으로 공식적 검토, 결함 발견 과정
+            * 구성 : 이해 관계자, 중재자, 검토자, 기록자
+        * 피어 리뷰
+            * 동료 검토
+            * 프로젝트 수행과정에서 각 단계 별 산출물, 제품에 대해 동료들이 상호 교차하여 검토 수행하는 활동
+            * 구성 : 프로젝트 팀원, 체크리스트
+        * 워크쓰루
+            * 비공식 검토
+            * 프로젝트 개발 초기에 팀 내에서 수행하는 검토 과정
+            * 구성 : 프로젝트 팀원
+![informal](./image/informal.jpg)
+|구분|인스펙션|피어 리뷰|워크쓰루|
+|:---:|:---:|:---:|:---:|
+|공식성|Formal|Mid Formal|Informal|
+|개념|산출물 대상 공식 검토|개발단계별 산출물 대상 동료 검토|소팀 내 결함 해결방안 상호 검토|
+|목적|요구사항 확인|계획의 적합성 평가|결함 발견|
+|기법|이해관계자 산출물 검사|검토 회의|집중 검토 기법|
+|규모|3 ~ 6명|3명 이상|2 ~ 7명|
+|참석자|이해관계자|경영자, 개발 관리자|개발자|
+|리더십|훈련된 중재자|선임 관리자|개발자 본인|
+|결함 기록|공식 기록|공식 기록|개인별 기록|
+
+    * 동적 테스트
+        * 소프트웨어 실행을 통해 소프트웨어에 존재하는 결함을 검출하는 방법
+        * 특징 : 단독분석보다 정적 기법 병행 수행 적용
+        * 장점 : 오류 탐색 정확도 높음
+        * 단점 : 코드 전체 수행 어려움
+
+* 테스트 방식
+    * 화이트박스 테스트 (White Box Test)
+        * 응용 프로그램의 내부 구조, 동작을 디테일하게 거사하는 테스트 방식
+        * 유형
+            * 경로 테스트
+            * 루프 테스트
+            * 상태 테스트
+    * 블랙박스 테스트 (Black Box Test)
+        * 소프트웨어의 내부 구조나 작동 원리를 모르는 상태에서 동작을 검사하는 방식
+        * 유형
+            * 기능 테스트
+            * 비 기능 테스트
+            * 회귀 테스트
+    * Static
+        * 프로그램을 실행하지 않고 소스 코드 전체 또는 일부를 분석하는 기법
+    * Dynamic
+        * SW를 실행하여 다양한 입력 값에 대해 기대하는 결과 값이 나타나는지 확인하는 테스팅 기법
+
+### testcode.c
+```
+#include <stdio.h>
+/* test code for input var */
+
+int g_var1 = 0;
+void exFunc(int * var);
+int inputVarTest(int a){
+	int ret = 0;
+
+	if (a == 100 && g_var1 == 10) {
+		ret = 100;
+	}else if(a == 50 && g_var1 ==5){
+		ret =50;
+	}else {
+		ret =-1;
+	}
+	
+	return ret;
+}
+struct strc{
+	unsigned char state;
+};
+
+int bitFunc(struct strc data){
+
+
+	struct strc data2;
+	if((data.state & 0x02) == 0x02){ /* [CS_IGNORE=MISRA_C_2012.MISRA_C_2012_10_04;의도된 코드] */
+		printf("state1 = %X\n",2);
+		printf("state2 = %X\n",data.state);
+		printf("state3 = %d\n",data.state);
+	}else{
+		printf("state4 = %X\n",0x02 & 0x02);
+		printf("state5 = %X\n",data.state);
+		printf("state6 = %d\n",data.state);
+	}
+	return 0;
+}
+
+/* test code for undefined func Stub */
+int undefinedFunc(int arg);
+int definedFunc(int arg){
+	return (arg * 12) + (arg * 100);
+}
+
+void undefinedStubTest(int a) /* [CS_IGNORE=MISRA_C_2012.MISRA_C_2012_02_07;TEST] */
+{
+	int j;
+	int	l;
+
+	j = undefinedFunc(l);
+	if(j == 100 ){
+		j=0;
+
+	}else{
+		j=1;
+	}
+}
+
+/* test code for defined func Stub */
+void definedStubTest(int a)
+{
+	int j, l;
+
+	j = definedFunc(a);
+	if(j == 112 ){
+		j=0;
+	}else if(j ==336){
+		j=1;
+	}else{
+		j=2;
+	}
+}
+
+
+/* Test code for void pointer */
+struct S {
+   int m1;
+   float m2;
+};
+
+int VoidPtrTest(void* arg)
+{
+   int ret = 0;
+   struct S *ptr = (struct S*)arg;
+   if (ptr->m1 == 0) {
+      ret = 0;
+   }else{
+      ret = 1;
+   }
+   return ret;
+}
+
+/* test code for static local var */
+void staticVarTest(){
+	static int a = 0;
+
+	if(a==0){
+		a++;
+		return;
+	}else if(a==1){
+		a=3;
+		return;
+	}else if(a==3){
+		a++;
+		return;
+	}
+	else
+	{
+		/* exception */
+	}
+
+	return;
+}
+
+void funcCall(){
+	testA();
+	testB();
+	testC();
+}
+/* test code for local var - call by reference */
+void localVarTest(){
+	int local_var =0;
+	int flag = 0;
+	exFunc(&local_var);
+	if(local_var == 1){
+		flag = 1;
+	}else if(local_var ==2){
+		flag = 2;
+	}else{
+		flag = 0;
+	}
+}
+
+/* test code for Null Check */
+struct data {
+	int a;
+	char *b;
+};
+
+int testMe(int a, int b , char c){
+	return 0;
+}
+int pointerTest(struct data *pData)
+{
+	if(pData == 0){
+		return -1;
+	}else if(pData->a == 0){
+		return 0;
+	}else if (pData->a == 1){
+		return 1;
+	}
+	else
+	{
+		/* exception */
+	}
+	pData->b = (char *)malloc(10);
+	strcpy(pData->b, "mwyun");
+}
+
+
+#ifdef UNIT_TARGET
+/* Test code for virtual memory */
+
+#define READ_REG(ADDR) (*(volatile unsigned long*)(ADDR))
+typedef struct strname{
+	int a;
+}AAA;
+#define REG_BASE_ADDR 0xFFE40000U
+#define (*(unsigned int *)AAA) 0xFFFF0230u
+typedef unsigned char	uint8_t;			// unsigned  8-bits : begins with 'b'
+typedef char			int8_t;			//   signed  8-bits : begins with 'c'
+typedef unsigned int	uint16_t;			// unsigned 16-bits : begins with 'w'
+typedef int				int16_t;			//   signed 16-bits : begins with 'i'
+typedef unsigned long	uint32_t;			// unsigned 32-bits : begins with 'u'
+typedef long			int32_t;			//   signed 32-bits : begins with 'l'
+typedef float           float32_t;			// single precision IEEE 754 32-bits : begins with Capital
+typedef double			int64_t;
+
+extern volatile uint32_t ulAdcColumnWriteIndex;
+int virtualMemoryTest1(){
+	*(uint8_t *) ((((uint32_t)0x68000000) + (((uint32_t)0x2340) * 2)) + (ulAdcColumnWriteIndex * ((uint32_t)8) )+ 0)=100;
+	/*if(READ_REG(REG_BASE_ADDR)==10){
+		return 10;
+	}*/
+	return -1;
+}
+
+
+void virtualMemoryTest2(void)
+{
+    if(AAA&0x01==0x01){}
+}
+
+/* test code for infinite loop */
+int infiniteLoopTest(int arg){
+	
+	while(1){
+		return arg;
+	}
+}
+
+#endif
+```