전체 글 58

20200831 공부

1. 32bit 비트맵파일 읽어서 출력하기 2. 문제만들기 1. 32bit 비트맵파일 읽어서 출력하기 출력결과 백버퍼로 사용할 DIB 생성 BITMAPINFO bmi; SPRITE screen; void CreateBackBuffer(HWND hWnd, int width, int height) { // dib 만들기 bmi.bmiHeader = { sizeof(BITMAPINFOHEADER), width, -height, 1, 32, BI_RGB, (DWORD)width* height * 4, 0,0, 0,0 }; screen.width = width; screen.height = height; screen.image = (BYTE*)malloc(bmi.bmiHeader.biSizeImage); } 비트..

공부 2020.09.01

VirtualAlloc 함수를 이용한 Dynamic Array Design

VirtualAlloc 함수를 이용해서 메모리 예약, 커밋, 해제를 직접 사용해보자 #include #include SIZE_T maxPage = 10; SIZE_T pageCount = 0; SYSTEM_INFO si; LPVOID baseAddr; int PageFaultExceptionFilter(DWORD); int main() { GetSystemInfo(&si); baseAddr = VirtualAlloc( NULL, si.dwPageSize * maxPage, MEM_RESERVE, PAGE_NOACCESS); int dataSize = (si.dwPageSize * maxPage) / sizeof(int); int* dataArr = (int*)baseAddr; for (int i = 0;..

공부 2020.08.15

쓰레드 동기화 인터락 함수

인터락 함수(Interlocked Family Of Function) 기반의 동기화 이전 예제와 같이 전역으로 선언된 변수 하나의 접근방식을 동기화하는 것이 목적이라면, 이러한 용도로 특화된 인터락 함수를 사용하는 것도 나쁘지 않다. 인터락 함수는 함수 내부적으로 한 순간에 하나의 쓰레드에 의해서만 실행되도록 동기화 되어 있다. 변수 값 증가 (32비트) LONG InterlockedIncrement( LONG volatile *Addend ); 변수 값 감소 (32비트) LONG InterlockedDecrement( LONG volatile *Addend ); #include #include #include #include #define NUM_OF_GATE 6 LONG gTotalCount = 0;..

공부 2020.08.06

쓰레드 동기화, 임계영역 접근 동기화

쓰레드 동기화 유저모드 동기화 커널 모드로의 전환이 불필요하기 때문에 성능상의 이점이 있다. 다만 그만큼 기능상의 제한도 있다. 커널모드 동기화 커널에서 제공하는 동기화 기능을 활용하는 방법. 커널 모드로의 변경이 필요하고 이는 성능의 저하로 이어진다. 하지만 유저모드 동기화에서 제공하지 못하는 기능을 제공받을 수 있다. 동기화가 필요한 프로그램 #include #include #include #include #define NUM_OF_GATE 6 LONG gTotalCount = 0; void IncreaseCount() { ++gTotalCount;// 임계영역 } unsigned int WINAPI ThreadProc(LPVOID param) { for (DWORD i = 0; i < 1000; i..

공부 2020.08.06

컨텍스트 스위칭 (Context Switching)

실행중인 프로세스(Running 상태의 프로세스)의 상태변경은 시스템에 부하를 주기도 한다. 실행중인 프로세스가 변경되면 CPU 내에 존재하는 레지스터들의 값이 변경되기 때문이다. 위 그림의 작업을 컨텍스트 스위칭 이라 한다. 프로세스A 레지스터 정보는 메모리에 저장되고, 프로세스B 레지스터 정보는 CPU의 레지스터에 복원시키고 있다. 레지스터 개수가 많은 시스템일수록, 그리고 프로세스별로 관리되어야 할 데이터 종류가 많을수록 시스템에 더 많은 부담을 준다.

공부 2020.08.04

프로세스 상태변화

cpu는 하나인데 어떻게 여러 개의 프로그램이 동시에 실행 가능한 것인가? cpu가 여러 개의 프로세스를 번갈아 가면서 실행하면 된다 프로세스의 cpu 할당 순서 및 방법을 결정짓는 일을 스케줄링 이라고 하고, 이때 사용되는 알고리즘을 스케줄링 알고리즘 이라 한다. 실제로 프로세스를 관리하는 운영체제 요소(모듈)를 스케줄러 라고 한다 Start -> Ready 프로세스 생성과 동시에 Ready 상태로 들어간다. 스케줄러에 의해서 선택되기를 기다린다 Ready -> Running 스케줄러 알고리즘에 의해 선택된 프로세스는 Running 상태가 되어 실행된다 Running -> Ready 프로세스A가 실행중에 운선순위가 더 높은 프로세스B가 실행되면 프로세스A는 Ready 상태로 진입하고 프로세스B는 Run..

공부 2020.08.04

정올 1183 동전 자판기(下) 문제풀이

정올 문제풀이 1183 : 동전 자판기(下) 문제 철수는 동전 자판기를 자주 이용한다. 그래서 그는 항상 상당히 많은 개수의 동전들을 주머니에 가지고 다니는데, 동전들이 주머니에서 짤랑거리는 것을 듣기 싫어한다. 그래서 철수는 동전자판기에서 무언가 살 때는 되도록 많은 개수의 동전을 사용한다. 철수의 주위에 있는 자판기들은 아주 구형인 모델이어서 지폐를 사용할 수 없고, 또, 정확한 액수만을 넣어야 한다. 이 문제는 철수가 가지고 있는 동전 중 최대 개수의 동전을 이용하여 자판기의 물건을 구입하는 방법을 출력하는 프로그램을 작성하는 것이다. 입력형식 첫줄에는 자판기에서 구입하려는 물건의 값 W가 주어진다. 둘째줄에는 6개의 정수가 주어진다. 각각의 정수는 철수가 가지고 있는 500원짜리, 100원짜리, ..

비트맵 이미지블렌딩 프로그램 만들기 (c++ 연습)

가로 세로 크기가 같은 두 개의 32bit컬러 비트맵파일을 블렌딩해서 새로운 bmp 파일로 저장하는 프로그램 만들기 c++ 코드 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 #include #include #include void Blending(const char* pfN..

공부 2020.07.18

정올 2499 저울 문제풀이

정올 문제풀이 2499 : 저울 입력받은 숫자들을 더해서 만들 수 없는 최소 숫자를 구하기 제출코드 c++ #include #include using namespace std; int main() { int n; int arr[1000]; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", arr + i); sort(arr, arr + n, less()); int res = 0; for (int i = 0; i < n; i++) { if (res + 1 < arr[i]) break; res += arr[i]; } ++res; printf("%d\n", res); return 0; } 입력 예 7 3 1 6 2 7 30 1 정렬! 1 1 2 3 6 7 30..