RPC 구현

System/Common 2011. 12. 7. 17:12

다음 글은 다음 논문에 대한 요약이다. 자바의 RMI 가 이 때의 RPC에서 얼마나 발전한 메커니즘인지를 여실히 알게해 주는 글이었다.


Andrew D. Birrell and Bruce J. Nelson

Xerox Palo Alto Research Center

Published: ACM Transactions on Computer Systems, Vol. 2, No. 1,

February 1984, pages 39-59.



Goals

Simplicity
- Make RPC as similar to procedure calls as possible simple semantics easy to understand
- Make distrusted computation easier
Efficiency
- Make sematic of RPC package as powerful as possible without losing efficiency
Security
- Secure end-to-end communications with RPC

Generality

- Procedures are well-known type


Procedure Calls:
    Transfer of control and data within a program
Remote Procedure Calls (RPC):
    Extend procedure calls across communication network
Caller:
    Environment that invokes RPC
Callee:
    Environment where procedure is to execute

Basic RPC Mechanism

  • Caller invoke a remote procedure and get suspended.
  • Parameters are passed across the network to the Callee.
  • Callee executes the procedure and produce results.
  • Results are passed back to the caller and caller resumes execution.


The authors wanted their implementation of this concept to be relatively transparent to the programmer,
so that an RPC call would look and feel semantically like a local procedure call.

Structure
Five pieces involved: user, user-stub, RPC communications package (RPCRuntime), server-stub, the server.


User

include server’s ID and unique sequence number with each call

specify or select server from available list or bind statically by network address

writes interface, client, and server code but doesn’t need to write any code for communication mechanism

RPC Runtime

manages communication between machines/processes


stub of user and server

  • Server and client link to programmatically generated stubs of a common interface module at compile time
  • stubs pack and unpack the requiring and required procedure call's network data

user stub

- imports the exported procedure's prototypes

server stub

- exports the prodecures


Server

register their exported interfaces with secure database servers

returns results to separate address space

executes the called procedure





Binding

- Naming and Location
    Naming: Specifying what machine to bind to.
   Location: Determining machine address of the callee and specifying the procedure to be invoked using Grapevine database

- Interface
    The caller needs to bind to a callee that can perform the remote procedure. This is specified for the callee
    by the abstraction that the authors call an interface.

    An interface consists of two components:
    (1) Type – specify which interface the caller expects the callee to implement.
        This concept is similar to an object oriented programming interface

    (2) Instance – specify which particular implementer of an abstract interface is desired.
        The instance is similar to an object that implements the OOP interface.


- Binding Types

  • Decision about instance made dynamically
  • Specify type, but dynamically pick instance
  • Specify type and instance at compile time


- Binding Events


Exporter: specifies network address, identifier and table index

Importer: iterates through member list returned by Grapevine


- Binding Events on Callee
    + The caller binds to the callee by specifying something to uniquely identify the callee (Naming in this case) and
      the callee’s location.
    + But first the caller must find out what callees are available to handle the request at the time of the procedure call.
      This is accomplished by a database lookup:
    + When a callee wishes to export an interface (make it available to callers), it stores information about its
      interface in a network accessible database.



-Binding Events on Caller
    The caller can then find the server callee in a database lookup:
        By specifying a particular instance of the desired interface type and receiving location information
         about that instance, or
        By specifying the type of the interface and receiving a list of instances that implement that type,
         and then iterating through them to find an available match.





Protocol
The protocol used is intended for small, discrete chunks of data, each of which can contain
    - Identifiers specifying caller, callee and call
    - Requested procedure and procedure arguments
    - Procedure results
    - Acknowledgements of received packets
    - Exception information

