KR101857907B1 - IoT 디바이스를 위한 이기종 분산 공유 메모리 - Google Patents

IoT 디바이스를 위한 이기종 분산 공유 메모리 Download PDF

Info

Publication number
KR101857907B1
KR101857907B1 KR1020170020650A KR20170020650A KR101857907B1 KR 101857907 B1 KR101857907 B1 KR 101857907B1 KR 1020170020650 A KR1020170020650 A KR 1020170020650A KR 20170020650 A KR20170020650 A KR 20170020650A KR 101857907 B1 KR101857907 B1 KR 101857907B1
Authority
KR
South Korea
Prior art keywords
shared memory
memory
copy
hdsm
branch section
Prior art date
Application number
KR1020170020650A
Other languages
English (en)
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 KR1020170020650A priority Critical patent/KR101857907B1/ko
Application granted granted Critical
Publication of KR101857907B1 publication Critical patent/KR101857907B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/14Handling requests for interconnection or transfer
    • G06F13/16Handling requests for interconnection or transfer for access to memory bus
    • G06F13/1605Handling requests for interconnection or transfer for access to memory bus based on arbitration
    • G06F13/1652Handling requests for interconnection or transfer for access to memory bus based on arbitration in a multiprocessor architecture
    • G06F13/1663Access to shared memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/14Handling requests for interconnection or transfer
    • G06F13/16Handling requests for interconnection or transfer for access to memory bus
    • G06F13/1668Details of memory controller

Abstract

제1 디바이스로부터 브랜치 진입 신호를 수신하여 제1 공유 메모리 복사본을 생성하고, 제2 디바이스로부터 브랜치 진입 신호를 수신하여 제2 공유 메모리 복사본을 생성하고, 제1 디바이스로부터 합병 신호가 수신되면 제1 공유 메모리 복사본을 메모리에 합병하며, 제2 디바이스로부터 합병 신호가 수신되면 제1 공유 메모리 복사본이 합병된 메모리에 제2 공유 메모리 복사본을 합병하는 메모리 운영 방법 및 디바이스가 개시된다.

Description

