{{위키데이터 속성 추적}}
'''로컬 프로시저 호출'''({{lang|en|Local Procedure Call}}, '''LPC''', 또는 '''Lightweight Procedure Call'''나 '''Local Inter-Process Communication'''라고도 함)은 내부의 문서화되어 있지 않은, [[프로세스 간 통신]](IPC) 기능이다. 이것은 프로세스들 간의 경량 [[프로세스 간 통신]]을 목적으로 [[윈도우 NT]] [[커널]]에서 제공한다. [[윈도우 비스타]]의 경우 LPC는 빠른 속도의 통신 방법을 제공하기 위해 '''Advanced Local Procedure Call''' ('''ALPC''')로 재작성되었다. 이것은 효율적으로 사용자 모드 드라이버 프레임워크를 구현한다. ALPC의 유저 모드 부분은 [[윈도우 NT 아키텍처|executive]] 내부의 UMDF의 구성요소와의 효율적인 통신을 필요로 한다.<ref>{{Harvcoltxt|Russinovich|Solomon|Ionescu|2009|p = 201}}</ref>

(A)LPC 인터페이스는 [[윈도우 NT]]의 문서화되지 않은 [[네이티브 API]]의 한 부분이며, 응용 프로그램이 직접적으로 사용할 수 없다. 그러나 아래의 예처럼 간접적으로 사용될 수 있다.
* 같은 머신의 프로세스들끼리 서로 통신할 때처럼 마이크로소프트 RPC API를 사용하는 경우.
* (A)LPC로 구현된 Windows API를 호출할 때.

== 구현 ==
(A)LPC는 커널의 안전한 포트 객체들을 사용하여 구현되며, 연결 상대방 프로세스의 식별을 허락한다. 각 메시지들 또한 안전하다. (응용 프로그램들은 메시지마다 SIDs를 세팅하며, (A)LPC 메시지와 관련된 토큰 내부의 security contest가 바뀌었는지를 테스트한다.

서버와 클라이언트 사이의 전형적인 통신 시나리오는 아래와 같다.
# 먼저 서버 프로세스는 ''named server connection port'' 객체를 생성하고 클라이언트의 연결을 기다린다.
# 클라이언트는 연결 메시지를 보냄으로써 알려진 포트에 연결을 요청한다.
# 만약 서버가 연결을 수용할 경우 두 ''unnamed''  포트들이 생성된다.
#* ''클라이언트 통신 포트'' - 특정한 서버와의 통신을 위해 클라이언트 쓰레드에서 쓰인다.
#* ''서버 통신 포트'' - 특정한 클라이언트와 통신하기 위해 서버에서 쓰인다. 클라이언트 마다 각 포트들이 생성된다.
# 클라이언트는 클라이언트 통신 포트 핸들을 받고, 서버는 서버 통신 포트 핸들을 받으며, 프로세스 사이의 통신 채널이 확립된다.
(A)LPC는 서버와 클라이언트 간의 메시지 교환에 대한 아래의 세 가지 모드를 지원한다.<ref>{{Harvcoltxt|Russinovich|Solomon|Ionescu|2009|p = 203}}</ref>
* 작은 메시지들 (256 바이트 이하)을 위해 커널은 프로세스들 간의 메시지 버퍼를 복사한다. 이것은 보내는 프로세스의 [[주소 공간]] 부터 시스템 주소 공간까지, 그리고 그곳부터 받는 프로세스의 주소 공간까지이다.
* 메시지가 256 바이트를 넘어설 경우, 공유된 메모리 섹션은 데이터 전송을 위해 사용되어야 한다.(A)LPC 서비스는 보내는 프로세스와 받는 프로세스들 간에 지도를 만들어 준다. 첫번째로 보내는 쪽은 공유된 메모리에 데이터를 놓고 받는 프로세스에게 공유된 메모리를 가리키며 통보를 한다.
* 데이터가 너무 커서 공유된 섹션에 맞지 않을 때, 서버는 클라이언트의 주소 공간에서 직접적으로 데이터를 읽고 쓸 수 있다.
ALPC 과거 LPC 인터페이스보다 LPC가 배타적으로 사용하는 동기화 요청/답변 메커니즘 대신 I/O completion ports를 사용하여 설정할 수 있으므로 성능적으로 유리한 점이 있다.<ref>{{Harvcoltxt|Russinovich|Solomon|Ionescu|2009|p = 204}}</ref> 이것은 메시지들과 쓰레드들의 수를 자동으로 균형을 맞춰, ALPC 포트들을 높은 속도로 통신할 수 있게 해준다. 게다가 ALPC 메시지들은 일괄처리될 수 있으므로 사용자 모드/커널 모드 전환을 최소화할 수 있다.

== 알려진 용법 ==
(A)LPC는 윈도우 NT의 내부 하위 시스템들 사이의 통신에서 많이 쓰인다. Win32 서브시스템은 (A)LPC를 클라이언트와 [[클라이언트/서버 런타임 서브시스템|CSRSS]] 사이의 통신에서 많이 사용한다. Quick LPC는 윈도우 NT의 3.51 버전에서 이 호출들을 더 빠르게 하기 위해 도입되었다. 이 방식은 4.0 버전에서 대부분 버려졌는데, 서버의 성능을 중요시하는 부분들이 커널 모드(win32k.sys)로 넘어왔기 때문이다.

[[로컬 보안 인증 하위 시스템 서비스]](LSASS : Local Security Authority Subsystem Service), [[세션 관리자 하위 시스템]](SMSS : Session Manager SubSystem), 그리고 [[서비스 제어 관리자]](SCM : Service Control Manager) 모두 클라이언트 프로세스들과 통신을 위해 직접적으로 (A)LPC 포트들을 사용한다. [[윈로그온]]과 보안 참조 모니터(SRM)는 LSASS 프로세스와의 통신을 위해 사용한다.

이미 언급했듯이, Microsoft RPC는 클라이언트와 서버가 같은 머신에 있는 경우 전송을 위해 (A)LPC를 사용할 수 있다. 많은 서비스들은 오직 RPC를 통해 단지 로컬 컴퓨터와 통신하기 위해 만들어졌다. 많은 경우에 Remote [[객체 연결 삽입]]과 [[분산 컴포넌트 오브젝트 모델]]은 로컬 통신을 위해 (A)LPC를 사용한다.

== 같이 보기 ==
<!--* Doors-->
* [[원격 프로시저 호출]]

== 노트 ==
{{각주}}

== 각주 ==
* {{인용|first1 = Prasad|last1 = Dabak|first2 = Milind|last2 = Borate|first3 = Sandeep|last3 = Phadke|title = Undocumented Windows NT|publisher = [[Hungry Minds]]|year = 1999|isbn = 0-7645-4569-8}}
* {{인용|title = Windows® Internals|edition = 5th|first1 = Mark|last1 = Russinovich|author1-link = Mark Russinovich|first2 = David|last2 = Solomon|first3 = Alex|last3 = Ionescu|year = 2009|publisher = [[Microsoft Press]]|isbn = 0-7356-2530-1}}

== 외부 링크 ==
* {{웹 인용 |url=http://www.windowsitlibrary.com/Content/356/08/toc.html |제목=Local Procedure Call |확인날짜=2015-10-08 |보존url=https://web.archive.org/web/20080612141354/http://www.windowsitlibrary.com/Content/356/08/toc.html |보존날짜=2008-06-12 |url-status=dead }} — Includes explanation of undocumented functions
* [http://www.zezula.net/en/prog/lpc.html LPC Communication]

[[분류:윈도우 구성 요소]]
[[분류:프로세스 간 통신]]