Note: a caller may send requests for acknowledgement to the callee, and as long as the callee responds,
the caller may wait indefinitely for results if the remote procedure deadlocks or loops (just like local procedure calls).

    - Simple Calls
        Retransmission of a packet (either from caller or callee) occurs until an acknowledgement is received.
        To the caller, a received packet containing the procedure results is viewed as an acknowledgement.
        To the callee, a received packet containing a new procedure call is viewed as an acknowledgement of
          the last procedure result sent.
        Each call by the caller carries a unique identifier so that subsequent calls to the same procedure
          may be processed, but duplicate packets (from retransmissions) for the same call will be discarded.
        Any given caller (process or thread on a given machine) will have at most one outstanding remote call.






    - Complicated Calls
        An acknowledgement is expected for each packet sent.
        The caller may send additional packets, called probes, if the callee is taking a long time to send results.

          After a certain threshold of probes sent without an acknowledgment, the caller may raise
          an exception to the user about a communication failure (again, a deadlocked callee can’t be detected). -- not good of extra overhead
        If the contents of a packet (procedure arguments or return results) are too large to fit in one packet,
          multiple packets are sent with all but the last requiring acknowledgement before transmission of the next.

          Each packet is sequentially marked.





Advantages of RPC protocol
- Minimal per-connection setup and teardown costs
- Minimal state when connection is idle
      Server just keeps last sequence number
      Client has a list of server addresses & IDs
- Minimize delay between RPC request and response – no handshaking phase
- No idle time communication, i.e.: keep-alive packets


Exceptions
    Exceptions for RPC are published in a server’s interface along with all of the normal procedure calls.
    Propagating any exceptions back to the caller and any handlers waiting there to catch them.
    Callee can transmit an exception instead of result packet.  Exception packet is handled as new call packet.
    RPCRuntime call failed exception, raised by the callee raised when there are communication difficulties.

Processes - optimizations
Processes:
    A server callee maintains a pool of available server processes to handle incoming requests:
    - This saves the cost of creating a new process to handle each request.
    - A new process is created to handle a new request when the available processes are busy.
    - To save on the costs of context switches between processes, each packet contains Ids of calling and serving processes.
Optimizations:
    - Minimize the costs of maintaining connections.
    - Avoid costs of establishing and terminating connections.
    - Reduce the number of process switches involved in a call.

Other Optimizations:
    - Use the subsequence packet as ACK
    - Bypass software layer if within same network

Security
    - Encryption end to end – based security for calls
    - Garpevine can be used as an authentication server


in failure

  • Machine failures are handled by re-transmission and re-binding.
  • Mesa has an exceptions and catch mechanism that RPC runtime passes back exception packets. (only pass back exceptions defined in I/F)


Performance
    - Measurements made for remote calls between two Dorados computers connected by Ethernet (2.94 Mbps)
    - Ethernet shared with other users, but the network was lightly loaded.
    - Did not use any encryption facilities.
    - 12000 calls made on each procedure.
    - Interval timed is from the time the user invokes a local procedure to the return of the procedure call.

    - Performance Summary:
        Mainly RPC overhead – not due to local call
        For small packets, RPC overhead dominates
        For large packets, transmission time dominates


Environment
Cedar:
    developing and programming environment.  Designed to be used on single-user workstation.  Also used for the construction of servers.
Dorado:
    Powerful machine with 24 bit virtual address space.
Network:
    2.94 megabit / sec Ethernet
Protocol:
    PUP
Language:
    Mesa (modified for the purpose of Cedar)

출처 - http://blog.naver.com/ahtz?Redirect=Log&logNo=20116355337

'System > Common' 카테고리의 다른 글

linux - File Descriptor  (0) 2011.12.12
Character Device File vs Block Device File  (0) 2011.12.08
심볼릭 링크 vs 하드링크  (0) 2011.12.08
솔라리스와 리눅스 런레벨 비교  (0) 2011.12.05
파일 시스템 구조  (0) 2011.12.04
Posted by linuxism
,

          Solaris                                                 Linux
0      PROM모드                                             전원 끔
s      단일사용자                                      X (SUSE: 단일사용자)
1      단일사용자+파일시스템                          단일사용자
2      다중사용자                                       다중사용자(TUI)
3      다중사용자+네트워크                   다중사용자+네트워크(TUI)
4      X                                                               X
5      전원 끔                                       다중사용자+네트워크(GUI)
6      재부팅                                                      재부팅

런레벨
init명령어
시스템 런 레벨을 변경하거나 시스템을 끄거나 재부팅 할 수 있음.
svc.startd 데몬에게 변경할 런 레벨을 알려줌.
Ex. init 0 , init 1 , init 3   .........

SMF에 의한 런 레벨 변경
# svcadm milestone single-user (런 레벨 s)
# svcadm milestone multi-uiser (런 레벨 2)
# svcadm mileston multi-user-server (런 레벨 3)

