본문 바로가기

2017/01

모델 기본 보호되어 있는 글입니다. 더보기
뷰 기본 보호되어 있는 글입니다. 더보기
컨트롤러 기본 보호되어 있는 글입니다. 더보기
애플리케이션 작성 보호되어 있는 글입니다. 더보기
Rails 환경 구축 보호되어 있는 글입니다. 더보기
C9과 Bootstrap을 이용해 간단히 홈페이지 만들기 보호되어 있는 글입니다. 더보기
메모리 관리 메모리 관리 Virtual Memory Control Reserve는 예약, Commit은 할당, Free는 할당되지 않음을 말한다. Windows 시스템에서 부여할 수 있도록 정의한 페이지의 상태를 말하는 것이다. 페이지의 총 개수는 가상 메모리 크기 / 페이지 하나당 크기 = 페이지의 개수 로 나타낼 수 있다. Commit은 물리 메모리에 할당이 이루어진 부분들이다. malloc을 통해 메모리 할당하는 것 또한 메모리의 페이지는 Commit 상태가 된다. 반대로 할당되지 않은 부분은 free 상태이다. Commit과 Free를 이용해서 상태를 나타낼 수 있지만 Reserve 상태라는 것을 두고 예약 공간을 만들어 둔다. 메모리의 사용량이 늘어남에 따라서 Commit 상태의 페이지 수를 늘릴 수 있는 .. 더보기
비동기 I/O (Asynchronous I/O) 비동기 I/O (Asynchronous I/O) 만들어 놓은 프로그램이 CPU 사용량을 확인했을데 들쭉날쭉하다면 뭔가 잘못만들어 졌을 가능성이 매우 큽니다.사용량이 큰 폭으로 사용된다면 성능저하가 일어나기 때문입니다. 가령 모든 데이터를 받아낸 뒤에 실행이 된다면 데이터를 받아오는 동안에는 어떠한 작업도 하지 못하게 됩니다. 예를 들어 동영상을 볼 때 동영상 데이터를 모두 받아온 뒤 영상이 나온다면 그 동안은 영상을 볼 수가 없게 되는 것이죠. 이러한 방식은 동기 I/O (Synchronous I/O)라 합니다. ANSI 표준 함수를 이용해 만들어진 프로그램들은 Synchronous I/O 방식으로 만들어 집니다. 한번 호출되면 완료될 때까지 유지되는 현상을 Blocking이라 하는데 이러한 함수들을 가.. 더보기
SEH (Structured Exception Handling) SEH (Structured Exception Handling) __try, __except를 이용하는 방법을 말합니다. try에서 실제 처리할 코드를 넣어주고 except에서 예외가 발생했을 때 처리하는 코드를 넣어줍니다. 보통 코드를 작성을하면 if문을 통해서 NULL일 경우에 대해 GetLastError()을 이용하여 어떤 에러가 발생했는지 화인합니다. 모든 부분에 if문을 통해서 처리를 할 수도 있지만 SEH를 이용할 수도 있습니다. Termination Handler Termination Handler는 종료 핸들러라고 하는데 이 핸들러에서 사용되는 키워드는 __try, __finally를 사용합니다. 123456789101112131415161718192021222324252627#includ.. 더보기
type confusion 보호되어 있는 글입니다. 더보기
strcmp 보호되어 있는 글입니다. 더보기
md5 password 보호되어 있는 글입니다. 더보기
md5_compare 보호되어 있는 글입니다. 더보기
login filtering 보호되어 있는 글입니다. 더보기
flee button 보호되어 있는 글입니다. 더보기
캐쉬와 가상메모리 캐쉬와 가상메모리 12345678910111213141516171819202122232425262728293031323334#include #define ARR_LEN 5 void bubblesort(int srcArr[], int n){ int i, j, temp; for(i = 0; i RAM > 하드 디스크 순으로 갈 수록 더 큰 블록을 가져오게 됩니다. L1 캐쉬가 가득찬 상태에서 데이터가 없어 L2 캐쉬에서 가져오게 될 경우에는 캐쉬 교체 정책에 의하여 가장 오래전에 참조된 블럭을 밀어 내 버립니다. 가상 메모리 메인 메모리는 1GB인데 어덯게 프로세스에 4GB를 할당해서 사용할 까요? 가령 16M의 메모리를 사용하는 환경이 있다고 한다면 물리 메모리 관점으로만 보자면 정확히 16MB의 메모리 .. 더보기
쓰레드 풀 (Thread Pool) 쓰레드 풀 (Thread Pool) 쓰레드가 계속해서 생성되고 소멸되면 시스템에 많은 부담을 줍니다. 쓰레드를 소멸시키지 않고 다시 사용하는 것을 쓰레드 풀이라고 합니다. 123456789101112131415161718192021typedef void(*WORK) (void); typedef struct __WorkerThread{ HANDLE hTread; DWORD idThread; } WorkerThread; struct __ThreadPool{ WORK workList[WORK_MAX]; WorkerThread workerThreadList[THREAD_MAX]; HANDLE workerEventList[THREAD_MAX]; DWORD idxOfCurrentWork; DWORD idxOfLas.. 더보기
생산자/소비자 모델 생산자/소비자 모델 생산자/소비자 모델을 풀어 말하면 실행 순서에 있어서의 동기화라고 할 수 있다. 가령 빵을 만드는 생산자가 빵을 구워서 테이블에 두면 소비자는 빵을 사먹을 수 있다. 이 순서가 바뀌어 소비자가 비어있는 테이블에 빵을 찾게 되고 그 뒤 생산자가 빵을 놓게 된다면 적절하지 못한 순서가 된 것이다. 실행 순서가 동기화 되지 못한것이다. 실행 순서에 있어서 동기화를 생산자/소비자 모델이라 부르는 이유이다. 이를 바탕으로 한 쓰레드가 문자를 입력 받고 출력하는 역할을 모두 실행한다면 출력속도가 입력속도를 따라가지 못하는 경우가 발생하게 되고 어느 순간 문자열이 손실될 것입니다. 위와 같은 현상을 방지하고자 두개의 쓰레드를 이용합니다. A 쓰레드는 입력만 받고 B 쓰레드는 출력만 하는 것이죠.A.. 더보기
쓰레드 동기화 쓰레드 동기화 동기화라는 단어는 무언가 상태가 동일함을 말하는데 쓰레드 동기화는 정해진 순서가 잘 지켜지고 있음을 말합니다.A 쓰레드의 결과를 B쓰레드가 출력을 한다고 가정할때 정상적인 순서로는 A 쓰레드가 실행이 된 후 B 쓰레드가 실행이 되어야 합니다. 하지만 B 쓰레드가 먼저 실행되면 정상적으로 출력할 수 없게 되죠. 따라서 쓰레드의 실행 순서를 정의하고 이 순서에 맞게 따르도록 하는 것이 쓰레드 동기화 라고 합니다. A 쓰레드와 B 쓰레드가 같은 메모리 영역에(데이터, 힙)에 접근한다면 문제가 발생할 것입니다. 이러한 동시 접근을 막는것 도한 동기화에 해당합니다. 동기화의 두가지 방법 유저모드 동기화동기화가 진행되면서 커널의 힘을 빌리지 않는 기법을 말합니다. 커널 모드로 전환이 불필요하기 때문에.. 더보기
Thread 생성과 소멸 Thread 생성과 소멸 Windows에서 쓰레드를 생성하는 함수는 CreateThread()이다. 쓰레드의 최대 개수는 메모리가 허용하는 만큼 가능하다. 쓰레드 또한 독립된 스택을 사용하기 때문에 이러한 스택을 만들기 위해 메모리가 허용하는 만큼가능하다. CountThread.cpp1234567891011121314151617181920212223242526272829303132333435363738394041424344#include #include #include #define MAX_THREAD (1024*10) DWORD WINAPI ThreadProc(LPVOID lpParam){ DWORD threadNum = (DWORD)lpParam; while (1) { printf("Thread nu.. 더보기
쓰레드 (Thread) 쓰레드 (Thread) 하나의 프로그램이 둘 이상의 프로세스를 생성한다면 컨텍스트 스위칭이 비번하게 일어납니다. 앞서 포스팅에서 컨텍스트 스위칭이 빈번하게 일어나면 성능저하가 일어난다고 했습니다.그렇다면 컨텍스트 스위칭이 적게 일어나면 되는데, 풀어 말하면 저장하고 복원하는 컨텍스트의 정보 개수를 줄이면 됩니다. 프로세스의 경우 완전히 독립적인 영역이기 때문에 공유를 할 수 없지만 쓰레드의 경우에는 하나의 프로그램에서 둘 이상의 흐름을 만들어 내기 위한 것이기 때문에 프로세스와 달리 공유하는 상태 정보가 있습니다. 따라서 쓰레드를 사용하는 이유에는 공유하는 요소가 잇고, 컨텍스트 스위칭에 걸리는 시간을 줄이기 위한 것입니다. 쓰레드의 특성 1. 쓰레드마다 스택을 독립적으로 할당한다. 프로세스와 마찬가지로.. 더보기
우선순위 알고리즘 우선순위 알고리즘 프로세스마다 우선순위를 부여해 우선순위가 높은 프로세스를 먼저 실행시키는 방식이다. 가령 A프로세스가 B프로세스 보다 높은 우선순위를 가진다고 한다면 일반적으로 생각해 봤을 때 A프로세스가 어느정도 실행이되고, B프로세스 또한 어느정도 실행된다고 생각할 수 있다. 하지만 보편적인 운영체제에서 B프로세스는 실행이 되지 않는다. 이 상태를 기아상태라고한다. 그렇다면 반대로 일반적으로 생각하는 것이 맞다면 A와 B프로세스가 단순히 임의의 메시지를 출력하낟고 한다면 I/O 작업을 하는 과정에서 낮은 우선순위르 프로세스가 실행될 수 있다.이와 같은 상태에서 기아상태가 발생하는 것은 매우 드문일이다. 라운드로빈 알고리즘 그렇다면 우선순위가 같은 경우 어떤 프로세스를 먼저 실행시켜야 할까? 프로세스.. 더보기
프로세스 환경변수 프로세스 환경변수 환경변수는 프로세스별로 별도의 메모리 공간에 문자열 데이터를 저장하고 관리 할 수 있도록 되어있습니다. 문자열 구조는 key = value로 이루어져 있습니다.마치 python에서 dictionary 방식? 이라고 생각하면 쉬울 것 같습니다. EnvParent.cpp 123456789101112131415161718192021222324252627#include #include #include int _tmain(int argc, TCHAR* argv[]){ SetEnvironmentVariable(_T("Good"), _T("morning")); SetEnvironmentVariable(_T("Hey"), _T("Ho!")); SetEnvironmentVariable(_T("Big").. 더보기