분류 전체보기 96

10-1. 절차적 함수 호출(Procedure Call) 지원 CPU 모델

스택 프레임(Stack Frame) - 함수 별로 선언된 변수들의 메모리 공간의 구분 - 다음에 저장할 메모리 주소를 레지스터의 SP(Stack Pointer)에 저장 FP Register - 레지스터에는 반환 후 SP 위치를 알지 못함 - 반환 후 되돌아갈 주소를 저장하는 레지스터 공간은 FP(Frame Pointer) Register - 다시 말하면 FP는 SP의 백업 FP Register 문제점 - 함수 내 함수 호출이 반복적으로 실행되면 FP가 덮어쓰게 됨 - 이를 해결하기 위해 FP의 백업이 필요 FP Register 해결책 - 스택 메모리를 FP의 백업으로 사용 - FP가 덮어쓰기가 되기 전 SP가 가리키는 메모리 주소에 현재 FP의 주소 값을 저장 - 반환은 이를 역순으로 사용 정리 1. 메..

9. 프로세스의 스케줄링

일반 OS와 리얼타임(Real Time) OS의 차이점 - 두 OS를 결정짓는 요소는 스케줄러 - 리얼타임은 다른 말로 실시간을 뜻함 └ 프로그램 실행 시 즉시 실행되도록 스케줄링 함 └ 응답성이 좋지만 프로그램 속도가 빠른 것은 별개 - OS는 클럭을 기준으로 타임 슬라이스(Time Slice)를 정함 └ 일반적으로 1ms를 1 TS - 일반 OS는 TS가 크고, 리얼타임 OS는 상대적으로 작음 선점형 OS와 비선점형 OS - 우선순위가 높은 것을 먼저 실행해야 하는 것이 OS의 의무 - 선점형 OS의 스케줄러는 우선 순위가 낮은 것을 즉시 뒤로 밀어내고 우선 순위가 높은 것이 먼저 실행 됨 └ 상대적으로 스케줄러가 하는 일이 많음 └ 스케줄러가 더 많이 프로세스의 실행에 직접적으로 관여함 - 비선점형..

8-3. 파이프 방식의 IPC

IPC별 특성 메일슬롯 이름없는 파이프 이름있는 파이프 방향성 단방향, 브로드캐스팅 단방향 양방향 통신범위 제한 없음 부모 자식 프로세스 제한 없음 이름없는 파이프 - PC 이름이 없음을 의미 - 부모 프로세스가 만들 파이프를 통해 서로 데이터를 송/수신할 수 있음(위험 요소로 작용) 이름있는 프로그래밍 모델 1) CreateNamedPipe 함수를 통해 파이프를 생성하지만 바로 외부와 통신은 불가 2) ConnectNamedPipe 함수로 연결 대기 상태로 전환 3) Client의 CreateFile 함수 호출에 의해 파이프에 연결하여 데이터를 송/수신 예제) NamedPipe_Server.cpp #include #include #include #include #define BUF_SIZE 1024 i..

8-2. 핸들 테이블과 오브젝트 핸들의 상속

핸들테이블의 이해 - 핸들 테이블은 프로세스마다 독립적 핸들테이블의 상속 - CreateProcess 함수에서 5번째 인자 값으로 bInheritHandles라는 BOOL 값에 따라 핸들테이블 상속이 가능 - 핸들 테이블의 데이터 마다 상속 여부가 있으며, Y가 되어 있는 핸들 데이터만 상속이 가능 ex) 핸들 테이블 예시 핸들 주소 상속여부 127 0x1200 Y 168 0x1680 N 256 0x2400 Y ..... SECURITY_ARRTIVUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; // 핸들 상속 여부 ..... CreateMailSlot(....&sa); // &sa는 4번..

8-1. 프로세스 환경변수

프로세스 환경변수의 구성 환경변수 데이터를 저장하는 함수 : SetEnvironmentVariable("Key", "Value"); 환경변수 데이터를 가져오는 함수 : GetEnvironmentVariable("Key", 반환할 포인터 변수,); * 환경변수 테이블은 자식 프로세스에게 복사하여 보낼 수 있음 ex) EnvParent.cpp #include #include #include int _tmain(int argc, TCHAR* argv[]) { SetEnvironmentVariable(_T("Good"), _T("morning")); SetEnvironmentVariable(_T("Hey"), _T("Ho!")); SetEnvironmentVariable(_T("Big"), _T("Boy"));..

7-2. Signaled & Non-Signaled