halt / poweroff 명령어
시스템 즉시 종료
rc0 스크립트를 실행하지 않고 종료
접속한 사용자에게 종료를 통보하지 않고 종료

shutdown 명령어
rc0 스크립트를 실행하고 정상적으로 종료
접속한 사용자에게 종료를 통보함
# shutdown -y -g0 -i5 systemoff!
                  -y : 시스템을 끌 것인지 물음에 무조껀 YES
                  -gn : 몇초후에 시스템을 종료할 것인지 (기본값 : 60초)
                  -in : 변경할 런 레벨
                   사용자에게 전송할 메세지

'System > Common' 카테고리의 다른 글

linux - File Descriptor  (0) 2011.12.12
Character Device File vs Block Device File  (0) 2011.12.08
심볼릭 링크 vs 하드링크  (0) 2011.12.08
RPC 구현  (0) 2011.12.07
파일 시스템 구조  (0) 2011.12.04
Posted by linuxism
,

- 파일 시스템 -
*파일 시스템이란?
파일과 그 안에 든 자료를 저장하고 찾기 쉽도록 유지 관리하는 방법
* 파일 시스템의 종류
FAT 32 : window 9x 시리즈의 파일 시스템
NTFS : windows NT4.0, window 2000 이상의 파일 시스템
EXT2 : 구 버전 리눅스에서 사용하는 파일 시스템
EXT3 : 현재 리눅스에서 널리 사용되는 파일 시스템
UFS :유닉스 파일 시스템(솔라리스)
NFS : 네트워크 파일 시스템
* 자기 디스크
하드 디스크,플로피 디스크등이 있다.
① 하드 디스크 구조
플래터 :
비자성체인 비금속(알루미늄) 원판(disk)표면에 자성체인 산화금속 막을 양면에 도장(coating)한 것이
다.
플래터위에 촘촘히 트랙을 만들고 섹터로 구분하여 데이터를 저장할 수 있는 공간을 만들어 준다.
포맷이라는 작업을 통하여 구획을 나누어 주어야 플래터에 데이터를 기록할 수 있다.
② 물리적 구조 :
1. 트랙 :
디스크의 표면에서 헤더가 돌아가는 원 모양의 섹터들의 모임이다.



2. 섹터 :
트랙을 부채꼴 모양으로 분할한 영역으로 주소가 부여되고 I/O의 단위
1Sector = 512Byte
3. 실린더 :
동일한 길이의 반지름을 가지는 트랙들이 상하로 모여 구성되는 모임이다.
4. 클러스터 : 여러개의 섹터를 묶은 단위.
③ 기억용량의 단위
하드용량 = 트랙 × 섹터 × 면수 × 바이트
실린더 수 = 트랙수
KB(Kilo Byte) : 1,024Byte = 210 = 103
MB(Mega Byte) : 1,024KByte =220 = 106
GB(Giga Byte) : 1,024MByte = 230 = 109







* 파일시스템의 구조

○VTOC 디스크 라벨(Disk Label)
VTOC에서는 디스크의 첫번째 섹터(512 바이트)를 차지하며, 각 파티션에 대한 정보를 담는다.
○부트 블록(Boot Block)
VTOC 다음의 15섹터를 차지하며, 부팅 시 최초 실행되는 Bootstrap 프로그램이 여기에 위치한다. 또
한 디렉토리의 가장 상위에 있는 ‘.(root directory)'도 여기에 위치한다.
○프라이머리 슈퍼 블록(Primary Super Block)
16섹터 크기이며, 다음과 같은 정보를 포함한다.
• 데이터 블록의 개수
• 실린더 그룹의 개수
• 데이터 블록의 크기 및 조각(Fragment)
블록 그룹 번호 (block group number)
블록 크기 (Block size)
그룹당 블록 수(Block per group)
• 하드웨어 정보
• 마운트 포인트 정보 (마운트 횟수 (Mount count))
• 파일 시스템 상태 정보
• 매직 넘버 (Magic Number)
• 개정 레벨 (Rebision Level)
• 프리 블록 (Free blocks)
• 프리 inode (Free Inode)
• 첫번째 Inode (First Inode)
○백업 슈퍼 블록(Backup Super Block)
백업 슈퍼 블록은 슈퍼 블록의 중요성 때문에 각 실린더 그룹마다 하나씩 복사하여 존재한다. 따라서
슈퍼 블록이 손상되더라도 충분히 복구가 가능해진다.
○실린더 그룹 블록(Cylinder Group Block)
각 실린더 그룹에는 다음과 같은 정보가 저장된다.
• I-노드의 개수
• 실린더 그룹에 속한 데이터 블록의 개수
• 디렉토리의 개수
• 실린더 그룹 내에 사용하지 않는 블록, I-노드 개수
○데이터 블록(Data Blocks)
실린더 그룹별 데이터 블록의 기본 크기는 8192바이트다.(8KB)