IoT 디바이스를 위한 이기종 분산 공유 메모리{HETEROGENEOUS DISTRIBUTED SHARED MEMORY FOR IOT DEVICES}
본 발명은 사물인터넷(IoT, Internet Of Things) 디바이스를 위한 이기종 분산 공유 메모리에 대한 것으로, 더욱 상세하게는 IoT 디바이스의 특성에 적합한 메모리와 메모리를 운영하는 방법에 대한 것이다.
기술 발전에 따라 다양한 종류와 성능의 디지털 디바이스들이 서로 통신하며 서비스를 제공하는 사물인터넷 환경이 도래하였다. 도 1에 도시된 바와 같이, 사물인터넷 환경에서는 기존의 스마트폰과 휴대폰뿐 아니라 집, 공장, 농장, 차량 등에 설치된 다양한 종류의 디바이스들이 서로 통신하며 서비스를 제공한다. 또한, 클라우드 기술 또한 이러한 사물인터넷 환경과 연계되어 급속도로 발전하고 있는 상황이다.
사물인터넷 환경을 구성하는 디바이스들은 데스크탑 컴퓨터나 서버에 비해서 상대적으로 낮은 성능과 컴퓨팅 자원을 갖는다. 기본적으로 사물인터넷 어플리케이션은 다수의 디바이스로 이루어져 각자의 서브프로그램(sub-program)을 구동하는 방식으로 동작하며, 디바이스들 간에 각각 서로 다른 아키텍쳐를 가진 경우도 많다.
따라서, 개발자는 사물인터넷 어플리케이션을 프로그래밍하는 데에 있어서 디바이스가 상대적으로 낮은 성능을 갖는다는 점, 다수의 서브프로그램을 각각 별도로 구현해야 한다는 점, 디바이스 간의 아키텍쳐가 서로 다르다는 점 등을 고려해야 한다는 어려움이 있다.
한편, 이기종 분산 공유 메모리(HDSM, Heterogeneous Distributed Shared Memory) 기술은 분산 공유 메모리(DSM, Distributed Shared Memory) 기술의 이기종 시스템 환경을 위한 확장 시스템으로, 프로그램을 구동하는 디바이스들의 아키텍쳐와 프로그래밍 언어가 다른 경우를 지원하는 메모리 운영 방식이다. HDSM에 의하면 런타임(runtime)에 데이터 변환(data conversion)을 수행함으로써 이종 시스템 환경에서 분산 공유 메모리를 구현할 수 있게 된다.
앞서 설명했듯이, 사물인터넷 디바이스는 다른 디바이스에 비해 성능과 자원 측면에서 특성을 가지기 때문에, HDSM에서 개량되어 사물인터넷 디바이스에 적용될 수 있는 메모리에 대한 요구가 날로 증대되는 상황이다.
본 발명은 상기한 바와 같은 문제점을 해결하기 위하여 안출된 것으로서, 본 발명의 목적은 사물인터넷 환경에 적합하도록 개선된 메모리 운영 방식을 제안하는 것이다.
본 발명의 또 다른 목적은 사물인터넷 디바이스의 특성을 고려한 메모리 운영 방식을 제안함으로써 사물인터넷 디바이스의 성능만으로도 사물인터넷 환경에 요구되는 성능을 지원하는 것이다.
본 발명에서 이루고자 하는 기술적 목적들은 이상에서 언급한 사항들로 제한되지 않으며, 언급하지 않은 또 다른 기술적 과제들은 이하 설명할 본 발명의 실시 예들로부터 본 발명이 속하는 기술분야에서 통상의 지식을 가진 자에 의해 고려될 수 있다.
상기 기술적 과제를 해결하기 위한 메모리 운영 방법은, 제1 디바이스로부터 브랜치 진입 신호가 수신됨에 따라 제1 디바이스의 브랜치 섹션을 위한 제1 공유 메모리 복사본을 생성하는 단계, 제2 디바이스로부터 브랜치 진입 신호가 수신됨에 따라 제2 디바이스의 브랜치 섹션을 위한 제2 공유 메모리 복사본을 생성하는 단계, 제1 디바이스로부터 합병 신호가 수신되면 제1 공유 메모리 복사본을 마스터 디바이스의 메모리에 합병하는 단계, 및 제2 디바이스로부터 합병 신호가 수신되면 제1 공유 메모리 복사본이 합병된 메모리에 제2 공유 메모리 복사본을 합병하는 단계를 포함한다.
브랜치 섹션 동안 공유 변수에 대하여 변경된 값들은 공유 메모리 복사본 상에 저장되며, 브랜치 섹션의 종료 시점에 마스터 디바이스의 메모리 상에 반영될 수 있다.
마스터 디바이스는 단일한 전역적 순서에 따라 복수의 디바이스들로부터 갱신된 데이터를 수집하며, 단일한 전역적 순서는 브랜치 섹션의 종료 시점에 따라 결정될 수 있다.
제1 디바이스 및 제2 디바이스는 공유 메모리의 복사본에 각각 접근함으로써, 배타적 접근을 위해 기다리는 과정이 생략될 수 있다.
이기종 분산 공유 메모리의 프레임워크는 각각의 디바이스를 위한 코드를 변환하여 IR(Intermediate Representation) 코드를 생성하는 프론트엔드 컴파일러, 메모리 레이아웃을 통일하고 IoT-HDSM 인에이블드 IR 코드를 생성하는 IoT-HDSM(Internet Of Things-HDSM) 컴파일러, 및 각각의 디바이스들의 아키텍쳐에 따라 최종 컴파일을 수행하는 백엔드 컴파일러로 구성될 수 있다.
메모리 레이아웃을 통일하는 과정은, 패딩 바이트를 삽입하고 포인터 사이즈를 정렬하고 메모리 값을 읽는 코드의 바이트 순서를 변환함으로써 수행될 수 있다.
프론트엔드 컴파일러는 제한적인 컴퓨팅 자원을 나타내는 표시를 인식함으로써 소정의 디바이스를 사물인터넷 디바이스로 인식할 수 있다.
마스터 디바이스는 브랜치 섹션의 시작을 알리는 'beginBranch' 함수, 브랜치 섹션의 종료를 알리는 'endBranch' 함수 및 브랜치 섹션의 시작에 따라 공유 메모리 복사본을 생성하는 'makeBranch' 함수를 지원할 수 있다.
상기 기술적 과제를 해결하기 위한 마스터 디바이스는, 복수의 디바이스들과 신호를 주고 받으며 통신하는 통신부, 마스터 디바이스의 동작을 위한 데이터를 저장하는 메모리, 및 통신부 및 메모리와 연결되어 마스터 디바이스의 동작을 제어하는 제어부를 포함하고, 제어부는, 통신부가 제1 디바이스로부터 브랜치 진입 신호를 수신함에 따라, 제1 디바이스의 브랜치 섹션을 위한 제1 공유 메모리 복사본을 생성하고, 통신부가 제2 디바이스로부터 브랜치 진입 신호를 수신함에 따라, 제2 디바이스의 브랜치 섹션을 위한 제2 공유 메모리 복사본을 생성하고, 통신부가 제1 디바이스로부터 합병 신호를 수신하면, 제1 공유 메모리 복사본을 마스터 디바이스의 메모리에 합병하며, 통신부가 제2 디바이스로부터 합병 신호를 수신하면, 제1 공유 메모리 복사본이 합병된 메모리에 제2 공유 메모리 복사본을 합병한다.
상기 기술적 과제를 해결하기 위한 컴퓨터로 판독 가능한 기록 매체는, 상술한 메모리 운영 방법을 구현하기 위한 프로그램을 기록한다.
본 발명의 실시 예들에 따르면 다음과 같은 효과를 기대할 수 있다.
첫째로, 개선된 메모리 운영 방식을 통해 사물인터넷 디바이스들의 원활한 동작이 가능하게 된다.
둘째로, 사물인터넷 디바이스의 제한된 제원만으로도 사물인터넷 환경에서 요구되는 실행 시간으로 동작할 수 있어, 디바이스의 성능 측면에서 이득이 발생하게 된다.
본 발명의 실시 예들에서 얻을 수 있는 효과는 이상에서 언급한 효과들로 제한되지 않으며, 언급하지 않은 또 다른 효과들은 이하의 본 발명의 실시 예들에 대한 기재로부터 본 발명이 속하는 기술분야에서 통상의 지식을 가진 자에게 명확하게 도출되고 이해될 수 있다. 즉, 본 발명을 실시함에 따른 의도하지 않은 효과들 역시 본 발명의 실시 예들로부터 당해 기술분야의 통상의 지식을 가진 자에 의해 도출될 수 있다.
이하에 첨부되는 도면들은 본 발명에 관한 이해를 돕기 위한 것으로, 상세한 설명과 함께 본 발명에 대한 실시 예들을 제공한다. 다만, 본 발명의 기술적 특징이 특정 도면에 한정되는 것은 아니며, 각 도면에서 개시하는 특징들은 서로 조합되어 새로운 실시 예로 구성될 수 있다.
도 1은 제안하는 발명과 관련된 사물인터넷 환경을 도시하는 도면이다.
도 2는 제안하는 일 실시 예에 따른 코드 구성을 도시하는 도면이다.
도 3은 제안하는 일 실시 예에 따른 디바이스들의 공유 메모리 운영 과정을 도시하는 도면이다.
도 4는 제안하는 일 실시 예에 따른 디바이스들의 프로그램 코드 컴파일 과정을 도시하는 도면이다.
도 5는 제안하는 일 실시 예에 따른 디바이스들이 구조체 정렬 방식을 통합하는 과정을 도시하는 도면이다.
도 6은 제안하는 일 실시 예에 따른 디바이스들의 메모리 운영 방법을 도시하는 흐름도이다.
도 7은 제안하는 일 실시 예에 따른 디바이스의 구성을 도시하는 블록도이다.
아래에서는 첨부한 도면을 참조하여 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자가 용이하게 실시할 수 있도록 본 발명의 실시예를 상세히 설명한다. 그러나 본 발명은 여러 가지 상이한 형태로 구현될 수 있으며 여기에서 설명하는 실시예에 한정되지 않는다. 그리고 도면에서 본 발명을 명확하게 설명하기 위해서 설명과 관계없는 부분은 생략하였으며, 명세서 전체를 통하여 유사한 부분에 대해서는 유사한 도면 부호를 붙였다.
본 명세서에서 사용되는 용어에 대해 간략히 설명하고, 본 발명에 대해 구체적으로 설명하기로 한다.
본 발명에서 사용되는 용어는 본 발명에서의 기능을 고려하면서 가능한 현재 널리 사용되는 일반적인 용어들을 선택하였으나, 이는 당 분야에 종사하는 기술자의 의도 또는 판례, 새로운 기술의 출현 등에 따라 달라질 수 있다. 또한, 특정한 경우는 출원인이 임의로 선정한 용어도 있으며, 이 경우 해당되는 발명의 설명 부분에서 상세히 그 의미를 기재할 것이다. 따라서 본 발명에서 사용되는 용어는 단순한 용어의 명칭이 아닌, 그 용어가 가지는 의미와 본 발명의 전반에 걸친 내용을 토대로 정의되어야 한다.
명세서 전체에서 어떤 부분이 어떤 구성요소를 "포함"한다고 할 때, 이는 특별히 반대되는 기재가 없는 한 다른 구성요소를 제외하는 것이 아니라 다른 구성요소를 더 포함할 수 있음을 의미한다. 또한, 명세서에 기재된 "...부", "모듈" 등의 용어는 적어도 하나의 기능이나 동작을 처리하는 단위를 의미하며, 이는 하드웨어 또는 소프트웨어로 구현되거나 하드웨어와 소프트웨어의 결합으로 구현될 수 있다. 또한, 명세서 전체에서 어떤 부분이 다른 부분과 "연결"되어 있다고 할 때, 이는 "직접적으로 연결"되어 있는 경우뿐 아니라, "그 중간에 다른 소자를 사이에 두고" 연결되어 있는 경우도 포함한다.
이하에서는 첨부된 도면을 참고하여 본 발명을 상세히 설명한다. 이하에서 제안하는 실시 예에서는, 사물인터넷 어플리케이션의 개발과 구동을 용이하게 하기 위한 메모리로써 일명 IoT-HDSM를 제안한다. IoT-HDSM 은 컴파일러와 런타임 협동의 경량 HDSM 프레임워크로써, 컴파일러는 사물인터넷 디바이스(이하에서, 단순하게 '디바이스'라 한다) 간 서로 다른 메모리 구조체, 메모리 주소의 크기, 엔디안(endianness)을 통합하기 위해 번역 코드를 삽입하는 역할을 하며, 런타임 시스템은 디바이스 간 공유 메모리의 일관성을 유지하는 역할을 담당한다.
멀티 쓰레딩(multi-threading)이 지원되지 않는 수준의 경량 사물인터넷 디바이스는 종래의 HDSM 을 구동할 수 없을만큼의 제한적인 컴퓨팅 자원을 가진다. 이러한 경량 사물인터넷 디바이스의 경우 컴파일러는 공유 변수의 접근 직전에 해당 변수의 최신 값을 마스터 노드로부터 가져오는 코드를 삽입하며, 공유 변수에 쓰기가 발생한 직후에 해당 값을 마스터 노드로 전달하는 코드를 삽입함으로써 공유 메모리의 일관성을 지킨다.
그러나, 경량 사물인터넷 디바이스를 위한 코드에서 같은 공유 데이터에 반복적으로 접근하는 반복문이 컴파일러에 의해 발견된 경우, 컴파일러는 공유 데이터를 읽기 직전과 쓰기 직후의 시점 대신에 반복문의 시작에 해당 변수의 최신 값을 마스터 노드로부터 가져오는 코드를 삽입하고, 반복문의 종료에 해당 변수의 변경 사항을 마스터 노드로 전달하는 코드를 삽입한다. 이를 통해, 마스터 노드와의 잦은 통신이 줄어들게 된다.
또한, IoT-HDSM에서는 메모리 일관성을 유지하기 위한 비용을 줄이기 위해서, 새로운 동시성 주석(concurrency annotation) 방식인 메모리 브랜치(memory branch)를 제안한다. 제안하는 실시 예에 의하면, 디바이스에서 하나 이상의 공유 변수의 값이 변경되고 다른 디바이스로 동시에 전파되어야 하는 경우, 해당 변수의 값을 변경하는 코드가 브랜치 섹션으로 감싸질 수 있다.
브랜치 섹션이 시작할 때는 해당 시점의 공유 메모리 복사본(snapshot)을 저장해두고, 브랜치 섹션 내부의 코드를 실행하는 동안의 메모리 접근은 공유 메모리 원본이 아닌 복사본에 대해서 수행된다. 이어서, 브랜치 섹션이 종료될 때 공유 메모리간 일관성 유지작업을 수행하는 마스터 노드의 메모리와 병합된다. 다수의 디바이스에서 상술한 브랜치 방식을 사용하는 경우, 마스터 노드는 각 브랜치의 완료 시점을 기준으로 먼저 종료되는 브랜치의 메모리 변경 사항을 마스터 노드에 먼저 적용하는 순서를 통해서 단일한 전역적 순서를 생성한다. 따라서, 만약 두개 이상의 디바이스가 브랜치 섹션 내에서 같은 공유 변수에 대해 서로 다른 값으로 쓰기를 수행하는 경우, 나중에 종료되는 브랜치의 쓰기가 최종적으로 마스터 노드의 메모리에 반영될 것이다.
도 2는 제안하는 일 실시 예에 따른 코드 구성을 도시하는 도면이다. 도 2에서는 앞서 설명한 바에 따라 제안하는 IoT-HDSM 방식에 따른 예시 코드를 도시한다. 도 2에는, 디바이스 1, 2, 3을 위한 코드들이 각각 도시되며(210, 220, 230), 'User'라는 이름의 구조체가 정수 변수 a, b, c, d로 구성된다. 또한, 모든 디바이스 코드에서 User 포인터 타입의 user 변수가 글로벌 변수로 선언되어 있다.
IoT-HDSM 프레임워크는 글로벌 변수 user를 공유 메모리 공간에 할당하고, 모든 디바이스가 해당 변수의 값을 일관되게 볼 수 있도록 한다. 디바이스 1을 위한 코드에서 updateUserData 함수에서는 @branch 로 시작하여 중괄호로 감싸진 코드 섹션에서 user 변수의 b와 c 값을 getB와 getC 함수의 반환 값으로 갱신하는 것이 도시된다(210). 디바이스 2의 코드의 analyzeUserdata 함수에서는 @branch 로 시작해서 중괄호로 감싸진 코드 섹션에서 user 변수의 b와 c 값을 analyze 함수에 인자로 넣고, analyze 함수 호출의 반환 값을 user 변수의 d변수에 쓰고 있다(220). 디바이스 3의 코드의 readUserData 함수에서는 branch 없이 지역 변수로 선언된 local_a 변수에 user 변수의 a 변수를 복사해서 삽입하며(230), 디바이스들은 각각 보유한 함수를 주기적으로 호출하며 공유 변수의 값을 읽거나 갱신한다.
도 2에 도시된 예시에서 브랜치(branch) 섹션을 사용하는 이유는 디바이스 1엥서 b와 c 변수의 값 갱신을 원자적으로(atomically) 실시하기를 원하기 때문이며, 마찬가지로 디바이스 2에서 b와 c 변수의 값을 읽을 때에도 원자적으로 읽기를 원하기 때문이다. 만약 디바이스 1과 2에서 branch 섹션을 사용하지 않는다면, 디바이스 1에서 두 변수의 값 갱신이 순차적으로 일어나게 되고 그 값의 갱신 또한 순차적으로 전파될 것이다. 따라서, 디바이스 2에서 두 변수의 값을 읽을 때 b의 값은 최신으로 갱신된 값으로 읽게 되지만 특정 시점에서 c의 값은 갱신 이전의 값을 가져오게 될 가능성이 존재한다. 따라서, 디바이스 1은 b와 c 두 변수의 갱신을 c 변수 갱신을 마친 뒤에 동시에 다른 디바이스로 전파하기 원하며, 디바이스 2 또한 다른 시점에 갱신된 두 값이 아닌 특정 시점에 함께 갱신된 b와 c 값을 읽고자 하기 때문에 branch 섹션을 적용하는 것이다.
도 3은 제안하는 일 실시 예에 따른 디바이스들의 공유 메모리 운영 과정을 도시하는 도면이다. 도 3에서는 앞서 도 2에 관련하여 설명한 브랜치 섹션에 대한 방식을 구체적인 예를 들어 설명한다.
도 3에서는 도 2에 도시된 코드의 예시에서 메모리 브랜치의 동작 과정을 시간 순서에 따라 도시한다. 도 3에 의하면, 시간 순서에 따라 마스터 디바이스(300), 디바이스 1(310), 디바이스 2(320)의 메모리 상태가 각각 도시된다. 도 3에는 각 디바이스들의 메모리 상태 변화가 도시되며, 영역 332, 334, 336, 338에서 4 개의 박스(box)들은 각각 도 2에서 설명한 공유 변수 user의 a, b, c, d 변수 값을 담는 메모리 공간을 나타낸다.
마스터 디바이스(300)는 공유 메모리의 최신 값을 통해서 제안하는 실시 예에 따른 메모리의 일관성을 유지하는 작업을 실시한다. 디바이스 1(310)은 브랜치 섹션 내부에서 공유 변수 user의 변수 b, c를 갱신하며, 디바이스 2(320)는 브랜치 섹션 내부에서 공유 변수 user의 변수 b, c를 읽어와 d를 갱신한다. 이때, 도 3에서 'beginBrch', 'endBrch', 'makeBrch' 기재는 각각 'beginBranch', 'endBranch', 'makeBranch' 함수를 의미한다.
브랜치 섹션을 시작할 때에는 beginBranch 함수를 호출하게 되는데, 이때 마스터 디바이스(300)에 신호가 전송된다. 마스터 디바이스(300)는 신호를 수신하게 되면 makeBranch 함수를 호출하여 보유하고 있는 공유 메모리의 복사본을 생성하게 된다. 도 3에서 디바이스 1(310)이 beginBranch 함수를 호출함에 따라 마스터 디바이스(300)가 영역 334에 디바이스 1를 위한 공유 메모리의 복사본을 생성한 결과가 도시된다.
브랜치 섹션의 내부에서 코드가 실행되는 동안 일어난 변경은 공유 메모리 공간에 기록된다. 브랜치 섹션을 끝낼 때에는 endBranch 함수를 호출하는데, 이때 기록된 공유 메모리 변경 사항이 마스터 디바이스(300)로 전송되어 브랜치 섹션이 시작할 때에 생성했던 복사본과 비교하여 실제 공유 메모리와의 합병(merge)이 이루어진다. 도 3에서 디바이스 1(310)이 브랜치 섹션 내에 변수 b, c를 갱신한 결과, 브랜치 섹션이 종료되면 마스터 디바이스(300)는 공유 메모리의 복사본을 실제 공유 메모리와 합병하여 변수의 변경사항들을 적용하게 된다.
도 3에서 디바이스 2(320)에서는 두 번의 브랜치 섹션 과정이 이루어진다. 디바이스 2(320)는 최초의 beginBranch 함수 호출을 통해 마스터 디바이스(300)의 makeBranch 함수가 호출되게끔 하며, 이때 디바이스 2(320)를 위한 공유 메모리 복사본이 영역 336에 도시된다. 최초의 브랜치 섹션에서는 디바이스 1(310)에 의한 브랜치 섹션 시작 과정과 동일한 메모리 상태의 복사본이 디바이스 2(320)를 위해 생성된다. 그러나, 디바이스 2(320)의 브랜치 섹션이 종료된 후 변수 d의 갱신된 내용이 마스터 디바이스(300)에 합병되는 과정에서, 디바이스 1(310)의 변경사항이 이미 적용된 메모리에 변경사항이 적용된다. 따라서, 디바이스 2(320)에서 두 번째 브랜치 섹션을 실행할 때에는 마스터 디바이스(300)는 디바이스 1(310)에서 갱신한 b, c값을 가진 채로 공유 메모리의 복사본을 생성하기 때문에, 디바이스 2(320)는 브랜치 섹션 내부 코드 실행 시에 갱신된 b, c 값을 읽을 수 있게 된다.
앞서 설명한 IoT-HDSM 기술에 따른 메모리 운영 방식에 의하면, 종래의 HDSM 과 같이 런타임에 데이터 변환을 수행하는 것이 아니라, 프로그램을 컴파일할 때 이기종 메모리 구조체의 재정렬을 통한 통합 및 포인터 크기 통합이 이루어지며 엔디언이 다른 디바이스 코드에만 엔디언 번역 코드가 삽입된다. 따라서, 종래의 방식에 비해서 런타임 비용이 줄어들어 사물인터넷 디바이스에서의 분산 공유 메모리 실행의 부담이 대폭 줄어들게 된다.
또한, 메모리 브랜치 방식을 이용하게 되면, 공유 변수에 대한 배타적 접근을 가능케하는 lock과 비교했을 때 섹션에 진입할 때 배타적 접근을 위해 기다릴 필요 없이 즉시 진입이 가능하게 된다. 각 디바이스는 당시의 메모리 복사본에 접근할 수 있게 되어 배타적 접근을 위한 기다림이 필요없게 된다. 한편, 브랜치 방식과 같이 배타적 접근 없이 섹션에 진입이 가능한 트랜잭션(transaction)은 섹션이 끝나는 시점에서 다른 디바이스 또는 쓰레드에서 어떤 공유 변경이 있었는지에 따라 마스터 노드에서 충돌 발생 가능성이 존재할 수 있어서 충돌이 발생했을 때를 대비한 복구 메커니즘이 수행되어야 하며, 유효성 검사 및 롤백을 위해 많은 메모리 공간을 요구한다. 반면에, 제안하는 브랜치 방식의 경우 복구 메커니즘 없이도 가장 마지막의 합병 요구, 즉 가장 나중에 종료되는 브랜치의 쓰기를 반영하기 때문에 평균적으로 더 적은 런타임 비용이 발생하게 되며, 구현을 위해 요구되는 메모리 공간 또한 상대적으로 적은 편이다.
도 4는 제안하는 일 실시 예에 따른 디바이스들의 프로그램 코드 컴파일 과정을 도시하는 도면이다. 도 4는 IoT-HDSM 프레임워크가 사물인터넷 디바이스 각각에서 구동될 프로그램 코드를 컴파일하는 과정을 설명하는 도면이다.
도 4에 의하면, IoT-HDSM 프레임워크의 컴파일러는 크게 프론트엔드 컴파일러(front-end compiler, 410), IoT-HDSM 컴파일러(IoT-HDSM compiler, 420), 백엔드 컴파일러(back-end compiler, 432, 43)로 구성된다. 프론트엔드 컴파일러(410)는 디바이스를 위한 코드를 중간언어로 변환하여 IR(Intermediate Representation) 코드를 생성한다. IoT-HDSM 컴파일러(420)는 프론트엔드 컴파일러(410)가 변환한 IR 코드를 IoT-HDSM 이 동작할 수 있도록 메모리 레이아웃을 통일하고(422), 공유 메모리 제공을 위한 코드 변형과정을 거쳐(424) IoT-HDSM 인에이블드(enabled) IR 코드를 생성한다. 백엔드 컴파일러(432, 434)는 디바이스(442, 444, 446)들에서 각자의 코드가 구동되어야 할 아키텍쳐에 따라 실행 가능한 바이너리로의 최종 컴파일 과정을 수행한다.
도 5는 제안하는 일 실시 예에 따른 디바이스들이 구조체 정렬 방식을 통합하는 과정을 도시하는 도면이다. 도 5에서는 IoT-HDSM 프레임워크가 각 디바이스에서 구동될 프로그램 코드를 컴파일하는 과정을 설명하는 도면이다.
도 5를 참조하면, IoT-HDSM 프레임워크의 프론트엔드 컴파일러(510)에서는 경량 사물인터넷 디바이스의 구분을 위한 컴퓨팅 파워 표시(comp. power annotation)를 인식하고, 브랜치 섹션의 시작과 끝에서 beginBranch 함수와 endBranch 함수로 호출한다.
디바이스가 beginBranch 함수를 호출하면 마스터 디바이스로 브랜치 진입 신호가 전송되고, 마스터 디바이스는 브랜치 진입 신호를 수신한 뒤 새로운 프로세스를 통해서 공유 메모리의 복사본을 생성한다. 이에 따라, 디바이스가 브랜치 섹션으로 진입한 뒤 메모리 값을 읽을 때, 디바이스는 공유 메모리의 복사본에 접근하게 된다. 디바이스는 브랜치 진입 이후에 시도되는 메모리 쓰기를 write set으로 저장해두었다가, endBranch 함수를 호출하면 마스터 디바이스로 병합 신호와 함께 write set을 전송한다. 마스터 디바이스는 수신한 write set을 기보유한 공유 메모리에 병합함과 동시에 브랜치를 시작할 때에 생성했던 프로세스를 없앤다.
메모리 레이아웃 통일(520) 단계에서는 ARM와 x86 아키텍처에서의 구조체 레이아웃을 통합한다. 이를 위해 패딩 바이트를 삽입하여 메모리 레이아웃을 재정렬하고(memory layout realignment), 포인터 사이즈를 64비트 기준으로 맞추어 모든 디바이스가 64비트의 주소공간을 가지게끔 수정하며(address size conversion), 엔디안이 다른 아키텍처들의 경우 메모리 값을 읽는 코드(dereference)의 바이트 순서를 반대로 바꾸어 주는 번역 함수 호출로 대체함으로써(endianness translation) 모든 디바이스가 통일된 엔디안을 가지고 공유 메모리에 접근할 수 있게끔 한다.
또한, IoT-HDSM 프레임워크는 글로벌 공간과 힙(heap) 공간에 있는 변수에 대해 공유 메모리를 제공하며(530), 이를 위해 dsm_malloc, dsm_free, dsm_read, dsm_write 함수를 각각 제공한다.
dsm_malloc 함수는 인자로 받은 사이즈 바이트만큼의 메모리 공간을 할당받고 해당 공간의 시작 주소의 포인터를 반환하는 함수인 malloc의 래퍼(wrapper) 함수이다. 공유 메모리를 관리하는 마스터 디바이스는 다른 디바이스의 dsm_malloc 함수 호출을 통해 공유 메모리 공간을 할당하는 역할을 한다. dsm_free 함수는 dsm_malloc 함수를 통해 할당된 공유 메모리 공간을 해제하며, dsm_read 와 dsm_write 함수는 경량 사물인터넷 디바이스라고 표시된 코드에만 사용되어 공유 메모리 공간의 값을 읽거나 쓰는 데에 사용된다.
공유 메모리 제공 단계(530)에서 힙 공간에 할당될 변수와 글로벌 공간에 할당될 변수에 대해 dsm_malloz(size) 함수 호출의 반환 값을 가지게 함으로써, 결과적으로 IoT-HDSM 방식이 일관성을 유지하는 공유 메모리 공간으로의 할당을 유도한다. IoT-HDSM 은 공유 메모리 공간의 일관성 유지를 위한 프로토콜로써 늦은 릴리즈 일관성(lazy release consistency) 모델을 사용한다.
그러나, 앞서 프론트엔드에서 경량 사물인터넷 디바이스를 위한 코드가 인식된 경우, 백그라운드로 작동하는 IoT-HDSM 런타임을 구동하기에 부족한 컴퓨팅 자원을 가지거나 멀티-쓰레딩이 지원되지 않는 디바이스이기 때문에, 공유 변수에 대한 접근 직전에 dsm_read(address, size) 함수 호출을 통해서 마스터 디바이스로부터 해당 변수의 최신 값을 가져오게끔 한다. 공유 변수에 대한 쓰기 이후에는 dsm_write(address, data, size) 함수의 호출을 통해 변수에 쓴 값을 마스터 노드에 전송함으로써 해당하는 주소에 위치한 값을 갱신할 수 있게끔 한다. 모든 단계를 통해 얻을 수 있는 실행파일 중에서 경량 사물인터넷 디바이스를 위한 device3.exe는 따로 IoT-HDSM 런타임을 포함하지 않으며, 그 외의 실행 파일인 device1.exe, device2.exe는 IoT-HDSM 런타임을 포함하게 된다.
도 6은 제안하는 일 실시 예에 따른 디바이스들의 메모리 운영 방법을 도시하는 흐름도이다. 도 6에서는 도 2 내지 도 5에서 설명한 마스터 디바이스, 디바이스 1, 디바이스 2의 동작을 시계열적인 흐름에 따라 도시하며, 각각의 디바이스의 입장에서 수행되는 일련의 과정을 설명한다.
도 6에 도시된 메모리 운영 방법에 의하면, 디바이스 1은 브랜치 섹션이 시작됨에 따라(S610) beginBranch 함수를 호출한다(S611). beginBranch 함수가 호출되면 디바이스 1은 브랜치 진입 신호를 마스터 디바이스로 전송하며(S612), 브랜치 진입 신호를 수신한 마스터 디바이스는 makeBranch 함수를 호출한다(S620). 이어서, 마스터 디바이스는 브랜치 진입 신호를 전송한 디바이스 1을 위한 공유 메모리 복사본을 생성한다(S621). 디바이스 1이 브랜치 섹션 내에서 새로운 데이터를 생성하거나(S613) 변수의 값을 변경하는 과정은 모두 기록되었다가 브랜치의 종료에 따라 endBranch 함수가 호출되면(S614), 디바이스 1이 마스터 디바이스로 병합 신호를 전송함으로써(S615) 공유 메모리 복사본에 저장된다. 이어서, 마스터 디바이스는 디바이스 1을 위한 공유 메모리 복사본을 본래의 공유 메모리와 합병함으로써(S624) 디바이스 1에서 생성되거나 변경된 값들을 기록한다.
한편, 디바이스 2 또한 브랜치 섹션이 시작됨에 따라(S630) beginBranch 함수를 호출한다(S631). 디바이스 2 또한 브랜치 진입 신호를 마스터 디바이스로 전송하며(S632) 브랜치 진입 신호를 수신한 마스터 디바이스는 makeBranch 함수를 호출하고(S622) 디바이스 2를 위한 공유 메모리 복사본을 생성한다(S623). 이때, 디바이스 2를 위한 공유 메모리 복사본은 S621에서 생성된 디바이스 1을 위한 공유 메모리 복사본과 동일하다. 이어서 디바이스 2에서 브랜치 섹션 동안 데이터가 생성되거나 변경된 내용들은(S633), endBranch 함수의 호출을 통해(S634) 병합 신호가 마스터 디바이스로 전송되면(S635) 마스터 디바이스가 보유한 공유 메모리 복사 본에 저장된다. 이어서, 마스터 디바이스는 디바이스 2를 위한 공유 메모리 복사본의 내용을 자신이 보유한 공유 메모리와 합병하는데(S625), 이때 주목해야 할 점은 S625에서의 공유 메모리는 S624에서 디바이스 1에 의해 변경된 값이 반영된 내용들이라는 점이다. 즉, S625에서는 S624의 공유 메모리와 합병이 이루어져, 마스터 디바이스는 디바이스 1과 디바이스 2에 변경 사항들을 모두 기록할 수 있게 된다.
한편, 도 6에서 설명한 메모리 운영 방법은 컴퓨터에서 실행될 수 있는 프로그램으로 작성 가능하고, 컴퓨터 판독 가능 매체를 이용하여 상기 프로그램을 동작시키는 범용 디지털 컴퓨터에서 구현될 수 있다. 또한, 상술한 방법에서 사용된 데이터의 구조는 컴퓨터 판독 가능 매체에 여러 수단을 통하여 기록될 수 있다. 본 발명의 다양한 방법들을 수행하기 위한 실행 가능한 컴퓨터 프로그램이나 코드를 기록하는 기록 매체는, 반송파(carrier waves)나 신호들과 같이 일시적인 대상들은 포함하는 것으로 이해되지는 않아야 한다. 상기 컴퓨터 판독 가능 매체는 마그네틱 저장매체(예를 들면, 롬, 플로피 디스크, 하드 디스크 등), 광학적 판독 매체(예를 들면, 시디롬, DVD 등)와 같은 저장 매체를 포함할 수 있다.
도 7은 제안하는 일 실시 예에 따른 디바이스의 구성을 도시하는 블록도이다. 도 7은 이상의 도 2 내지 도 6에서 설명한 메모리 운영 방법을 구동하는 디바이스의 구현 예를 도시한다. 도 7의 디바이스(1000)는 상술한 마스터 디바이스 또는 경량 사물인터넷 디바이스에 모두 해당될 수 있으며, 도시된 구성들은 단순한 구현 예에 불과하여 디바이스(1000)는 다른 범용적인 구성들을 더 포함할 수 있음은 물론이다.
제어부(1010)는 디바이스(1000)의 구동을 위한 전반적인 동작을 제어한다. 제어부(1010)는 브랜치 생성에 따라 beginBranch, makeBranch, endBranch 함수들을 호출하거나, 공유 메모리의 복사본을 생성할 수도 있으며, 브랜치 섹션 내에서 데이터의 변경을 기록하였다가 공유를 위해 전송하기도 한다.
통신부(1020)는 네트워크(1100)를 통해 외부 디바이스나 서버와 통신을 수행하며, 유선 통신, 무선 통신, 근거리 통신, 직접 통신, 이동 통신 등 다양한 통신 방식을 통해 데이터를 주고 받을 수 있다.
메모리(1030)는 디바이스(1000)가 그 목적과 기능에 따라 동작하기 위한 데이터, 프로그램, 알고리즘, 소프트웨어 등을 저장하는 수단이다. 메모리(1030)는 디바이스(1000) 내에 하드웨어로 구현되어 디바이스(1000)가 처리한 값과 정보를 데이터로 저장한다.
전술한 본 발명의 설명은 예시를 위한 것이며, 본 발명이 속하는 기술분야의 통상의 지식을 가진 자는 본 발명의 기술적 사상이나 필수적인 특징을 변경하지 않고서 다른 구체적인 형태로 쉽게 변형이 가능하다는 것을 이해할 수 있을 것이다. 그러므로 이상에서 기술한 실시 예들은 모든 면에서 예시적인 것이며 한정적이 아닌 것으로 이해해야만 한다. 예를 들어, 단일형으로 설명되어 있는 각 구성 요소는 분산되어 실시될 수도 있으며, 마찬가지로 분산된 것으로 설명되어 있는 구성 요소들도 결합된 형태로 실시될 수 있다.
본 발명의 범위는 상기 상세한 설명보다는 후술하는 특허청구범위에 의하여 나타내어지며, 특허청구범위의 의미 및 범위 그리고 그 균등 개념으로부터 도출되는 모든 변경 또는 변형된 형태가 본 발명의 범위에 포함되는 것으로 해석되어야 한다.
1000: 디바이스 1010: 제어부
1020: 통신부 1030: 메모리
1100: 네트워크

