Skip to content
Snippets Groups Projects
Commit 0827fb83 authored by Nayoung Kim's avatar Nayoung Kim
Browse files

Update lec15

parent 8289b8e3
No related branches found
No related tags found
No related merge requests found
...@@ -1893,3 +1893,418 @@ SET (PROJECT_VERSION_MINOR 1) ...@@ -1893,3 +1893,418 @@ SET (PROJECT_VERSION_MINOR 1)
``` ```
SET (CMAKE_BUILD_TYPE Debug) SET (CMAKE_BUILD_TYPE Debug)
SET (CMAKE_VERBOSE_MAKEFILE true) 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
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment