시작은 미미하나 끝은 쥬쥬하리라.

Study 56

[열혈 C++ 프로그래밍] (2) C언어 기반 C++ 2

C언어 기반 C++ 2 C언어 기반 C++ bool 자료형 참조자의 이해 참조자와 함수 malloc & free를 대신하는 new C언어 기반 C++ const 변수, 객체의 상수화 키워드 const int* ptr1 = &val -> ptr1을 이용하여 val1의 값을 변경 할 수 없음 - const 변수는 반드시 선언과 동시에 초기화 -> 멤버 변수를 const로 선언하는 경우에는 반드시 초기화 리스트(initialize list) 사용 -> Bar의 num은 초기화가 아닌 const int num; 을 선언 한 이후 num = 1;을 시도하는 것 - const 포인터 -> const가 맨 앞에 있으면서 포인터 변수가 가리키 는 값을 상수화를 하는 경우에는 *ptr 상수화 -> const 위치가 자료..

[열혈 C++ 프로그래밍] (1) C언어 기반 C++ 1

C언어 기반 C++ 1 printf와 scanf를 대신하는 입출력 방식 함수 오버로딩 매개변수의 디폴트 값 인라인 함수 이름 공간 범위 지정 연산자 포인터 Printf와 scanf를 대신하는 입출력 방식 iostream iostream : 신 버전 라이브러리 iostream.h : 구 버전 라이브러리 std::endl; 개행 cout = console output, 별도의 서식지정 필요 없음, 연이은 입출력 가능 cin = console input, 별도의 서식지정 필요 없음, 연이은 입출력 가능 데이터선언 C : scanf("%s", str); C++ : cin >> str 함수 오버로딩 동일한 함수명을 가지면서 매개변수형이 다른 n개의 함수 관계 ex) 함수명이 같은데 매개변수가 다른 것 -> O e..

[Window System Programming] Chapter 17. 예외 처리 / SEH & 종료 핸들러 / 예외 핸들러

4-17 예외 처리 / SEH & 종료 핸들러 / 예외 핸들러 예외 처리 SEH & 종료 핸들러 예외 핸들러 예외 처리 CPU의 예외 처리 정책 CPU는 미리 정의된 예외 상황에서 소프트웨어, OS 등이 동작하는 중간에 예외가 발생하면 정책에 따라 처리 -> CPU는 에외 상황이 발생하면 발생 여부만 알려주고 처리의 구체적인 방안은 소프트웨어가 결정 -> 소프트웨어는 예외 처리 핸들러를 마련 해놓고, 예외 발생시 예외 핸들러 동작 -> OS를 하드웨어에 넣는 시점에서 이미 예외 핸들러는 설정 하드웨어 예외 이미 결정되어 있는 CPU의 예외 -> 하드웨어 예외의 처리 결정권은 소프트웨어에게 있음 SEH & 종료 핸들러 SEH Windows OS는 SEH(구조적 예외 기법) 매커니즘을 가지고 있음 -> 1...

[Window System Programming] Chapter 16. 메모리 계층 / 캐쉬와 캐쉬 알고리즘 / 가상 메모리

4-16 메모리 계층 / 캐쉬와 캐쉬 알고리즘 / 가상 메모리 메모리 계층 캐쉬와 캐쉬 알고리즘 가상 메모리 페이지 & 페이지 프레임 메모리 계층 메모리 계층 레지스터 : CPU에 내장, 연산을 위한 저장소 제공 L1 & L2 캐쉬 : CPU와 RAM 사이의 중간 저장소 역할, CPU의 일부가 아닌 CPU에 근접한 메모리 메인 메모리 : RAM ( + 하드디스크 일부 : 스왑 파일) -> 상위 계층으로 갈수록 비용, 속도 증가 -> 메모리 계층 비교 시, 같은 기능을 기준으로 비교 (ex: 메인 메모리의 실행 하드디스크의 실행을 비교) -> 프로그램 실행을 위해서 하위 메모리는 상위 메모리에게 메모리를 전달 -> 상위 메모리에 데이터가 없다면 하위 메모리에 데이터를 요청 -> 프로그램의 지역적 특성 때문..

[Window System Programming] Chapter 15. 스레드 풀링(Pooling)

3-15 스레드 풀링(Pooling) 스레드 풀 스레드 풀 구현 스레드 풀 스레드 풀의 필요성 스레드의 생성과 소멸이 빈번히 일어나면 시스템이 부담 -> 하나의 동작을 위해 하나의 스레드가 생성 후 소멸되고 다시 다른 동작을 위해 다른 스레드 생성/소멸 = 비효율적 스레드 풀 할당된 동작을 마친 스레드를 소멸시키지 않고 스레드 풀에 저장해두었다가 필요한 경우 다시 재사용 -> n개의 동작이 요구되면, 미리 스레드 풀 내부에 저장해둔 스레드를 통해 해당 동작을 처리하고 다시 스레드 풀로 반환 스레드 풀 구현 스레드 풀 구현 고려사항 1. 스레드를 어떻게 동작에 할당할 것인가? 2. 동작을 마무리한 스레드를 어떻게 스레드 풀 내부에 다시 저장할 것인가? 스레드 풀 구현 -> 스레드를 저장할 구조체 선언 : ..

[Window System Programming] Chapter 14. 이벤트 기반 동기화 / 타이머 기반 동기화