Claims (10)

  1. 사물인터넷 환경에서 마스터 디바이스가 서로 다른 아키텍쳐를 지원하는 사물인터넷 디바이스들을 위하여 이기종 분산 공유 메모리(HDSM, Heterogeneous Distributed Shared Memory)를 운영하는 방법에 있어서,
    제1 디바이스로부터 브랜치 진입 신호가 수신됨에 따라, 상기 제1 디바이스의 브랜치 섹션을 위한 제1 공유 메모리 복사본을 생성하는 단계;
    제2 디바이스로부터 브랜치 진입 신호가 수신됨에 따라, 상기 제2 디바이스의 브랜치 섹션을 위한 제2 공유 메모리 복사본을 생성하는 단계;
    상기 제1 디바이스로부터 합병 신호가 수신되면, 상기 제1 공유 메모리 복사본을 상기 마스터 디바이스의 메모리에 합병하는 단계; 및
    상기 제2 디바이스로부터 합병 신호가 수신되면, 상기 제1 공유 메모리 복사본이 합병된 메모리에 상기 제2 공유 메모리 복사본을 합병하는 단계를 포함하며,
    상기 이기종 분산 공유 메모리의 프레임워크는 각각의 디바이스들을 위한 코드를 변환하여 IR(Intermediate Representation) 코드를 생성하는 프론트엔드 컴파일러;
    메모리 레이아웃을 정적으로 통일하고 IoT-HDSM 인에이블드 IR 코드를 생성하는 IoT-HDSM(Internet Of Things-HDSM) 컴파일러; 및
    상기 각각의 디바이스들의 아키텍쳐에 따라 최종 컴파일을 수행하는 백엔드 컴파일러로 구성되는 것인, 메모리 운영 방법.
  2. 제1항에 있어서,
    브랜치 섹션 동안 공유 변수에 대하여 변경된 값들은 공유 메모리 복사본 상에 저장되며, 상기 브랜치 섹션의 종료 시점에 상기 마스터 디바이스의 메모리 상에 반영되는 것인, 메모리 운영 방법.
  3. 제1항에 있어서,
    상기 마스터 디바이스는 단일한 전역적 순서에 따라 복수의 디바이스들로부터 갱신된 데이터를 수집하며, 상기 단일한 전역적 순서는 브랜치 섹션의 종료 시점에 따라 결정되는 것인, 메모리 운영 방법.
  4. 제1항에 있어서,
    상기 제1 디바이스 및 상기 제2 디바이스는 공유 메모리의 복사본에 각각 접근함으로써, 배타적 접근을 위해 기다리는 과정이 생략되는 것인, 메모리 운영 방법.
  5. 삭제
  6. 제1항에 있어서,
    상기 메모리 레이아웃을 통일하는 과정은, 패딩 바이트를 삽입하고 포인터 사이즈를 정렬하고 메모리 값을 읽는 코드의 바이트 순서를 변환함으로써 수행되는 것인, 메모리 운영 방법.
  7. 제1항에 있어서,
    상기 프론트엔드 컴파일러는 제한적인 컴퓨팅 자원을 나타내는 표시를 인식함으로써 소정의 디바이스를 상기 사물인터넷 디바이스로 인식하는 것인, 메모리 운영 방법.
  8. 제1항에 있어서,
    상기 마스터 디바이스는 브랜치 섹션의 시작을 알리는 'beginBranch' 함수, 브랜치 섹션의 종료를 알리는 'endBranch' 함수 및 브랜치 섹션의 시작에 따라 공유 메모리 복사본을 생성하는 'makeBranch' 함수를 지원하는 것인, 메모리 운영 방법.
  9. 사물인터넷 환경에서 서로 다른 아키텍쳐를 지원하는 사물인터넷 디바이스들을 위하여 이기종 분산 공유 메모리(HDSM, Heterogeneous Distributed Shared Memory)를 운영하는 마스터 디바이스에 있어서,
    복수의 디바이스들과 신호를 주고 받으며 통신하는 통신부;
    상기 마스터 디바이스의 동작을 위한 데이터를 저장하는 메모리; 및
    상기 통신부 및 상기 메모리와 연결되어 상기 마스터 디바이스의 동작을 제어하는 제어부를 포함하고,
    상기 제어부는,
    상기 통신부가 제1 디바이스로부터 브랜치 진입 신호를 수신함에 따라, 상기 제1 디바이스의 브랜치 섹션을 위한 제1 공유 메모리 복사본을 생성하고,
    상기 통신부가 제2 디바이스로부터 브랜치 진입 신호를 수신함에 따라, 상기 제2 디바이스의 브랜치 섹션을 위한 제2 공유 메모리 복사본을 생성하고,
    상기 통신부가 상기 제1 디바이스로부터 합병 신호를 수신하면, 상기 제1 공유 메모리 복사본을 상기 마스터 디바이스의 메모리에 합병하며,
    상기 통신부가 상기 제2 디바이스로부터 합병 신호를 수신하면, 상기 제1 공유 메모리 복사본이 합병된 메모리에 상기 제2 공유 메모리 복사본을 합병하는 것이며,
    상기 이기종 분산 공유 메모리의 프레임워크는 각각의 디바이스들을 위한 코드를 변환하여 IR(Intermediate Representation) 코드를 생성하는 프론트엔드 컴파일러;
    메모리 레이아웃을 정적으로 통일하고 IoT-HDSM 인에이블드 IR 코드를 생성하는 IoT-HDSM(Internet Of Things-HDSM) 컴파일러; 및
    상기 각각의 디바이스들의 아키텍쳐에 따라 최종 컴파일을 수행하는 백엔드 컴파일러로 구성되는 것인, 마스터 디바이스.
  10. 제1항, 제2항, 제3항, 제4항, 제6항 내지 제8항 중 어느 하나의 항에 기재된 방법을 구현하기 위한 프로그램이 기록된 컴퓨터로 판독 가능한 기록 매체.
