[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 2007 윤성우 저
" 시스템 프로그래이란 하드웨어를 사용할 수 있도록 도와주는 프로그램"
= Window 운영체제 기반의 컴퓨터에게 일을 시키기 위한 프로그램 구현하는 것
15장 쓰레드 풀링
쓰레드 생성/해제를 하는 대신 재활용하는 것
쓰레드 생성/해제를 하는 것은 비용이 많이 든다.
ex) 은행원 5명이 일을 하고 있고 5줄씩 줄을 서 있다가 한 명이 사라지면 손님들을 4명이 받을 수 있도록 재배치해야 한다.
-> 손님들은 한 줄로 서있고 5명이 돌아가면서 일을 처리
*파이프와 리다이렉션
| 기호는 해당 명령어를 다른 프로세스에서 실행시킨다.
ex) text.txt | sort > sort.txt => text.txt 의 내용물을 정렬하여 sort.txt에 저장
16장 컴퓨터 구조에 대한 네 번째 이야기
메모리
*메인 메모리 : RAM,
*레지스터 : CPU안에 내장되어 연산을 위한 저장소를 제공한다.
*캐쉬 : CPU와 RAM 사이에서 중간 저장소 역할을 한다.
*하드디스크
메모리 계층 구조
CPU와 가까이 있을수록 빠르고 멀리 있을 수록 느리다.
메인 메모리에 접근하기 위해서는 버스 인터페이스 컨트롤에 접근해야 하는데 데이터 입출력 위해서는 메모리 버스를 거쳐야 하기 때문에 아예 메모리 안에 있는 레지스터가 제일 빠르다.
CPU가 연산을 할 때 데이터를 찾는 순서
레지스터-> L1 캐쉬 -> L2 캐쉬 -> 메인 메모리 -> 하드 디스크
캐쉬 알고리즘
: 자주 사용하는 주소는 캐쉬에 저장된다. CPU는 어떤 기준으로 캐쉬를 구성할까?
-템퍼럴 로컬리티(Temporal Locality)
코드에서 자주 접근하는 변수를 템퍼럴 로컬리티(Temporal Locality)가 이루어진 상황이라고 한다.
-스페이셜 로컬리티
현재 접근한 메모리 영영인 이미 접근이 이루어진 영역의 근처일 확률이 높을 때 스페이셜 로컬리티라고 한다.
이렇게 캐쉬가 백분 활용될 수 있도록 코딩하는 프로그래머리 캐쉬 프린들리 코드라고 한다.
* 캐쉬에서 데이터를 찾을 때 그 캐쉬에 데이터가 있을 경우 이를 캐쉬 히트가 발생하였다고 한다. / 반대 캐쉬 미스
* L2 캐쉬에서 데이터를 찾았을 경우 이를 L1으로 이동시키는데 데이터 단위는 하나의 블록이다. 단순히 필요한 부분이 아니라 포함하는 블록을 모두 보내는 것(스페이셜 로컬리티에 따라)
*교체 알고리즘
LRU : Lear Rencentrly Used 오래전에 참조된 블록을 밀어내는 알고리즘
캐쉬 프렌드리 코드 작성 기법
ex)
int a[10][10] 을 예로 들어본다.
a[1][0] a[2][0] ......a[1][2] a[2][2] 순으로 접근하면 주소가 넘나드는 범위가 크다.
a[1][0] a[1][1] a[1][2] .... a[9][0] a[9][1] 순으로 접근하면 주소가 4바이트 단위로 넘나들기 때문에 위의 순회보다 스페이션 로컬리티를 만족시킨다고 할 수 있다.
* 가상 메모리
페이징 알고리즘 :
가상 메모리로 4G를 할당하고 실체 CPU에서 메모리를 요구할 때 물리 메모리에 페이징 된 실제 메모리를 적재하는 것
그렇게 해도 물리 메모리를 다 사용한다면? 하드디스크를 사용한다.
스왑 : 하드디스크는 느리기 때문에 하드디스크에 저장해둔 메모리 블록을 램에 스왑 한다. (현재 사용 <-> 사용 안 하는 메모리)
17장 구조적 예외처리 기법 SEH(Streuctureed Exception Handling)
1)
__try {}
__finally {}
__try 안의 구문이 하나라도 실행되면 finally {}가 반드시 실행된다. (리턴이 있더라도 컴파일러는 return에 의해 반환되는 값을 잠시 저장하고 finally를 실행한다.)
**ExitProcess, ExitThread, ANSI C 라이브러리 exit에 의한 종료 또는 쓰레드의 강제 종료는 __finally 실행으로 이어지지 않는다.
활용1
__try{} 에서 처리한 내용을 __finally에서 재점검한다.
ex) ptr == NULL인지
활용2
ReleaseMutex를 __finally에서 진행시킨다.
2)
__try{}
__exception(){}
예외사항을 전달
** EXCEPTION_EXECUTE_HANDLER 프로프램은 예외사항을 처리했다고 가정하고 그다음 줄을 실행한다.
** GetExceptionCode()
** RaiseException : 개발자가 예외처리를 지정
** GetExceptionInformation : 예외 발생 시 더 많은 정보를 얻고 싶다면
'Programming' 카테고리의 다른 글
윈도우 시스템 프로그래밍_8 (0) | 2020.10.25 |
---|---|
윈도우 시스템 프로그래밍_7 (0) | 2020.10.18 |
윈도우 시스템 프로그래밍_5 (0) | 2020.10.04 |
윈도우 시스템 프로그래밍_4 (0) | 2020.09.26 |
윈도우 시스템 프로그래밍_3 (0) | 2020.09.21 |