2017년 4월 8일 토요일

안드로이드에서 프로세스와 스레드 생성 과정

Linux프로세스 생성과 관련한 코드를 살펴보았으니, 이번에는 실제로 안드로이드(Android) 플랫폼에서의 프로세스 생성이 어떻게 이뤄지는지, 그 과정을 살펴보도록 하자. 안드로이드에서의 프로세스(Process) 생성과 스레드(Thread) 생성에 관련한 각각의 예를 살펴보자.

안드로이드에서의 프로세스(Process) 생성 안드로이드에서의 프로세스 생성에 자주 사용되는 함수는 Java의 표준 라이브러리인 Runtime을 이용한 실행이다. Runtime.exec() 를 통해서 Process 를 생성하고 Process는 stdout로 Process가 실행된 결과를 전달한다. 이미 이전 글에서 Linux 는 프로세스 생성에 fork-and-exec 모델에 대해 알아보았다. 시스템 콜 함수인 fork() 함수와 exec() 함수를 호출해서 외부 프로세스를 실행한다.

안드로이드에서는 아직 vfork() 함수를 사용하고 있다.(이전 글에서 vfork() 함수는 서서히 없어질 것처럼 기재했었지만..) vfork() 함수는 부모 프로세스와 같은 자식 프로세스를 생성하고, 메모리 공간은 공유하기 때문에, 부모 프로세스는 exec() 함수가 호출될때까지 잠시 대기(sleep)한다. exec() 함수는 하위 프로세스가 실행할 파일을 읽어 메모리 이미지를 변경하고 새로운 프로그램을 실행한다. 아래에서 보이는 예제에서는 ping 명령어 실행이 이뤄졌다. vfork() 함수 호출 후에, exec() 함수를 호출하면 프로세스를 생성했던 부모 프로세스는 sleep에서 깨어나 이전에 실행했던 프로세스를 계속 실행하며, 새로이 fork된 자식 프로세스(이경우는 ping 명령어)는 새로운 메모리 공간에서 실행을 시작한다.

Runtime.exec() 호출 시, JAVA library 단에서 native 단 호출까지 함수 콜을 아래 모두 표시해두었다. UNIXProcess_md.c 파일에서 UNIXProcess_forkAndExec 함수를 보면 실제 프로세스 생성에 사용되는 vfork 와 exec 함수 system call 호출을 확인할 수 있다.

fork process on android

안드로이드에서의 스레드(Thread) 생성 안드로이드에서의 스레드 생성에 대해 살펴보자. 아래 예는 Thread를 생성하고 start로 Thread를 실행했을 때의 함수 호출을 표시해두었다. Thread start 호출 시, 안드로이드 art 의 thread.cc 파일에서 pthread_create 함수를 이용하여 thread를 생성한다. pthread는 POSIX 스레드(POSIX Threads)의 약자로, 모든 유닉스 계열 POSIX 시스템에서, 일반적으로 이용되는 표준 라이브러리이다. 실제로 thread를 생성하는 부분은 pthread_create 함수 안에 clone 호출로 이뤄져있다. Clone 함수 호출 시, 사용되는 flags들도 눈여겨보자. 안드로이드에서의 thread 생성 시, 아래 flag가 설정되어 clone system call로 전달되는 것이다.

fork thread on android

안드로이드 프로세스(Process) 생성과 스레드(Thread) 생성에 관련한 각각의 예를 살펴보았다. 실제로 함수 콜을 따라가면서, 함수들을 살펴보면, 좀 더 깊은 이해를 할 수 있다.

Navigation of this blog:이 블로그 한눈에 보기

댓글 없음:

댓글 쓰기