본문 바로가기
Android

안드로이드 하드웨어 서비스 01 안드로이드 하드웨어 서비스 (2)

by OKOK 2021. 5. 19.

1.2 IPC(Inter Process Communication)

프로세스는 독립된 실행 객체로 서로 다른 프로세스는 서로 다른 주소 공간에서 실행됨. 프로세스 간에 영향을 받지 않는 장점이 있지만 주소 공간이 독립되어 있는 만큼 별도의 프로그래밍 장치가 없이 서로 간의 통신이 어려움. 안드로이드 네이티브 데몬 서비스에서 주로 사용하는 리눅스 커널 IPC인 파이프와 유닉스 도메인 소켓을 소개하고.

 

ppid가 1인 프로세스는 init 프로세스에 의해 생성된 데몬 프로세스임. 데몬 프로세스는 init 프로세스가 fork(), exec() 호출하여 새로운 데몬 프로세스를 만들음. Zygote 프로세스는 시스템 서버를 생성하고 각종 자바 앱을 생성함. 

 

유닉스와 리눅스에서 새로운 프로세스를 만드는 함수는 fork함수가 유일함 서버 프로세스가 클라이언트 프로세스의 요청을 처리하기 위해 자신을 복사하여 worker 프로세스를 만들 때 사용. 주로 네트워크 서버에서 사용되는 방법임. 새로운 프로그래믕ㄹ 생성할 때 사용됨. 리눅스에서 새로운 프로세스르 생성하기 위한 방법은 오직 fork() 호출하는 것임. 부모 프로세스인 프로그램 A는 fork() 호출하여 자식 프로세스를 생성함. 자식 프로세스는 exec() 호출하기 전까지 프로그램 A의 코드를 실행하지만 exec() 호출된 후 프로그램 B가 실행됨. exec() 게열은 새로운 프로세스를 현재 프로세스에 덮어쓰는 함수라고 이해하면 됨. fork 후에 pid에 의해서 자식 프로세스의 실행 흐름과 부모 프로세스의 실행 흐름을 제어해야 함. 

 

1.2.3 리눅스 커널의 IPC

서버와 클라이언트 모델에서 서버 프로세스는 클라이언트 프로세스의 서비스 요청을 처리하고 그 결과를 프로세스에 반환함. 통신을 위해 오에스 레벨의 데이터 교환 메커니즘이 필요함. 세마포어는 프로세스 간 데이터를 동기화하고 자원에 대한 접근을 제어하기 위해 사용됨. 유닉스 도메인 소켓은 동일한 시스템 내의 프로세스 간의 통신을 위한 방법을 제공함. 파이프는 부모 프로세스와 자식 프로세스 간의 통신 또는 동일한 부모를 갖는 프로세스 간의 통신에서만 사용이 가능한 한계가 있음. 소ㅔㅅ은 동일한 시스템상의 프로세스들 간의 통신이나 네트워크상에 연결된 프로세스 간의 통신을 위한 프로그래밍 인터페이스를 제공함. 클라이언트가 서버에 접속하기 위해서 서버의 소켓은 지정된 내부 주소와 포트를 가지고 있어야 함. 서버 소켓의 IP와 포트 번호를 리눅스 커널에 등록해야 하는데 이 작업은 bind() 함수에 의해 수행됨. 클라이언트가 서버의 주소를 connect() 함수에 의해 제공하는 반면, 서브는 bind()함수를 통해 자신의 주소와 포트 번호를 지정함. 

 

1.2.6 유닉스 도메인 소켓

유닉스 도메인 소켓은 소켓 에피아이 수정이 필요 없이 동일한 시스템 내의 파일시스템을 이용하여 내부 프로세스 간의 통신을 위해 사용할 수 있음. 

 

1.3.1 서버/클라이언트 모델

fork() 프로세스를 생성하는 것은 OS의 많은 자원을 소모하는 동작이며 멀티프로세스는 서로 독립적인 메모리 공간에서 실행되므로 프로세스 간 IPC가 필요하므로 프로그래밍이 복잡해지는 단점이 있음. 반면 멀티 스레드는 새로운 프로세스를 새엉하지 않고 프로세스의 대부분 리소르를 공유하고 쓰레드를 위한 자료구조(지역변수, 레지스터 저장을 위한 공간, 스택, 피씨)만 필요한 가벼운 모델이다. 따라서 이러한 멀티 프로세스 모델의 문제점을 해결하면서 병렬 처리가 가능한 멀티 쓰레드를 사용함. 이러한 멀티 쓰레드 모델의 단점은 하나의 쓰레드가 죽으면 그 쓰레드를 포함한 프로세스 전체에 심각한 영향을 미치고 각 쓰레드 중 어떤 것이 먼저 실행될지 그 순서를 예측하기 힘들기 때문에 디버깅하기 힘듬. 멀티 플렉싱 모델은 단일 프로세스 또는 쓰레드를 이용해서 멀티 클라이언트에 서비스를 제공함. 

댓글