본문 바로가기

Programming

윈도우 시스템 프로그래밍_7

[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 2007 윤성우 저
" 시스템 프로그래이란 하드웨어를 사용할 수 있도록 도와주는 프로그램"

= Window 운영체제 기반의 컴퓨터에게 일을 시키기 위한 프로그램 구현하는 것

 18장 파일 I/O 와 디렉터리 컨트롤

CreateFile()

WriteFile()

ReadFile()

 

파일 시간

GetFileTime 함수는 UTC 기반으로 시간 정보를 돌려준다.

UTC 란 Coordinated Universal TIme, 세계 시간 기준을 만들기 위해 정의된 시간이다.

: 1601년 1월 1일을 기준으로 100 나노초 단위 기준으로 지나간 시간을 계산한다.

: 정밀도를 높이기 위해 "Atomic Clock" 이라는 시계가 사용된다.

FileTimeToSystemTime : 년/시/분/초 로 포맷 변경

SystemTimeToTzSpecificLocalTime : 지역별, 국가별 시간대로 변경

 

파일 크기

FILE* fp = fopen("test.dat", "rb")

fseek(fp, 0, SEEK_END) = ftell(fp); // fp를 끝으로 이동시켜서 현재 위치 정보를 얻는다.

파일 크기 : 파일의 데이터를 읽으며 늘어나기 때문에 파일의 마지막 위치가 파일 크기이다.

Window 시스템 함수는 파일 크기를 직접 계산해서 반환하는 함수를 제공한다.

 

파일 특성 정보 얻어오기

GetFileAttribute()

: 파일 경로/ 핸들로 

 

현재 디렉터리

: 실행파일이 존재하는 디렉터리. 이 후 변경 가능하다.

GetCurrentDirectory()

 

표준 검색 경로 

: 찾는 위치를 지정하였을 경우 파일 찾는 순서

1. 실행 중인 프로그램이 로드된 디렉터리

2. 현재 디렉터리

3. 시스쳄 디렉터리

4. 윈도우 디렉터리

5. 환경 변수 PATH에 등록된 디렉터리

 

 


 

 

19장 비동가 I/O 와 APC

Window 관리자의 성능 탭

잘못된 동영상 플레이어의 예시 : 데이터 수신할 때는 CPU가 일하지 않고, 플레이할 때에는 CPU가 일한다. 따라서 CPU가 특정 시간에만 일을 하게 되면 성능이 저하된다.

(비동기 처리)-> 데이터 수신될 때에도 플레이하도록 작업하면 됨 

 

1. 중첩 I/O

1) (논 블로킹)여러 개의 데이터 통신 요청을 여러 번 한다.

2) 각각의 데이터 통신이 들어오면 I/O 처리를 한다.

3) *단 I/O 연산이 끝나면 어떤 것의 연산이 끝났는지 확인을 해야 함

 

 

2. 완료 루틴

1) (논 블로킹)여러 개의 데이터 통신 요청을 만들고

2) 이에 따라 처리할 내용을 묶어 놓는다.

 

3. 알림 가능한 상태

1) A, B, C 실행하고 D를 실행해야 하는데 A가 완료되어 뒤처리, B가 완료되어 뒷처리 하다 보면 D 실행할 시점을 놓치게 된다.

2) 이를 위해 완료 루틴이 실행되는 타이밍을 프로그래머가 결정할 수 있게 되어 있다.

3) I/O 파일 fp는 기록한 파일 위치만을 기록하는데 비동기의 경우 기록 순서가 엇갈릴 수 있음을 주의해야 한다.

 

블로킹: 호출된 함수가 일을 끝낸 다음 함수를 반환. 동기 I/O에서 주로 사용

논블로킹 : 함수 호출되자마자 반환함 비동기 I/O에서 주로 사용

 

 


 

20 장 메모리 관리

디폴트 힙 컨트롤 

동적 할당을 그때마다 넣고 관리하기는 쉽지 않다.

이를 위해 디폴트를 힙을 할당하고 프로그램이 끝나면 그 영역을 통째로 해제하는 방법이 디폴트 힙 컨트롤

 

MMF(Memory Mapped File)

메모리에만 저장하는 것이 아니라 메모리에 연결된 파일에 실제 데이터가 저장되는 것.

1) 파일을 연다.

2) CreateFileMapping 파일 연결 오브젝트 생성

3) MapViewOfFile 반환되는 포인트를 가지고 메모리에 접근하여 파일을 변경

 

Copy-On-Write

쓰레드를 생성할 때 각각의 쓰레드가 참조할 테이블 형태의 데이터가 제공된다. 변경은 드믈게 일어난다. 그렇다면 드믈게 일어나는 변경을 위해 쓰레드 테이블을 독립적으로 각각 만들어 주어야 하는가? 이를 위해서 나온 것이 Copy-On-Write이다.

 

1) 쓰레드를 생성할 때마다 기본 테이블을 복사-할당하지 않고 하나의 테이블을 공유

2) 테이블의 데이터가 변경될 때 기본 테이블을 복사해서 복사본을 변경하게 만든다. 

 

 

 

'Programming' 카테고리의 다른 글

이펙티브 모던 C++_1  (0) 2020.11.01
윈도우 시스템 프로그래밍_8  (0) 2020.10.25
윈도우 시스템 프로그래밍_6  (0) 2020.10.11
윈도우 시스템 프로그래밍_5  (0) 2020.10.04
윈도우 시스템 프로그래밍_4  (0) 2020.09.26