# `resource` — 자원 사용 정보

이 모듈은 프로그램에서 사용하는 시스템 자원을 측정하고 제어하기 위한 기본 메커니즘을 제공합니다.

기호 상수는 특정 시스템 자원을 지정하고 현재 프로세스나 그 자식들에 대한 사용 정보를 요청하는 데 사용됩니다.

시스템 호출(syscall) 실패 시 `OSError`가 발생합니다.

exception `resource.``error`

  폐지된 `OSError`의 별칭.

  버전 3.3에서 변경: PEP 3151에 따라, 이 클래스는 `OSError`의 별칭이 되었습니다.

## 자원 제한

아래 설명된 `setrlimit()` 함수를 사용하여 자원 사용량을 제한 할 수 있습니다. 각 자원은 제한의 쌍으로 제어됩니다: 소프트 제한과 하드 제한. 소프트 제한은 현재 제한이며, 시간이 지남에 따라 프로세스에 의해 낮아지거나 높아질 수 있습니다. 소프트 제한은 하드 제한을 초과할 수 없습니다. 하드 제한은 소프트 제한보다 큰 값으로 낮출 수 있지만, 높일 수는 없습니다. (슈퍼 유저의 유효 UID를 갖는 프로세스만 하드 제한을 높일 수 있습니다.)

제한될 수 있는 구체적인 자원은 시스템에 따라 다릅니다. getrlimit(2) 매뉴얼 페이지에 설명되어 있습니다. 아래에 나열된 자원은 하부 운영 체제에서 지원할 때 지원됩니다; 운영 체제에서 검사하거나 제어할 수 없는 자원은 해당 플랫폼에서는 이 모듈에서 정의되지 않습니다.

`resource.``RLIM_INFINITY`

  무제한 자원의 제한을 나타내는 데 사용되는 상수.

`resource.``getrlimit`(resource)

  resource의 현재 소프트와 하드 제한인 튜플 `(soft, hard)`를 반환합니다. 유효하지 않은 resource가 지정되면 `ValueError`가 발생하고, 하부 시스템 호출이 예기치 않게 실패하면 `error`가 발생합니다.

`resource.``setrlimit`(resource, limits)

  resource의 새로운 소비 제한을 설정합니다. limits 인자는 새로운 제한을 설명하는 두 정수의 튜플 `(soft, hard)`이어야 합니다. `RLIM_INFINITY` 값을 사용하여 무제한 제한을 요청할 수 있습니다.

  유효하지 않은 resource가 지정되거나, 새 소프트 제한이 하드 제한을 초과하거나, 프로세스가 하드 제한을 높이려고 시도하면 `ValueError`가 발생합니다. 해당 자원의 하드나 시스템 제한이 무제한이 아닐 때 `RLIM_INFINITY` 제한을 지정하면 `ValueError`가 발생합니다. 슈퍼 유저의 유효 UID를 갖는 프로세스는 무제한을 포함하여 임의의 유효한 제한 값을 요청할 수 있지만, 요청된 제한이 시스템이 부과한 제한을 초과하면 `ValueError`가 여전히 발생합니다.

  하부 시스템 호출이 실패하면 `setrlimit`도 `error`를 발생시킬 수 있습니다.

  VxWorks는 `RLIMIT_NOFILE` 설정만 지원합니다.

  인자 `resource`, `limits`로 감사 이벤트 `resource.setrlimit`를 발생시킵니다.

`resource.``prlimit`(pid, resource[, limits])

  하나의 함수에서 `setrlimit()`와 `getrlimit()`를 결합하고 임의 프로세스의 자원 제한을 가져오고 설정하도록 지원합니다. pid가 0이면, 호출은 현재 프로세스에 적용됩니다. resource와 limits는 limits가 선택적이라는 점을 제외하고 `setrlimit()`와 같은 의미입니다.

  limits가 제공되지 않으면 함수는 프로세스 pid의 resource 제한을 반환합니다. limits가 제공되면 프로세스의 resource 제한이 설정되고 이전 자원 제한이 반환됩니다.

  pid를 찾을 수 없으면 `ProcessLookupError`가 발생하고 사용자가 프로세스에 대해 `CAP_SYS_RESOURCE`가 없으면 `PermissionError`가 발생합니다.

  인자 `pid`, `resource`, `limits`로 감사 이벤트 `resource.prlimit`를 발생시킵니다.

  가용성: glibc 2.13 이상이 설치된 리눅스 2.6.36 이상.

  버전 3.4에 추가.

이 기호들은 `setrlimit()`와 `getrlimit()` 함수를 사용하여 소비를 제어할 수 있는 아래 설명된 자원을 정의합니다. 이 기호의 값은 정확히 C 프로그램에서 사용하는 상수입니다.