* i 노드 테이블 : 실린더 그룹에 대한 I노드들의 정보를 담고 있다.
총 15개의 데이터 블록 포인터를 가지고 있다.


• 파일의 종류와 접근모드
inode가 어느 파일에 해당하는지 나타내는 정보와, 접근권한을 나타내는 정보가
저장
• 파일의 소유자 및 그룹에 대한 UID와 GID
• 파일의 크기
• 파일에 마지막으로 접근, 변조, i노드가 변경된 시간
• 데이터 저장에 사용된 총 데이터 블록의 수
데이터 저장된 블록에 대한 포인터
맨 앞의 12블록은 inode가 실제 데이터를 가르키고 있다.
간접 블록과,이중 간접 블록,삼중 간접 블록은 해당 데이터를
i-노드는 이러한 데이터 블록에 대한 참조(Index) 정보를 가지고 있다.
각 파일은 각 실린더 그룹에 속하며 하나의 i-노드에 의해 구성된다.
i-node에는 데이터 블록에 대해 총 15개의 참조 정보가 있으며, 12번째 데이터 블록까지 기본으로
사용되며, 파일의 크기가 96KB 를 넘으면 13번째의 확장 참조자가 사용된다.
12번째까지 데이터 블록 포인터는 각각 8KB의 데이터 블럭을 가리킨다.(12 * 8=96KB)
13번째는 파일이 16MB 이하의 경우에 사용된다.
• 2048개의 데이터 블록 포인터를 갖는다.
• 16384KB ( 2048 * 8)
• 13번째 포인터까지 사용한 경우 최대 파일의 크기는 96+16384=16480KB
14번째는 32GB, 15번째는 70TB까지 이론상으로 가능하다.
• 확장 참조자가 다시 포인터만을 가진 간접 데이터 블록을 한번 더 거치게 된다.
사실상 파일 시스템에서 크기가 1TB 이상인 파일은 존재할 수 없다.
*가상 파일 시스템(The Virtual File System)
< 구조 (The VFS structure) >
VFS는 모든 파일 시스템이 필요로 하는 일련의 펑션을 정의하고 있다. 이러한 인터페이스는 세 종류
대상과 관련된 일련의 동작으로 구성된다. 즉 파일시스템, 아이노드, 열린 파일이다.
VFS는 커널에서 지원하는 파일시스템 타입을 알고 있다. 이는 커널 구성 동안에 만들어 지는 테이블
을 사용한다.이 테이블 내의 각 엔트리가 하나의 파일 시스템 타입을 정의한다.즉 파일시스템 타입
의 이름과 펑션에 대한 포인터이다.
어떤 파일 시스템이 마운트 될 때 그에 맞는 마운트 펑션이 불려 진다. 이 펑션이 디스크의 슈퍼블
록을 읽는 것을 담당하며,내부 변수를 초기화하고vfs에 마운트된 파일시스템 디스크립터를 돌려 준
다.
파일시스템이 마운트 된 후에 vfs 펑션은 물리적인 파일시스템 루틴을 접근하는데 이 디스크립터를
사용한다. 마운트된 파일시스템 디스크립터는 모든 파일시스템 타입에 공통된 며 가지의 데이터를 포
함 한다. 물리적 파일시스템 커널코드에 의해 제공되는 펑션에 대한 포인터와 물리적인 파일 시스템
코드에 필요한 고유정보이다.파일시스템 디스크립터에 포함된 펑션 포인터는VFS가 파일 시스템 내
부 루틴을 접근하는 것을 허용한다.
두 가지의 다른 디스크립터가 VFS에 의해 사용된다. 아이노드 디스크립터와 열린 파일 디스크립터이
다. 각 디스크립터는 사용 중인 파일에 관련된 정보와 물리적인 파일시스템 코드에 의해 제공되는 일
련의 동작을 갖고 있다. 아이노드 디스크립터는 어떤 파일에 대해서도 사용되는 펑션에 대한 포인터
를 포함하는데 비해 (e.g. create, unlink) 파일 디스크립터는 열린 파일에 대해서만 작동하는 펑션에
대한 포인터를 갖는다. (e.g. read, write)

