블로그 이미지
vee

카테고리

분류 전체보기 (17)
void (1)
Information (0)
Develop (5)
Linux (3)
Hardware (3)
Operating system (5)
Total
Today
Yesterday

달력

« » 2026.7
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

 

Windows.h

기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의하며 그 외 Windows 프로그래밍에 필요한 보조 헤더 파일을 포함하고 있다.

 

Win32 응용프로그램의 Entry Point(시작점)은 main()이 아니라 WinMain()이다.

 

WinMain의 원형

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)

  • WinMain의 원형은 고정되어 있다.
  • APIENTRY 지정자는 Windows의 표준 호출 규약인 __Stdcall을 사용한다는 뜻
  • hInstance : 프로그램의 인스턴스 핸들
  • hPrevInstance : 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들
  • lpszCmdParam : argv에 해당
  • nCmdShow : 프로그램이 실행될 형태이며 최소화, 보통 모양 등이 전달됨

 

WndProc 함수

WndProc 함수는 사용자와 시스템이 보내오는 메시지를 처리하는 역할

Windows 응용 프로그램은 WinMain과 WndProc이 전부 존재해야 정상적으로 동작할 수 있다.

 

WndProc의 원형

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

  • CALLBACK 매크로는 APIENTRY와 마찬가지로 __stdcall로 정의되어 있다.
Posted by vee
, |

 

Windows Application Programming Interface

Windows API

 

Textbook – Windows API 정복 개정판 (한빛미디어, 김상형)

 

첫 번째 예제 – 기본 윈도우 띄우기

 

Source code

#include <Windows.h>

 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE g_hInst;

LPCTSTR lpszClass=TEXT("First API project");

 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)

{

    HWND hWnd;

    MSG Message;

    WNDCLASS WndClass;

    g_hInst=hInstance;

 

    WndClass.cbClsExtra=0;

    WndClass.cbWndExtra=0;

    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

    WndClass.hCursor=LoadCursor(NULL, IDC_ARROW);

    WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);

    WndClass.hInstance=hInstance;

    WndClass.lpfnWndProc=WndProc;

    WndClass.lpszClassName=lpszClass;

    WndClass.lpszMenuName=NULL;

    WndClass.style=CS_HREDRAW|CS_VREDRAW;

    RegisterClass(&WndClass);

 

    hWnd=CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL);

    ShowWindow(hWnd, nCmdShow);

 

    while(GetMessage(&Message, NULL, 0, 0))

    {

        TranslateMessage(&Message);

        DispatchMessage(&Message);

    }

    return (int)Message.wParam;

}

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

    switch(iMessage)

    {

    case WM_DESTROY:

        PostQuitMessage(0);

        return 0;

    }

    return(DefWindowProc(hWnd, iMessage, wParam, lParam));

}

 

Compile

Posted by vee
, |

Operating system concepts
-Paging

Paging

가상 메모리를 모두 같은 크기의 블록으로 편성해 운용하는 기법.
논리 주소 공간이 한 연속적인 공간에 다 모여 있어야 한다는 제약을 없애고, 외부 단편화를 방지하며 압축 작업이 필요하지 않게 만들 수 있다.

페이지는 하드웨어 의존적이다.

 

Basic method

물리 메모리는 Frame이라 부르는 고정 크기의 블록으로 나누어져 있고, 논리 메모리는 Page라 불리는 프레임과 같은 크기의 블록으로 나누어진다.

CPU에서 나오는 모든 주소는 페이지 번호(p)페이지 변위(d:offset)으로 나누어진다.
페이지 번호는 페이지 테이블(page table)을 액세스 할 때 사용되며, 페이지 테이블은 주 메모리에 존재하는 페이지의 기준 주소를 가지고 있다. (페이지의 주소에 페이지 변위를 더하면 메모리 장치로 전송될 물리 주소가 된다)

논리 주소의 형태

페이지 번호 (p)
m-n

페이지 변위 (d)

n

 

디스크의 입장에서는 페이지의 크기가 클수록 효율적이지만, 내부 단편화를 방지하기 위해선 페이지의 크기가 작을수록 효율적이다.

 

Hardware support

대부분의 컴퓨터는 페이지 테이블을 주 메모리에 저장하고 페이지 테이블 기준 레지스터(PTBR, Page-Table Base Register)로 페이지 테이블을 가리키도록 한다.

이 방식의 문제점은 메모리 접근 시간이다.
페이지 테이블 자체가 메모리에 올려져 있기 때문에, 특정 주소로 접근하기를 원한다면 먼저 페이지 테이블을 액세스해야 한다.

이 문제를 해결하는 표준 방법은 TLB(Translation Look-aside Buffers)라는 소형 하드웨어 캐시를 사용하는 것이다.

TLB는 매우 빠른 연관 메모리로 구성되며, TLB 내의 각 항목은 key와 value의 두 부분으로 구성된다.
TLB에 페이지를 찾아달라고 요청이 들어오면, 찾고자 하는 페이지를 동시에 여러 개의 내부 키와 비교하여 같은 것이 발견되면 그에 대응하는 프레임 번호를 알려준다.

만약 페이지 번호가 연관 레지스터 TLB에서 찾아지지 않으면 주 메모리의 페이지 테이블에서 찾아야 한다. 이렇게 해서 프레임 번호가 얻어지면 페이지 번호와 프레임 번호가 TLB에 추가되어 다음 참조 시 매우 빨리 처리할 수 있게 된다.

TLB가 가득 찼다면 OS는 새 항목을 넣기 위해 교체 작업을 해야 하는데, LRU부터 무작위 교체까지 다양한 정책이 사용된다.

 

Effective memory access time

페이지 번호가 TLB에서 발견되는 비율을 hit ratio라고 부른다.

Hit ratio가 80%, TLB 탐색시간이 20ns, 메모리 접근 시간이 100ns일 때
유효 메모리 접근 시간(effective memory access time)은 다음과 같이 구한다.

0.80 * 120 + 0.20 * 220 = 140 ns

Hit ratio가 98%일 때는 122ns

 

 

Protection

페이지화된 환경에서 메모리의 보호는 각 프레임과 연관되어있는 Protection bit에 의해 구현된다.
Protection bit는 보통 페이지 테이블에 속해있으며 페이지의 읽기/쓰기 속성을 정의할 수 있다.

읽기 전용 페이지에 쓰기를 시도하면 OS에게 하드웨어 트랩이 전달된다.

페이지 테이블의 각 엔트리에는 유효/무효(valid/invalid)라는 하나의 비트개 더 있는데,
이 비트가 유효일 경우 관련 페이지가 프로세스의 합법적인 페이지임을 의미하고 무효인 경우 그 페이지는 프로세스의 논리 주소 공간에 속하지 않는다는 것을 나타낸다.

 

Shared page

페이징의 또 다른 장점은 공통 코드를 공유할 수 있는 것이다.

각 프로세스들은 레지스터들의 복사 값과 프로세스가 실행되는 동안 필요한 데이터들을 저장하는 공간을 따로 가지고 있기 때문에 공통 코드를 실행하는데 문제가 없다.

Posted by vee
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함