
서버 클러스터란, LAN 환경에서 연결된 여러대의 서버 머신으로 구성되는 것을 말한다.
일반적으로 3티어로 구성된다.

2티어의 서버들은 서로 다른 서비스들을 돌리고, 1티어의 스위치가 잘 라우팅해줘야 한다.
클라이언트는 여러 서버들을 알 필요가 없다. 딱 하나의 Access point하고만 통신을 하는 느낌을 받아야한다.
이것이 Access Transparency 다.
이 스위치는 로드 밸런서 역할을 할 수도 있는데, 우리가 네트워크에서 배운 일반 스위치보다
더 업그레이드 된 이런 기능을 내장해서 사용한다고 한다.
어쨋든 이 경우 스위치가 모든 요청을 다 받으므로 Single point of failure가 발생할 수 있으니,
여러 AP를 쓰거나 distributed server를 사용할 수 있다.

이동하는 모바일 기기가 있고, 각자 집이 있다고 해보자.
각 집에서 커버하는 네트워크를 Home-agent라고 하고, 그 안에서 쓰는 기기의 주소가 있을 것이다.
내가 이동을 하면, 다른 네트워크를 사용할 것이고, 새로운 주소를 부여받을 것이다.
이 주소를 내가 Home-agent에게 알려주고, 다른 누군가가 home-agent로 나를 찾으면, 이 새로운 주소를 알려주는 방식이다.
딱봐도 알듯 Home-agent에 bottle-neck이 발생할 것이다. 매번 얘를 거쳐야 하니까.
그래서 새로운 주소인 CA를 클라이언트에게 알려줘서, 다음에 요청할땐 direct로 통신하게 하는 것이다.
이는 Access transparency를 어기는 일이다. 그래서 직접 APP한테 알려주는 것이 아니라, client의 app 아래의
middleware에서 저장하게 하고, app은 그냥 늘 먹던대로 통신하는데 아랫단에서 주소 설정을 해주는 방식이다.

이를 가져와서, 여러 클라이언트가 하나의 AP와 통신하는듯 하게, 그러나 여러 서버로 매핑하는 distributed server구현이 가능하다.
분산 시스템에서의 코드 마이그레이션은 성능 향상을 위해 진행된다.
과부하가 심한 A 머신에서, 덜 바쁜 B로 작업을 이전할 수 있는 것이다.
코드 이전을 위해 3 파트로 나눠서 설명.
코드의 이동성의 정도를 기준으로 나눌 수 있다.
weak mobility에선,
기존 프로세스에서 코드를 실행할 수도 있고,
새로운 프로세스를 생성해서 코드를 실행할 수도 있다.
strong mobility에선,
실행 상태를 전송(VM)하거나, 원격 복제를 해서 작업을 처리(Remote replication)한다.

위에서 말햇듯 리소스 세그먼트란,프로세스가 필요로 하는 외부 리소스들이다.
파일, 네트워크 리소스 등.
이걸 다른 컴퓨터로 옮기는 것이 가능한가? A의 Socket을 B에서 가져갈 수 있는가?
프로세스가 리소스를 참조하는 방식에 따라 세가지 바인딩이 있음
리소스가 기계와 얼마나 민접해있는지에 따라 3가지 유형으로 나눌수도 있다.

MV : 이동
GR : global reference
CP : Copy
RB : Rebind (여기서 새로 실행)
ex 1. 이미지를 많이 쓰는 프로세스
A에 이미지 파일들과, 프로그램이 있다면,
B에 프로그램만 옮기고, 이미지 파일은 A에서 네트워킹으로 받아 쓰면 된다. 이때 필요한게 global reference다. 대신 퍼포먼스는 떨어지겠지.
Ex 2. 프로세스가 소켓을 사용중인 경우
old 머신이 소켓을 통해 다른 기기와 통신을 할 것이다.
new에서는 소켓을 만들긴 하되,
나는 old머신이 메시지 받았을 때 new에게 다시 전달하는 통로만 뚫어주면 된다. 이게 global reference.
OS고 HW고 다 다를 경우
실행환경(OS)를 옮기면 됨 => VM 같은거 써서
메모리는 어떻게 옮기나?