■ 솔리디티(Solidity) 언어란?

계약 지향 프로그래밍 언어로 다양한 블록체인 플랫폼의 스마트계약(Smart Contract) 작성 및 구현에 사용된다.

특히, dapp을 프로그래밍 하는 언어가 바로 솔리디티다. 

솔리디티는 이더리움 블록체인 플랫폼에서 스마트 계약(Smart Contract)를 정의하는 언어입니다.
솔리디티 문법은 자바스크립트 문법과 유사합니다. 다만, 정적 타입 언어1라, 자료형을 명시해주어야 합니다.

 

https://ggs134.gitbooks.io/solidityguide/content/chapter1_1.html

■ 이더리움 솔리디티 실습 튜토리얼

https://programmers.co.kr/learn/courses/36/lessons/1901

 

 

 

 

 

 

'프로그래밍 > SOLIDITY' 카테고리의 다른 글

mapping 자료구조  (0) 2019.12.04
#해싱(Hashing)에 대한 이해  (0) 2019.12.04
블로그 이미지

cocoa9518

,

많은 양의 데이터들을 작은 크기의 테이블로 mapping시켜 저장할 수 있도록 하는 데이터 관리 기법이 해싱의 개념이다. 

해싱은 키값에 직접 산술적인 연산을 적용하여 항목에 저장되어 있는 테이블의 주소를 계산하여 항목에 접근한다. 

이렇게 키 값의 연산에 의해 직접 접근이 가능한 구조를 해시테이블(Hash Table)이라고 부르고, 해시 테이블을 이용한 탐색을 해싱(Hashing)이라고 한다.  

 

해시함수(hash function)를 이용해서 데이터를 해시테이블에 저장하고 검색하는 기법, 

 

HashMap에서 저장되는 데이터를 찾는 과정

(1) 검색하고자하는 값의 키로 해시함수를 호출한다.

(2) 해쉬함수의 계산곌과인 해쉬코드를 이용해서 해당값의 에 저장되어 있는 LinkedList를 찾는다. 

(3) LinkedList에서 검색한 키와 일치하는 데이터를 찾는다. 

 

 

'프로그래밍 > SOLIDITY' 카테고리의 다른 글

mapping 자료구조  (0) 2019.12.04
솔리티디(Solidity) 프로그램  (0) 2019.12.04
블로그 이미지

cocoa9518

,

한 프로그램 안에서 다수의 프로세서가 동작할 때 공유(데이터)메모리를 사용하게 된다.

그럴때 임계영역에서 서로 경쟁하다가 동시에 충돌 나거나 순서가 뒤바뀌는 상황이 발생된다.

이러한 문제를 해결하기 위해서 만들어진게 세마포어다 . 역할은 한번에 하나의 프로세서만 접근을

가능하게 만들어주는 것이다.

 

철도의 까치발 신호기 또는 해군의 수기 신호라는 뜻으로, 복수의 작업을 동시에 병행하여 수행하는 운영 체제(또는 프로그래밍)에서 공유 자원에 대한 접속을 제어하기 위하여 사용되는 신호.

병행 내지 병렬로 동작되는 둘 이상의 프로세스 사이에서 마이크로프로세서 시간이나 입출력 접속구(port)와 같은 공유 자원을 동시에 사용할 수 없기 때문에, 한 프로세스가 사용하고 있는 동안에 세마포어를 세워서 다른 프로세스를 대기시키고 사용이 끝나면 해제시키는 방법으로 사용한다.

[네이버 지식백과] 세마포어 [semaphore] (IT용어사전, 한국정보통신기술협회)

 

세마포어는 지하철 화장실처럼 화장실 칸의 개수가 여러개 유한하게 있는 곳의 열쇠의 갯수이다.

뮤텍스는 1개의 화장실에 대해서 다룬다면, 세마포어는 여러개의 화장실로 다루게 되고

화장실을 쓰기위해 열쇠를 하나 가져가면 P, 열쇠를 반납하면 V라고 한다.

만약 열쇠를 계속 가져가서(P) 열쇠가 0개가 되면, 다음 사람은 줄을 서서 기다려야한다.

화장실을  쓴다음 열쇠를 반납하게되면(V) 다음 사람이 들어갈 수 있다.

 

 

 

 

 

 

'프로그래밍 > 윈도우시스템' 카테고리의 다른 글

뮤텍스 예제  (0) 2019.12.04
뮤텍스에 대한 이해 (Mutex)  (0) 2019.12.04
프로세스(Process)와 스레드(Thread)의 개념  (0) 2019.12.04
블로그 이미지

cocoa9518

,

 

뮤텍스를 2개생성하고 사용하는 예제

 

# MutexNoti Example


constexpr auto MAX_THR_CNT 4

 

DWORD WINAPI ThreadProc(PVOID pParam);



