본문 바로가기

운영체제26

4-2. Process ID & Handle PROCESS ID란? 프로세스가 만들어지면 2개의 핸들이 생성된다. PROCESS KERNEL OBJECT (PKO), THREAD KERNEL OBJECT (TKO) TKO가 생기는 이유는 프로세스 생성 시 주 스레드가 자동으로 생성되기 때문 PID를 구하는 방법 1. 자신의 프로세스 ID 구하기 GetCurrentProcessId() : 내 PROCESS ID 구하기 GetCurrentThreadId() : 내 THREAD ID 구하기 #include #include using std::cout; using std::endl; int main() { DWORD pid = GetCurrentProcessId(); cout 2022. 9. 13.
4-1. Kernel Object 윈도우 핸들 A라는 프로세스가 윈도우를 만들어서 3000번이라는 핸들을 받았다고 가정한다. 이 3000번이라는 번호를 B 프로세스에게 전달한다고 했을 때 B 프로세스가 A 프로세스가 만든 핸들을 조작할 수 있을까? OK 윈도우 핸들은 모든 프로세스에 개방적이다. 그렇다면 CreatePen의 반환값인 Pen 객체는 어떨까? CreatePen의 반환값으로 나온 Pen도 같은 방법으로 B 프로세스에 전달한다면? B 프로세스가 A 프로세스가 만든 펜의 핸들을 조작할 수 있을까? NO GDI 핸들은 그걸 만든 하나의 프로세스만 사용할 수 있다. 그럼 어떤건 되고 어떤 건 안되는데 이걸 어떻게 판별해야 할까? 이 접근권한은 Object Category라는 카테고리로 분류된다. Object Category User .. 2022. 9. 13.
3-3. 가상 주소 공간과 DLL 가상 주소 공간이란? 두 프로세스 A, B가 켜져 있을 때, A가 물리메모리 0x10000000번대 주소를 사용하고, B가 물리메모리 0x20000000번대 주소를 사용하는 경우를 가정해보자. 어쩌다 A가 실수로 0x21000000번대 주소로 접근해서 잘못 참조할 수 있다. 이걸 막으려면 두 프로세스는 가상의 주소공간을 갖고, 실제 물리 메모리는 운영체제가 관리 해주는게 좋을 것 같다. 물리 메모리를 직접 사용하면 안되는 이유 프로세스 간 안정성이 떨어짐 사용할 수 있는 주소에 제약이 있음 (다른 프로세스의 주소를 피해야 하므로) Page Table 이에 대한 방안으로 Page Table이라는 방안을 통해 해결한다. 페이지테이블은 위와 같은 문제들을 방지하기 위해서 물리 주소와 가상 주소를 매핑해주는 역.. 2022. 9. 12.
3-2 Dynamic Library DLL 만들기 DLL : 동적 연결 라이브러리 // dllmain.cpp : DLL 애플리케이션의 진입점을 정의합니다. #include "pch.h" //dll을 외부에서 사용하려면 __declspec(dllexport) 지시어를 통해 export 해주어야 한다. //이를 export 심볼이라고 한다. __declspec(dllexport) int add(int a, int b) { return a + b; } __declspec(dllexport) int __stdcall sub(int a, int b) { return a - b; } dll 샘플 코드 DLL 빌드 방법 개발자 명령 프롬프트에서 빌드 2. 통합개발환경에서 빌드 dll은 f5로 실행할 수 없고 ctrl + shift + b를 통해 빌드만.. 2022. 9. 11.