저는 단일 코어 임베디드 Linux 시스템의 부팅 시간을 단축할 수 있는 방법을 찾고 있습니다. 일부 사용자 정의 데몬은 시작 중에 눈에 띄는 지연을 경험합니다. 일단 시작되면 백그라운드에서 실행되지만 실행 프로세스에 오랜 시간이 걸립니다.
##This takes long during startup
##In file /etc/init.d/run_custom_daemon
...
/opt/bin/custom_daemon -d
...
데몬의 시작을 백그라운드에 놓으면 시작 시간이 줄어드는 것을 알 수 있습니다.
##This takes much less but is it a real gain?
##In file /etc/init.d/run_custom_daemon
...
/opt/bin/custom_daemon -d &
...
로그인 화면에 도달하는 데 걸리는 시간에만 관심이 있는 사람에게는 이것이 속도 향상처럼 보입니다. 그러나 이것은 단지 외관상의 개선일 뿐이며 시작 시퀀스의 다음 프로세스에서 데몬이 시작 시 실행될 것으로 예상하는 경우 문제를 일으킬 수 있다고 생각합니다.
이것이 올바른 가정인가요?
답변1
일반적으로 데몬은 상위 프로세스가 종료되기 전에 두세 번 분기됩니다. 데몬이 bg에서 시작되면 비대화형 쉘은 첫 번째 포크가 종료될 때까지 기다리지 않습니다. 아무런 관련이 없기 때문에 즉시 종료됩니다. 이렇게 하면 작업 속도가 약간 빨라질 수 있습니다. 데몬이 실패하지 않을 것이라고 확신한다면 이것이 나쁜 결과를 가져올 것이라고는 생각하지 않습니다.
포크를 제거하여 속도를 높이려면 다음과 같이 'exec'할 수 있습니다 exec daemon
. 하지만 'bg'와 'exec'는 데몬의 반환 값을 얻을 수 없습니다.
"init" 또는 init에 의해 생성된 일부 에이전트가 일부 쉘 마법으로 이를 알아낼 때 실행할 다음 init 스크립트가 자체 복제되어 "next init scritp"를 실행하고 exec[lv]* 일련의 함수가 발견됩니다 #! "next init script"를 인수로 하여 인터프리터를 실행하면 인터프리터는 다음 데몬이 시작될 때까지 "next init script"를 구문 분석하고 실행하며 커널은 간헐적으로 CPU 시간을 얻습니다... 첫 번째 데몬이 시작될 것으로 예상됩니다. .
데몬의 첫 번째 포크는 두 번째 "포크" 시스템 호출의 종료를 확인하고 종료하는 것 외에는 아무 작업도 수행하지 않습니다. 다른 사람이 첫 번째 포크에서 열려 있는 "fd"를 닫고 연기하는 대신 0,1 및 2에서 /dev/null을 열 수 있습니다. 일부 벤치마크는 성능을 어느 정도 밝힐 수 있습니다.