Linux에는 공유 메모리, (명명된) 파이프, 소켓, 메시지 큐 등 프로세스 간 통신을 위한 다양한 방법이 있습니다.
Linux 커널과 프로세스가 통신하는 동등하거나 유사한 방법은 무엇입니까? 몇 가지 방법이 있나요?
- 프로세스는 커널에 시스템 호출을 합니다.
- 커널은 프로세스에 신호를 보냅니다.
- 프로세스는 커널 파일을 사용하여 다음과 같은 일부 기능을 노출합니다.QEMU는 /dev/kvm 장치 노드를 통해 KVM을 사용합니다.
- 더...?
프로세스 간 통신은 프로세스 간에 임의의 데이터를 전송할 수 있지만 커널과 프로세스 간에 전송될 수 있는 데이터 형식은 (제가 나열한 방식에 따라) 더 제한적이라는 것이 맞나요?
감사해요.
답변1
프로세스 간 통신은 어떤 면에서는 사용자 공간과 커널 간 통신의 특별한 경우입니다. 프로세스 간 통신은 항상 커널에 의해 중재되기 때문입니다(적어도 설정 및 해제의 경우).
프로세스가 커널을 호출할 때 프로세스는 여전히 실행 중이지만 커널 모드에 있습니다. 따라서 프로세스와 커널을 구별하는 것은 편리하기는 하지만 다소 부정확하고 오해를 불러일으킬 수 있습니다. 나열된 이벤트로 인해 데이터가 사용자 공간에서 커널로 전달되고 커널 모드에서 수행되는 처리는 다음과 같습니다.
ioctl
(이것은 실제로 시스템 호출이지만 매우 일반적이므로 별도로 고려하는 것이 유용합니다.)- 메모리 매핑 파일(메모리 매핑은 프로세스 간에 메모리를 공유하는 방법이기도 함)
- 네트워크 링크 소켓.
사용자 공간과 커널 사이에 전송될 수 있는 데이터의 성격에는 본질적으로 제한이 없습니다.write
파일에 무엇이든 쓸 수 있습니다.send
소켓에 무엇이든 쓸 수 있습니다. 데이터가 의미가 있는지 여부는 자신이 수행하는 작업에 따라 다릅니다.소켓을 사용하는 두 프로그램 간의 통신을 위해 애플리케이션 계층 프로토콜이 존재해야 합니까?질문(모든 형태의 의사소통에 적용 가능)