int main() 
{
     ① Mutex를 2개 생성 (종료Mutex, 임계구역설정Mutex)
     HANDLE arWaits[2];
     arWaits[0] = CreateMutex(nullptr, TRUE, _T("종료Mutex"));
     arWaits[1] = CreateMutex(nullptr, FALSE, _T("임계구역Mutex"));

    ② 작업 스레드를 생성  
    HANDLE arhThreads[MAX_THR_CNT];
    for(auto i=0; i<MAX_THR_CNT; i++)
    {
       DWORD dwThreadID(0);  
       arhThreads[i] = CreateThread(nullptr, 0, ThreaProc, arWaits, 0, &dwThreadID);
    }

    ③ 키를 받으면 실행중인 스레드를 종료하기 위해서 소유한 뮤텍스를 해제  
    getchar();
    ReleaseMutex(arWaits[0]);

    ④ 모든 스레드의 종료(TRUE)를 무한대기(INFINITE). 
    WaitForMultipleObjects(MAX_THR_CNT, arhThreads, TRUE, INFINITE);
 
    ⑤ 모든 스레드를 종료  
    for (auto i=0; i<MAX_THR_CNT; i++)
    {
        CloseHandle(arhThreads[i]);
    }

    for (auto i=0; i<2; i++)
    {
        CloseHandle(arWaits[1];
    }
    return 0;
}

* 스레드 엔트리 함수에 대한 구현
DWORD WINAPI ThreadProc(PVOID pParam)
{
     PHANDLE parWaits = (PHANDLE)pParam;

     while(true)
     {
          DWORD dwWaitCode = WaitForMultipleObjects(2, parWaits, FALSE, INFINITE);

          if(dwWaitCode == WAIT_FAILED)
          {  
              break;
          }

         if(dwWaitCode == WAIT_OBJECT_0)
         {
             break;
         }

         // Do somethings , Critical Region
         SYSTEMTIME st;
         GetLocalTime(&st);

         cout << "..." << "Sub Thread " << GetCurrentThreadId() << " => ";
         cout << st.wYear << "/" << st.wMonth << "/" << st.wDay << " ";
         cout << st.wHour << ":" << st.wMinute << ":" << st.wSecond << " ";
         cout << st.wMilliseconds << endl;

         ReleaseMutex(parWaits[1]);
         Sleep(1000);
     }
     return 0;
}

 

 

 

 

 

블로그 이미지

cocoa9518

,

공유자원에 대한 "Mutually exclusive access" (상호 배타적 접근)을 조정.

 

뮤텍스는 데이터를 보호하기 위한 객체이며, 공유리소스에 대한 배타적이고 독점적인 점유권을 요구하는 객체이다. 


DWORD WINAPI ThreadProc(PVOID pParam)
{
      HANDLE hMutex = (HANDLE)pParam);
      WaitForSingleObject(hMutex, INFINITE);

     // Do Action....


      Release(hMutex);
      return 0;
}


