Windows OS
Windows OS - Virtual Memory 사용 VirtualAlloc, VirtualFree
Windows OS - Virtual Memory 사용 VirtualAlloc, VirtualFree
2022.02.28Windows 는 프로세스가 가진 가상 메모리 영역을 관리할때 페이지라고 불리는 단위로 쪼개서 관리한다. 이 page라고 불리는 단위는 x86, x64 아키텍처에서는 4KB이며, IA-64 아키텍처에서는 8KB이다. Windows OS에서는 이 페이지라고 불리는 작다면 작고 크다면 큰 단위의 상태값이 바뀌며 메모리가 관리될 것이다. App, 그러니까 프로세스 에서 사용하는 모든 주소는 가상 메모리 주소이다. 가상 메모리 주소가 실제로 물리 메모리 주소에 매핑 되게 해야 우리는 물리 메모리에 실제로 값을 저장 시킬 수 있다. 어떠한 페이지가 물리 메모리와 매핑된 상태를 commit 상태라고 한다. 그니까 어떠한 페이지가 commit 되었으면, 그 페이지의 시작 주소로부터 4KB는 전부 액세스 되는거다. 어..
Windows OS - 가상 메모리 주소, 물리 메모리 주소
Windows OS - 가상 메모리 주소, 물리 메모리 주소
2022.02.25가상주소와 물리주소 가상주소는 말 그대로 가상의 주소이다. 물리주소는 실제 RAM에 위치한 데이터의 주소이다. 이건 일반적으로 구현하는 App에서는 알 수 없다. App에서 사용하는 모든 주소는 가상주소 이다. 현재 사용중인 PC의 메인메모리(RAM) 용량을 보자. 내 경우엔 16GB 이다. 물리적인 주소는 0x0 ~ 0x 000000FFFFFFFFFF 까지 가능하다. 그런데 실제로 프로그래밍을 해보면 나의 PC에 꽂힌, RAM이 표현할 수 있는 물리적인 영역을 아득히 초과한 번지수가 나오는 경우가 분명히 있다. App에서 사용하는 주소값은 가상 메모리주소이기 때문이다. 메모리 사용시에도 역시 OS와 하드웨어의 통제를 받고 있다. 이 가상 메모리 주소 와 실제 물리적인 주소와의 변환을 MMU가 수행한다...
Windows OS - Windows 제공 Reader/Writer lock SRWLock
Windows OS - Windows 제공 Reader/Writer lock SRWLock
2022.02.20_RTL_SRWLOCK SRWLock; InitializeSRWLock(&SRWLock); //Exclusive Lock , 즉 Write Lock. //Writer 와 공유 X //Reader 와 공유 X AcquireSRWLockExclusive(&SRWLock); ReleaseSRWLockExclusive(&SRWLock); //Shared Lock, 즉 Read Lock. //Writer 와 공유 X //Reader 와 공유 O AcquireSRWLockShared(&SRWLock); ReleaseSRWLockShared(&SRWLock); 정말 빠르다. Reader / Writer Lock을 직접 구현해도 SRWLock보다 빠르기 힘들어 보인다. CriticalSection 과의 차이가 있다. ..
Windows OS - CriticalSection Spinlock으로 사용하기
Windows OS - CriticalSection Spinlock으로 사용하기
2022.02.20EnterCriticalSection 시, 유저모드와 커널모드간 전환이 일어난다. 그런데 만약, 이미 다른 스레드가 공유자원을 가지고 있다는 판단에 커널모드로 전환되는 와중에, 공유자원이 접근 가능하게 되었다면 이는 큰 CPU 낭비로 이어질 수 있다. 때문에, CriticalSection 사용시 일정카운트동안은 스핀락처럼 공유자원 획득을 시도하도록 설정 할 수 있다. CRITICAL_SECTION CS; InitializeCriticalSection(&CS); SetCriticalSectionSpinCount(&CS, 4000); //4000 번 공유자원 획득을 시도하고, 이후에도 실패한다면, 커널모드로 제어를 전환한다.(블로킹 된다.)
Windows OS - 스레드(Thread) 2편
Windows OS - 스레드(Thread) 2편
2022.02.01스레드가 마지막으로 사용했던 레지스터 정보인 Context를 로드한다. 할당받은 시간을 모두 사용하고 다시 메모리에 Context를 저장시킨다. (상술 했듯이 커널메모리 안의 스레드 커널 오브젝트 안에 Context가 저장된다.) 이게 반복되면 시스템에 돌고있는 스레드들이 모두 실행되는 것이다. 윈도우즈 OS는 실시간 OS가 아닌 선점형 멀티스레드 기반 OS이다. OS에 의해 물흐르듯 일어나는 스케쥴링 작업을 App을 작성하는 프로그래머의 마음대로 변경하거나 교체 하는 것에는 한계가 있다. App에서의 스레드 통제는 어디까지나 OS의 판단하에서 적합한 기준내에서 실행된다. 스레드의 정지와 재개 스레드의 정지란 해당 스레드가 CPU시간을 할당받지 않도록 설정하는 것이다. 스레드 커널 오브젝트 내에는 정지카..
Windows OS - 스레드(Thread) 1편
Windows OS - 스레드(Thread) 1편
2022.01.12아주 기본적인 스레드의 개념. '프로세스는 왜 존재하는가' 를 생각해본다.왜 존재하는가? 간단하다. 프로세스는 프로그램 실행을 위해 존재한다. 프로그램 실행은 어떻게 이루어지는가? 프로그램은 명령어의 집합이다. 기계어 명령어를 파일로 만들면 그게 우리가 실행파일이라고 부르는것이 된다. 기계어 명령어가 CPU로 전달되면 CPU는 그것을 이해하고 실행한다. 이게 프로그램의 실행이다. 아무튼, 프로세스는 프로그램 실행을 위해 존재한다고 했다. 여기서 스레드라는 개념이 등장한다. 스레드라는 개념은 프로세스의 개념보다는 비교적 늦게 등장했다. 프로세스가 가지는 프로그램 실행의 개념을 스레드에게 100% 이식했다. 간단한 비유를 하자면 부서가 분리된 것이다. 이 스레드라는 것이 프로그램을 실행한다. 프로세스와 스레..
Windows OS - C/C++ App과 Process(프로세스) 기본
Windows OS - C/C++ App과 Process(프로세스) 기본
2022.01.02Windows OS의 프로세스 Windows OS에서 프로세스는 실행중인 프로그램의 Instance라고 정의된다. 프로세스에 관련된 내용은 정말로 방대하지만, 우선은 기본적으로 간략한 내용들만을 다루기로 한다. 프로세스는 두개의 컴포넌트로 구성된다. 1. 프로세스 관리를 위해 운영체제가 사용하는 커널 오브젝트. 2. 프로세스 실행 모듈 Code, DLL Code, Thread Stack과 Heap 등을 위한 메모리 블럭. 프로세스는 절대로 자력으로 실행될 수 없다. 프로세스의 Context를 실행하는 주체는 어디까지나 Thread이다. 따라서 OS가 프로세스를 생성하면 일단은 무조건 1개의 스레드가 기본적으로 생성되는데, 이를 주 스레드(Primary Thread) 라고 부른다. 프로세스내에 Thread..
Windows OS - Kernel Object(커널 오브젝트)
Windows OS - Kernel Object(커널 오브젝트)
2022.01.02커널 오브젝트는 무엇인가? Windows는 Object의 형태로 OS내의 자원을 관리한다. Object는 메모리 블럭의 형태를 띄고있다. C/C++ 의 구조체를 생각하면 된다. https://docs.microsoft.com/en-us/windows/win32/sysinfo/object-categories Object Categories - Win32 apps The system provides three categories of objects: user, graphics device interface (GDI), and kernel. docs.microsoft.com 이중에서, 그 중요도가 높아 Windows Kernel에 의해서 관리되는 자원을 Kernel Object로 분리해두었다. Windows ..