KR100308024B1 - 객체지향분산처리시스템에서멀티미디어스트림데이터의제어및자원할당을위한방법 - Google Patents

객체지향분산처리시스템에서멀티미디어스트림데이터의제어및자원할당을위한방법 Download PDF

Info

Publication number
KR100308024B1
KR100308024B1 KR1019980047673A KR19980047673A KR100308024B1 KR 100308024 B1 KR100308024 B1 KR 100308024B1 KR 1019980047673 A KR1019980047673 A KR 1019980047673A KR 19980047673 A KR19980047673 A KR 19980047673A KR 100308024 B1 KR100308024 B1 KR 100308024B1
Authority
KR
South Korea
Prior art keywords
stream
graph
sub
processing system
distributed processing
Prior art date
Application number
KR1019980047673A
Other languages
English (en)
Other versions
KR20000031566A (ko
Inventor
윤성진
Original Assignee
구자홍
엘지전자주식회사
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 구자홍, 엘지전자주식회사 filed Critical 구자홍
Priority to KR1019980047673A priority Critical patent/KR100308024B1/ko
Publication of KR20000031566A publication Critical patent/KR20000031566A/ko
Application granted granted Critical
Publication of KR100308024B1 publication Critical patent/KR100308024B1/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5022Mechanisms to release resources

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법은 멀티미디어 스트림 데이터의 전송을 쉽게 제어하고, 이에 필요한 자원을 효율적이고 일관되게 할당하기 위한 것으로, 스트림을 생성하여 전송하고 이를 최종적으로 받아 처리하는 일련의 소스 버츄얼 디바이스(Source Virtual Device)와 인터미디이트 버츄얼 디바이스(Intermediate Virtual Device), 싱크 버츄얼 디바이스(Sink Virtual Device)와 그들 사이를 연결하는 스트림 커넥션(Stream Connection)과 같은 객체들을 스트림 그래프(Stream Graph)로 추상화한 후 이를 그룹핑(grouping)하여 관리하는데 그 요지가 있다.

Description

객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법{method for allocating and controlling multimedia stream data resource in object-oriented distributed process system}
본 발명은 객체 지향 분산 처리시스템의 멀티미디어 프레임워크 구조에 관한 것으로, 특히 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 관한 것이다.
멀티미디어 프레임워크는 멀티미디어 데이터의 처리와 전송을 위한 서비스들을 추상화하여 멀티미디어, 응용 프로그램 개발자가 하위 레벨의 지식없이도 여러 플랫폼에서 동일한 인터페이스로 쉽게 프로그램을 디자인하고 구현할 수 있는 환경을 제공해 주는 미들웨어이다.
종래의 멀티미디어 프레임워크에 대한 연구로는 OMG(Object Management Group)의 RFP Submission인 "Control and Management of Audio/Video Streams"가 있으며, IMA(Interactive Multimedia Association)의 MSS(Multimedia System Services), MS의 ActiceMovie 등이 있다. 이들은 스트림 데이터를 생성하여 종료할 때까지의 거치게 되는 프로세서와 연결을 별개의 단위로 모델링하여 이들을 조합함으로써, 하나의 멀티미디어 시스템을 구축할 수 있도록 구성되어 있다.
먼저, OMG Stream RFP Submission의 경우 스트림 데이터를 처리하는 프로세스는 스트림 데이터를 주고받는 양단(End Party)의 내부에 감추어져 있다고 보고 양단의 연결을 어떻게 하느냐의 관점에서 구조를 설계하였다. 그리고 데이터를 주고받는 연결의 최하위 단위를 플로우(Flow)로 보고 이들을 묶어서 다시 스트림으로 추상화하였다. 이 구조는 양단을 응용 프로그램 수준에 해당하는 추상화를 할 수 있어서 사용자 입장에서 쉽게 접근할 수 있는 장점이 있는 반면, 스트림 데이터를 처리하는 프로세스 단위의 추상화가 없기 때문에 구현시 이를 별도로 고려해 주어야 하는 불편함이 있다. 또한, 양단의 입장에서 설계를 했기 때문에 여러 호스트에 걸쳐서 스트림 데이터가 흐르는 경우, 이를 고려한 확장된 구조를 필요로 한다.
IMA의 MSS 경우, 스트림 데이터를 처리하는 프로세스 단위를 버츄얼 디바이스(Virtual Device)로 모델링하고 이들 디바이스 사이를 연결하는 버츄얼 커넥션(Virtual Connection)로 모델링하였다. 이때, 버츄얼 디바이스(Virtual Device)의 실제 위치(Physical Connection)는 분산되어 있을 수 있다고 가정을 하기 때문에 버츄얼 디바이스(Virtual Device)와 버츄얼 커넥션(Virtual Connection)의 조합으로 구성되는 전체 시스템은 여러 호스트에 걸쳐서 존재할 수 있게 된다. 이 모델의 경우 버츄얼 디바이스(Virtual Device)와 버츄얼 커넥션(Virtual Connection)을 통과하는 스트림을 일괄적으로 제어를 하기 위해서는 그룹 서비스(Group Service)를 통해 이들을 그룹핑(Grouping)하게 되는데, 임의의 그룹핑(Grouping) 범위를 설정하기 어려운 단점이 있다. 즉 스트림을 구성하는 요소들을 하나씩 그룹(Group)에 추가하거나 전체를 한꺼번에 추가하는 방법밖에 제공되고 있지 않고 있다. 또한 일단 그룹(Group)이 정의되어 구성 요소들에게 자원이 할당된 후에는 동적으로 그룹(Group)의 요소들을 변경할 수 없다.
MS의 ActiceMovie 역시 스트림 데이터를 처리하는 단위를 필터(Filter)로 모델링하였으며 필터들은 한쪽 필터의 출력핀(OutPin)과 다른쪽 필터의 입력핀(InPin)이 연결되도록 하였다. 그러나 연결에 대한 별도의 추상화는 없으며 따라서 연결에 대한 인터페이스는 노출되지 않게 된다. 이러한 전체 필터들의 연결을 필터 그래프(Filter Graph)라 하며 이 필터 그래프를 관리해 주는 필터 메니저(Filter Manager)가 존재하여 이를 통해 스트림을 제어할 수 있으며 QoS를 설정할 수 있게 된다. 그러나 필터 메니저(Filter Manager)가 관리해 주는 스트림의 범위는 고정적이어서 동적으로 바뀔 수 없으며 서브-스트림(Sub-stream)을 제어할 수 없다는 단점이 있다.
상기 MS의 ActiveMovie는 앞의 두 모델과 달리 로컬 호스트(Local Host)에서의 멀티미디어 스트림 데이터(Stream Data)를 처리하기 위한 프레임워크이기 때문에 네트워크상의 스트림을 흐르게 하는 연결은 존재하지 않는다.
그러나 종래 기술에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 스트림 RFP 서브미션의 경우 스트림 데이터를 처리하는 프로세스 단위의 추상화가 없으며, 여러 호스트에 걸쳐 스트림 데이터가 흐를 경우 이를 별도로 고려해야 하는 문제점이 있다.
또한, 종래 기술에 있어서 MSS는 그룹 서비스를 통해 그룹핑할 경우 임의의 그룹핑 단위를 설정하기 어려운 문제점이 있다.
그리고 종래 기술에 있어서 액티스 무비(Active Movie)는 필터 메니저가 관리해 주는 스트림의 범위가 고정적이어서 동적으로 바뀔 수 없으며 서브 스트림을 제어할 수 없는 문제점이 있다.
따라서 본 발명은 상기와 같은 문제점을 해결하기 위해 안출한 것으로서, 멀티미디어 스트림 데이터의 전송을 쉽게 제어하고, 이에 필요한 자원을 효율적이고 일관되게 할당하도록 한 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터 제어 및 자원 할당을 위한 방법을 제공하는데 그 목적이 있다.
도 1 은 마이크에서 스피커로 오디오 데이터가 전송되는 모습을 나타낸 도면
도 2a 및 도 2b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 인터미디이트를 거쳐 전송되는 스트림을 나타낸 스트림 그래프
도 3a 및 도 3b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 디스트리뷰터를 거쳐 전송되는 스트림을 나타낸 스트림 그래프
도 4a 및 도 4b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 멀티캐스트 스트림 커넥션을 거쳐 전송되는 스트림을 나타낸 스트림 그래프
도 5a 및 도 5b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 믹서를 거쳐 전송되는 스트림을 나타낸 스트림 그래프
도 6a 및 도 6b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 전송되는 스트림을 나타낸 스트림 그래프
도 7 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 전체 스트림 그래프를 그룹핑하는 경우를 나타낸 도면
도 8 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 시작과 끝 노드를 명시해서 서브-스트림 그래프(Sub-stream Graph)를 찾는 경우를 나타낸 도면
도 9a 및 도 9f 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 노드나 에지에 영향을 주는 서브-스트림(Sub-stream)을 나타낸 도면
도 10a 및 도 10b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 노드 제거시 커넥티버티 넘버가 2가 되는 경우와 1로 유지하는 경우를 나타낸 도면
도 11 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 서브-스트림(Sub-stream)을 제어하는 과정을 나타낸 도면
도 12 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 전송되는 스트림의 전달상태를 나타낸 도면
도 13 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 디바이스 내에서의 전송되는 스트림의 관리상태를 나타낸 도면
도 14 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 복합 장치를 나타낸 도면
도 15 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 그룹(Group) 병합 상태를 나타낸 도면
도 16a 및 도 16c 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 그룹(Group) 분리 상태를 나타낸 도면
도 17 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 그룹(Group) 추출 상태를 나타낸 도면
도 18a 및 도 18b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 믹서를 거쳐 전송되는 스트림의 관리 상태를 나타낸 도면
도 19 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 유사 코드의 검증 상태를 나타낸 도면
도 20a 및 도 20b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 서브그래프 생성을 위한 알고리즘의 검증을 위한 도면
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터 제어 및 자원 할당을 위한 방법의 특징은, 스트림을 생성하여 전송하고 이를 최종적으로 받아 처리하는 일련의 소스 버츄얼 디바이스(Source Virtual Device)와 인터미디이트 버츄얼 디바이스(Intermediate Virtual Device), 싱크 버츄얼 디바이스(Sink Virtual Device)와 그들 사이를 연결하는 스트림 커넥션(Stream Connection)과 같은 객체들을 스트림 그래프(Stream Graph)로 추상화한 후 이를 그룹핑(grouping)하여 관리하는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 다른 특징은, 상기 스트림 그래프(Stream Graph)에 임의의 서브-스트림 그래프(Sub-stream Graph)를 정의하여 관리하는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 상기 서브-스트림 그래프(Sub-stream Graph)는 임의의 노드가 영향을 줄 수 있는 범위로 설정하는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 상기 서브-스트림 그래프(Sub-stream Graph)는 임의의 노드들의 시작과 끝을 지정하여 범위를 설정하는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 상기 스트림 그래프(Stream Graph)에서 하나의 스트림은 디스트리뷰터(distributor), 멀티캐스트/브러드캐스트(multicast/broadcast)에 의해 여러 갈래로 분기되는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 상기 스트림 그래프(Stream Graph)에서 다중 스트림은 믹서(Mixer)에 의해 통합되는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 상기 스트림 그래프(Stream Graph)에서 서브-스트림 그래프(Sub-stream Graph)의 제거는 시작 노드와 끝 노드를 지정하여 다른 서브-스트림 그래프(Sub-streamGraph)와 중복되지 않는 부분의 제거로 가능하게 되는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 상기 스트림 그래프(Stream Graph)에서 서브-스트림 그래프(Sub-stream Graph)의 합병(Merge)은 중복되는 서브-스트림 그래프(Sub-stream Graph)를 하나의 서브-스트림 그래프(Sub-stream Graph)의 처리로 가능하게 되는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 상기 스트림 그래프(Stream Graph)에서 서브-스트림 그래프(Sub-stream Graph)의 추출(Extract)은 중복되는 부분의 서브-스트림 그래프(Sub-stream Graph)를 복사하고 중복되지 않는 부분의 제거로 가능하게 되는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 상기 스트림 그래프(Stream Graph)의 서브 스트림 그래프(Sub-stream Graph)의 분리, 합병 및 추출을 이용하여 스트림의 관리 범위를 동적으로 변경하는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 상기 스트림 그래프(Stream Graph)로 추상화한 후 이를 그룹핑(Grouping)하여 관리되는 그룹(Group)들은 상기 그룹(Group)들 사이를 연결하는 스트림 커넥션(Stream Connection)과 같은 객체들을 스트림 프래프(Stream Graph)로 추상화한 후 이를 그룹 오프 그룹(Group Of Group)으로 그룹핑(Grouping)하여 동시에 다수의 스트림(Stream)을 관리하는데 있다.
상기와 같은 목적을 달성하기 위한 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 또다른 특징은, 소스 버츄얼 디바이스(Source Virtual Device)와 인터미디이트 버츄얼 디바이스(Intermediate Virtual Device), 싱크 버츄얼 디바이스(Sink Virtual Device)가 로컬(local)로 연결구성된 컴포지트 디바이스(composite device)에 있어서, 상기 로컬(local)로 연결구성된 소스 버츄얼 디바이스(Source Virtual Device)와 인터미디이트 버츄얼 디바이스(Intermediate Virtual Device), 싱크 버츄얼 디바이스(Sink Virtual Device) 사이를 연결하는 스트림 커넥션(Stream Connection)과 같은 객체들을 스트림 그래프(Stream Graph)로 추상화한 후 이를 그룹핑(grouping)하여 내부적으로 관리하는데 있다.
이하, 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법의 바람직한 실시예에 대하여 첨부한 도면을 참조하여 설명하면 다음과 같다.
도 1 은 마이크에서 스피커로 오디오 데이터가 전송되는 모습을 나타낸 도면이고, 도 2a 및 도 2b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 인터미디이트를 거쳐 전송되는 스트림을 나타낸 스트림 그래프이고, 도 3a 및 도 3b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을위한 방법에 있어서 디스트리뷰터를 거쳐 전송되는 스트림을 나타낸 스트림 그래프이고, 도 4a 및 도 4b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 멀티캐스트 스트림 커넥션을 거쳐 전송되는 스트림을 나타낸 스트림 그래프이고, 도 5a 및 도 5b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 믹서를 거쳐 전송되는 스트림을 나타낸 스트림 그래프이고, 도 6a 및 도 6b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 전송되는 스트림을 나타낸 스트림 그래프이고, 도 7 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 전체 스트림 그래프를 그룹핑하는 경우를 나타낸 도면이고, 도 8 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 시작과 끝 노드를 명시해서 서브-스트림 그래프(Sub-stream Graph)를 찾는 경우를 나타낸 도면이고, 도 9a 및 도 9f 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 노드나 에지에 영향을 주는 서브-스트림(Sub-stream)을 나타낸 도면이고, 도 10a 및 도 10b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 노드 제거시 커넥티버티 넘버가 2가 되는 경우와 1로 유지하는 경우를 나타낸 도면이고, 도 11 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어및 자원 할당을 위한 방법에 있어서 서브-스트림(Sub-stream)을 제어하는 과정을 나타낸 도면이고, 도 12 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 전송되는 스트림의 전달상태를 나타낸 도면이고, 도 13 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 디바이스 내에서의 전송되는 스트림의 관리상태를 나타낸 도면이고, 도 14 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 복합 장치를 나타낸 도면이고, 도 15 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 그룹(Group) 병합 상태를 나타낸 도면이고, 도 16a 및 도 16c 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 그룹(Group) 분리 상태를 나타낸 도면이고, 도 17 은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 그룹(Group) 추출 상태를 나타낸 도면이고, 도 18a 및 도 18b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 믹서를 거쳐 전송되는 스트림의 관리 상태를 나타낸 도면이고, 도 19 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 있어서 유사 코드의 검증 상태를 나타낸 도면이고, 도 20a 및 도 20b 는 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및자원 할당을 위한 방법에 있어서 서브그래프 생성을 위한 알고리즘의 검증을 위한 도면이다.
이와 같은 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법에 대하여 첨부한 도면을 참조하여 상세히 설명하면 다음과 같다.
스트림이 생성되어 소멸될 때까지의 거치게 되는 일련의 버츄얼 디바이스(Virtual Device)와 스트림 연결을 각각 노드(Node)와 에지(Edge)로 모델링하여 그래프로 표현할 수 있는데 이를 스트림 그래프(Stream Graph)라 정의한다. 상기 스트림 그래프(Stream Graph)는 다중 소스/다중 싱크(multiple source/multiple sink)로 표현되는 다이렉티드 그래프(directed graph)로 그룹(Group) 정의 핵심이 되는 개념이다. 상기 그룹(Group)은 커넥티버티 넘버(Connectivity Number)가 1인 스트림 그래프(Stream Graph)를 관리하며 이 그래프를 통과하는 스트림을 제어하고, 이에 사용되는 자원의 할당에 관여한다.
그룹(Group)의 주요 기능
그룹(Group)은 상기 버츄얼 디바이스(Virtual Device)와 스트림 커넥션(Stream connection)을 통해 흘러가는 스트림을 전체적으로 제어하고, 임의의 스트림이 사용자가 요구하는 QoS를 만족하면서 흐를 수 있도록 스트림이 통과하는 각 버츄얼 디바이스(Virtual Device)와 스트림 커넥션(Stream Connection)에 대하여 자원을 최적으로 할당한다.
먼저, 그룹(Group)이 정의되어 있지 않은 상태에서 도 1 에 도시된 바와 같이, 오디오 데이터가 마이크에서 발생되어 스피커로 전송되는 경우 소스(source)로부터 싱크(sink)까지 스트림을 제어하려면 마이크로폰(1), 스트림 커넥션(2), 스피커(3) 각각의 스트림 컨트롤러에게 별도로 제어를 명령해야 한다. 따라서 상기 버츄얼 디바이스(Virtual Device)와 스트림 커넥션(Stream Connection)을 한 그룹(Group)으로 묶은 후 상기 그룹(Group)의 스트림 컨토롤러로 한 번만 제어 명령을 전송하여 전체적으로 스트림을 제어할 수 있다.
결국, 소스 디바이스(Source Device)로부터 발생되어 싱크 디바이스(Sink Device)에 가서 소멸이 되는 하나의 스트림을 묶어서 한 번에 제어를 하겠다는 것이 그룹(Group)이다. 이때, 스트림은 사용자가 원하는 서비스 품질(QoS)을 만족해야만 하는 단위이다. 상기 그룹(Group)은 스트림이 주어진 서비스 품질(QoS)을 만족하도록 스트림이 흘러가는 통로를 구성하는 버츄얼 디바이스(Virtual Device)와 스트림 커넥션(Stream connection)들에게 자원을 최적으로 할당하는 역할을 한다.
아울러 서비스 품질 파라메터(QoS Parameter)는 버츄얼 리소스(Virtual Resource)에 정의되어 있으며 Guranteelevel, Reliable, DelayBounds, BandwidthBounds가 있다. 이때 사용자가 DelayBounds를 2초로 그룹(Group)에 주었다면 그룹(Group)은 상기 2초를 마이크로폰에 0.5초, 스트림 커넥션(Stream Connection)에 1초, 스피커에 0.5초와 같이 서비스 품질(QoS)값을 배분하여 자원을 할당한다.
스트림 그래프(Stream Graph)의 정의
상기 스트림은 일시적인 데이터(Temporal Date)가 생성되어 종료될 때까지 일정한 경로를 통해서 전달된다. 상기 일정한 경로는 버츄얼 디바이스(Virtual Device)와 스트림 커넥션(Stream Connection)에 의해 구성된다.
상기 스트림 커넥션(Stream Connection)은 버츄얼 디바이스(Virtual Device) 사이를 로컬(local) 또는 네트워크(network) 사이에 두고 연결해 주어 스트림이 전달되도록 하는 통로이다.
상기 스트림의 경로를 구성하는 버츄얼 디바이스(Virtual Device)와 스트림 커넥션(Stream Connection)을 각각 노드(Node)와 에지(Edge)로 모델링한 후 그래프로 표현하여 추상화할 수 있으며 이 그래프를 스트림 그래프(Stream Graph)라 정의한다.
스트림 그래프(Stream Graph)
스트림 그래프(Stream Graph)는 버츄얼 디바이스(Virtual Device)를 노드로 스트림 그래프(Stream Graph)를 에지로 모델링하여 표현한 그래프로, 다중 소스(Multiple Source)와 다중 싱크(Multiple Sink)를 갖는 다이렉티드 그래프(Directed Graph)이며, 싸이클(Cycle)을 허용하지 않는다.
상기 스트림 그래프(Stream Graph)는 네 가지 유형으로 나눌 수 있는데 첫째로, 도 2a 및 도 2b 에 도시된 바와 같이, 하나의 소스(one source)와 하나의 싱크(one sink)로 체인(chain) 형태의 스트림 그래프를 갖는 것으로, 스트림이 소스(source)에서 발생되어 인터미디에이트(Intermediate) 디바이스를 거쳐서 싱크(sink)로 가서 소멸이 되는 과정으로 대부분의 경우 피어 투 피어 커뮤니케이션(peer to peer communication)을 나타낸다.
둘째로, 도 3a 및 도 3b 에 도시된 바와 같이, 하나의 소스(one source)와 다중 싱크(multiple sink)로 트리(tree) 형태의 스트림 그래프를 갖는 것으로, 소스(source)에서 발생된 스트림을 여러 갈래로 분기시키는 과정이다.
아울러 멀티캐스트 스트림 커넥션(Multicast Stream Connection)의 경우에는 도 4a 및 도 4b 에 도시된 바와 같이, 소스(source)에서 생성되는 스트림을 분기시키는 것은 전술한 도 3a 및 도 3b 에 도시된 바와 같으며, 이 경우 스트림 커넥션(Stream Connection)이 스트림 그래프의 에지(Edge)로 바로 매핑되지 않으므로 상기 분기가 되는 부분에 더미 노드(dummy node)를 하나 삽입을 하면 자연스럽게 매핑된다.
셋째로, 도 5a 및 도 5b 에 도시된 바와 같이, 다중 소스(multiple source)와 하나의 싱크(one sink)로 로컬 믹서(Local Mixer) 형태의 스트림 그래프를 갖는 것으로, 로컬에 있는 믹서(Mixer)를 생각해 보면 다중 소스(multiple source)를 갖고 하나의 싱크(one sink)를 갖는 스트림 그래프(Stream Graph)가 생성되며, 화상 회의를 예로 들면, 각각의 호스트에서 다른 호스트들로부터 받은 오디오 데이터를믹싱한 후 스피커를 통해 송출하는 것을 나타낸다.
넷째로, 도 6a 및 도 6b 에 도시된 바와 같이, 다중 소스(multiple source)와 다중 싱크(multiple sink)로 다이렉티드 그래프(directed graph) 형태의 스트림 그래프를 갖는 것으로, 예를 들면 믹싱 서버(Mixing server)와 같은 경우 다중 소스와 다중 싱크를 갖으며 믹서가 별개의 서버로 동작할 때, 각기 소스(source)에서 받은 것들을 다시 싱크들로 분배하는 것을 나타낸다.
서브-스트림 그래프(Sub-stream Graph) 정의 및 인터페이스(Interface)
상기 스트림 그래프(Stream Graph)에서 임의의 서브-스트림 그래프(Sub-stream Graph)를 그룹핑하여 제어하고자 할 때 원하는 서브-스트림 그래프(Sub-stream Graph)는 상황이나 개인마다 주관적으로 정의될 수 있으므로 이를 정의하는 과정에 대하여 네가지로 나누어 설명하면 다음과 같다.
첫째, 다중 소스(multiple source)와 다중 싱크(multiple sink)를 갖는 전체 스트림 그래프(Stream Graph)를 그룹핑하는 방법을 제공하며 이는 add_stream_graph 함수들을 사용한다. 이때 시드(seed)로 줄 수 있는 것이 버츄얼 디바이스(Virtual Device)나 스트림 커넥션(Stream Connection)이 될 수 있는데, 버츄얼 디바이스(Virtual Device)를 주는 경우 도 7 에 도시된 바와 같이, A, B, C, D, E, F가 될 수 있고, 스트림 커넥션(Stream Connection)을 시드(seed)로 주는 경우에는 [A, C], [B, C], [C, D], [D, E], [D, F]가 될 수 있다.
상기 버츄얼 디바이스(Virtual Device)는 재귀적(recursive)으로 정의될 수있기 때문에, 실제 한 버츄얼 디바이스(Virtual Device)에 여러 스트림이 통과할 수 있는데, 이 경우 스트림을 구분되어야 스트림 그래프(Stream Graph)를 찾을 수 있기 때문에 하기한 참조 1에 나타낸 바와 같이, PortIndex까지 add_stream_graph_by_port()의 인자로 주어서 PortIndex가 포함되어 있는 스트림안에서 스트림 그래프(Stream Graph)를 찾게 된다.
참조 1
1. int add_stream_graph_by_dev(in VirtualDevice dev)raises(AlreadyHasGraph, MoreThanOneStream);
2. int add_stream_graph_by_port(in VirtualDevice dev, in PortIndex port)raises(AlreadyHasGraph);
3. int add_stream_graph_by_connection(in StreamConnection connection)raises(AlreadyHasGraph);
둘째, 소스(source)와 싱크(sink)를 명시해서 서브-스트림 그래프(Sub-stream Graph)를 그룹핑하는 방법으로, 소스(source)와 싱크(sink)가 아니더라도 중간 노드부터 시작하거나 끝나는 특정한 서브-스트림 그래프(Sub-stream Graph)를 찾는 방법으로 시작 노드와 끝 노드를 명시해 주어 서브-스트림 그래프(Sub-stream Graph)를 찾게 되는데, 이는 add_substream_graph() 함수들을 통해서 찾을 수 있으며 이때 인자로는 시작 노드와 끝 노드인 두 개의 버츄얼 디바이스(VirtualDevice)를 준다. 단 노드에 여러 스트림이 통과하는 경우 포트까지 명시할 수 있으며, 시작 노드와 끝 노드 사이에 여러 경로가 존재한다면 이를 모두 찾아 준다.
도 8 은 A에서 E까지 서브-스트림 그래프(Sub-stream Graph)를 찾는 경우를 나타내며, 결과는 A-C-D-E의 경로를 찾는 것이다. 즉 하기한 참조 2에 나타낸 바와 같이, add_substream-graph_fromdev_todev(NULL, todev)과 같이 시작 노드가 NULL인 경우 모든 소스 디바이스(source device)에서 todev까지의 연결되어 있는 서브-스트림 그래프(Sub-stream Graph)를 찾아준다.
반대로 add_substream-graph_fromdev_todev(todev, NULL)과 같이 끝 노드가 NULL인 경우는 fromdev에서 모든 싱크 디바이스(sink device)까지 연결되어 있는 서브-스트림 그래프(Sub-stream Graph)를 찾아준다.
만일, 도 8 에서 add_substream-graph-fromdev-todev(A, NULL)이었다면 노드 B와 에지 [B, C]를 제외한 나머지 부분 서브-스트림 그래프(Sub-stream Graph)가 찾아진다.
참조 2
1. int add_substream_graph_fromdev_todev(in VirtualDevice fromdev, in VirtualDevice todev)raises(NoCommonNode, CannotFindSubstreamGraph);
2. int add_substream_graph_fromport_toport(in VirtualDevice fromdev, in PortIndex fromdev, in VirtualDevice todev, in PortIndex toport)raises(NoCommonNode, CannotFindSubstreamGraph);
셋째, 임의의 노드(Node)나 에지(Edge)에서 자신에게 영향을 주는 서브-스트림 그래프(Sub-stream Graph)를 찾는 과정은, add_substream_graph의 인자로 버츄얼 디바이스(Virtual Device)나 스트림 커넥션(Stream Connection)을 주면 된다. 이 경우, 주어진 노드(Node)나 에지(Edge)를 포함하며 소스(source)부터 싱크(sink)까지 서브-스트림 그래프(Sub-stream Graph)가 정의된다.
즉 도 9a 및 도 9f 에 도시된 바와 같이, 전체 노드 개수가 6개이므로 그래프 역시 6개가 정의되며, 이때 역시 시드(seed)로 주는 버츄얼 디바이스(Virtual Device)에 여러 스트림이 통과할 경우 하기한 참조 3에 나타낸 바와 같이, 포트까지 명시해 주어야 서브-스트림 그래프(Sub-stream Graph)를 찾을 수 있다.
상기 스트림 그래프(Stream Graph)에 임의의 서브-스트림 그래프(Sub-stream Graph)를 정의하여 관리하며, 상기 서브-스트림 그래프(Sub-stream Graph)는 임의의 노드가 영향을 줄 수 있는 범위로 설정한다.
아울러 상기 서브-스트림 그래프(Sub-stream Graph)는 임의의 노드들의 시작과 끝을 지정하여 범위를 설정할 수도 있다.
참조 3
1. int add_substream_graph_by_dev(in VirtalDevice dev)raises(NoCommonNode);
2. int add_substream_graph_by_port(in VirtualDevice dev, in PortIndex port)raises(NoCommonNode);
3. int add_substream_graph_by_connection(in StreamConnection connection)raises(NoCommonNode);
넷째, 그룹(Group)은 하나의 스트림 그래프(Sream Graph)만을 정의하여 관리하기 때문에 전체 스트림 그래프(Stream Graph)를 제거할 경우 별도의 인자가 필요없다. 만일, 여러 스트림에 대한 스트림 그래프(Stream Graph)를 그룹핑하고 싶다면 그룹(Group)의 "Group of Group" 기능을 사용해야 한다. 따라서 그룹(Group)에 정의되어 있는 스트림 그래프(Stream Graph)의 일부 서브-스트림 그래프(sub-stream Graph)를 제거한 후 그룹(Group)에 남아 있는 스트림 그래프(Stream Graph)의 커넥티버티 넘버(Connectivity number)는 항상 1을 유지해야 한다. 즉 도 10a 에 도시된 바와 같이, A-B-D-E를 제거하였을 경우 남는 B-C와 D-F로 상기 커넥티버티 넘버(Connectivity number)가 2가 되므로 제거가 안된다.
그러면 도 10b 에 도시된 바와 같이, 한 그룹(Group)내에서 관리되는 스트림 그래프(Stream Graph)에서 시작 노드와 끝 노드를 지정하여 하기한 참조 4에 나타낸 바와 같이, 서브-스트림 그래프(Sub-stream Graph)를 제거하는 경우 다른 서브-스트림 그래프(Sub-stream Graph)와 중복이 되지 않는 부분만을 제거한다. 이 경우 서브-스트림 그래프(Sub-stream Graph) A-C와 D-E가 삭제되고 B-C-D-F가 남아서 커넥티버티 넘버(Connectivity number)가 1로 보장된다.
참조 4
1. int remove_stream_graph();
2. int remove_substream_graph_fromdev_todev(in VortualDevice fromdev, in VirtualDevice todev)raises(NoSuchNode);
3. int remove_substream_graph_fromport_toport(in VortualDevice fromdev, in PortIndex fromdev, in VirtualDevice todev, in PortIndex toport)raises(NoSuchNode);
상기 소스(source)와 싱크(sink)를 포함하여 제거(remove)하는 경우는 하기한 참조 5에 나타낸 바와 같이 제어한다.
참조 5
remove_substream_graph(NULL, todev); or remove_substream_graph(fromdev, NULL);
예를 들어 도 11 에 도시된 바와 같이, 제 1 내지 제 3 호스트(10~30)로 구성되며, 각 호스트에는 마이크와 스피커가 페어(pair)으로 존재하고, 모든 버츄얼 디바이스(Virtual Device)와 스트림 커넥션(Stream Connection)이 그룹 123(Group 123)으로 그룹핑되어 있을 경우 하기한 참조 6에 나타낸 바와 같이, 제 2 호스트(20)의 spk2를 todev로 놓고 제거하는 경우에 대하여 설명하면 다음과 같다.
참조 6
remove_substream_graph_fromdev_todev(NULL, spk2);
먼저, 제 2 호스트(20)내 spk2에서 영향을 주는 모든 소스(source)를 검색하여 상기 제 1 및 제 3 호스트(10)(30)내 mic1과 mic3을 찾는다. 상기 찾은 mic1과 mic3의 입장에서 통합이 일어나기 전까지의 서브그래프(subgraph)를 제거하게 되는데 제거되는 부분은 없다. 상기 spk2의 입장에서 분기가 일어나기 전까지의 서브그래프(subgraph)를 제거하게 되는데 여기서는 멀티캐스트 커넥션 m1과 m3에서 분기가 일어나므로 상기 두 부분부터 spk2까지의 서브그래프(subgraph)가 제거된다.
결국 삭제된 부분은 도 11 에 도시된 Y자 형태로 표시된 부분이며 다른 서브-스트림(Sub-stream)과 중복이 되는 부분을 제외하고 자기 자신에게만 관련된 부분만이 삭제된다.
아울러, 상기 제 2 호스트(20)의 mic2의 제거시 remove_substream_graph_fromdev_todev(mic2, NULL);을 통해 삭제된다. 따라서 제 2 호스트(20)가 세션(session)에서 탈퇴를 할 경우 spk2와 mic2에 관계된 부분을 그룹 123(Group 123)에서 제거함으로써 그룹(Group)의 일관성을 유지할 수 있다.
스트림 그래프(Stream Graph)에 스트림 컨트롤(Stream Control)을 하는 과정
먼저, 그룹(Group)에 정의된 스트림 그래프(Stream Graph)를 제어하기 위하여 그룹(Group)은 각 노드(Node)와 에지(Edge)에 정의된 스트림 컨트롤러(Stream Controller)에 제어신호를 전달한다. 이때, 주의해야 할 점은 항상 소스(source)에서 싱크(sink) 방향으로 제어신호를 전달해야 한다는 점이다. 이를 위해, 통합이나 분기가 되는 노드(Node)를 기준으로 소스(source)에서 싱크(sink)까지의 모든 노드(Node)와 에지(Edge)들을 토폴로지컬 오더링(topological ordering)하여 순서를 정한다.
예를 들어 도 12 에 도시된 바와 같이, 노드(Node)를 중심으로 오더링(ordering)한 경우 A, B, C, D, E, F가 된다. 실제 에지(Edge)까지 포함해서 오더링(ordering)을 할 경우 A, B, [A, C], [B, C], C, [C, D], D, [D, E], [D, F], E, F가 될 수 있다.
또한, 그룹(Group)은 스트림을 제어할 경우 제어의 종류에 따라 전달 방식을 결정해야 한다. 즉 무조건 같은 제어를 각 노드(Node)와 에지(Edge)에 전달하기만 하면 안되는 경우가 있다. 예를 들면, resume같은 경우 모두에게 resume의 제어를 전달하기만 하면 되지만, fast forward같은 제어가 있다면 소스 노드(source node)에서만 fast forward를 하기만 하면 나머지 부분은 그냥 resume을 하기만 하면 된다. 여기서 rewind같은 경우도 소스(source)에서만 rewind를 해주면 나머지는 그냥 스트림을 전달하기만 하면 된다.
버츄얼리소스(VirtualResource)로써 그래프(Graph)의 QoS에 따른 리소스(Resource)할당 기능
먼저, 스트림이 시작된 후 그룹(Group)의 스트림 그래프(Stream Graph)가 동적으로 바뀌어서 서비스 품질(QoS)값을 조정해야 하는 경우 혹은 상황에 따라 서비스 품질(QoS) 모니터링의 결과로 스트림 그래프(Stream Graph)의 서비스 품질(QoS)을 바꾸어 주어야 할 경우 그룹(Group)은 이를 고려해서 자원 할당을 조정해야 하는데, 버츄얼 리소스(Virtual Device)에 정의되어 있는 adjust_resource()함수를 이용해서 이를 행할 수 있다.
상기 각 버츄얼 리소스(Virtual Resource)들의 서비스 품질(QoS)값이 변경되는 경우 그룹(Group)은 이를 이벤트(Event)로 통지받을 수 있다. 이 외의 서비스 품질(QoS)의 관리와 모니터링(monitoring)은 디바이스 메니저(Device Manager)나 자원 메니저(Resource Manager)와 같이 헬퍼 컴포넌트(Helper Component)들에 의해 이루어질 수 있다.
그룹 오브 그룹(Group of Group) 및 컴포지트 디바이스(Composite Device)
한편, 그룹 오브 그룹(Group of Group)은 스트림 그래프(Stream Graph) 대신 그룹 리스트를 관리하는 그룹(Group)으로, 도 13 에 도시된 바와 같이, 그룹(Group)이 제 1 및 제 2 서브-그룹(SubGroup1)(SubGroup2)을 관리하는 것을 나타내며, 다중 스트림 그래프(multicast Stream Graph)를 제어할 경우 사용되며 하기한 참조 7에 나타낸 바와 같이, add_group()이나 remove_group()과 같은 함수들을 통해 동적으로 그룹(Group)들이 추가 또는 삭제될 수 있다.
참조 7
1. Group add group(in Group g);
2. Group remove_group(in Group g);
한편, 어떤 시스템이 한 호스트내에서 스트림 그래프(Stream Graph)를 형성하는 범위에 대해서 한 그룹(Group)을 관리하면 좋은 경우 그룹핑을 할 수 있지만 이 경우 컴포지트 디바이스(Composite Device)로 정의해서 사용할 수 있는 지를 고려해야 한다. 예를 들어, 도 14 에 도시된 바와 같이, 마이크로폰(Microphone), 디스트리뷰터(Distributor) 및 오디오인코더(AudioEncoder)와 같은 버츄얼 디바이스(Virtual Device)들이 스트림 그래프를 로컬(local)에서 형성된다. 상기 컴포지트 디바이스(Composite Device)를 정의하여 사용함으로써 얻는 이점은 사용자 입장에서 시스템을 단순화시켜 생각할 수 있다는 점과 그룹(Group) 입장에서도 스트림 그래프 엘리먼트(Stream Graph Element)들의 개수가 줄어들기 때문에 탐색이나, 제어 등의 작업에 소요되는 등의 작업에 소요되는 복잡도를 줄일 수 있다는 점들이 있다.
그 외에 그룹핑을 위해 필요한 오퍼레이션(operation)들을 보면 하기한 참조 8에 나타낸 바와 같이, 그룹(Group)과 그룹(Group)을 합병(Merge)하거나 하나의 그룹(Group)을 두 개의 그룹(Group)으로 분리(Split)하는 것들이 포함된다.
참조 8
1. boolean merge(in Group g);
2. Group split(in VirtualDevice dev);
3. Group extract(in VirtualDevice fromdev, in VirtualDevice todev);
첫째, 그룹 합병(Group Merge)은 서브-스트림(Sub-stream)별로 그룹핑을 하여 사용하다가 통합하여 사용하고 싶은 경우 사용할 수 있다. 이때 주의해야 할 점은 합병(Merge)한 후에도 하나의 그래프()의 커넥티버티 넘버()가 1을 만족해야 하는 점으로 만일 그렇지 못하다면 합병(Merge)이 되지 않는다. 만일 합병(Merge)을 할 때 중복되는 서브-스트림 그래프(Sub-stream Graph)가 있으면 하나의 서브-스트림 그래프(Sub-stream Graph)가 되도록 처리한다.
예를 들면, 도 15 는 하기한 참조 9에 나타낸 바와 같이, 4개의 그룹(Group) G1, G2, G3, G4를 합병(Merge)하여 하나의 그룹(Group)으로 만드는 경우를 나타낸다. 이때, 합병(Merge) 순서는 커넥티버티 넘버(Connectivity Number)를 1로 유지함에 있어서 매우 중요하다.
참조 9
Group G1, G2, G3, G4;
G1.merge(G2);
G1.merge(G3);
G1.merge(G4);
둘째, 분리(Split)는 하나의 스트림 그래프(Stream Graph)를 여러 개의 서브-스트림 그래프(Sub-stream Graph)로 나누고자 할 때 사용된다. 예를 들면 도 16a 및 도 16c 은 하기한 참조 10에 나타낸 바와 같이, 그룹(Group) G1을 4개의 그룹(Group)으로 분리(Split)하는 경우를 나타낸다.
참조 10
Group G1, G2, G3, G4;
G4 = G1.split(D, OPort2);
G3 = G1.split(D, OPort1);
G2 = G1.split(C);
셋째, 추출(Extract)은 하기한 참조 11에 나타낸 바와 같이, 그룹(Group)에 정의된 서브-스트림 그래프(Sub-stream Graph)를 빼어 내는 함수이다. 이런 점에서 분리(Split)와 유사하다고 볼 수 있으나 추출(extract)은 중복이 되는 부분을 제거하지 않고 복사(copy)만해서 가져오며 중복이 되지 않는 부분은 제거하면서 가져온다. 예를 들어, 도 17 에서 extract(A, B)를 하면 그룹(Group)에 남아 있는 서브-스트림 그래프(Sub-stream Graph)는 B-C-D-F가 되고 추출(extract)된 서브-스트림그래프(sub-stream Graph)는 A-C-D-E가 된다.
참조 11
G2 = G1.extract(A, E);
그러므로 상기 스트림 그래프(Stream Graph)의 서브 스트림 그래프(Sub-stream Graph)의 분리, 합병 및 추출을 이용하여 스트림의 관리 범위를 동적으로 변경할 수 있다.
디바이스(Device)에서의 스트림(Stream) 관리
한편, 버츄얼 디바이스(Virtual Device)를 노드로 모델링했을 때 각 버츄얼 디바이스(Virtual Device)는 자신을 통과하는 스트림의 흐름 상태를 파악하고 있어야 한다. 즉 도 18a 및 도 18b 에 도시된 바와 같이, 어떤 입력 포트(input port)가 어떤 출력 포트(output port)에 영향을 주는지 관계를 알아야 한다.
그리고 각 포트(Port)는 자신에게 영향을 주는 포트 리스트(Port list)들을 갖고 있어서 스트림이 상기 버츄얼 디바이스(Virtual Device)를 통과할 때 어떤 포트(Port)를 통과한 스트림이 어떤 포트(Port)를 통해 나가는지를 알 수 있다. 또한, 이 정보를 이용해서 이 버츄얼 디바이스(Virtual Device)에 몇 개의 스트림이 통과하는 지를 가늠할 수 있게 된다. 즉 하기한 참조 12에 나타낸 바와 같이,Virtual Device:get_port_info_list()를 이용해서 PortInfoList를 얻을 수 있는데 각각의 포트(Port)들에 대한 정보를 보면 struct PortInfo에 matePorts멤버가 있다. 이것은 각 포트(Port) 입장에서 자신에게 영향을 주는 포트(Port)들을 말해 준다.
참조 12-PortInfo에 대한 structure 정의
typedef short PortIndex;
typedef sequence < PortIndex>PortIndexList;
struct PortInfo{
PortIndex port;
PortIndexList matePorts//영향을 주고 받는 port들의 list
boolean input;
boolean external;
ClassNameList formats;
};
typedef sequence < PortInfo>PortInfoList;
스트림(Stream) 탐색 알고리즘
그룹(Group)은 노드(Node)와 에지(Edge)로 구성된 스트림 그래프(Stream Graph)를 찾아내기 위해 주어진 버츄얼 디바이스(Virtual Device)나 스트림 커넥션(Stream Connection)이 제공해 주는 연결 정보를 이용한다.
즉 버츄얼 디바이스(Virtual Device)에서 자신과 연결된 스트림 커넥션(Stream Connection)을 알아내는 방법으로, 버츄얼 디바이스(Virtual Device)는 get_port_info_list()를 이용하여 생성된 모든 포트(Port)를 알아낸다. 이후 get_stream_connection_by_port()를 이용하여 각각의 포트(Port)에 연결된 커넥션(Connection)을 알아낸다.
아울러, 스트림 커넥션(Stream Connection)에서 자신이 연결하는 버츄얼 디바이스(Virtual Device)들을 알아내는 방법으로, 스트림 커넥션(Stream Connection)은 get_connection_info()를 이용하여 모든 버츄얼 디바이스(Virtual Device)를 찾는다.
참조 13-버츄얼 디바이스(Virtual Device)와 스트림커넥션(StreamConnection)의 API정의
interface VirtualDevice : VirtualResource{
...
PortInfoList get_info_list();
StreamConnection get_stream_connection_by_port(in PortIndex port);
...
};
interface StreamConnection : VirtualResource{
...
struct DevInfo{
VirtualDevice device;
PorIndex port;
};
typedef sequence < DevInfo > DevInfoList;
struct ConnectionInfo{
long multicastnum;
DevInfo sourcedevice;
DevInfoList destinationdevicelist;
};
ConnectionInfo get_connection_info();
...
};
이와 같은 상태에서 상기한 참조 13에 나타낸 바와 같이 스트림 커넥션(Stream Connection)에서 get_connection_info()을 부르면 유니캐스트 스트림 커넥션(unicast Stream Connection)인 경우 하나의 소스(source)와 하나의 데스티네이션 디바이스(destination device)가 연결이 되어 있기 때문에 항상 2개의 DevInfo정보가 전달된다. 그러나, 스트림 커넥션 멀티캐스트(StreamConnectionMulticast)의 경우 소스 디바이스(source device)에 정보는 항상 갖고 있지만 데스티네이션(destination)이 없을 경우도 있고 있다면 1개 이상일 수 있기 때문에 DevInfo의 개수가 일정하지 않다.
전체 스트림 그래프(Stream Graph) 탐색 알고리즘
참조 14
1. int add_stream_graph_by_dev(in VirtualDevice dev)raises(AlreadyHasGraph, MoreThanOneStream);
2. int add_stream_graph_by_port(in VirtualDevice dev, in PortIndex port)raises(AlreadyHasGraph);
3. int add_stream_graph_by_connection(in StreamConnection connection)raises(AlreadyHasGraph);
전체 탐색을 위한 각각의 방법에 대한 알고리즘을 유사 코드(pseudo code)로 표현한 것으로, 먼저, 상기한 참조 14에 나타낸 바와 같은 각각의 세 함수는 각각 예외처리를 하고 나서 add_stream_graph(VirtualDevice dev, PortIndex port)로 동일하게 처리한다.
여기서, 상기 예외(Exception)의 종류에는 AleadyHasGraph, MoreThanOneStream이 있는데 전체 스트림 그래프(Stream Graph)를 가산하려고 할 때 이미 그래프에 스트림 그래프(Stream Graph)가 정의되어 있다면 AleadyHasGraph가 발생되고, 시드(seed)로 준 버츄얼 디바이스(Virtual device)에 다중 스트림(multiple stream)이 통과하는 경우 MoreThanOneStream이 발생된다.
상기 알고리즘은 주어진 시드(seed)를 중심으로 Depth first Search(DFS)를 하면서 그래프를 가산하며 스트림의 방향과 무관하게 탐색을 한다. 상기 그룹(Group)에 가산되는 단위는 길이가 1인 그래프(Graph) 즉, 소스 노드(source node)와 데스티네이션 노드(destination node)와 커넥션(connection)의 페어(pair)로 가산되며 가산되는 당시 그룹(Group)에 커넥티버티 넘버(Connectivity Number)는 항상 1로 유지되어야 한다.
한편, 하기한 케이스 1(case 1)에 나타낸 바와 같이, 버츄얼 디바이스(Virtual Device)를 시드(seed)로 주는 경우 버츄얼 디바이스(Virtual Device)에 다중 스트림()이 통과하는 경우 이를 처리할 수 없기 때문에 MortThanOneStream Exception을 발생시킨다.
케이스 1(case 1)
Int add_stream_graph_by_dev(VirtualDeviceRef dev){
if(get_element_num() > 0){
AlreadyHadGraph e;
throw(e);
return;
}
if(has_one_stream(dev) == FALSE){
MoreThanOneStream e;
throw(e);
return;
}
//시트(Seed)로 받은 디바이스의 모든 port에 대하여 add_stream_graph를 부름
PortInfoList portInfoList = dev -> get_port_info_list();
for(each portInfo of portInfoList)add_stream_graph(dev,portInfo.port);
return get_element_num();
}
또한, 케이스 2(case 2)에 나타낸 바와 같이, 디바이스와 함께 포트(port)를 명시해 주는 경우 디바이스에 다중 스트림(multiple stream)이 통과하더라도 이를 구분해 줄 수 있다. 이 포트(port)가 포함되어 있는 스트림이 통과하는 포트(port)들의 정보는 get_related_port_info_list()라는 함수를 통해서 얻을 수 있다.
케이스 2(case 2)
Int add_stream_graph_by_port(VirtaulDevice dev,PortIndex port){
if(get_element)num() > 0){
AlreadyHadGraph e;
throw(e);
return;
}
PortInfoLostportInfoList = get_related_port_info_list(dev,port);
for(each portInfo of portInfoList)add_stream_graph(dev,portInfo.port{;
return get_element_num();
}
또한, 케이스 3(case 3)에 나타낸 바와 같이, 시드(seed)를 StreamConnection으로 주는 경우 소스(source)에 대한 DevInfo를 받아서 상기 시드(seed)를 VirtualDevice와 port로 주는 경우로 바꾸어서 처리한다.
케이스 3(case 3)
int add_stream_graph_by_connection(StreamConnectionRef connection){
if(get_element_num() > 0){
AlreadyHadGraph e;
throw(e);
return;
}
DevInfo sourceInfo = connection -> get_connection_info().sourcedevice;
PortInfoList protInfoList = get_related_portlist(sourceInfo.device, sourceInfo.port);
for(each portInfo of portInfoList)add_stram_graph(sourceInfo.device, portInfo.port);
return get_element_num();
}
여기서, int get_element_num()은 Group에 소속되어 있는 GraphElement의 개수를 넘겨주는 것을 나타내고, boolean has_one_stream(VirtualDeviceRef dev)은 임의의 버츄얼 디바이스(Virtual Device)에 몇 개의 스트림이 통과하는지를 알려주고, PortInfoList get_related_port_info_list(VirtualDeviceRef dev, PortIndex port)는 dev의 port 리스트에서 port와 영향 관계가 있는 port 리스트를 얻는 함수이고, int add_stream_graph(VirtualDeviceRef dev, PortIndex port)는 이 디바이스의 port에 연결된 스트림 그래프(Stream Graph)를 찾기 위해 양방향으로 탐색하는 함수이고, DevInfo get_source_endpoint_info(StreamConnection connection)는 connection에 연결되어 있는 EndPointList중에서 소스(source)를 찾아주는 것이다.
위의 세 함수가 내부적으로 부르는 함수는 add_stream_graph로 인자로는 VirtualDevice와 PortIndex를 취한다. 이 함수에서는 먼저 주어진 PortIndex를 이용해 이 Port에 연결된 StreamConnection을 얻고 다시 이 StreamConnection을 통해 연결된 상대편 VirtualDevice들을 알아낸다. 그런 다음 각각의 상대편 버츄얼 디바이스(Virtual Device)에 대해 [VirtualDevice, StreamConnection, VirtualDeive]의 페어(pair)로 구성이 되는 길이 1인 그래프를 add_one_length_graph 함수를 통해서 그래프에 가산시킨다. 그런 다음 상대편 VirtualDevice 입장에서 동일한 탐색을 진행할 수 있도록 관련 Port들을 찾아 주고 다시 add_stream_graph 함수를 각각의 Port마다 재귀적으로 호출한다. 이미 그룹(Group)에 그래프가 가산되었는지는 is_inserted 함수를 통해서 확인할 수 있다.
참조 15
void add_steam_graph(VirtualDeviceRef dev, PortIndex port){
StreamConnection connection = dev -> get_stream_connection_by_port(port);
ConnectionInfo connectionInfo = connection_info();
for(each devInfo of ConnectionInfo){
if(devInfo.device == dev)continue;//자기자신이면 다음으로
if(is_inserted(dev,port,connection,devInfo.device,devInfo.port))continue;
add_one_length_graph(dev,port,connection,devInfo.device,devInfo.port x);
PortInfoList PortInfoList = get_related_port_info_list(device, devInfo.port);
for(each portInfo of portInfoList){
if(portInfo.port == devInfo.port)continue;
add_stream_graph(devInfo.device,portInfo.port);
}
}
}
여기서, boolean is_inserted(VirtualDeviceRef dev1, PortIndex port1, StreamConnectionRef connection, VirtualDeviceRef dev2, PortIndex port2)는 이미 서브스트림 그래프(substream graph)가 그룹(group)에 가산되었는지를 테스트하는 것이고, void add_length_graph(VirtualDeviceRef dev1, PortIndex port1, StreamConnectionRef connection, VirtualDeviceRef dev2, PortIndex port2)는 길이가 1인 서브스트림 그래프(substream graph)를 그룹(group)에 가산하는 것을 나타내며, 이때 소스(source)와 데스티네이션(destination)을 넣는 순서는 구분하지 않는 것을 나타낸다.
유사 코드(Pseude Code) 검증
유사 코드(pseude code)의 검증은 dev의 포트에 연결된 길이 1인 서브-스트림 그래프(Sub-stream Graph)를 가산한다.
이어 파트너 디바이스(partner device) 각각의 포트에 대해서 길이 1 인 서브-스트림 그래프(Sub-stream Graph)를 가산하도록 시킨다.
여기서 add_stream_graph_by_dev();를 콜(call)했다면 상기 알고리즘에 의해서 가산되는 노드(node)와 에지(edge)는 하기한 참조 16에 나타낸 바와 같다.
참조 16
1. add_stream_graph_by_dev(C);
add_stream_graph(C, CIPort1);
add_stream_graph(C, CIPort2);
add_stream_graph(C, CIPort);
2. add_stream_graph(C, CIPort1);
add_one_length_graph(C, CIPort1, E1, A, AOPort);
3. add_stream_graph(C, CIPort2);
add_one_length_graph(C, CIPort1, E2, B, BOPort);
4. add_stream_graph(C, COPort);
add_one_length_graph(C, CIPort1, E3, D, DOPort);
add_stream_graph(D, DOPort1);
add_one_length_graph(D, DOPort2);
5. add_stream_graph(D, DOPort1);
add_one_length_graph(D, DOPort1, E4, E, EIPort);
6. add_stream_graph(D, DOPort2);
add_one_length_graph(D, DOPort2, E5, F, FIPort);
예를 들면, 도 19 에 도시된 바와 같이, 그룹(Group)에 가산된 순서를 보면 E1, E2, E3, E4, E5 순으로 가산되었으며 그룹(Group)의 커넥티버티 넘버(Connectivity Number)는 항상 1을 유지하고 있다.
서브스트림 그래프(Substram Graph) 탐색 알고리즘
참조 17
1. int add_substream-graph_fromdev_todev(in VirtualDevice fromdev, in VirtualDevice todev)raises(NoCommonNode, CannotFindSubstreamGraph);
2. int add_substream-graph_fromdev_todev(in VirtualDevice fromdev, in PortIndex fromdev, in PortIndex fromport, in VirtualDevice todev, in PortIndex toport)raises(NoCommonNode, CannotFindSubstreamGraph);
서브-스트림 그래프(Sub-stream Graph)를 찾는 방법은 상기한 참조 17에 나타낸 바와 같이, 크게 from to와 effective range의 두 가지 방법이 있다.
먼저, from to방법에 있어서는 서브-스트림 그래프(Sub-stream Graph)는 이미 그룹(Group)에 스트림 그래프(Stream Graph)가 정의된 후에도 추가가 가능하다. 이때, 그룹(Group)과 탐색된 서브-스트림 그래프(Sub-stream Graph)간에 공통 부분이 없는 경우는 추가되지 않으며 NoCommonNode exception이 발생된다. 특히, from to방법에서는 from to사이에 서브-스트림 그래프(Sub-stream Graph)가 정의되어 있지 않는 경우 CannotFindSubStreamGraph exception이 발생한다.
상기 from to방법에서 from device와 to device가 동일한 경우 하나의 노드가 스트림 그래프(Stream Graph)를 형성하고 있는 경우로 보고 이를 그룹(Group)에 추가하게 되는데 만일, 이미 그룹(Group)에 스트림 그래프(Stream Graph)가 정의되어 있다면 NoCommonNode exception을 일으키게 된다.
만일, from과 to device에 다중 스트림(multiple stream)이 통과한다면 MoreThanOneStream exception이 일어나게 된다.
상기 유사 코드(Pseudo Code)에서 탐색 방향은 from이 NULL인 경우 to에서부터 거꾸로 모든 소스(source)까지 탐색을 하며 그 이외의 경우는 모두 from에서 to방향으로 탐색을 한다.
여기서, from과 to가 NULL이 아닌 경우 어느 방향으로 탐색을 해도 상관이 없다. 상기 from에서 to로 탐색을 하는 경우 from의 모든 출력 포트(output port)들을 구해서 각각에서 출발하는 서브-스트림 그래프(Sub-stream Graph)를 구한다. 이때 내부적으로 사용하는 함수가 케이스 4에 나타낸 바와 같은, add_substream_graph_toward_todev이다. 이들은 모두 Temporary Group인 tempGroup에 모아지고 나중에 그룹(Group)에 합병(Merge)된다.
반대로, to에서 from쪽으로 탐색을 하는 경우 to의 모든 입력 포트(input port)들을 구해 스트림의 방향과 역으로 탐색을 한다. 이때, 내부적으로 사용하는 함수가 add_substream_graph_toward_fromdev이다.
케이스 4(case 4)
int add_substream_graph_fromdev_todev(VirtualDeviceRef fromdev, VirtaulDeviceRef todev){
if(fromdev == todev){
if(fromdev == NULL)return 0;
if(get_element_num() > 0){
NoCommonNode e; throw(e); return 0;
}
//node 하나만 있는 경우도 stream graph임
add_one_length_graph(fromdev, NULL, todev);
Return 1;
}
//device가 두 개 이상의 스트림을 갖고 있으면 port를 명시해야 함
If((has_one_stream(fromdev) == FALSE)\\(has_one_stream(todev) == FALSE)){
MoreThanOneStream e; throw(e); return 0;
}
int oldNum = get_element_num();
GroupRef tempGroup = GroupFactory -> get_new_group();//GroupFactory가 있다고 가정
if(fromdev != NULL){
PortInfoList outportInfoList get_outport_info_list(fromdev);
for(each outportInfo of outportInfoList);
tempGroup -> add_substream_graph_toward_fromdev(todev, inportInfo.port, fromdev);
}
else{
PortInfoList inportInfoList get_inport_info_list(todev);
for(each outportInfo of outportInfoList)
tempGroup -> add_substream_graph_toward_todev(fromdev, outportInfo.port, todev);
}
TRY{
merge(tempGroup);
}CATCH(NoCommomNode e){
throw(e); return 0:
}
if(tempGroup -> get_element_num() == 0){
CannotFindSubstreamGraph e; throw(e); return();
}
int increment = get_element_num()-oldNum;
return increment;
}
여기서, PortInfoList get_outport_info_list(VirtualDeviceRef dev)는 dev의 PortInfoList중에서 출력 포트(output port)에 대한 정보만 넘겨주고, PortInfoList get_inport_info_list(VirtualDeviceRef dev)는 dev의 PortInfoList중에서 input port에 대한 정보만 넘겨주고, booleanadd_substream_graph_toward_todev(VirtualDeviceRef dev, PortIndex port, VirtualDeviceRef todev, PortIndex toport = ALL)는 임의의 dev의 port에서 부터 todev까지 그래프를 만들어주는 함수이고, boolean add_substream_graph_toward_todev(VirtualDeviceRef dev, PortIndex port, VirtualDeviceRef fromdev, PortIndex fromport = ALL)는 임의의 dev의 port에서 부터 todev까지 그래프를 만들어주는 함수이다.
상기 add_substream_graph_fromport_toport는 from to방법에서 from과 to device에 다중 스트림(multiple stream)이 통과하는 경우 사용한다. 정확히 fromport에서 출발하여 toport까지 오는 서브-스트림 그래프(Sub-stream Graph)만을 찾아준다. fromport와 toport는 ALL이라는 값을 가질 수 있는데 이 경우 포트(port)를 명시하지 않는 경우와 동일하다.
따라서, from과 to가 동일한 버츄얼 디바이스(Virtual Device)라면 서브-스트림 그래프(Sub-stream Graph)가 정의되지 않게 되며 CannotFindSubStreamGraph exception이 발생된다.
케이스 5(case 5)
int add_substream_graph_fromdev_todev(VirtualDeviceRef fromdev, PortIndex fromport, VirtaulDeviceRef todev, PortIndex toport)
{
if(fromdev == todev){
CannotFindSubstreamGraph e; throw(e); return 0;
}
int oldNum = get_element_num();
GroupRef tempGroup = GroupFactory -> get_new_group();//GroupFactory가 있다고 가정
if(fromdev !== NULL){
if(fromport == ALL){
for(each outportInfo of outportInfoList)
tempGroup -> add_substream_graph_toward_todev(fromdev, outportInfo.port, todev, toport);
}
else
tempGroup -> add_substream_graph_toward_todev(fromdev, fromport, todev, toport);
}
else{
if(toport == ALL)tempGroup -> add_substream_graph_fromdev_todev(NULL, todev);
else tempGroup -> add_substream_graph_toward_fromdev, toport, fromdev,fromport);
}
TRY{
merge(tempGroup);
}CATCH(NoCommomNode e){
throw(e); return 0:
}
if(tempGroup -> get_element_num() == 0){
CannotFindSubstreamGraph e; throw(e); return();
}
int increment = get_element_num()-oldNum;
return increment;
}
상기 케이스 5에 나타낸 바와 같은, add_substream_graph_toward_todev는 버츄얼 디바이스(Virtual Device)와 출력 포트 인덱스(outport port index)를 인자로 받는다. 먼저, 이 출력 포트(output port)를 이용해서 스트림 커넥션(Stream Connection)을 구한 뒤 다시 이 스트림 커넥션(Stream Connection)과 연결되어 있는 데스티네이션 버츄얼 디바이스(destination Virtual Device)들을 찾아낸다. 이 알고리즘의 골자는 todev부터 데스티네이션 디바이스(destination device)까지 그래프(graph)가 형성이 되었다면 현재의 소스 디바이스(source device)에서 데스티네이션 디바이스(destination device)까지 길이 1인 그래프(graph)를 형성시킨다.
따라서, 재귀적으로 정의되므로 데스티네이션 디바이스(destination device)가 todev인지 혹은 싱크 디바이스(sink device)인지 테스트해서 탐색의 종료 시점을 확인해야 한다. 만일 데스티네이션 디바이스(destination device)가 todev인 경우 길이 1인 그래프를 만든다. 또한, 하기한 참조 18에 나타낸 바와 같이, 데스티네이션 디바이스(destination device)가 싱크(sink)인 경우 todev가 NULL이라면 역시 길이 1인 그래프를 만드나 todev가 NULL이 아니라면 탐색이 더 이상 진행되지 않는 시점임을 알 수 있다. 만일, 데스티네이션 디바이스(destination device)가 중간 노드이면서 todev가 아니라면 계속해서 탐색을 진행하도록 한다.
참조 18
//default : toport == ALL
boolean add_substream_graph_toward_todev(VirtualDeviceRef dev, PortIndex outport, VirtualDeviceRef todev, PortIndex toport)
{
StreamConnection connection = dev -> get_stream_connection_by_port(outport);
ConnectionInfo ConnectionInfo = connection -> get_connection_info();
booleam adding = FALSE;
for(each devInfo in ConnectionInfo){//muticast connection인 경우 3개 이상의 devInfo이 존재
if(devInfo.device == dev) continue;//자신은 제외
//이미 add되어 있다면 담색에서 prunning시킴
if(is_inserted(dev, outport, connection, devInfo.device, devInfo.port)return TRUE;
// 경우 1 : todev와 toport를 찾는 경우
if(devInfo.device == todev)&&((toport == ALL)\\(devInfo.port == toport)){
adding = TRUE;
add_one_length_graph(dev, outport, connection, devInfo.device, devInfo.port);
continue;
}
// 경우 2 : todev가 NULL인 경우 모든 sink까지 탐색이므로, destination이 sink인 경우
if(is_sink_node(devInfo.device)){
if(todev == NULL){
adding = TRUE;
add_one_length_graph(dev, outport, connection, devInfo.device,devInfo.port);
}
continue;
}
//destination device에서 현재의 stream의 영향을 받는 output port들을 찾아내서 다시 탐색 시작
PortInfoList outportInfoList = get_outport_info_list(devInfo.device, devInfo.port);
boolean added = FALSE;
for(each outportInfo of outportInfoList)
if(add_substream_graph_todev(devInfo.device, outportInfo.port, todev, toport))
added = TRUE;
// 경우 3 : todev 에서부터 destination까지 연결이 성공으로 연결된 경우
if(added){
adding = TRUE;
add_one_length_graph(dev, outport, connection, devInfo.device,devInfo.port);
}
}
return adding;
}
알고리즘 설명 및 유사 코드(Pseudo Code) 검증
먼저, 도 20a 및 도 20b 에 도시된 바와 같이, 버츄얼 디바이스(Virtual Device)의 출력 포트(outport)에 연결된 스트림 커넥션(Stream Connection)을 통해 ConnectionInfo를 구한다.
이어 ConnectionInfo에서 각 데스티네이션 앤드포인트(destination endpoint)를 구한다. 그리고 다음 세 경우에 따라 그래프를 만들던지 탐색을 계속한다.
그리고, 데스티네이션 앤드포인트(destination endpoint)가 todev인 경우 길이 1인 그래프를 만들다.
다음으로, 데스티네이션 앤드포인트(destination endpoint)가 싱크 디바이스(sink device)이고 todev가 NULL인 경우 길이 1인 그래프를 만든다.
그 다음으로, 데스티네이션 앤드포인트(destination endpoint)로부터 탐색을 계속해야 하는 경우 상기 데스티네이션 앤드포인트(destination endpoint)에서 다시 생성되는 그래프를 탐색하기 위해 이 커넥션(connection)에 영향을 받는 출력 포트(output port)를 구한다. 상기 각각의 출력 포트(output port)에 대하여 상기 과정을 반복한 후 상기 데스티네이션 앤드포인트(destination endpoint)에서 그래프가 생성이 되었다면 현재 dev에서 상기 데스티네이션 앤드포인트(destination endpoint)까지 길이 1인 그래프를 만든다.
그리고 add_substream_graph_fromdev_todev(A, E)를 콜(call)했다면 상기 알고리즘에 의해서 그래프는 하기한 참조 19에 나타낸 바와 같이 생성된다.
참조 19
1. add_substream_graph_fromdev_todev(A, E);
outportInfoList = {AOPort};
add_substream_graph_toward_todev(A, AOPort, E, ALL);
2. add_substream_graph_fromdev_todev(A, AOPort, E, ALL);
ConnectionInfo = {[C, CIPort1]};
outportInfoList = {COPort};
add_substream_graph_toward_todev(C, COPort, E, ALL);//return TRUE
add_one_length_graph(A, AOPort, E1, C, CIPort1);
3. add_substream_graph_fromdev_todev(C, COPort, E, ALL);
ConnectionInfo = {[D, DIPort1]};
outportInfoList = {DOPort1, DOPort2};
add_substream_graph_toward_todev(D, DOPort1, E, ALL);//return TRUE
add_substream_graph_toward_todev(D, DOPort2, E, ALL);//return FALSE
add_one_length_graph(C, COPort, E3, D, DIPort1);
4. add_substream_graph_fromdev_todev(D, DOPort1, E, ALL);
outportInfoList = {[E, EOPort]};
//E가 todev이고 toport가 ALL이므로 그래프를 만든다.
Add_substream_graph_toward_todev(D, DOPort, E4, E, EIPort);
5. add_substream_graph_fromdev_todev(D, DOPort2, E, ALL);
ConnectionInfo = {[F, FIPort]};
//F가 sink이나 todev가 NULL이 아니므로 false를 return한다.
Return FALSE;
하기한 참조 20에 나타낸 바와 같은, add_substream_graph_toward_fromdev는 add_substream_graph_toward_todev의 역인 알고리즘이다.
단, 스트림 커넥션(Stream Connection)의 DevInfo을 소스 앤드포인트(sourceendpoint)에 대한 것만 받으면 되므로 좀 더 절차가 단순해진다.
이 알고리즘 역시 소스 디바이스(source device)가 fromdev부터 todev를 형성하고 있다면 현재의 데스티네이션 디바이스(destination device)와 소스 디바이스(source device)를 연결하는 길이 1인 그래프를 만들 수 있다는 것이 알고리즘의 골자이다.
참조 20
//default : fromport = ALL
boolean add_substream_graph_toward_fromdev(VirtualDeviceRef dev, PortIndex inport, VirtualDeviceRef fromdev, PortIndex fromport)
{
StreamConnection connection - dec -> get_stream_connection_by_port(outport);
DevInfo sourceInfo = connection -> get_connection_info().sourcedevice;
//이미 add되어 있다면 prunning시킴
if(is_inserted(sourceInfo.device, sourceInfo.port, connection, dev, inport))return TRUE;
// 경우 1 : fromdev와 fromport를 찾는 경우
if(sourceInfo.device == fromdev)&&((fromport == ALL)\\(sourceInfo.port == fromport))){
add_one_length_graph(sourceInfo.device, sourceInfo.port, connection, dev, inport);
return TRUE;
}
// 경우 2 : fromdev가 NULL인 경우 모든 sink까지 탐색이므로, destination이 sink인 경우
if(is_sink_node(sourceInfo.device)){
if(fromdev == NULL){
return TRUE;
}
return FALSE;
}
boolean added = FALSE;
//destination device에서 현재의 stream의 영향을 받는 input port들을 찾아내서 다시 탐색 시작
PortInfoList inportInfoList = get_inport_info_list(sourceInfo.device, sourceInfo.port);
for(each inportInfo of inportInfoList)
if(add_substream_graph_toward_fromdev(sourceInfo.device, inportInfo.port, fromdev))
added = TRUE;
// 경우 3 : fromdev에서부터 source까지 연결이 성공으로 연결된 경우
if(added)
add_one_length_graph(sourceInfo.device, sourceInfo.port, connection, dev, inport);
return added;
}
또한, dev의 입력 포트(inport)에 연결된 커넥션(connection)을 통해 sourceInfo를 구한다.
이후 다음 세 가지 경우에 따라 그래프를 만들던지 탐색을 계속한다.
그리고 소스 앤드포인트(source endpoint)가 fromdev인 경우 길이 1인 그래프를 만든다.
다음으로, 소스 앤드포인트(source endpoint)가 소스 디바이스(source device)이고 fromdev가 NULL인 경우 길이 1인 그래프를 만든다.
상기 소스 앤드포인트(source endpoint)로부터 탐색을 계속해야 하는 경우그 다음으로, 소스 앤드포인트(source endpoint)에서 다시 생성되는 그래프를 탐색하기 위해 이 커넥션(connention)에 영향을 받는 입력 포트(inport)들을 구한다. 상기 각각의 입력 포트(inport)에 대해서 상기 과정을 반복 수행한 후 소스 앤드포인트(source endpoint)에서 그래프가 생성이 되었다면 현지 dev에서 상기 소스 앤드포인트(source endpoint)까지 길이 1인 그래프를 만든다.
그리고 add_stream_graph_fromdev_todev(NULL, E)를 콜(call)했다면 상기 알고리즘에 의해서 그래프는 하기한 참조 21에 나타낸 바와 같이 생성된다.
참조 21
1. add_substream_graph_fromdev_todev(NULL, E);
inportInfoList = {EIPort};
add_substream_graph_toward_todev(E, EIPort, NULL, ALL);
2. add_substream_graph_fromdev_todev(E, EIPort, NULL, ALL);
sourceInfo = {[D, DOPort1]};
inportInfoList = {DIPort};
add_substream_graph_toward_todev(D, DIPort, NULL, ALL);//return TRUE
add_one_length_graph(D, DOPort1, E4, E, EIPort1);
3. add_substream_graph_fromdev_todev(D, DIPort, NULL, ALL);
sourceInfo = {[C, COPort]};
inportInfoList = {CIPort1, CIPort2};
add_substream_graph_toward_todev(C, CIPort1, NULL, ALL);//return TRUE
add_substream_graph_toward_todev(C, CIPort2, NULL, ALL);//return FALSE
add_one_length_graph(C, COPort, E3, D, DIPort);
4. add_substream_graph_fromdev_todev(C, CIPort1, NULL, ALL);
sourceInfo = {[A, AOPort]};
//A가 source device이고 fromdev가 NULL이므로
add_one_length_graph(A, AOPort, E1, C, CIPort);
return TRUE;
5. add_substream_graph_fromdev_todev(C, CIPort2, NULL, ALL);
sourceInfo = {[B, BOPort]};
//B가 source device이고 fromdev가 NULL이므로
add_one_length_graph(B, BOPort, E2, C, CIPort2);
return TRUE;
상기까지 설명한 방법은 from to 방법에 대한 것으로 하기한 참조 22에 나타낸 바와 같은 함수들은 effective range 방법으로 VirtualDevice나StreamConnection을 시드(seed)로 주어 이에 영향을 주는 서브-스트림 그래프(Sub-stream Graph)를 찾아내는 방법이다. 이 방법들은 add_substream_graph_fromdev_todev의 조합으로 해결된다.
참조 22
1. int add_substream_graph_by_dev(in VirtualDevice dev)raises(NoCommonNode);
2. int add_substream_graph_by_port(in VirtualDevice dev, in PortIndex port)raises(NoCommonNode);
3. int add_substream_graph_by_connection(in StreamConnection connection)raises(NoCommonNode);
상기한 참조 22에 나타낸 add_substream_graph_by_dev함수같은 경우 시드(seed)로 준 노드에 모든 포트를 얻은 수 각 포트에 대해 add_substream_graph_fromport_toport 함수를 이용하여 서브-스트림 그래프(Sub-stream Graph)를 얻는다. 그리고 하기한 케이스 6에 나타낸 바와 같이 입력 포트(Input port)인 경우 모든 소스(source)까지 서브-스트림 그래프(Sub-stream Graph)를 찾도록 하고 출력 포트(output port)인 경우 모든 싱크(sink)까지 서브-스트림 그래프(Sub-stream Graph)를 얻어서 이를 그래프에 합병(Merge)시킨다.
케이스 6(case 6)
int add_substream_graph_by_dev(VirtualDeviceRef dev)
{
GroupRef tempGroup = GroupFactory => get_new_group(); //GroupFactory가 있다고 가정
PortInfoList portInfoList = dev.get_port_info_list();
for(each portInfo of portInfoList){
if(portInfo.input == TRUE)
tempGroup -> add_substream_graph_fromport_toport(NULL, ALL, dev, port);
else
tempGroup -> add_substream_graph_fromport_toport(dev, port, NULL, ALL);
}
TRY{
merge(tempGroup);
}CATCH(NoCommonNode e){
throw(e); return();
}
}
상기 add_substream_graph_by_port함수같은 경우 시드(seed)로 주어진 노드와 포트와 함께 같은 스트림을 통과하는 관계된 모든 포트를 얻은 후 각 포트에 대해 add_substream_graph_fromport_toport함수를 이용하여 서브-스트림 그래프(Sub-stream Graph)를 얻는다. 그리고 하기한 케이스 7 및 케이스 8에 나타낸 바와 같이, 입력 포트(Input port)인 경우 모든 소스(source)까지 서브-스트림 그래프(Sub-stream Graph)를 찾도록 하고 출력 포트(output port)인 경우 모든 싱크(sink)까지 서브-스트림 그래프(Sub-stream Graph)를 얻어서 이를 그래프에 합병(Merge)시킨다.
케이스 7(case 7)
int add_substream_graph_by_dev(VirtualDeviceRef, PortIndex port)
{
GroupRef tempGroup = GroupFactory => get_new_group(); //GroupFactory가 있다고 가정
PortInfoList portInfoList = get_related_port_info_list(dev, port);
for(each portInfo of portInfoList){
if(portInfo.input == TRUE)
tempGroup -> add_substream_graph_fromport_toport(NULL, ALL, dev, port);
else
tempGroup -> add_substream_graph_fromport_toport(dev, port, NULL, ALL);
}
TRY{
merge(tempGroup);
}CATCH(NoCommonNode e){
throw(e); return();
}
}
케이스 8(case 8)
int add_substream_graph_by_connection(StreamConnectionRef connection)
{
GroupRef tempGroup = GroupFactory => get_new_group(); //GroupFactory가 있다고 가정
DevInfo sourceInfo = get_source_endpoint_info(connection -> get_connection_info());
tempGroup -> add_substream_graph_toward_todev(sourceInfo.device, sourceInfo.port, NULL);
for(each inportInfo of inportInfoList){
tempGroup -> add_stream_graph_toward_fromdev(sourceInfo.device, inportInfo.port, NULL);
}
TRY{
merge(tempGroup);
}CATCH(NoCommonNode e){
throw(e); return();
}
}
상기와 같은 본 발명은 멀티미디어 스트림을 다루는 모든 응용 분야에 적용할 수 있으며 사용자가 기타 서비스를 추가함으로써 얼마든지 확장이 가능하다.
예를 들면, VOD(Video On Demand)나 AOD(Audio On Demand) 서비스, 화상회의 시스템, CTI 등의 응용 분야가 있다.
이상에서 설명한 바와 같이 본 발명에 따른 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법은 스트림 그래프에 기존의 그래프 이론을 적용시켜서 스트림을 다루는 연산을 정형화할 수 있고 스트림의 제어범위와 방식은 시스템의 종류와 상황에 따라 다양할 수 있으며, 본 발명에서 제시하는 스트림 그래프를 통해 특정 상황이 아닌 임의의 상황에서 스트림을 제어할 수 있는 일반적인 방식의 지원이 가능할 뿐만 아니라 스트림 그래프의 동적인 정의에 의해 스트림 제어를 동적으로 할 수 있게 되고 스트림 그래프의 동적인 정의에 의해 동적 자원 할당이 가능하다는 효과가 있다.

Claims (12)

  1. 스트림을 생성하여 전송하고 이를 최종적으로 받아 처리하는 일련의 소스 버츄얼 디바이스(Source Virtual Device)와 인터미디이트 버츄얼 디바이스(Intermediate Virtual Device), 싱크 버츄얼 디바이스(Sink Virtual Device)와 그들 사이를 연결하는 스트림 커넥션(Stream Connection)과 같은 객체들을 포함하는 객체 지향 분산 처리시스템에 있어서,
    상기 객체들을 각각의 노드와 에지로 모델링하여 그래프로 표현하는 스트림 그래프(Stream Graph) 표현단계와, 상기 스트림 그래프에 따라 상기 소스 비츄얼 디바이스로부터 상기 싱크비츄얼 디바이스로 전달되는 하나의 스트림을 묶어 한번에 제어가 가능하도록 그룹핑하여 관리하는 단계를 포함하는 것을 특징으로 하는 객체 재향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  2. 제 1 항에 있어서,
    상기 스트림 그래프(Stream Graph)표현단계는 임의의 서브-스트림 그래프(Sub-stream Graph)를 정의하여 관리됨을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  3. 제 2 항에 있어서,
    상기 서브-스트림 그래프(Sub-stream Graph)는 임의의 노드가 영향을 줄 수 있는 범위로 설정하는 것을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  4. 제 2 항에 있어서,
    상기 서브-스트림 그래프(Sub-stream Graph)는 임의의 노드들의 시작과 끝을 지정하여 범위를 설정하는 것을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  5. 제 1 항에 있어서,
    상기 스트림 그래프(Stream Graph) 표현단계는, 하나의 스트림이 디스트리뷰터(distributor), 멀티캐스트/브러드캐스트(multicast/broadcast)에 의해 여러 갈래로 분기됨을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  6. 제 1 항에 있어서,
    상기 스트림 그래프(Stream Graph) 표현단계는 다중 스트림이 믹서(Mixer)에 의해 통합됨을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  7. 제 1 항에 있어서,
    상기 스트림 그래프(Stream Graph) 표현단계는 서브-스트림 그래프(Sub-stream Graph)의 제거가 시작 노드와 끝 노드를 지정하여 다른 서브-스트림 그래프(Sub-stream Graph)와 중복되지 않는 부분의 제거로 가능하게 됨을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  8. 제 1 항에 있어서,
    상기 스트림 그래프(Stream Graph) 표현단계는 서브-스트림 그래프(Sub-stream Graph)의 합병(Merge)이 중복되는 서브-스트림 그래프(Sub-stream Graph)를 하나의 서브-스트림 그래프(Sub-stream Graph)의 처리로 가능하게 됨을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  9. 제 1 항에 있어서,
    상기 스트림 그래프(Stream Graph) 표현단계는 서브-스트림 그래프(Sub-stream Graph)의 추출(Extract)이 중복되는 부분의 서브-스트림 그래프(Sub-stream Graph)를 복사하고 중복되지 않는 부분의 제거로 가능하게 됨을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  10. 제 1 항에 있어서,
    상기 스트림 그래프(Stream Graph) 표현단계는 서브 스트림 그래프(Sub-stream Graph)의 분리, 합병 및 추출을 이용하여 스트림의 관리 범위를 동적으로 변경하는 것을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  11. 제 1 항에 있어서,
    상기 그룹핑하여 관리하는 단계는 상기 스트림 그래프(Stream Graph)로 추상화한 후 이를 그룹핑(Grouping)하여 그룹(Group)들로 관리하고 상기 그룹(Group)들 사이를 연결하는 스트림 커넥션(Stream Connection)과 같은 객체들을 스트림 그래프(Stream Graph)로 추상화한 후 이를 그룹 오프 그룹(Group Of Group)으로 그룹핑(Grouping)하여 동시에 다수의 스트림(Stream)을 관리함을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
  12. 소스 버츄얼 디바이스(Source Virtual Device)와 인터미디이트 버츄얼 디바이스(Intermediate Virtual Device), 싱크 버츄얼 디바이스(Sink Virtual Device)가 로컬(local)로 연결구성된 컴포지트 디바이스(composite device)에 있어서,
    상기 로컬(local)로 연결구성된 소스 버츄얼 디바이스(Source VirtualDevice)와 인터미디이트 버츄얼 디바이스(Intermediate Virtual Device), 싱크 버츄얼 디바이스(Sink Virtual Device) 사이를 연결하는 스트림 커넥션(Stream Connection)과 같은 객체들을 스트림 그래프(Stream Graph)로 추상화한 후 이를 그룹핑(grouping)하여 내부적으로 관리함을 특징으로 하는 객체 지향 분산 처리시스템에서 멀티미디어 스트림 데이터의 제어 및 자원 할당을 위한 방법.
KR1019980047673A 1998-11-07 1998-11-07 객체지향분산처리시스템에서멀티미디어스트림데이터의제어및자원할당을위한방법 KR100308024B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1019980047673A KR100308024B1 (ko) 1998-11-07 1998-11-07 객체지향분산처리시스템에서멀티미디어스트림데이터의제어및자원할당을위한방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1019980047673A KR100308024B1 (ko) 1998-11-07 1998-11-07 객체지향분산처리시스템에서멀티미디어스트림데이터의제어및자원할당을위한방법

Publications (2)

Publication Number Publication Date
KR20000031566A KR20000031566A (ko) 2000-06-05
KR100308024B1 true KR100308024B1 (ko) 2001-10-19

Family

ID=19557489

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1019980047673A KR100308024B1 (ko) 1998-11-07 1998-11-07 객체지향분산처리시스템에서멀티미디어스트림데이터의제어및자원할당을위한방법

Country Status (1)

Country Link
KR (1) KR100308024B1 (ko)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2011081367A2 (ko) 2009-12-28 2011-07-07 전자부품연구원 멀티미디어 데이터 처리 방법
US8782237B2 (en) * 2010-01-28 2014-07-15 Intel Corporation Audio/video streaming in a topology of devices
KR101701224B1 (ko) * 2015-11-30 2017-02-01 고려대학교 산학협력단 객체 모델 기반 실시간 스트림 데이터 분산 병렬 처리 시스템

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5388264A (en) * 1993-09-13 1995-02-07 Taligent, Inc. Object oriented framework system for routing, editing, and synchronizing MIDI multimedia information using graphically represented connection object

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5388264A (en) * 1993-09-13 1995-02-07 Taligent, Inc. Object oriented framework system for routing, editing, and synchronizing MIDI multimedia information using graphically represented connection object

Also Published As

Publication number Publication date
KR20000031566A (ko) 2000-06-05

Similar Documents

Publication Publication Date Title
TW548930B (en) Application development interface for multi-user applications executable over communication networks
US9596141B2 (en) Representing software defined networks using a programmable graph model
KR101126255B1 (ko) 신호처리장치
US20140280802A1 (en) Capability identification and modification through hardware introspection and reflection
Al Ridhawi et al. Workflow-net based service composition using mobile edge nodes
MXPA04006407A (es) Resolucion de una topologia distribuida para canalizar datos.
KR20140075784A (ko) 대규모 매체 클라우드를 위한 분산 맵핑 기능
EP3846362A1 (en) Optimizing audio signal networks using partitioning and mixer processing graph recomposition
US8375051B2 (en) Apparatus for controlling subscriptions
CN113169899B (zh) 确定网络服务(ns)的规模
US20220182163A1 (en) Distributed audio mixing
Huang et al. Network hypervisors: enhancing SDN infrastructure
KR20160000542A (ko) 데이터 분산 서비스 응용 생성 방법 및 장치
KR100308024B1 (ko) 객체지향분산처리시스템에서멀티미디어스트림데이터의제어및자원할당을위한방법
Chen et al. An efficient linear programming rounding-and-refinement algorithm for large-scale network slicing problem
US20150373095A1 (en) Method and apparatus for determining service quality profile on data distribution service
Risso et al. Mixed integer programming formulations for Steiner tree and quality of service multicast tree problems
Dit Picard et al. VRML data sharing in the spin-3D CVE
Putrycz Design and implementation of a portable and adaptable load balancing framework
US11425464B2 (en) Communication device, communication control device, and data distribution system
Humernbrum et al. Rtf+ shark: Using software-defined networks for multiplayer online games
Hagin et al. Problem formulations, models and algorithms for mapping distributed multimedia applications to distributed computer systems
de Almeida et al. A management and configuration infrastructure for RNP’s digital video distribution service
Ferreira Fairness-oriented multicast routing for distributed interactive applications with computing on the network edge.
Dibley An Investigation of the XMOS XSl Architecture as a Platform for Development of Audio Control Standards

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20080618

Year of fee payment: 8

LAPS Lapse due to unpaid annual fee