int main()
{
     (1) Mutex의 생성
     HANDLE hMutex = CreateMutex(nullptr, FALSE, nullptr);

     (2) 작업스레드 생성
    HANDLE arhThreads[MAX_THR_CNT];

    for(auto i=0; i<MAX_THR_CNT; i++)
    {
      DWORD dwThreadID(0);
      arhThreads[i] = CreateThread(nullptr, 0, ThreaProc, hMutex, 0, &dwThreadID);
    }

     (3) 모든 스레드의 작업완료를 기다린다. 
    WaitForMultipleObjects(MAX_THR_CNT, arhThreads, TRUE, INFINITE);

     (4) 작업스레드 종료 
    for(auto i=0; i<MAX_THR_CNT; I++)
    {
      CloseHandle(arhThreads[i];
    }

     (5) Mutex 소멸
    CloseHandle(hMutex);
  

  return 0;
}

 

 

 

 

뮤텍스와 세마포어는 운영체제에서 사용하는 동기화 기법들임.

뮤텍스는 개념적으로 상호배제를 함으로써 임계구역에 하나의 스레드만 들어갈 수 있고

세마포어는 하나의 스레드만 들어갈 수도 있고, 여러개의 스레드가 들어갈 수 있다는 점이

차이가 있다. 

 

뮤텍스의 세마포어의 차이점

뮤텍스는 공유자원을 접근 할 수 있는 키가 하나인 세마포어와 같다. 키를 하나 쓸수 있는가?

여러개를 쓸 수 있는가의 차이가 있을 뿐이다. 

 

 

 

 

블로그 이미지

cocoa9518

,

정의 (Definition) 

  프로세스 : 운영체제로부터 자원을 할당받는 (독립적인)작업의 단위
  스레드 : 프로세스가 할당받은 자원을 이용하는 실행의 단위


프로세스  
 - 운영제제로부터 (독립적인) 주소공간, 파일, 메모리등을 할당받음
 - 각 프로세스는 독립적이며, 자신만의 고유의 영역을 할당받아 사용한다. 
 - 실행중인 프로그램을 의미

스레드 
 - 스레드는 프로세스 안에 존재하며, 여러 스레드가 자원을 공유
 - 스레드는 프로세스내에서 각각의 스택 공간을 제외한 모든 주소공간과 자원을 공유
 

 

프로세스는 실행될 때 운영체제로부터 프로세서, 필요한 주소공간, 메모리등 자원(Resource)을 할당을 받는다. 

스레드는 할 프로세스 내에서 동작되는 여러 실행(Execution)의 흐름으로 프로세스 내의 주소공간이나 자원들을

같은 프로세스내의 스레드끼리 공유하면서 실행된다. 

 

요약하면, 

운영체제(OS)가 시스템의 자원을 어떤 단위로 할당하고, 프로세스와 스레드는 이 자원을 어떻게 사용하느냐를 

결정하는 것이라고 할 수 있다. 

 

여러 프로세스가 할 수 있는 작업들을 스레드로 하는 이유?

운영체제는 시스템 자원을 효율적으로 관리하기 위해서 스레드를 사용한다. 멀티 프로세스로 실행되는 작업을 

멀티 스레드로 싱핼할 경우, 프로세스를 생성하여 자원을 할당하는 시스템콜(System call)이 줄어들어 자원을 

효율적으로 관리할 수 있다. 뿐만 아니라 프로세스 간의 통신보다 스레드 간의 통신비용이 적게들기 때문에 

통신부담이 줄어들게 된다. 

 

https://kldp.org/node/295

 

사용자수준 쓰레드와 커널수준 쓰레드의 차이? | KLDP

사용자 수준 쓰레드와 커널 수준 쓰레드의 차이에 대해서 설명해 주실수 있으시겠습니까? 각각 장단점이 있다고 하는데, 잘 이해가 되질 않네요. 사용자 수준은 문맥교환의 오버해드가 없다, 커널 수준은 사용자 수준 보다 효율적일 수 있다.. 라고 하는데 잘 이해가 가질 않네요.. 그리고 현재 리눅스에서는 두가지 쓰레드 모델이 모두 지원 되나요?

kldp.org

 

 

 

 

'프로그래밍 > 윈도우시스템' 카테고리의 다른 글

세마포어(Semaphore)에 대한 이해  (0) 2019.12.04
뮤텍스 예제  (0) 2019.12.04
뮤텍스에 대한 이해 (Mutex)  (0) 2019.12.04
블로그 이미지

cocoa9518

,

 

픽셀 해상도는 한 픽셀의 입도(granularity)이다. 즉 하나의 픽셀에서 표현되는 그레이-레벨들 또는 컬러들의 수를 나타낸다.  픽셀 해상도는 과학적 문헌에서 흔히 양자화(quantization)라 불린다. 다른 문헌에서 그것은 종종 그레이-스케일 해상도라 불린다.

 

픽셀해상도는 프레임 그래버나 카메라에 위치하는 아날로그디지털 변환기(ADC)의 함수이다. 흑백 머신비전 시스템들은 256 그레이 레벨들을 제공하는, 픽셀 당 8 비트를 흔하게 사용한다.

 

흑백 이미지들은 과학적 연구를 위하여 10 비트(1024 그레이 레벨) 또는 12 비트(4096 그레이 레벨)로 디지털화된다. 컬러 시스템은 3 원색(primary colors)(R, G, B) 각각을 위하여 8 비트를 사용하며 총 16,777,216 컬러들을 제공한다.

 

 

 

 

 

 

블로그 이미지

cocoa9518

,

 

특징 해상도는 시스템에 의해서 신뢰성 있게 이미지화 될 수 있는 가장 작은 특징을 말한다. 예를 들면 검출 할 수 있는 가장 작은 결함의 크기는 0.05㎜이다. (정의에서 “신뢰성 있게” 라는 단어가 중요하다) 가끔씩  한 픽셀보다 더 작은 인공물(artifact)이 이미지속에 나타날 수 있지만 그것의 양상(appearance)은 신뢰할 수 없다고 판단해야 된다.

 

 

카메라와 프레임그래버들이 데이터를 샘플링 하는 장치들이기 때문에(픽셀은 데이터 샘플이다) 이미지속에 있는 하나의 인공물(artifact)을 표현하기 위해서는 적어도 두 픽셀이 필요하다는 “Shannon 의 샘플링 이론”이라 불리는 원리가 있다. 실용적인 기술은 대개 이론적인 한계들에 도달하지 않기 때문에 최소 특징크기를 3 픽셀에서 4 픽셀을 측정하는 것이 실용적인 제약(limit)이다.

하나의 특징이 3 또는 4 픽셀들에 걸치도록(spanning) 하는 제약은 좋은 콘트라스트와 낮은 잡음을 가정한다. 만일 이미지가 낮은 콘트라스트를 가지거나 이미지속의 잡음이 높다면 신뢰할 수 있는 검출을 위하여 더 많은 픽셀들에 걸쳐야 할 필요가 있다. 또한 이러한 한계는 특징의 검출능력(detectability)에 영향을 미친다. 오직 3 또는 4 개의 픽셀들에 걸치는 하나의 특징(feature)은 항상 이미지속에서 나타나기는 하지만 그것은 어떤 정도의 정확도로 측정 가능하지 않을 것이다.  4 픽셀 폭인 하나의 특징과 3 픽셀 폭인 특징 사이를 구별해야만 하는 시스템은 매우 신뢰할 수 없게 될 것이다

 

 

 

 

 

 

 

블로그 이미지

cocoa9518

,