KR1020170020650A 2017-02-15 2017-02-15 IoT 디바이스를 위한 이기종 분산 공유 메모리 KR101857907B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020170020650A KR101857907B1 (ko) 2017-02-15 2017-02-15 IoT 디바이스를 위한 이기종 분산 공유 메모리

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020170020650A KR101857907B1 (ko) 2017-02-15 2017-02-15 IoT 디바이스를 위한 이기종 분산 공유 메모리

Publications (1)

Publication Number Publication Date
KR101857907B1 true KR101857907B1 (ko) 2018-05-14

Family

ID=62187963

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020170020650A KR101857907B1 (ko) 2017-02-15 2017-02-15 IoT 디바이스를 위한 이기종 분산 공유 메모리

Country Status (1)

Country Link
KR (1) KR101857907B1 (ko)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20030018737A1 (en) * 2001-07-17 2003-01-23 Storage Technology Corporation System and method for a distributed shared memory
JP2003108400A (ja) 2001-09-27 2003-04-11 Nippon Telegr & Teleph Corp <Ntt> 分散共有メモリシステム及び分散共有メモリ制御方法
JP2016532959A (ja) 2013-08-07 2016-10-20 クアルコム,インコーポレイテッド 異種マルチプロセッサシステムにおける共有メモリ領域のための動的なアドレスのネゴシエーション

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20030018737A1 (en) * 2001-07-17 2003-01-23 Storage Technology Corporation System and method for a distributed shared memory
JP2003108400A (ja) 2001-09-27 2003-04-11 Nippon Telegr & Teleph Corp <Ntt> 分散共有メモリシステム及び分散共有メモリ制御方法
JP2016532959A (ja) 2013-08-07 2016-10-20 クアルコム,インコーポレイテッド 異種マルチプロセッサシステムにおける共有メモリ領域のための動的なアドレスのネゴシエーション

