기본적으로 저는 임베디드 Linux가 단일 애플리케이션을 실행하기를 원하지만 최소한의 커널 프로세스와 최소한의 사용자 영역 프로세스를 사용합니다.
- 나는 커널이나 루트 파일 시스템의 크기에 별로 관심이 없습니다. (물론 얇은 것이 여전히 선호됩니다.)
- 따라서 커널에 추가로 내장된 모듈은 필요하지 않을 때 실행되지 않는 한 괜찮습니다. 나중에 사용/활성화할 수 있을 것 같아요
- 그리고 "ps", "top" 등의 명령을 실행할 수 있도록 모니터링할 커널 프로세스가 여전히 필요합니다.
- "Init" 프로그램을 변경하여 사용자 영역 프로세스를 활성화/비활성화할 수 있다는 것을 알고 있습니다. 맞나요?
- 하지만 커널 프로세스를 활성화/비활성화하는 방법은 무엇입니까?
- ---- 내 애플리케이션에 어떤 커널 프로세스가 필요한지 어떻게 알 수 있나요?
감사해요!
답변1
특정 커널 API를 지원하기 위해 존재하기 때문에 커널 스레드를 개별적으로 비활성화하는 일반적인 방법은 없습니다(예 [kworker/*]
:작업 대기열) 또는 하위 시스템(예: 플러시 및 기타 백그라운드 작업과 관련된 블록 하위 시스템의 스레드) 또는 모듈(예: 파일 시스템, 장치 매퍼 등을 관리하는 데 사용되는 스레드)
어떤 경우에는 이를 사용하는 커널 API가 실제로 선택 사항이 아니며 작업 대기열의 경우처럼 커널 스레드를 사용하지 않고 동일한 기능을 제공하는 대안을 제공하지 않기 때문에 실제로 비활성화할 수 없습니다. (그러나 커널 개발자들은 이 API에서 사용되는 전체 스레드 수를 줄이기 위해 노력했습니다.)
어떤 경우에는 특정 스레드를 비활성화할 수 있지만 일반적으로 전체 커널 하위 시스템이나 모듈을 비활성화해야만 스레드를 비활성화할 수 있습니다. 예를 들어, ext4를 더 이상 사용하지 않으면 ext4 커널 스레드도 없게 됩니다.
여기서 질문을 잘못하신 것 같습니다. 커널 스레드는 오버헤드의 원인이 아닙니다. 종종 그 반대가 사실입니다. 일부 프로시저와 콜백이 이동되었습니다.입력하다커널 스레드를 보다 효율적으로 실행할 수 있도록 하고, 동일한 작업을 수행하기 위한 별도의 메커니즘을 마련하는 대신 커널 스케줄러를 재사용하여 백그라운드에서 주기적으로 실행되도록 합니다.
커널 스레드는 실제로 추가 메모리를 차지하지 않고 커널 주소 공간만 공유합니다. (기술적으로 각 스레드에는 추가 스레드가 필요 task_struct
하지만 이는 임베디드 시스템에서도 기본적으로 관련이 없습니다.)
임베디드 시스템에 대한 커널 기능을 비활성화하는 것은 의미가 있지만 실행 중인 커널 스레드가 아니라 필요하지 않거나 조정할 수 있는 특정 커널 구성에 집중해야 합니다. 이는 매우 명백할 수 있지만(실행할 때 ps
등) 위에서 언급한 것처럼 이것이 실제로 시스템 리소스를 사용한다는 의미는 아닙니다. 따라서 효율성 향상을 찾고 있다면 커널 스레드에 집중하는 것보다 다른 곳에서 유용한 것을 찾을 가능성이 더 높습니다.