[ 장치 파일(Device special files) ]
유닉스 계열 운영체제에서 장치는 특수 파일에 의해서 접근될 수 있다. 장치파일은 파일시스템에서
어떤 공간을 사용하지는 않는다.이들은 단지 장치드라이버의 접근점에 불과하다.
두 가지 형태의 장치특수파일이 존재한다.캐릭터와 블록 스페셜 파일이다.전자는 캐릭터 모드로 입
출력 동작을 허용하고 후자는 버퍼캐시 기능을 통해 블록모드로 데이터가 쓰여져야 한다. 특수파일에
대해서 입출력(I/O)요청이 일어날 경우 이들은 가상 장치 드라이버((pseudo) device driver)로 포워딩
된다. 특수파일은 장치형태를 구별해주는 메이저넘버와 각각의 유니트를 구별해주는 마이너넘버로 표
현된다.
[ 저널링 파일 시스템 ( Journaling FileSystem ) - ext3 파일 시스템 ]
리눅스의 표준 파일 시스템은 ext2 파일 시스템입니다. Ext2 파일 시스템은 리눅스의 표준 파일 시
스템으로 오랜 동안 안정적이고 뛰어난 성능을 보여 왔습니다. 그러나 ext2 파일 시스템은 정전이나
시스템 장애로 인하여 비정상적으로 시스템이 셧다운되었을 때 파일 시스템이 언마운트되지 않은 경
우나 Maximal mount에 도달하였을 때 데이터의 손실을 막기 위하여 데이터 구조 일치성을 파일 시스
템이 체크하도록 되어 있는데, 파일 시스템이 작을 경우에는 무의미 할 뿐더러 파일 시스템이 큰 경
우에는 부팅하는 데 상당한 오랜 시간이 걸리는 문제점이 있습니다.
그래서 부팅 할 때의 시간을 단축하면서 비정상적인 시스템 종료시 파일 시스템을 체크하지 않고 인
덱스(index)에 대한 로그를 기록하여 문제 발생 시 이를 복구할 수 있는 대체 파일 시스템이 요구되어
등장한 것이 저널리 파일 시스템입니다.
리눅스에서 지원하는 저널링 파일 시스템으로 ext3, reiserfs, XFS등이 많이 사용되고 있습니다. 레드
햇 리눅스 9 버전은 ext2 파일시스템의 대안으로 ext3 파일 시스템을 기본 파일 시스템으로 지원합니
다. Ext3 파일시스템은 ext2 파일 시스템과 호환성을 유지하는 파일 시스템입니다.
[ ext3 파일 시스템의 이점 ]
< ext3 파일 시스템의 가용성과 데이터 무결성 ( Data Integrity ) >
앞서 언급한 대로 ext2 파일 시스템은 예기치 못한 정전이나 시스템 충돌로 인하여 시스템이 비정상
종료 되었을 때 다시 부팅시 파일 일치성을 e2fsck 프로그램에 의해서 점검하게 됩니다. Ext2 파일
시스템에서는 파일 데이터를 바로 동기화시키지 않기 때문에 이러한 비상 사태가 일어나게 되면 데이
터 일치성이 맞질 않기 때문에 부팅시 이를 점검하게 되는 것입니다. 데이터 일치성 점검은 파일 시
스템 크기에 따라서 걸리는 시간이 달라 질 수 있습니다. 수기가 바이트의 파일 시스템을 갖고 있는
경우라면 파일 시스템을 체크하는데 있어서 상당한 오래 걸리며, 이 시간 동안에 시스템을 사용 할
수 없는 단점이 있습니다. 그러나 ext3 파일 시스템은 변경되는 파일 데이터를 바로 동기화시키기 때
문에 시스템이 급작스럽게 정지되더라도 다음 부팅시에는 파일 시스템을 체크하지 않고, 구조 일치성
을 체크하는데 불과 몇 초 밖에 걸리지 않기 때문에 부팅 속도가 빨라지는 이점이 있습니다. 항상 파
일시스템의 일치성을 유지하고 있어서 데이터 무결성을 보장해 주는 이점이 있습니다.
< ext2 파일 시스템에서 ext3 파일 시스템으로 변환 용이 >
레드햇 리눅스에서 저널링 파일 시스템으로 reiserfs 파일 시스템 대신에 ext3를 채택하게 된 것은
기존의 ext2 파일 시스템과의 호환성과 변환이 쉽기 때문입니다. Tune2fs 프로그램으로 사용하면
ext2 파일 시스템에 저널 ( journal )을 추가하여 ext3 로 변환할 수 있으며 ( 이때 tune2fs - j 파티
션)으로 저널링을 추가해 준다.레드햇 리눅스 9에서는 e2fsprogs 프로그램을 지원하고 있어서 이
프로그램이 설치되어 있으면 ext3 파일 시스템을 거꾸로 ext2 파일 시스템으로 사용할 수 있게 해줍
니다. 이와 같이 ext3파일 시스템은 ext2 파일 시스템에서 쉽게 변환 할 수 있는 이점이 있습니다.
< 속도 >
ext3 파일 시스템은 하드디스크의 헤더 동작을 최적화 시켜 주기 때문에 동일한 데이터를 여러 차례
반복 저장하더라도 ext2 파일 시스템에 비해 빠른 속도를 제공합니다. Ext3 파일 시스템에서는 데이
터 일치성 속도를 최적화할 수 있는 data=writeback, data=ordered, data=journal 등 세가지 저널링
모드를 제공하는데, /etc/fstab 파일에서 마운트 옵션으로 저널링 모드 값을 ‘data = 모드값’ 형태로
지정해 주어 사용할 수 있습니다. 레드햇 리눅스에서는 기본 저널링 기본값으로 data=ordered를 지원
하며, 이 모드는 블록이 순서대로 디스크에 저장되면서 완전한 데이터 일치성을 갖도록 해 줍니다.
* fsck (File system check)
파일 시스템이 완전한 상태를 유지하고 있는가를 검사하고, 잘못된 것은 바로 잡아주는 명령
사용법 #fsck [옵션] 검사 파일 시스템
[옵션]
-a : 검사도중 발견된 에러를 자동으로 복구
-r :검사도중 에러가 발견되면 복구할 것인가를 묻는다.
-V :검색 중 각종 정보를 자세하게 보여준다.
사용 예 #fsck –a /dev/hda1
* 사용량 측정
df : 디스크의 여유 공간을 보여준다
사용법 # df [옵션] 파일 시스템
[옵션]
-I : 블록 여유 용량 대신 inode 사용 정보를 보고
-k, h : 여유 용량을 킬로바이트와 메가 바이트 단위로 출력
사용 예 # df –h /dev/hda
du : 디스크의 사용량을 보여준다
사용법 # du [옵션] 디렉토리, 파일명
-s : 총 합계만 출력
-a : 크기가 계산된 각 파일의 크기를 출력
-b,h,k : 메가바이트 단위로 출력
사용 예 # du –h /root
* fdisk 명령어
파티션 생성 명령
사용법 # fdisk /dev/장치명
a      부트 파티션 저장
d      파티션 삭제
q      파티션 정보 및 종료
p      파티션 설정 상태 확인
w     파티션 정보 저장
t      파티션 시스템 유형 변경
n     새 파티션 생성
l     지원 가능한 파티션 보기

출처 - http://cominfo.tistory.com/entry/%ED%8C%8C%EC%9D%BC-%EC%8B%9C%EC%8A%A4%ED%85%9C 

'System > Common' 카테고리의 다른 글

linux - File Descriptor  (0) 2011.12.12
Character Device File vs Block Device File  (0) 2011.12.08
심볼릭 링크 vs 하드링크  (0) 2011.12.08
RPC 구현  (0) 2011.12.07
솔라리스와 리눅스 런레벨 비교  (0) 2011.12.05
Posted by linuxism
,