본문 바로가기

CS

(32)
[C] quickSort 알고리즘 #include void printArray(int arr[], int length);void quickSort(int arr[], int left, int right);int q = 1;int main(void) { int arr[6] = {2, 4, 3, 5, 1, 0}; printf("\nBefore Sorting : "); printArray(arr, 6); printf("\n"); quickSort(arr, 0, 5); printf("\nAfter Sorting : "); printArray(arr, 6);}void quickSort(int arr[], int left, int right) { int leftCounter = left; int rightCounter = right..
[C] Merge Sort 알고리즘 (합병 정렬) #include void mergeSort(int arr[], int left, int right);void merge(int arr[], int left, int mid, int right);void printArray(int arr[], int length);int ms = 1; //mergeSort 함수 호출 횟수, 필수 아님int m = 1; //merge 함수 호출 횟수, 필수 아님int temp[6]; //임시 배열 생성int main(void) { int arr[6] = {29, 30, 6, 26, 23, 2}; printf("\nBefore Sorting : "); printArray(arr, 6); mergeSort(arr, 0, 5); printf("\nAfter Sorting..
CH3.2 소프트웨어 개발 프로세스 CH 3.2 소프트웨어 개발 프로세스3.2.1 Agile 개발 프로세스 개요3.2.2 유저 스토리3.2.3 대표적인 Agile 방법론 3.2.1 Agile 개발 프로세스 개요등장배경 Agile 프로세스는 그 이름처럼 신속한 소프트웨어 개발을 위해 나온 프로세스이다. 소프트웨어를 신속하게 개발하기 위해서는 '잦은 요구사항 변경을 어떻게 해결하는가?' 가 중요하다. 명세서와 코드로는 사용자와 의사소통이 힘들기 때문에 유저에게 반복적으로 프로토타입을 개발하여 보여주고 피드백을 받는 것이 빠른 소프트웨어 개발의 방법이라고 할 수 있다.   사용자에게 가시적인 소프트웨어를 보여주는 개발 접근 방법이 애자일 개발 방법론이다. 반복적으로 개발반복된 테스트유저 피드백 반복적..
CH2. 소프트웨어 품질 CH2. 소프트웨어 품질 2.1 소프트웨어 품질의 중요성 2.2 소프트웨어 품질 요소 2.3 소프트웨어 품질 모델 및 표준 2.4 소프트웨어 품질 관리 소프트웨어 품질이란 구체적으로 무엇을 의미하고, 어떤 품질 요소가 있으며, 이들을 정량적으로 관리하는 방법에 대해 살펴본다. 2.1 소프트웨어 품질의 중요성 사람마다 제품을 선택하는 기준은 다른다. 따라서 사용자가 만족하는 소프트웨어를 개발하는 것 또한 어려움이 따른다. 그럼에도 소프트웨어 공학의 목표는 높은 품질의 소프트웨어를 만들어내는 것이다. 이는 즉, 소프트웨어 개발과 관련된 모든 이해 관계자 Stakeholder의 만족도를 높이는 것으로 해석할 수 있다. 소프트웨어의 품질은 눈으로 확인하기 어렵고, 절대적 평가가 힘들며, 시간이 지날 수록 품질의..
CH1. 소프트웨어 공학 개요 CH1. 소프트웨어 공학 개요 1.1 소프트웨어 고장 사례 1.2 소프트웨어 위기 1.3 소프트웨어 공학 기술의 적용 기존 소프트웨어의 사고 사례를 통해, 소프트웨어에 체계적·공학적 방법을 적용하여 개발하는 이유를 생각해보고 소프트웨어 공학의 필요성을 알아본다. 주요 개념 소프트웨어 위기의 원인과 증상 - 8, 6가지 소프트웨어 개발이 어려운 이유 - 6가지 소프트웨어의 특성 정보, 왜 공학적 기술을 도입해야 할까? - 4가지 소프트웨어 공학적 기법의 종류 - 9가지 소프트웨어 공학의 원리 - 8가지 1.1 소프트웨어 고장 사례 소프트웨어 개요 소프트웨어 = 소스 코드 + 프로그램 + 문저의 집합 소프트웨어의 특징 비가시성 : 눈에 보이지 않음 복잡성 : 다양한 구성 요소와 상호 작용으로 구성 변경성 :..
4.4 스레드의 추가적 이슈들 4.4 스레드의 추가적 이슈들 4.4.1 멀티스레드와 fork(), exec() 4.4.2 자원 동기화 문제 4.4.3 스레드 요약 4.4.1 멀티스레드와 fork(), exec() 만약 멀티 스레드에서 fork() 시스템 콜을 실행한다면 어떻게 될까? 여러 스레드 중 한 스레드가 fork()를 호출할 시, 새로운 프로세스는 fork()를 호출한 스레드만 복제할 것이다. 코드 자체는 복사가 되겠지만, 호출한 스레드만 Running state가 되는 것이다. 또한 한 스레드가 exec()를 호출할 경우 프로세스 전체가 사라진다. 그렇다면 fork()가 모든 스레드를 복제한다면 어떻게 될까? fork() 이후 exec()를 호출한다면 어차피 바뀔 것이므로 모든 스레드를 복제할 이유가 없을 것이다. 그러나 e..
4.3 스레드 모델 4.3 스레드 모델 4.3.1 스레드 모델 종류 4.3.2 멀티 스레딩 모델 4.3.1 스레드 모델 종류 스레드의 모델에는 두 종류가 있다. Kernel-level thread : 운영체제가 커널에서 관리하는 스레드 User-level thread : User-space에서 관리하는 스레드 Kerner-level thread 커널 스레드, 즉 커널이 직접 생성하고 관리하는 스레드이다. 응용 프로그램이 시스템 호출을 통해 커널 레벨의 스레드를 생성한다. 따라서 커널이 스레드에 대한 정보, TCB를 커널 공간에 생성하고 소유하게 되며 커널에 의해 스케줄된다. 스레드 주소 공간 (스레드 코드와 데이터)는 사용자 공간에 존재하게된다. 메인 스레드는 커널 스레드이다. 응용프로그램이 적재되어 프로세스가 생성될 때 ..
4.2 스레드 Deep dive 4.2 스레드 DEEP DIVE 4.2.1 스레드 주소 공간 4.2.2 스레드 Life cycle 4.2.3 스레드 Operation 4.2.4 스레드 Context 이번 시간에는 스레드에 대해 조금 더 깊게 알아볼 것이다. 4.2.1 스레드 주소 공간 스레드가 생성되고 실행되는 동안 접근 가능한 메모리 영역이 스레드 주소공간이다. 스레드 주소공간은 프로세스의 주소 공간 내에 형성된다. 일반적인 함수가 수직적인 관계라면 스레드는 아래와 같이 side-by-side 형태이다. 스레드 사적공간은 스레드 코드, 스레드 로컬 스토리지, 스레드 스택으로 구분 된다. 스레드들이 공유하는 공간은 프로세스의 코드, 프로세스의 데이터 공간 (로컬 스토리지 제외), 프로세스의 힙 영역이다. #include // pthre..
4.1 스레드 개요 4.1 스레드 개요 4.1.1 프로세스의 문제점 4.1.2 스레드의 등장 4.1.3 새로운 문제 4.1.4 스레드 장점과 단점 이번 시간에는 스레드라는 새로운 개념에 대해서 알아볼 것이다. 4.1.1 프로세스의 문제점 지난 시간까지 우리는 프로세스에 대해 배웠다. 프로세스는 메모리에 적재되어 CPU에 의해 실행될 수 있는 프로그램이었다. 이러한 프로세스를 사용하기에는 약간의 문제가 있다. 1. 프로세스 생성의 오버헤드가 크다. 물론 fork() 시스템 콜을 통해 직접 프로세스를 생성하는 것 보다는 간단하지만 그럼에도 오버헤드는 여전히 크다. 메모리를 할당하고, fork() 시스템 콜을 호출하고, PCB를 부여하는 과정은 결코 가볍지 않다. 2. Process context switching의 오버헤드가 ..
4.0 스레드 4.0 스레드 4.1 스레드 개요 4.2 스레드 Deep dive 4.3 스레드 모델 4.4 스레드의 추가적 이슈들