질문:
Go 프로세스를 포크하고 새 프로세스를 얻는 방법 프로세스 ID?
답변:
Go 프로세스를 분기하고 새 프로세스의 ID를 얻으려면 다음 위치에 있는 syscall.ForkExec() 함수를 사용할 수 있습니다. syscall 패키지.
Go 라이브러리의 fork() 함수는 사용자의 요구를 충족할 수 없다는 점에 유의해야 합니다.
fork() 함수가 처음 발명되었을 때는 스레드를 사용하지 않았고 프로세스에는 항상 실행 스레드가 하나만 있었기 때문에 포크가 안전했습니다. 그러나 Go가 고루틴 스케줄링을 구동하기 위해 운영 체제 수준 스레드를 많이 사용하면 상황이 근본적으로 바뀌게 됩니다.
Linux에서 장식되지 않은 fork(2)는 이제 하위 프로세스가 상위 프로세스에서 fork(2)를 호출하는 단일 스레드만 갖게 하는 반면 Go 런타임에서 사용하는 모든 스레드(일부 중요한 스레드 포함)는 그렇지 않습니다. 그중에서. 기본적으로 이는 하위 프로세스가 Go 코드를 계속 실행하는 것을 기대할 수 없으며합리적으로 할 수 있는 유일한 일은 즉시 exec(2)를 실행하는 것입니다. 이것이 syscall.ForkExec()이 사용되는 용도라는 점에 유의하세요.
이제 좀 더 생각해 보세요. 내 생각에 지금 당장 fork(2)를 직접 호출하는 데 유용한 유일한 것은 Redis에서 사용하는 것과 같은 "최선의 비동기 프로세스 상태 스냅샷"뿐입니다. 이 기술은 자식 프로세스가 부모 프로세스의 모든 메모리 데이터 페이지를 상속한다는 사실에 의존하지만 운영 체제는 실제로 모든 데이터를 복사하지 않고 쓰기 시 복사 기술을 사용하므로 자식 프로세스는 거기서 멈추고 모든 데이터를 저장할 수 있습니다. 상위 프로세스가 자체 주소 공간의 데이터를 수정하는 동안 구조를 디스크에 저장합니다. 그리고 다른 가능한 fork() 사용은 즉시 exec()를 의미합니다. 이는 exec.Command()와 같은 함수에 대한 것입니다. 그런데 도대체 왜 fork()를 사용합니까?
위 내용은 Go 프로세스를 포크하고 PID를 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!