커널 오브젝트의 상태 - 상태: 리소스의 현재 상황을 알리기 위함 - 만약 자식 프로세스를 생성했다면 자식 프로세스의 커널 오브젝트의 상태 정보는 Non-Signaled로 초기화되며 실행중을 의미함 - 실행이 종료되면 프로세스 커널 오브젝트는 Signaled 상태가 됨 - 커널 오브젝트 상태를 통해서 핸들을 가진 프로세스가 그 상태를 알 수 있음 상태관찰 시나리오 - 자식 프로세스의 커널오브젝 핸들의 값이 7이라면 - 부모 프로세스는 자식 프로세스의 상태를 알기 위한 함수(WaitForSingleObject())에 매개변수로 핸들 값 7을 대입하면 자식 프로세스의 상태를 알 수 있음 - 자식 프로세스가 Signaled 상태(종료된 상태)에는 WaitForSingleObject의 함수가 바로 반환되지만, ..

7-1. 프로세스간 통신(IPC)

* 하나의 프로세스가 하나의 프로그램이라는 생각을 할 수 있는데, 하나의 프로그램이 여러 프로세스로 형성될 수 있다. 이는 여러 프로세스 간의 통신이 이뤄져야 함을 뜻한다. IPC * 프로세스간 통신 - 프로세스간 데이터 송/수신 → 메모리 공유 - 데이터를 주고 받는 행위는 공유되어지는 메모리 공간을 생성하는 것과 같음 ex) 프로세스 A, B의 메모리 영역은 완전히 분리되어 있음 프로세스 A 영역 프로세스 B 영역 Data 영역 Data 영역 Heap 영역 Heap 영역 Stack 영역 Stack 영역 - OS는 안정성의 이유로 프로세스간의 메모리 영역에 접근하는 것을 막고 있기에 분리되었다고 볼 수 있음 - 이에 대한 해결책으로써 IPC를 제공함 메일슬롯 * 동작 원리 - 메일 슬롯은 우체통의 원리..

6-2. 커널 오브젝트와 핸들의 종속관계

- 프로세스 A와 A가 생성한 프로세스 B가 있다면 커널 오브젝트도 각각 1개씩 연결되어 있다. 프로세스A는 핸들 인덱스 값으로 커널 오브젝트에 접근하게 되는데, 프로세스 A가 프로세스 B의 핸들도 접근할 수 있다. 만약 프로세스 B가 소멸되지만 프로세스 A가 여전히 프로세스 B의 핸들을 통해 커널 오브젝트에 접근이 가능하기에 운영체제 영역에서 프로세스 B의 커널 오브젝트를 소멸시키지 않고 유지하게 된다. 즉, 운영체제는 커널 오브젝트에 하나라도 접근하는 프로세스가 있다면 커널 오브젝트를 유지시킨다. Q. 메인 함수에서 리턴 값은 어떤 의미가 있는가? A. 부모 프로세스는 자식 프로세서의 실행 상태를 알아야 하기에 정상적 종료를 했는지에 대한 값을 알아야 하기에 리턴 값은 프로세스의 커널 오브젝트에 종료..

6-1. 커널 오브젝트에 대한 이해

커널 오브젝트 * 커널 오브젝트(Kernel Object) - 커널(kernel)에 의해 관리되는 리소스 정보를 담고 있는 데이터 블록 - OS(운영체제)의 핵심 or 알맹이는 커널에 해당됨 - 리소스는 OS에 의해 생성/소멸되는 데이터를 말함 Kernel Object Resource 파이프 커널 오브젝트 ←─→ 파이프 프로세스 커널 오브젝트 ←─→ 프로세스 쓰레드 커널 오브젝트 ←─→ 쓰레드 - 예를 들어 파일에 대한 접근 정보는 OS가 가지고 있어서 사용자가 파일 접근에 대해 관리하게 됨 - 파일을 생성하거나 오픈하게 되면 이에 대한 커널 오브젝트가 생성이 됨(커널 오브젝트 없이 관리되지 않음) - 프로세스 커널 오브젝트에 프로세스에 대한 상태, 우선순위 등에 대한 정보를 담고 있음 - 따라서 커널 ..

5-2. 프로그래밍을 통한 프로세스의 생성

프로세스 생성 함수 Bool CreateProcess( LPCTSTR lpApllicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); - LPSTARTUPINFO, LPPROCESS_INFORMATION 는 사용자가 구조체를 생성하여 인자로 전달해..