.NET 프레임워크는 다음과 같은 두 개의 주요 컴포넌트로 이뤄져 있다.
- 공통 언어 런타임(Common Language Runtime)
이것은 .NET을 위한 런타임 엔진이며, 공통 중간 언어(Common Intermediate Language) 명령을
하부의 하드웨어 CPU 머신 언어와 가비지 컬렉터, 유형 검사, 코드 접근 보안 등의 명령으로 변환하는 JIT(just-in-time)컴파일러를 포함한다.
CLR은 COM 인프로세스 서버(DLL)로 구현돼 있으며, 윈도우 API가 제공하는 다양한 기능을 사용한다.
- .NET 프레임워크 클래스 라이브러리(Framework Class Library)
사용자 인터페이스 서비스와 네트워킹, 데이터베이스 접근 등과 같은
클라이언트와 서버 애플리케이션이 전형적으로 필요로 하는 기능을 구현하는 대규모 라이브러리다.
서비스와 함수, 루틴
윈도우 사용자와 프로그래밍 문서의 일부 용어는 문메겡 따라 다른 의미를 갖는다.
예를 들면 서비스는 운영체제네ㅏ 디바이스 드라이버, 서버 프로세스의 호출 가능한 루틴을 가리킨다.
다음은 각 용어가 의미하는 바를 설명한 목록이다.
- 윈도우 API 함수
윈도우 API에 문서화돼 있고 호출 가능한 서브 루티능로,
예를 들면 CreateProcess와 CreateFile, GetMessage가 있다.
- 네이티브 시스템 서비스(또는 시스템 호출)
운영체제 하부에 있는 문서화되지 않은 서비스로,
유저 모드에서 호출 가능하다.
예를 들어 NtCreate-UserProcess는 윈도우 CreateProcess 함수가
새로운 프로세스를 생성하기 위해 호출하는 내부 시스템 서비스이다.
- 커널 지원 함수 (또는 루틴)
커널 모드에서만 호출 가능한 윈도우 운영체제 내부의 서브루틴으로,
예를 들면 ExAllocatePool-WithTag는 디바이스 드라이버가 윈도우 시스템 힙(당구)으로부터
메모리를 할당하기 위해 호출하는 루틴이다.
- 윈도우 서비스
윈도우 서비스 컨트롤 관리자에 의해 시작된 프로세스다.
예를 들면 schtasks 명령 (유닉스의 at이나 cron 명령과 유사하다)을
지원하는 작업 스케줄러 서비스는 유저 모드 프로세스에서 동작한다(참고 : 레지스트리가 윈도우 디바이스 드라이버를 '서비스'로 정의하기도 한다).
- DLL (동적 연결 라이브러리)
호출 가능한 서브루틴들이 모여 있는 바이너리 파일로,
이 서브루틴을 사용하는 애플리케이션에 의해 동적으로 로드될 수 있다.
예를 들면 Msvcrt.dll(C 런타임 라이브러리)과 Kernel32.dll(윈도우 API 서브시스템 라이브러리 중 하나)가 있다.
윈도우 유저 모드 컴포넌트와 애플리케이션은 광범위하게 DLL을 사용한다.
정적 라이브러리 대비 DLL의 장점은 애플리케이션 간에 DLL을 공유할 수 있다는 것과,
윈도우는 애플리케이션이 참조하고 있는 DLL의 코드가 메모리상에 하나의 복사본만 존재하게 한다는 것이다.
참고로 라이브러리 .NET 어셈블리는 DLL로 컴파일되지만,
어떤 익스포트된 서브루틴도 갖지 않는다.
대신 CLR은 해당 유형 및 멤버에 액세스하려면 컴파일된 메타데이터를 구문 분석한다.
프로세스
프로그램과 프로세스는 표면상으로 유사하지만 본질적으로 서로 다른 것이다.
프로그램은 명령의 정적 연속체인 반면,
프로세스는 프로그램의 인스턴스가 실행될 때 사용되는 리소스의 집합을 위한 컨테이너다.
추상적이고 고차원적 관점에서 볼 떄 윈도우 프로세스는 다음과 같이 구성돼 있다.
- 전용 가상 주소 공간을 가진다.
이는 프로세스가 사용할 수 있는 가상 메모리 주소의 집합이다.
- 실행 가능한 프로그램이다.
이는 초기 코드와 데이터를 정의한다.
그리고 프로세스의 가상 주소 공간에 매핑된다는 의미를 가진다.
- 오픈 핸들 목록을 소유한다.
이들 핸들은 프로세스 내의 모든 스레드에서 접근 가능한 세마포어와 동기화 객체,
파일 같은 다양한 시스템 리소스에 대응된다.
- 보안 컨텍스트
이는 해당 앱컨테이너(AppContainer) 식별자와 이에 관련된 샌드박스(sandboxing) 정보와 더불어
프로세스와 연관된 사용자와 보안 그룹, 특권, 속성, 클레임, 기능, 사용자 계정 컨트롤 가상화 상태, 세션, 제한된 사용자 계정 상태를 식별한다.
- 프로세스 ID
이는 고유한 식별자로서 내부적으로는 클래이언트 ID라고 하는 식별자의 일부다.
- 최소 하나의 실행 스레드
빈 프로세스도 가능하지만, 이는 거의 쓸모가 없다.
프로세스와 프로세스 정보를 살펴보고 수정할 수 있는 다양한 툴이 있다.
다음 실습은 이런 툴을 사용해 얻을 수 있는 프로세스 정보에 대한 다양한 모습을 보여준다.
이런 툴 중 많은 것이 윈도우 자체와 윈도우 SDK의 디버깅 툴에 포함돼 있으며,
일부는 스레드 정보의 핵심 부분을 다른 이름으로 식별하지만 같은 정보를 보여준다.
작업 관리자에서 프로세스를 확인할 때 3가지 핵심 요소는 다음과 같다.
스레드, 핸들, 상태이다.
1) 스레드
이 열은 각 프로세스 내의 스레드 수를 보여준다.
스레드의 존재없이(이런 프로세스가 있다 하더라도 거의 쓸모없다.)
프로세스를 생성할 수 있는 직접적인 방법은 없기 때문에 스레드의 수는 일반적으로 최소 1이 돼야 한다.
스레드의 수가 0인 프로세스라면
어떤 이유(버그가 있는 드라이버 코드에 의해)로 인해 삭제될 수 없는 프로세스임을 의미한다.
2) 핸들
핸들 열은 해당 프로세스 내에서 실행하는 스레드에 의해 오픈된 커널 객체에 대한 핸들의 수를 보여준다.
3) 상태
상태 열은 다소 난해하다.
사용자 인터페이스를 전혀 갖지 않는 프로세의 경우라면
모든 스레드들이 뭔가(시그널이 되고 있는 커널 객체나 완료가 이뤄지는 I/O 동작 같은)를
대기 중인 상태일지라도 실행 중(Running) 상태가 정상적인 경우다.
이런 프로세스의 경우 가질 수 있는 다른 상태는 일시 중단됨(Suspended) 상태다.
이 경우는 프로세스 내의 모든 스레드가 일시 중단 상태인 경우에 발생한다.
이런 경우는 프로세스 자체에 의해서는 거의 발생하지 않고,
해당 프로세스에 대해 툴을 이용한 문서화되지 않은 NtSyspendProcess 네이티브 API를 호출함으로써
프로그램적으로 발생할 수 있다.
사용자 인터페이스를 생성하는 프로세스의 경우 실행 중 값은 UI가 응답 중임을 의미한다.
즉, 윈도우(들)를 생성한 스레드가 UI입력(기술적으로 해당 스레드와 관련된 메시지 큐)을 대기 중임을 나타낸다.
일시 중단됨 상태는 넌UI 경우에서도 유사하지만 윈도우앱(윈도우 런타임을 호시팅하는 앱들)의 경우 일시 중단됨 상태는 일반적으로
앱이 사용자에 의해 최소화됨으로써 자신의 포어그라운드 상태를 잃는 경우에 발생한다.
이런 프로세스는 CPU나 네트워킹 자원을 소비하지 않게 5초 후에 일시 중단되며,
이렇게 해서 새로운 포어그라운드 앱이 모든 머신 자원을 가질 수 있게 해준다.
이런 동작은 특히 태블릿이나 폰과 같은 배터리 전원 장치인 경우에 중요하다.
상태의 세 번째 가능한 값은 응답 없음이다.
이 상태는 사용자 인터페이스를 생성한
프로세스 내의 한 스레드가 적어도 5초 동안에
UI 관련 동작에 관해 자신의 메시지 큐를 검사하지 않은 경우에 발생한다.
이런 프로세스(실제로 해당 윈도우를 소유한 스레드)는
CPU 집중적인 작업을 빠르게 하고 있거나 또는 뭔가(I/O 완료되는 것과 같이)를 전적으로 대기하고 있을 수도 있다.
어느 쪽이든 간에 UI는 멈추고 윈도우 OS는 문제의 원도우를 희미하게 처리하고 윈도우 타이틀 위치에 '(응답 없음)'으로 표시한다.
--
부모 프로세스와 생성 프로세스
각 프로세스는 자신의 부모 프로세스나
생성 프로세스(자신이 생성 프로세스일 수도 있지만 반드시 그런 것은 아니다)를 가리킨다.
부모가 더 이상 존재하지 않는다면 해당 정보가 갱신되진 않는다.
그러므로 프로세스는 존재하지 않는 부모를 참조할 수 있다.
이것은 별 문제가 되지 않는다.
현재 이렇게 유지된 정보에 아무도 의존하지 않기 때문이다.
부모 프로세스가 생성 프로세스와 다른 이유는 무엇일까?
특정 경우에 특정 사용자 애플리키에션에 의해 생성된 것처럼 보이는 일부 프로세스는 프로세스 생성
API를 호출하는 브로커나 헬퍼프로세스의 도움을 받을 수 있다.
이런 경우 생성자로 브로커 프로세스를 표시하는 데 혼동이 있을 수 있으며
(핸들이나 주소 공간 상속이 필요한 경우 때때로 부정확할 수도 있다),
다시 부모 고간계가 이뤄졌다고 표시하는 데 어려움이 있다.
'컴퓨터 구조 + 운영체제' 카테고리의 다른 글
프로그램 실행과정 (0) | 2024.11.30 |
---|---|
시스템 프로그래밍의 이해와 접근 (1) | 2024.11.24 |
Unix/Linux Architecture (0) | 2024.11.10 |
시스템 프로그래밍 능력을 갖춰야 하는 이유 (0) | 2024.11.09 |
시스템 프로그래밍이란? (0) | 2024.10.31 |