3-14 이벤트 기반 동기화 / 타이머 기반 동기화 이벤트 기반 동기화 타이머 기반 동기화 이벤트 기반 동기화 6. 이벤트 기반 동기화 : 접근 기반 동기화 : 순서 기반 동기화 순서 동기화의 필요성 ex) 사용자로부터 입력을 받아 출력하는 프로그램 -> 입력에 의존적, 입력은 사용자에 의존적 -> 10Byte씩 입력을 받다가 100MB의 입력이 이루어지는 경우 데이터 손실 발생 가능성 -> 입력 도중에도 출력이 이루어져야하기 때문에 프로그램 성능이 감당하지 못할 수 있음 -> 입력 스레드와 출력 스레드 사이에 버퍼를 두어, 버퍼가 Full되는 경우 버퍼의 값을 출력 버퍼로 전달해주는 모델 정의 -> 입력 스레드가 버퍼에 데이터를 보내기 이전에 출력 스레드가 출력 동작을 진행하면 쓰레기값 출력 -> 순서..

[Window System Programming] Chapter 13. 스레드 동기화 / 유저 모드 동기화 / 커널 모드 동기화

3-13 스레드 동기화 / 유저 모드 동기화 / 커널 모드 동기화 스레드 동기화 유저 모드 동기화 커널 모드 동기화 스레드 동기화 스레드 동기화 필요 이유 : 다수 스레드의 동시 접근 문제 임계 영역(Critical Section) 둘 이상의 스레드가 동시에 접근할 위험요소를 가지고 있는 코드 블록 -> 임계 영역은 한 번에 하나의 스레드만 접근할 수 있도록 설정을 해주어야 함 -> 위의 과정을 접근 동기화 ex) A스레드가 값을 입력받아 해당 값을 가지고 B스레드가연산을 하는 경우 -> A스레드는 B스레드보다 먼저 실행되어야 함 : 스레드의 실행 순서 컨트롤 -> 위 과정을 순서 동기화 스레드 동기화 메모리의 접근 동기화 + 실행 순서 동기화 동기화 구분 순서 동기화 : 이벤트 기반 동기화 접근 동기화..

[Window System Programming] Chapter 12. 스레드 생성, 소멸 / 스레드 성격, 특성 / 스레드 상태, 우선순위 컨트롤

3-12 스레드 생성, 소멸 / 스레드 성격, 특성 / 스레드 상태, 우선순위 컨트롤 스레드 생성, 소멸 스레드 성격, 특성 스레드 상태, 우선순위 컨트롤 스레드 생성, 소멸 스레드 생성 : createThread() -> 핸들의 상속 여부 -> 스레드의 독립적인 스택 공간 크기(스택 사이즈) -> 스레드 main 함수의 함수 포인터(스레드 main 함수가 전달되면 스레드가 독립적인 루틴을 형성) -> 스레드 main 함수에 전달할 인자, 자료형 -> default Flag -> 스레드 ID 핸들 vs 스레드 ID 핸들 : 프로세스가 가지는 고유한 정수값 -> 해당 프로세스 내에서만 의미를 지님 -> 프로세스가 내부 리소스를 컨트롤하기 위한 목적 스레드 ID : 스레드가 가지는 고유한 ID -> OS 전..

[Window System Programming] Chapter 11. 프로세스 vs 스레드 / 커널 레벨 vs 유저 레벨 스레드 / 커널 모드 vs 유저 모드

3-11 프로세스 vs 스레드 커널 레벨 vs 유저 레벨 스레드 커널 모드 vs 유저 모드 프로세스 vs 스레드 ex) 1인용 테트리스 프로그램 -> 하나의 프로세스 사용 ex) 2인용 테트리스 프로그램 -> 하나의 부모 프로세스에 두 자식 프로세스를 생성해서 구현 -> 만약 프로세스를 상속하면 부모와 자식 프로세스는 모두 데이터/힙/스택/코드 세그먼트가 존재 -> 스케쥴러는 커널 오브젝트 관리와 컨텍스트 스위칭이 부담될 수 있음 일반적으로 코드의 흐름을 2개의 분기로 가져가기 위해서는 함수 호출을 위한 스택이 필요 -> 스택의 논리적 분할이 가능하다면 프로세스를 2개 생성하지 않아도 되지 않을까 ? : 스레드 -> 스레드는 부모 프로세스와 데이터/힙/코드 영역은 공유, 스택만 논리적으로 분할하여 사용 ..

[Window System Programming] Chapter 10. 절차적 함수 호출

3-1 절차적 함수 호출 스택 프레임 / 프레임 포인터 프로그램 카운터 스택 프레임 / 프레임 포인터 스택 프레임 함수 호출 과정에서 할당되는 메모리 블록 -> 함수 호출이 마무리된 이후에는 해당 함수의 지역 변수에 접근 불가 -> 메모리 블록이 함수 호출이 끝나면서 반환되었기 때문 -> main()이 fct1을, fct1은 fct2를 호출하는 구조 -> fct2의 지역변수 e와 h는 fct2 호출이 완료되면 반환되어 사라지는 스택 프레임에 해당 스택이라는 이름이 부여된 이유는 메모리의 구조적인 특성 때문 -> 가장 먼저 할당되면 가장 나중에 반환, 가장 나중에 반환되면 가장 먼저 반환되는 특성 : Stack sp 스택 포인터 기본적으로 스택이 데이터를 쌓거나 반환하기 위해서는 어느 위치까지 데이터를 저..