Similar Documents

Publication Publication Date Title
Shafi et al. Nested parallelism for multi-core HPC systems using Java
US8756590B2 (en) Binding data parallel device source code
CN105723341B (zh) 用于布局引擎和脚本引擎的存储器模型的实现方法及系统
US8296745B2 (en) Method and apparatus for portable stub generation
EP3350696B1 (en) Overriding a migrated method of an updated type
US9841958B2 (en) Extensible data parallel semantics
US8578357B2 (en) Endian conversion tool
JPH06266683A (ja) 並列処理装置
JP2009523271A (ja) ソフトウェアトランザクショナルメモリ動作の最適化
US20110231365A1 (en) Containment agnostic, n-ary roots leveraged model synchronization
KR20130096738A (ko) 논-리프 코드의 컴파일러 기반 벡터화를 위한 시스템들 및 방법들
CN102289387A (zh) 软件事务存储器中的动作框架
JP5811088B2 (ja) データ処理システム及びデータ処理方法
JP2011515741A (ja) 非同期メソッドのための宣言型サポート
CN106909441B (zh) 一种基于jvm的磁盘直接i/o访问的方法
CN102289393A (zh) 软件事务存储器中的锁的组成
CN107615243A (zh) 一种调用操作系统库的方法、装置及系统
US20140245260A1 (en) Distributed implementation of sequential code that includes a future
US10620916B2 (en) Read-only communication operator
KR101857907B1 (ko) IoT 디바이스를 위한 이기종 분산 공유 메모리
KR20190060561A (ko) 이종 디바이스의 선택적 추상화를 통한 사물 인터넷 어플리케이션의 개발 환경을 통합하는 방법 및 시스템
US20090328018A1 (en) Optimizing primitives in software transactional memory
US9720660B2 (en) Binary interface instrumentation
CN113867776A (zh) 中台应用的发布方法、装置、电子设备和存储介质
JP2016186697A (ja) 関数間変数共有方法及び機構

Legal Events

Date Code Title Description
E701 Decision to grant or registration of patent right
GRNT Written decision to grant