핸들 (컴퓨팅)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
핸들은 컴퓨터 프로그래밍에서 리소스를 참조하는 데 사용되는 추상화된 식별자이다. 포인터와 유사하게 사용되지만, 핸들은 외부에서 관리되는 참조를 나타내며, 시스템이 핸들을 무효화하지 않고도 참조 대상의 메모리 내 재배치를 가능하게 한다. 핸들은 보안 측면에서 접근 권한을 포함하는 커퍼시티 역할을 하며, 핸들 누수는 할당된 핸들을 해제하지 않아 발생하는 자원 누수의 한 유형이다. 윈도우 API 등에서 널리 사용되었으며, 현재는 가상 메모리 기술 발전으로 사용 빈도가 줄었지만, 여전히 운영체제에서 불투명 포인터 또는 내부 배열의 인덱스로 활용된다.
더 읽어볼만한 페이지
핸들 (컴퓨팅) |
---|
2. 포인터와의 비교
핸들과 포인터는 모두 리소스를 참조하는 데 사용되지만, 중요한 차이점이 있다. 포인터는 참조하는 대상의 주소를 직접 가지는 반면, 핸들은 외부에서 관리되는 참조를 추상화한 것이다. 핸들은 불투명성 때문에 시스템이 참조 대상을 메모리에서 재배치하여도 핸들 자체는 유효하게 유지된다. 또한, 간접 참조 계층을 추가하여 관리 시스템의 동작 제어를 증가시킨다.[1]
2. 1. 포인터의 특징
포인터는 참조하는 항목의 주소를 포함하지만, 핸들은 외부에서 관리되는 참조를 추상화한 것이다. 핸들은 불투명하기 때문에 시스템에서 참조 대상을 메모리 내에서 재배치할 수 있는데, 이는 포인터의 가상 메모리와 유사하지만 더욱 추상화된 방식이다. 추가적인 간접 참조 계층은 관리 시스템이 참조 대상에서 수행되는 작업에 대해 더 많은 제어 권한을 갖게 한다.[1]2. 2. 핸들의 특징
핸들은 포인터와 달리 외부에서 관리되는 참조를 추상화한 것이다. 이러한 불투명성 덕분에 시스템은 핸들을 무효화하지 않고도 참조 대상을 메모리 내에서 재배치할 수 있다. 이는 포인터에서는 불가능한 기능으로, 가상 메모리와 유사하지만 더욱 추상화된 방식이다. 추가적인 간접 참조 계층은 관리 시스템이 참조 대상에 대해 수행하는 작업에 대한 제어를 강화한다. 일반적으로 핸들은 툼스톤의 전역 배열에 대한 인덱스 또는 포인터이다.[1]2. 3. 핸들 누수
핸들 누수는 컴퓨터 프로그램이 자원에 대한 핸들을 요청하고 다 사용한 후에 놓지 않을 때 발생하는 소프트웨어 버그이다. 이것은 자원 누수의 일종으로, 메모리를 가리키는 포인터에 대한 메모리 누수와 유사하다.[1]3. 보안
컴퓨터 보안에서 핸들은 커퍼시티(Capability)로 기능한다. 즉, 객체를 식별할 뿐만 아니라 접근 권한도 연결된다.[1] 파일 이름은 위조될 수 있지만, 핸들은 외부 시스템에 의해 사용자에게 주어지므로, 단순히 식별자가 아니라 부여된 접근 권한도 나타낸다.
예를 들어 프로그램이 시스템 암호 파일(`/etc/passwd`)을 읽기/쓰기 모드(`O_RDWR`)로 열려고 할 때, 다음과 같은 호출을 통해 파일을 열 수 있다.
int fd = open("/etc/passwd", O_RDWR);
이 호출은 운영 체제에 지정된 접근 권한으로 지정된 파일을 열도록 요청한다. 운영 체제가 이를 허용하면 파일을 열고 핸들(파일 서술자)을 사용자에게 반환한다. 실제 접근은 운영 체제에 의해 제어되며, 핸들은 해당 접근 권한의 토큰이다. 운영 체제가 접근을 거부하면 파일을 열지 않고 핸들도 반환하지 않는다.[1]
3. 1. 커퍼시티 기반 보안
핸들은 다른 시스템에 의해 자원에 대한 접근이 중재될 수 있게 한다. 파일 이름을 위조할 수 있는 경우와 달리, 핸들은 외부 시스템에서 사용자에게 주어지므로, 단순히 식별자가 아니라 부여된 접근 권한을 나타낸다.[1]예를 들어 프로그램이 시스템 패스워드 파일(`/etc/passwd`)을 읽기/쓰기 모드로 열려고 할 때, 운영 체제는 특정 접근 권한을 가진 파일을 열도록 요청받는다.[1] 운영 체제가 허용하면 파일을 열고 핸들(파일 서술자)을 반환하며, 이는 실제 접근이 운영 체제에 의해 제어됨을 나타내는 토큰이다.[1]
커퍼시티 기반 시스템에서 핸들은 연관된 접근 권한과 함께 프로세스 간에 전달될 수 있다. 이때 핸들은 위조될 수 있는 작은 정수가 아니어야 한다.[1] 커퍼시티 기반이 아닌 시스템에서는 각 프로세스가 자원의 식별과 요구되는 접근 권한을 명시하여 각각의 핸들을 얻어야 한다.[1]
3. 2. 커퍼시티 기반 시스템과 비 커퍼시티 기반 시스템
커퍼시티 기반 시스템에서 핸들은 연관된 접근 권한과 함께 프로세스 간에 전달될 수 있다. 이 경우 핸들은 위조될 수 없도록 시스템 전체에서 고유한 작은 정수이면 안된다. 예를 들어, 리눅스에서 파일 디스크립터는 그 수치 값만으로는 의미가 없고, 프로세스 컨텍스트에서만 무언가를 참조할 수 있으므로 위조할 수 없다. 이러한 핸들을 전송하려면 특별한 주의가 필요한데, 전송 및 수신 프로세스에서 그 값이 다른 경우가 많기 때문이다.[1]반면에, 비 커퍼시티 기반 시스템에서는 각 프로세스가 자원의 식별과 요구되는 접근 권한을 명시하여 각각의 핸들을 얻어야 한다. (예: 각 프로세스는 파일 이름과 접근 모드를 제공하여 자체적으로 파일을 열어야 함)[2] 이러한 사용법은 핸들 전달을 지원하는 최신 시스템에서도 더 일반적이지만, 혼란된 대리인 문제와 같은 취약점에 취약하다.
4. 예시
핸들은 1980년대와 1990년대 운영 체제에서 메모리 관리를 위한 인기 있는 해결책이었다.[2][1] C 표준 I/O 라이브러리에서 파일 데이터 구조체는 파일 핸들(유닉스에서는 파일 서술자)이다. 윈도우 API는 시스템의 객체를 나타내고 운영 체제와 사용자 공간 간의 통신 경로를 제공하기 위해 핸들을 광범위하게 사용하는데, 예를 들어 데스크톱의 윈도우는 `HWND` 타입의 핸들로 표현된다.
이중 간접 참조 핸들은 최근 들어 선호도가 떨어졌는데, 이는 사용 가능한 메모리 증가와 향상된 가상 메모리 알고리즘으로 인해 더 단순한 포인터 사용이 더 매력적으로 변했기 때문이다. 그러나 많은 운영 체제는 여전히 이 용어를 불투명하고 "비공개" 자료 구조에 대한 포인터—불투명 포인터—또는 한 프로세스에서 해당 클라이언트로 전달되는 내부 배열의 인덱스에 적용한다.
참조
[1]
간행물
The Original Macintosh: Hungarian
http://www.folklore.[...]
1982-01
[2]
간행물
The Original Macintosh: Hungarian
http://www.folklore.[...]
1982-01
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com