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 + + +### 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 + + + +### 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>* 유지| +* 테스팅 방식(결함을 발견하는 메커니즘) + * 정적 테스트 + * 소프트웨어를 실행시키지 않고 결함을 검출하는 방법 + * 특징 : 코딩 규칙, 가이드 준수 여부 검사 + * 장점 : 코드 실행 전 사용 + * 단점 : 정확도 상대적 낮음 + * 인스펙션 + * 공식적 검사 + * 프로그램을 실행하지 않고 산출물을 대상으로 공식적 검토, 결함 발견 과정 + * 구성 : 이해 관계자, 중재자, 검토자, 기록자 + * 피어 리뷰 + * 동료 검토 + * 프로젝트 수행과정에서 각 단계 별 산출물, 제품에 대해 동료들이 상호 교차하여 검토 수행하는 활동 + * 구성 : 프로젝트 팀원, 체크리스트 + * 워크쓰루 + * 비공식 검토 + * 프로젝트 개발 초기에 팀 내에서 수행하는 검토 과정 + * 구성 : 프로젝트 팀원 + +|구분|인스펙션|피어 리뷰|워크쓰루| +|:---:|:---:|:---:|:---:| +|공식성|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 +```