getrlimit(2)에 관한 유닉스 매뉴얼 페이지는 사용 가능한 자원을 나열합니다. 모든 시스템이 같은 자원을 나타내는 데 같은 기호나 같은 값을 사용하는 것은 아닙니다. 이 모듈은 플랫폼 차이를 감추려고 시도하지 않습니다 — 플랫폼에서 정의되지 않은 기호는 해당 플랫폼에서 이 모듈에서 제공되지 않습니다.

`resource.``RLIMIT_CORE`

  현재 프로세스가 만들 수 있는 코어(core) 파일의 최대 크기 (바이트). 전체 프로세스 이미지를 담기 위해 더 큰 코어가 필요할 때 부분 코어 파일이 생성될 수 있습니다.

`resource.``RLIMIT_CPU`

  프로세스가 사용할 수 있는 최대 프로세서 시간 (초). 이 제한을 초과하면, `SIGXCPU` 시그널이 프로세스로 전송됩니다. (이 시그널을 포착하고, 열려있는 파일을 디스크로 플러시 하는 등 유용한 작업을 수행하는 방법에 대한 정보는 `signal` 모듈 설명서를 참조하십시오.)

`resource.``RLIMIT_FSIZE`

  프로세스가 만들 수 있는 파일의 최대 크기.

`resource.``RLIMIT_DATA`

  프로세스 힙(heap)의 최대 크기 (바이트).

`resource.``RLIMIT_STACK`

  현재 프로세스에 대한 호출 스택의 최대 크기 (바이트). 이것은 다중 스레드 프로세스에서 메인 스레드의 스택에만 영향을 줍니다.

`resource.``RLIMIT_RSS`

  프로세스에서 사용할 수 있는 최대 상주 집합(resident set) 크기.

`resource.``RLIMIT_NPROC`

  현재 프로세스가 만들 수 있는 최대 프로세스 수.

`resource.``RLIMIT_NOFILE`

  현재 프로세스에 대한 열린 파일 기술자의 최대 수.

`resource.``RLIMIT_OFILE`

  `RLIMIT_NOFILE`의 BSD 이름.

`resource.``RLIMIT_MEMLOCK`

  메모리에 잠겨 있을 수 있는 최대 주소 공간.

`resource.``RLIMIT_VMEM`

  프로세스가 차지할 수 있는 가장 큰 매핑된 메모리(mapped memory) 영역.

`resource.``RLIMIT_AS`

  프로세스에서 사용할 수 있는 주소 공간의 최대 영역 (바이트).

`resource.``RLIMIT_MSGQUEUE`

  POSIX 메시지 큐에 할당할 수 있는 바이트 수.

  가용성: 리눅스 2.6.8 이상.

  버전 3.4에 추가.

`resource.``RLIMIT_NICE`

  프로세스의 나이스(nice) 수준의 상한 (20 - rlim_cur로 계산됩니다).

  가용성: 리눅스 2.6.12 이상.

  버전 3.4에 추가.

`resource.``RLIMIT_RTPRIO`

  실시간 우선순위의 상한.

  가용성: 리눅스 2.6.12 이상.

  버전 3.4에 추가.

`resource.``RLIMIT_RTTIME`

  프로세스가 블로킹 시스템 호출 없이 실시간 스케줄링 하에서 소비할 수 있는 CPU 시간의 시간제한 (마이크로초).

  가용성: 리눅스 2.6.25 이상.

  버전 3.4에 추가.

`resource.``RLIMIT_SIGPENDING`

  프로세스가 큐에 넣을 수 있는 시그널 수입니다.

  가용성: 리눅스 2.6.8 이상.

  버전 3.4에 추가.

`resource.``RLIMIT_SBSIZE`

  이 사용자의 소켓 버퍼 사용량의 최대 크기 (바이트). 이것은 이 사용자가 모든 시점에 보유할 수 있는 네트워크 메모리양과 mbuf들의 양을 제한합니다.

  가용성: FreeBSD 9 이상.

  버전 3.4에 추가.

`resource.``RLIMIT_SWAP`

  The maximum size (in bytes) of the swap space that may be reserved or used by all of this user id’s processes. This limit is enforced only if bit 1 of the vm.overcommit sysctl is set. Please see tuning(7) for a complete description of this sysctl.

  가용성: FreeBSD 9 이상.

  버전 3.4에 추가.

`resource.``RLIMIT_NPTS`

  이 사용자 ID로 만들어지는 최대 의사 터미널(pseudo-terminal) 수.

  가용성: FreeBSD 9 이상.

  버전 3.4에 추가.

