![cat /proc/cpuinfo 명령을 실행하면 어떻게 되나요?](https://rvso.com/image/52103/cat%20%2Fproc%2Fcpuinfo%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%98%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%90%98%EB%82%98%EC%9A%94%3F.png)
내가 글을 쓰면 어떻게 되나요 cat /proc/cpuinfo
? CPU 정보를 즉시 읽고 호출할 때마다 해당 텍스트를 생성하는 OS에 대한 명명된 파이프(또는 다른 것)입니까?
답변1
에서 파일을 읽을 때마다 /proc
파일 내용으로 읽을 텍스트를 계산하는 커널의 일부 코드가 호출됩니다. 콘텐츠가 즉시 생성된다는 사실은 거의 모든 파일의 시간이 현재로 보고되고 크기가 0으로 보고되는 이유를 설명합니다. 여기서 0은 "모름"으로 읽어야 합니다. 일반적인 파일 시스템과 달리 /proc
에 마운트되는 파일 시스템은procfs, 디스크나 기타 저장 매체(예: FAT, ext2, zfs 등) 또는 네트워크(예: NFS, Samba 등)에서 데이터를 로드하지 않으며 사용자 코드를 호출하지 않습니다(예: FAT, ext2, zfs 등).퓨즈).
Procfs는 BSD가 아닌 대부분의 유니스에 존재합니다. AT&T의 Bell Labs에서 시작되었습니다.유닉스 8판프로세스에 대한 정보를 보고하는 방법으로 사용됩니다( ps
종종 읽어온 정보를 위한 멋진 프린터입니다 /proc
). 대부분의 procfs 구현에는 PID 123을 사용하여 프로세스에 대한 정보를 보고하기 위해 호출되는 파일 또는 디렉터리가 있습니다 /proc/123
. Linux는 예제를 포함하여 시스템 상태를 보고하는 더 많은 항목으로 proc 파일 시스템을 확장합니다 /proc/cpuinfo
.
과거에는 Linux가 /proc
드라이버에 대한 정보를 제공하는 다양한 파일을 획득했지만 이제는 이러한 사용이 더 이상 사용되지 않습니다./sys
, /proc
이제 천천히 진화합니다. /proc/bus
및 와 같은 항목은 /proc/fs/ext4
이전 버전과의 호환성을 위해 그대로 유지되지만 더 새로운 유사한 인터페이스가 /sys
. 이 답변에서는 Linux에 중점을 둘 것입니다.
/proc
Linux 관련 문서의 첫 번째 및 두 번째 진입점은 다음 과 같습니다.
- 그만큼
proc(5)
매뉴얼 페이지; - 파일
/proc
시스템에서커널 문서.
문서에서 다루지 않는 세 번째 진입점은 다음과 같습니다.소스를 읽고. 컴퓨터에서 소스를 다운로드할 수 있지만 이는 거대한 프로그램이므로LXR, Linux 상호 참조는 큰 도움이 됩니다. (LXR에는 다양한 변형이 있습니다. lxr.linux.no
현재 실행 중인 버전이 가장 훌륭하지만 불행히도 사이트가 다운되는 경우가 많습니다.) C에 대한 약간의 지식이 필요하지만 신비한 값을 추적하기 위해 프로그래머가 될 필요는 없습니다. .
항목 의 핵심 처리 /proc
는fs/proc
예배 규칙서. 모든 드라이버는 항목을 등록할 수 있습니다 /proc
(위에서 설명한 대로 현재는 더 이상 사용되지 않지만 /sys
). 에서 원하는 항목을 찾지 못한 경우 fs/proc
다른 곳을 찾아보십시오. 선언된 드라이버 호출 함수include/linux/proc_fs.h
. 커널 버전최대 3.9기능 create_proc_entry
과 일부 래퍼(특히 create_proc_read_entry
) 및 커널 버전을 제공합니다.3.10 이상대신 proc_create
및 proc_create_data
(및 몇 가지 추가)만 제공하세요.
/proc/cpuinfo
예를 들어, 를 검색하면 다음 "cpuinfo"
호출로 연결됩니다 proc_create("cpuinfo, …")
.fs/proc/cpuinfo.c
. 코드가 거의 상용구 코드라는 것을 알 수 있습니다. 대부분의 파일은 /proc
일부 텍스트 데이터를 덤프하기 때문에 이를 수행하는 도우미 함수가 있습니다. 단지seq_operations
구조이며 실제 고기는cpuinfo_op
아키텍처에 따라 달라지는 데이터 구조는 일반적으로 arch/<architecture>/kernel/setup.c
(또는 때로는 다른 파일)에 정의됩니다. x86을 예로 들면 다음과 같습니다.arch/x86/kernel/cpu/proc.c
. 주요 기능은 show_cpuinfo
원하는 파일 내용을 인쇄하는 것입니다. 나머지 인프라는 요청하는 속도로 읽기 프로세스에 데이터를 공급하기 위해 존재합니다. 다음과 같이 즉시 계산되는 몇 가지 숫자를 포함하여 커널의 다양한 변수에 있는 데이터에서 데이터가 즉시 수집되는 것을 볼 수 있습니다.CPU 주파수.
의 큰 부분은 /proc
의 프로세스별 정보입니다 /proc/<PID>
. 이 항목은 다음에 등록되어 있습니다.fs/proc/base.c
, 에서tgid_base_stuff
정렬; 여기에 등록된 일부 기능은 다른 파일에 정의되어 있습니다. 이러한 항목이 생성되는 방법에 대한 몇 가지 예를 살펴보겠습니다.
cmdline
에 의해 생성됩니다proc_pid_cmdline
같은 파일에. 프로세스에서 데이터를 찾아서 인쇄합니다.clear_refs
는 지금까지 본 항목과 달리 쓰기는 가능하지만 읽을 수는 없습니다. 그러므로proc_clear_refs_operations
구조는clear_refs_write
기능은 있지만 읽기 기능은 없습니다.cwd
다음과 같이 선언된 기호 링크(약간 마술적인 링크)입니다.proc_cwd_link
, 어느프로세스의 현재 디렉토리를 조회합니다.링크 콘텐츠로 반환합니다.fd
하위 디렉토리입니다. 디렉토리 자체에 대한 작업은proc_fd_operations
데이터 구조(항목을 열거하는 함수를 제외하고는 상용구입니다.proc_readfd
, 프로세스의 열린 파일을 열거함) 항목에 대한 작업이`proc_fd_inode_작업.
의 또 다른 중요한 영역 /proc
은 입니다 /proc/sys
.sysctl
. 이 계층 구조의 항목을 읽으면 해당 sysctl 값의 값이 반환되고, 쓰면 sysctl 값이 설정됩니다. sysctl의 진입점은 다음과 같습니다.fs/proc/proc_sysctl.c
. Sysctls에는 자체 등록 시스템이 있습니다.register_sysctl
그리고 친구들.
답변2
뒤에서 어떤 종류의 마법이 일어나고 있는지에 대한 통찰력을 얻으려고 할 때 가장 친한 친구는 입니다 strace
. 이 도구를 작동하는 방법을 배우는 것은 뒤에서 무슨 미친 마법이 일어나고 있는지 더 잘 이해하기 위해 할 수 있는 가장 좋은 일 중 하나입니다.
$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536) = 0
close(3) = 0
...
/proc/cpuinfo
위의 출력에서 이것이 단지 일반 파일이거나 적어도 하나인 것처럼 보일 수 있음을 알 수 있습니다 . 그럼 좀 더 자세히 살펴보겠습니다.
깊은 다이빙
#1- ls와 함께..파일 자체를 보면 "그냥 파일"인 것처럼 보입니다.
$ ls -l /proc/cpuinfo
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo
하지만 좀 더 자세히 살펴보세요. 우리는 이것이 특별하다는 첫 번째 힌트를 얻었습니다. 파일 크기가 0바이트라는 점에 유의하세요.
#2- 통계로..stat
이제 를 사용하여 파일을 보면 /proc/cpuinfo
.
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
Birth: -
실행 #2
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
Birth: -
액세스, 수정, 변경 시간을 확인하세요. 액세스할 때마다 계속 변경됩니다. 3개가 모두 이렇게 변하는 것은 매우 이례적입니다. 파일의 타임스탬프 속성을 편집하지 않는 한 일반적으로 동일하게 유지됩니다.
#삼- 파일로..이 파일이 일반 파일이 아니라는 또 다른 단서는 다음과 같습니다.
$ file /proc/cpuinfo
/proc/cpuinfo: empty
명명된 파이프의 일부 표현인 경우 다음 파일 중 하나와 유사하게 표시됩니다.
$ ls -l /dev/initctl /dev/zero
prw-------. 1 root root 0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero
$ file /dev/initctl /dev/zero
/dev/initctl: fifo (named pipe)
/dev/zero: character special
emptyfile
을 터치하면 /proc/cpuinfo
파이프보다는 파일처럼 보입니다.
$ touch emptyfile
$ ls -l emptyfile
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile
emptyfile: empty
#4- 마운트 포함..
따라서 이 시점에서 우리는 한 걸음 물러서서 조금 축소해야 합니다. 우리는 특정 파일을 보고 있지만 아마도 이 파일이 있는 파일 시스템을 살펴봐야 할 것입니다. 이를 위해 mount
명령을 사용할 수 있습니다.
$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
좋습니다. 파일 시스템 유형은 proc
. 다른 파일 시스템 유형 도 마찬가지 /proc
입니다. 이는 해당 파일이 특별하다는 힌트입니다 /proc
. 그것들은 단지 평범한 파일이 아닙니다. 그럼 파일 시스템을 특별하게 만드는 요소에 대해 좀 더 자세히 알아 보겠습니다 proc
.
mount
의 매뉴얼 페이지를 살펴보십시오 .
proc 파일 시스템은 특별한 장치와 연관되어 있지 않으며, 마운트 시 장치 사양 대신 proc 등 임의의 키워드를 사용할 수 있다. (관례적인 선택인 none은 운이 좋지 않습니다. umount의 'none busy' 오류 메시지는 혼란스러울 수 있습니다.)
proc
그리고 의 매뉴얼 페이지를 살펴보면 :
proc 파일 시스템은 커널 데이터 구조에 대한 인터페이스로 사용되는 의사 파일 시스템입니다. 일반적으로 /proc에 마운트됩니다. 대부분은 읽기 전용이지만 일부 파일에서는 커널 변수를 변경할 수 있습니다.
동일한 매뉴얼 페이지에서 조금 더 자세히 설명합니다.
/proc/cpu정보
이는 CPU 및 시스템 아키텍처 종속 항목의 모음으로, 지원되는 각 아키텍처마다 다른 목록이 있습니다. 두 가지 일반적인 항목은 CPU 번호와 보고밉을 제공하는 프로세서입니다. 커널 초기화 중에 계산되는 시스템 상수입니다. SMP 시스템에는 각 CPU에 대한 정보가 있습니다. lscpu(1) 명령은 이 파일에서 정보를 수집합니다.
매뉴얼 페이지 하단에는 여기에서 찾을 수 있는 다음 제목의 커널 문서에 대한 참조가 있습니다./proc 파일 시스템. 해당 문서에서 인용하면 다음과 같습니다.
proc 파일 시스템은 커널의 내부 데이터 구조에 대한 인터페이스 역할을 합니다. 시스템에 대한 정보를 얻고 런타임(sysctl)에 특정 커널 매개변수를 변경하는 데 사용할 수 있습니다.
결론
그럼 우리는 여기서 무엇을 배웠나요? 이것이 /proc
의사 파일 시스템이자 "내부 데이터 구조에 대한 인터페이스"라고 불리는 점을 고려하면 그 안에 있는 항목이 다음과 같다고 가정하는 것이 안전할 것입니다.~ 아니다실제 파일이 아니라 파일처럼 보이도록 만들어진 표현일 뿐이지만 실제로는 그렇지 않습니다.
2004년 경의 이전 버전에 있었던 것으로 보이는 이 인용문으로 마무리하겠습니다. man 5 proc
그러나 어떤 이유로든 더 이상 포함되지 않습니다.메모:그것이 무엇인지 매우 잘 설명하기 때문에 왜 제거되었는지 잘 모르겠습니다 /proc
.
GNU/Linux 시스템의 /proc 디렉토리는 커널에 대한 인터페이스와 같은 파일 시스템을 제공합니다. 이를 통해 애플리케이션과 사용자는 일반적인 파일 시스템 I/O 작업을 사용하여 커널에서 정보를 가져오고 커널에 값을 설정할 수 있습니다.
proc 파일 시스템은 프로세스 정보 의사 파일 시스템이라고도 합니다. 이는 ``실제'' 파일을 포함하지 않고 런타임 시스템 정보(예: 시스템 메모리, 마운트된 장치, 하드웨어 구성 등)를 포함합니다. 이러한 이유로 커널의 제어 및 정보 센터로 간주될 수 있습니다. 실제로 상당수의 시스템 유틸리티는 단순히 이 디렉토리에 있는 파일을 호출하는 것입니다. 예를 들어, 커널에 의해 로드된 모듈을 나열하는 lsmod 명령은 기본적으로 'cat /proc/modules'와 동일하고 시스템의 PCI 버스에 연결된 장치를 나열하는 lspci는 'cat / proc/pci'. 이 디렉토리에 있는 파일을 변경하면 시스템이 실행되는 동안 커널 매개변수를 변경할 수 있습니다.
원천: proc 의사 파일 시스템
참고자료
답변3
@slm의 답변은 매우 포괄적이지만 관점을 바꾸면 더 간단한 설명이 나올 수도 있다고 생각합니다.
일상적인 사용에서 우리는 파일을 물리적인 것으로 생각할 수 있습니다. 일부 장치에 저장된 데이터 덩어리. 이는 /proc/cpuinfo와 같은 파일을 매우 신비롭고 혼란스럽게 만듭니다. 그러나 파일을 다음과 같이 생각하면 모든 것이 완벽하게 이해됩니다.상호 작용; 일부 프로그램 안팎으로 데이터를 보내는 방법.
이러한 방식으로 데이터를 보내고 받는 프로그램은 파일 시스템 또는 드라이버입니다(이 용어를 어떻게 정의하느냐에 따라 정의가 너무 넓거나 좁을 수 있음). 중요한 점은일부이들 프로그램 중 하드웨어 장치를 사용하여 이 인터페이스를 통해 전송된 데이터를 저장하고 검색합니다. 하지만 전부는 아닙니다.
파일 시스템의 몇 가지 예~하지 않다저장 장치를 (적어도 직접적으로) 사용하는 방법은 다음과 같습니다.
- 조회 또는 계산된 데이터를 사용하는 파일 시스템. Proc는 다양한 커널 모듈에서 데이터를 가져오기 때문에 한 예입니다. 극단적인 예는 πfs( github.com/philipl/pifs )입니다.
- 일반 사용자 공간 프로그램으로 데이터를 처리하는 모든 FUSE 파일 시스템
- 예를 들어 암호화, 압축 또는 오디오 트랜스코딩을 사용하여 다른 파일 시스템의 데이터를 즉시 변환하는 파일 시스템( khenriks.github.io/mp3fs/ )
플랜9 OS(http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs)은 파일을 일반 프로그래밍 인터페이스로 사용하는 극단적인 예입니다.