This week I Learned 15

주영택·2020년 4월 13일
1

This Week What I Learned

목록 보기
13/50

Fork 하지 않고 프로세스를 실행하기

오늘 S 팀장님이 npm 으로 실행되는 서브 프로그램들을 수행하는 작업을 진행하면서 서브 프로그램들이 종료되면서 npm 이 함께 종료되고 있다는 (이게 정상임) 얘기를 해주시면서 npm 으로 실행되는 서브 프로그램들이 child process 로 실행되는게 맞냐고 물어보셔서 관련 내용을 정리해본다.

우선 이 이야기는 다음과 같은 검색어로 구글링해보면 좀 더 다양한 논의들을 접할 수 있다.

  • fork: fork 는 두 개의 프로세스를 return 하고 다른 하나는 child 프로세스가 된다.
  • exec: exec 는 자신을 새로운 프로세스Id 로 할당한다.
  • orphan process: 사실 orphan process 는 init 프로세스의 child 가 된다.
  • zombie process: 프로세스는 종료되었지만 프로세스 테이블에 기록이 남아 있는 상태.
  • daemon: 의도적으로 ohphan 이 되어 백그라운드에서 실행된 프로세스
  • nohup: 유닉스like 시스템에서 해당 프로세스를 daemon 화 시킨다.
  • disown: 해당 프로세세를 부모 프로세스에서 제거하고 orphan 화 한다.

참고 Orphan vs Zombie vs Daemon processes

프로세스를 백그라운드로 실행시키기

ctrl+z 그리고 Job 콘트롤 명령을 통해 프로세스를 백그라운드로 넘길 수 있다.

명령을 실행할 때 & 를 추가해 명시적으로 백그라운드에서 실행한다.

현재 터미널 프로세스를 종료해도 백그라운드 프로세스를 유지시키려면

위에서 본 disown 명령을 사용해 종료하지 않을 프로세스를 고아로 만든다. 즉, 현재 터미널 프로세스의 자식 프로세스가 아니라 init 프로세스의 자식으로 만든다. 터미널이 죽어도 해당 프로세스는 종료되지 않는다.

참고 How to Start Linux Command in Background and Detach Process in Terminal

CPS 를 지원하는 언어에서 스레드 콜스택을 추적하는 법

Continuation Passing Style 지원 언어들은 그동안 스레드 기반 멀티 프로그래밍 환경에서 제공하는 스레드 콜스택 추적을 대신하여 어떤 방법을 사용하고 있는지 이야기를 나누었는데...

콘텍스트가 콜스택을 추적하기 위해서는 세션 아이디 같은 걸 계속 달고 다니는 방법 밖에 없다는 결론에 다다랐다.

컨커런트 프로그래밍의 세계는 참 오묘하다.

취미용 두 개의 언어를 고른다면

C 를 대체할 Zig 와 GC 가 필요하다면 Nim 정도 사용하고 싶다.

링크들

profile
NodeJS 백엔드 웹 개발자입니다.

0개의 댓글