`resource.``RLIMIT_KQUEUES`

  The maximum number of kqueues this user id is allowed to create.

  Availability: FreeBSD 11 or later.

  버전 3.10에 추가.

## 자원 사용량

이 함수는 자원 사용량 정보를 조회하는 데 사용됩니다:

`resource.``getrusage`(who)

  이 함수는 who 매개 변수에 지정된 대로 현재 프로세스나 그 자식이 소비한 자원을 설명하는 객체를 반환합니다. who 매개 변수는 아래에 설명된 `RUSAGE_*` 상수 중 하나를 사용하여 지정해야 합니다.

  간단한 예:

      from resource import *
      import time

      # a non CPU-bound task
      time.sleep(3)
      print(getrusage(RUSAGE_SELF))

      # a CPU-bound task
      for i in range(10 ** 8):
         _ = 1 + 1
      print(getrusage(RUSAGE_SELF))

  반환 값의 필드는 각각 특정 시스템 자원이 어떻게 사용되었는지를 설명합니다. 예를 들어, 사용자 모드로 실행에 든 시간이나 프로세스가 주 메모리에서 스와프된 횟수. 일부 값은 클록 틱(clock tick) 내부에 의존합니다, 예를 들어, 프로세스에서 사용 중인 메모리양.

  이전 버전과의 호환성을 위해, 반환 값은 16개 요소의 튜플로 액세스 할 수도 있습니다.

  반환 값의 필드 `ru_utime`과 `ru_stime`은 각각 사용자 모드에서 실행된 시간과 시스템 모드에서 실행된 시간을 나타내는 부동 소수점 값입니다. 나머지 값은 정수입니다. 이러한 값에 대한 자세한 내용은 getrusage(2) 매뉴얼 페이지를 참조하십시오. 간략한 요약은 다음과 같습니다:

  인덱스 | 필드 | 자원
  --- | --- | ---
  `0` | `ru_utime` | 사용자 모드의 시간 (float 초)
  `1` | `ru_stime` | 시스템 모드의 시간 (float 초)
  `2` | `ru_maxrss` | 최대 상주 집합(resident set) 크기
  `3` | `ru_ixrss` | 공유 메모리 크기
  `4` | `ru_idrss` | 비공유 메모리 크기
  `5` | `ru_isrss` | 비공유 스택 크기
  `6` | `ru_minflt` | I/O가 필요 없는 페이지 폴트(page fault)
  `7` | `ru_majflt` | I/O가 필요한 페이지 폴트(page fault)
  `8` | `ru_nswap` | 스와프(swap out) 수
  `9` | `ru_inblock` | 블록 입력 연산(block input operations)
  `10` | `ru_oublock` | 블록 출력 연산(block output operations)
  `11` | `ru_msgsnd` | 보낸 메시지
  `12` | `ru_msgrcv` | 받은 메시지
  `13` | `ru_nsignals` | 받은 시그널
  `14` | `ru_nvcsw` | 자발적 컨텍스트 전환(voluntary context switches)
  `15` | `ru_nivcsw` | 비자발적 컨텍스트 전환(involuntary context switches)

  유효하지 않은 who 매개 변수가 지정되면 이 함수는 `ValueError`를 발생시킵니다. 비정상적인 상황에서 `error` 예외가 발생할 수도 있습니다.

`resource.``getpagesize`()

  시스템 페이지의 바이트 수를 반환합니다. (하드웨어 페이지 크기와 같을 필요는 없습니다.)

다음 `RUSAGE_*` 기호는 `getrusage()` 함수에 전달되어 제공할 프로세스 정보를 지정합니다.

`resource.``RUSAGE_SELF`

  호출하는 프로세스가 소비한 자원을 요청하기 위해 `getrusage()`로 전달합니다. 이는 프로세스의 모든 스레드가 사용하는 자원의 합계입니다.

`resource.``RUSAGE_CHILDREN`

  호출하는 프로세스의 종료되어 기다리고 있는 자식 프로세스에서 소비한 자원을 요청하기 위해 `getrusage()`로 전달합니다.

`resource.``RUSAGE_BOTH`

  현재 프로세스와 자식 프로세스 모두에서 소비한 자원을 요청하기 위해 `getrusage()`로 전달합니다. 모든 시스템에서 사용 가능한 것은 아닙니다.

`resource.``RUSAGE_THREAD`

  현재 스레드가 소비한 자원을 요청하기 위해 `getrusage()`에 전달합니다. 모든 시스템에서 사용 가능한 것은 아닙니다.

  버전 3.2에 추가.