Python, C/C++, Java, Scala, Go 로 구현한 Deep Learning 코드

https://github.com/yusugomori/DeepLearning




http://deeplearning.net/tutorial 번역된 블로그
0. 딥러닝 시작하기 : http://neuralix.blogspot.kr/2014/02/0.html
1. 로지스틱 회귀 : http://neuralix.blogspot.kr/2014/01/blog-post_626.html
2. 다층신경망(MLP) : http://neuralix.blogspot.kr/…/mlp-multi-layer-perceptron.ht…
3. 제한된 볼츠만 기계(RBM) : http://neuralix.blogspot.kr/2014/02/draft.html
4. 딥빌리프 네트워크(DBN) : http://neuralix.blogspot.kr/2014/02/4-dbn.html
5. 해밀토니안 몬테-카를로 표본추출 : http://neuralix.blogspot.kr/2014/02/5-hmc.html

저작자 표시 비영리 변경 금지
신고

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

Deep Learning Study 참고  (0) 2015.03.15
TopBraid Composer 시작하기 - 1  (3) 2010.03.17
Coding Guideline (Wipro)  (0) 2009.12.09
C++ Coding Guideline (Wipro)  (0) 2009.12.09

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

TopBraid Composer(이하 TBC)은 시맨틱 웹 솔루션 업체인 탑쿼드란트사의 제품으로
시맨틱 데이터 모델링, 리소스 연결, 쿼리 디자인 및 추론규칙등을 할수있는 IDE이다.

현재 Free, Standard, Maestro 버젼을 제공하는데 일단 Free버젼을 받아 시작해 보겠다.

1. 설치하기

TBC Free버젼 다운로드

TBC 를 사용하기 위해서는 자바 JDK가 먼저 깔려 있어야 한다.

JAVA SE JDK 다운로드

TBC설치를 마쳤으면, TopBraid Composer.exe를 실행한다.
*에러메세지가 뜰 경우 TopBraid Composer.ini파일을 열어서 -XX:MaxPermSize=256m 구문을 삭제한다.



2. 프로젝트 만들기

- File메뉴-New-Project 후 Next클릭


- Project name에 Ontologies 을 쓰고 Finish버튼을 누른다.



-  Ontologies를 선택후 오른쪽 마우스 클릭해서 New - RDF/OWL File선택


- Base URI : http://www.mydomain.com/Person
  File name : Person
  File extension : owl 선택 
  설정 후 Finish버튼 클릭



- 이제 아래와 같은 화면을 볼 수 있다.



3. 클래스 만들기

- 이제 Person class를 만들어보자.
  owl:Thing에서 오른쪽 마우스 클릭 후 Create subclass메뉴 선택


- Person을 기입하고 +버튼을 눌러
    rdfs:comment : Human being
    rdfs:label : Person
   을 추가하고 OK버튼 클릭




- Person클래스의 데이터 타입 변경을 위해
  Change Metaclass 을 선택한다.



- owl:Class 선택 후 OK버튼


- 위와 같은 방법으로 Person의 서브 클래스로 FemalePerson과 MalePerson클래스를 만든다.





4. 프로퍼티(Properties) 만들기

OWL 프로퍼티는 두 객체간의 관계를 나타낸다. 
오브젝트(Object) 프로퍼티 와 데이터타입(DataType) 프로퍼티 두가지 타입의 프로퍼티가 있다.

오브젝트 프로퍼티는 두 객체간의 링크를 나타내고
데이터타입 프로퍼티는 객체와 XML스키마 데이터타입 값과 연결된다.

OWL은 별도로 주석(Annotation) 프로토타입을 가지며 이것은 일반적으로 추론정보와 상관없는 정보들를 저장한다.

TBC에서 클래스는 동그라미 아이콘으로 나타나며 프로퍼티는 사각형으로 나타낸다.



- 프로퍼티를 만들기 위해 Create property 버튼을 누른다.






신고

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

Deep Learning Study 참고  (0) 2015.03.15
TopBraid Composer 시작하기 - 1  (3) 2010.03.17
Coding Guideline (Wipro)  (0) 2009.12.09
C++ Coding Guideline (Wipro)  (0) 2009.12.09

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글  3개가 달렸습니다.
  1. 안녕하세요! 저기 질문이 하나 있습니다~
    Create property 할 때, 이름 입력창이 나타나지 않고 실선으로 표시되는 문제의 해결방법을 아시면 부탁드려요 ㅠ ㅠ!
  2. 이 TBC에 대하여 좀더 알고 싶은데 어떤 자료를 봐야 하나요?
  3. 좋은 포스팅 감사합니다~! 출처 밝히고 퍼가겠습니다~!
secret

C Coding Guideline (Wipro)

C++ Coding Guideline (Wipro)

JAVA Coding Guideline (Wipro)
.NET C Coding Guideline (Wipro)

SQL Coding Guideline (Wipro)
신고

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

TopBraid Composer 시작하기 - 1  (3) 2010.03.17
Coding Guideline (Wipro)  (0) 2009.12.09
C++ Coding Guideline (Wipro)  (0) 2009.12.09
뮤텍스 (Mutex)  (0) 2009.12.09

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

C++ 코딩 가이드 라인
신고

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

Coding Guideline (Wipro)  (0) 2009.12.09
C++ Coding Guideline (Wipro)  (0) 2009.12.09
뮤텍스 (Mutex)  (0) 2009.12.09
프로세스와 스레드  (0) 2009.12.09

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

상호 배제
상호 배제(mutual exclusion, Mutex, 뮤텍스)는 동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘으로, 임계 구역(critical section)으로 불리는 코드 영역에 의해 구현된다.공유 불가능한 자원의 예로는 동시에 실행되고 있는 프로그램간의 통신에 사용되는 비트 단위의 깃발, 계수기, 큐 등이다. 문제는 스레드가 언제라도 정지되거나 시작될 수 있다는 것이다.) 프로그램의 일부분이 여러 단계를 거치면서 데이터를 읽고 쓰고 있다고 하자. 그런데 예상치 못한 사건 등에 의해 다른 스레드가 동작하기 시작했다. 첫 번째의 스레드가 쓰고 있는 영역에서, 이 두 번째의 스레드가 또 다른 작업을 시작한다면, 해당 영역의 값은 부적절하며 예상할 수 없는 상태에 놓이게 된다. 게다가 두 번째의 스레드가 값을 덮어 써버리기라도 한다면, 복구 불가능한 상태로 되고 만다. 그러므로 공유 데이터를 접근하는 프로그램 내부의 이른바 임계 구역이라는 부분은 홀로 수행되도록 보호되어야 하며, 다른 스레드가 동일한 부분의 프로그램을 수행해서 동일한 공유 데이터를 접근하는 것을 막아야 한다. 단일 프로세서 시스템에서, 상호 배제를 구현하는 가장 단순한 방법은 인터럽트를 억제해서 공유 데이터가 손상되는 것을 막는 것이다. 성능에 최소한의 영향을 주기 위해 인터럽트가 발생하지 않을 명령어 집합의 수는 가능한 최소로 유지시키는 것이 좋다.


쓰레드에서의 데이터 동기화 문제

예를 들어서 두개의 쓰레드가 2개의 변수를 업데이트하려고 하는데, 하나의 쓰레드는 2개의 변수를 0으로 다른 하나는 1로 변경을 시도한다고 하자. 만약 이러한 변경이 같은 시간(same time)에 일어난다면 하나는 0으로 변경이 되었지만 다른 하나는 1로 변경되는 문제가 발생할수도 있을것이다. 이러한 경우 충돌이 발생할 수 있을 것이다. 하나의 쓰레드가 변경하고자 하는 첫번째 변수를 0으로 바꾸었는데, 2번째 변수를 0으로 바꾸기 전에 다른 쓰레드가 변수를 모두 1로 바꾸어 버릴수 있기 때문이다. 그리고 나서 다시 첫번째 쓰레드가 두번째 변수를 0으로 바꾸게 되면, 첫번째 변수는 1이지만 두번째 변수는 0이 되는 데이타 불일치 상황이 발생하게 될것이다.

int a = 1;
Thread A
에서 a를 읽어들인다
.
Thread B
에서 a를 읽어들인다
.
Thread A
에서 a = a+1를 한다
.
{
    a = a+1;
   
결과는
2;
}
Thread B
에서 a++를 한다
.
{
   a = a + 1; //
읽어들인 값이 1이기 때문에

  
역시 결과는 2가 된다
.
}
 

두번의 a+1 과정을 거쳤음으로, a 3이 되는걸 기대하겠지만 이러한 류의 동시접근 문제로 a 2가 되어버리고 만다
.
Mutex
를 이용하면 된다
.
pthread
라이브러리는 이러한 문제의 해결을 위해서 mutex 라는 것을 사용한다. mutex IPC에서 데이타 접근 통제를 위해서 사용하는 세마포어와 매우 비슷한 일을한다. mutex 는 세마포어와 마찬가지로 잠금 을 사용하는데, mutex lock 에 대해서 다음과 같은 3가지 사항에 대해서 보증한다
.

    * Atomicity - mutex
잠금(lock)는 최소단위 연적(atomic operation) 으로 작동한다. 이말의 뜻은 하나의 쓰레드가 mutex 를 이용해서 잠금을 시도하는 도중에 다른 쓰레드가 mutex 잠금을 할수없도록 해준다는 뜻이다. 한번에 하나의 mutex 잠금을 하도록 보증해준다
.
    * Singularity -
만약 스레드가 mutex 잠금을 했다면, 잠금을 한 쓰레드가 mutex 잠금을 해제 하기 전까지 다른 어떠한 쓰레드도 mutex 잠금을 할수 없도록 보증해준다
.
    * Non-Busy Wait -
바쁜대기 상태에 놓이지 않는다는 뜻으로, 하나의 쓰레드가 mutex 잠금을 시도하는데 이미 다른 쓰레드가 mutex 잠금을 사용하고 있다면 이쓰레드는 다른 쓰레드가 락을 해제하기전까지 해당 지점에 머물러 있으며 이동안은 어떠한 CPU 자원도 소비하지 않는다 (이를테면
sleep).

mutex
는 위의 3가지 사항을 보증해 줌으로 우리는 쓰레드 공유되는 메모리를 충돌없이 사용할수 있게 된다. mutex 를 통해서 잠금을 얻는 것을 간단하게 나타내면 아래와 같다(pseude-code 형식으로 설명하겠다). 일단 첫번째 쓰레드는 다음과 같이 mutex 를 이용해서 변수 업데이트 작업을 하게 될것이다
.

'X1'
에 대해서 뮤텍스 잠금을 한다
.
첫번째 변수를 0으로 세팅한다
.
두번째 변수를 0으로 세팅한다
.
'X1'
뮤택스의 잠금을 해제한다
.

그리고 나서 2번째 쓰레드가 뮤텍스를 이용한 변수 업데이트 작업을 하게 될것이다
.

'X1'
에 대해서 뮤텍스 잠금을 한다
.
첫번째 변수를 1으로 세팅한다
.
두번째 변수를 1으로 세팅한다
.
'X1'
뮤택스의 잠금을 해제한다
.

2
개의 쓰레드가 같은 mutex 'X1' 을 사용한다고 가정하면 이 코드는 어떠한상황 에서도 두개의 변수를 '0' 혹은 '1' 로 유지할것이라는걸 보증할수 있을것이다. mutex 를 이용해서 이러한 작업을 할때 프로그래머는 어떠한 상황에서 mutex 를 써야할지에 대해서 주의를 기울여야 한다
.
만약 3번째 쓰레드가 mutex 를 사용하지 않은체 변수에 업데이트 작업을 하게 될경우 앞의 2개의 쓰레드가 mutex 를 사용한 이유가 사라지게 된다
.

뮤텍스 생성과 초기화

뮤텍스를 생성하기 위해서 우리는 먼저, 뮤텍스정보를 저장하기 위한 타입인 pthread_mutex_t 를 선언해주고 이것을 초기화 해주어야 한다. 선언과 초기화의 가장간단한 방법은 PTHREAD_MUTEX_INITIALIZER 상수를 할당하는 것으로 아래와 같이 사용할수 있다.

pthread_mutex_t a_mutex = PTHREAD_MUTEX_INITIALIZER; 
 


뮤텍스 잠금, 잠금해제, 제거

뮤텍스 잠금을 위한 함수로는 pthread_mutex_lock() 함수를 제공한다. 이 함수는 해당 뮤텍스에 대해서 잠금을 시도하는데, 만약 잠그려는 뮤텍스가 다른 쓰레드에 의해서 이미 잠겨있다면, 잠금을 얻을수 있을때까지 - 이미 잠근 다른 쓰레드가 뮤텍스의 잠금을 해제할때까지 - 봉쇄(블럭)되게 된다. 다음은 이러한 뮤텍스 잠금을 얻기 위한 지원함수들이다.

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_destory(pthread_mutex_t *mutex);
 


pthread_mutex_trylock()
를 사용하면 잠금을 얻을수 없을경우 해당 코드에서 블럭되지 않고 바로 에러코드를 돌려준다. pthread_mutex_lock 의 비봉쇄 버젼이라고 생각하면 된다
.

뮤텍스 잠금을 얻은후 해당 영역에서의 작업을 마친후 잠금을 해제하기 위해서 사용한다. 사용되는 함수는 pthread_mutex_unlock(3) 이며 함수원형은 다음과 같다
.

int pthread_mutex_unlock(pthread_mutex_t *mutex);
 

다음은 쓰레드간 공유되는 자원을 위해서 잠금을 어떻게 사용하는지를 보여주는 간단한 예제다
.
예제
: mutex_lock.c

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

int ncount;    //
쓰레드간 공유되는 자원

pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER; //
쓰레드 초기화

void* do_loop(void *data)
{
    int i;

    pthread_mutex_lock(&mutex); //
잠금을 생성한다.
    for (i = 0; i < 10; i++)
    {
        printf("loop1 : %d", ncount);
        ncount ++;
        sleep(1);
    }
    pthread_mutex_unlock(&mutex); //
잠금을 해제한다
.
}

void* do_loop2(void *data)
{
    int i;

    //
잠금을 얻으려고 하지만 do_loop 에서 이미 잠금을

    //
얻었음으로 잠금이 해제될때까지 기다린다
. 
    pthread_mutex_lock(&mutex); //
잠금을 생성한다
.
    for (i = 0; i < 10; i++)
    {
        printf("loop2 : %d", ncount);
        ncount ++;
        sleep(1);
    }
    pthread_mutex_unlock(&mutex); //
잠금을 해제한다
.
}   

int main()
{
    int       thr_id;
    pthread_t p_thread[2];
    int status;
    int a = 1;

    ncount = 0;
    thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);
    sleep(1);
    thr_id = pthread_create(&p_thread[1], NULL, do_loop2, (void *)&a);

    pthread_join(p_thread[0], (void *) &status);
    pthread_join(p_thread[1], (void *) &status);

    status = pthread_mutex_destroy(&mutex);
    printf("code  =  %d", status);
    printf("programing is end");
    return 0;
}

위의 코드를 우선 mutex 잠금을 하지 않은체 컴파일후 실행해보자. 간단하게 pthread_mutext_lock pthread_mutex_unlock 부만 주석처리하면 된다. 그러면 do_loop2 do_loop 가 일정한 간격을 두고 ncount 자원에 접근하는 것을 볼수 있을것이다. 그러나 우리는 do_loop ncount 자원을 접근하고 있는동안 다른 쓰레드가 접근하지 않기를 원할때가 있을것이다. 이럴때 뮤텍스 잠금을 사용하면 된다
.

위의 코드에서 뮤텍스 잠금 부분의 주석을 풀고 다시 컴파일해서 실행시켜보면, do_loop 쓰레드가 ncount 증가 작업을 모두 마칠때까지 do_loop2 쓰레드는 해당 영역에서 블럭됨을 알수 있을것이다. 이런식으로 하나의 쓰레드가 특정자원에 접근할때 다른 쓰레드가 접근하지 못하도록(한번에 하나의 쓰레드만 해당 자원에 접근할수 있도록) 제어할수 있다
.

컴파일 방법은 gcc -o mutex_lock mutex_lock.c -lpthread 이다


더이상 뮤텍스를 사용할일이 없다면 pthread_mutex_destory 를 이용해서 뮤텍스 자원을 제거(free) 하도록 한다. 만일 뮤텍스자원을 사용하는 쓰레드가 하나라도 존재한다면 에러코드(EBUSY)를 리턴한다. 그러므로 모든 쓰레드의 뮤텍스에 대해서 pthread_mutex_unlock 을 이용해서 잠겨져야만 뮤텍스 제거가 성공할수 있다. 성공할경우 0을 넘겨준다.
 

신고

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

C++ Coding Guideline (Wipro)  (0) 2009.12.09
뮤텍스 (Mutex)  (0) 2009.12.09
프로세스와 스레드  (0) 2009.12.09
메모리 단편화 memory fragmentation  (0) 2009.03.21

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.

멀티프로세스와 멀티스레드는 양쪽 모두 여러 흐름이 동시에 진행된다는 공통점을 가지고 있다. 하지만 멀티프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있는 것과 달리 멀티스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다. 또한 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다
.

멀티스레드의 다른 장점은 CPU가 여러 개일 경우에 각각의 CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있다는 것이다. 이러한 시스템에서는 여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문이다
.

멀티스레드의 단점에는 각각의 스레드 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없다는 것이 있다. 예를 들어, 두 스레드가 특정 공유 변수 i의 값을 1 증가시키는 명령을 실행할 때, 다음과 같은 방식으로 수행될 수 있다
.

   1.
공유되는 변수 i의 값을 레지스터에 저장한다
.
   2.
레지스터의 값을 1 증가시킨다
.
   3.
변수 i에 그 값을 저장한다
.

멀티스레드 환경이 확산됨에 따라 전통적인 프로세스 관리 방식에도 변화가 필요해졌다. 예를 들어, fork 또는 exec와 같은 시스템 호출시에 어떻게 처리할 것인가 하는 문제가 대두된 것이다
.

fork
문제 : 어떤 프로세스 내의 스레드가 fork를 호출하면 모든 스레드를 가진 프로세스를 생성할 것인지, 아니면 fork를 요청한 스레드만 가진 프로세스를 생성할 것인지 하는 문제이다. 유닉스에서는 각각 2가지 버전의 fork를 지원하고 있다
.
exec
문제 : fork를 통해 모든 스레드를 복제하고 난 후, exec를 수행한다면 모든 스레드들이 초기화된다. 그렇다면 교체될 스레드를 복제하는 작업은 필요가 없기 때문에 애초에 fork를 요청한 스레드만을 복제했어야 한다. 한편, fork를 한 후에 exec를 수행하지 않는다면 모든 스레드를 복제할 필요가 있는 경우도 있다
.

프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램이다. 종종 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다. 여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다
.
프로그램과 프로세스는 구별없이 혼용되기도 한다. 다만, 프로그램은 하드디스크 등에 저장되어 있는 실행코드의 성격이 강한 반면, 프로세스는 프로그램을 구동하여 메모리에 적재된 상태로 실행되는 하나의 작업 단위이다. 예를 들어, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스로 메모리에 적재되어 실행되는 것이다
.

 
프로세스의 상태


커널 내에는 준비 큐, 대기 큐, 실행 큐 등의 자료구조가 있으며 커널은 이것들을 이용하여 프로세스의 상태를 관리한다
.

*
생성(new) : 프로세스가 생성되는 중이다
.
*
실행(running) : 프로세스가 CPU를 차지하여 명령어들이 실행되고 있다
.
*
준비(ready) : 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다
.
*
대기(waiting) : 보류(block)라고 부르기도 한다. 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태를 말한다
.
*
종료(terminated) : 프로세스의 실행이 종료되었다
.
 
프로세스의 상태전이


하나의 작업이 시스템에 입력되면 거기에 대응되는 프로세스가 생성되어 준비 리스트의 끝에 들어간다. 시간이 지남에 따라 그 프로세스는 점차 준비 리스트의 앞으로 나가게 되고 언젠가 CPU를 사용할 수 있게 된다
.

*
디스패치
(dispatch)

준비리스트의 가장 앞에 있던 프로세스가 CPU를 점유하게 되는 것, 즉 준비 상태에서 실행 상태로 바뀌는 것을 디스패치라고 하며 다음과 같이 표시한다
.

dispatch (processname) : ready → running

*
보류
(block)

실행 상태의 프로세스가 허가된 시간을 다 쓰기 전에 입출력 동작을 필요로 하는 경우 프로세스는 CPU를 스스로 반납하고 보류 상태로 넘어 간다. 이것을 보류라고 하며 다음과 같이 표시한다
.

block (processname) : running → blocked

*
깨움
(wakeup)

입출력 작업 종료 등 기다리던 사건이 일어났을 때 보류 상태에서 대기 상태로 넘어가는 과정을 깨움이라고 하며 다음과 같이 표시한다
.

wakeup (processname) : blocked → ready

스레드와 프로세스


"
스레드" "프로세스"는 컴퓨터 분야에서 서로 연관된 개념입니다. 이 둘은 모두 특정 순서로 실행해야 할 명령 시퀀스를 나타냅니다. 그러나 개별 스레드 또는 프로세스의 명령은 함께 실행할 수 있습니다.

프 로세스는 운영 체제 내에 있으며 사용자에게 프로그램이나 응용 프로그램으로 표시되는 항목에 해당합니다. 반면에 스레드는 프로세스 내에 있습니다. 따라서 스레드를 "간단한 프로세스"라고도 합니다. 각 프로세스는 하나 이상의 스레드로 구성됩니다
.

여 러 개의 프로세스가 있으면 컴퓨터에서 한 번에 여러 작업을 수행할 수 있습니다. 여러 개의 스레드가 있으면 프로세스를 분할하여 작업을 병렬로 수행할 수 있습니다. 다중 프로세서 시스템에서는 프로세스나 스레드를 서로 다른 프로세스에서 실행하여 진정한 의미에서 병렬 처리를 수행할 수 있습니다
.

완벽한 병렬 처리가 항상 가능한 것은 아닙니다. 때로는 스레드를 동기화해야 합니다. 한 스레드에서 다른 스레드의 결과를 기다려야 하거나 다른 스레드에서 사용하고 있는 리소스를 한 스레드에서 독점적으로 액세스하여 사용해야 할 수도 있습니다. 동기화 문제는 다중 스레드 응용 프로그램에서 버그를 발생시키는 주요 원인입니다. 때로는 스레드에서 사용 가능하지 않은 리소스를 기다리게 되어 "교착 상태"가 발생할 수 있습니다
.


 

신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

  단편화란 어떠한 공간이나 자료가 여러조각으로 나뉜다는 것을 의미한다. (wiki)
그리고 단편화된 메모리란 "사용할 수 없는 자유메모리"로 설명될 수 있다. (Jan Lindblad) 자유 메모리는 메모리 할당자가 해당 메모리를 적재할 수 없는 상태로 만들때 생겨나며, 이들이 불연속적인 작은 부분에 따로 흩어져 있기 때문에 메모리 단편화 문제가 발생한다. 할당 방법에 따라 메모리 단편화가 문제되기도 하고 그렇지 않을 수도 있으므로, 메모리 할당자는 사용 가능한 리소스의 가용성을 높이는데 중요한 역할을 한다.

  컴파일러 및 링커가 메모리 할당기능을 수행할때에는 메모리 단편화가 일어나지 않는다. 이는 컴파일러가 데이터의 수명을 알고 있기 때문이다. 데이터의 수명을 알고 있으면 스택영역에 배치할 수 있는 이점이 있다. 이런 이유로 메모리 할당자는 메모리 단편화 없이 효율적으로 작업할 수 있는 것이다. 일반적으로 런타임시 메모리 할당은 스택될 수 없다. 그리고 메모리 할당은 시간과는 무관한 측면이 있어서 단편화 문제의 해결을 어렵게 한다.

  메모리 할당자는 기본적으로 오버헤드, 내부 단편화, 외부 단편화 3가지 측면에서 메모리를 낭비한다.
메모리 할당자는 모든 자유 블록의 위치, 크기 소유정보, 그리고 내부 상태와 관련된 정보를 부가적으로 저장하고 있다. 이것은 할당자가 관리하는 자체 메모리에 저장이 되며 이는 기존 메모리 할당 규칙을 따라야 한다. 모든 메모리 할당 작업은 프로세서 아키텍처에 따라 4,8,16으로 나뉠 수 있는 주소에서 시작해야 한다. 예를들어 43바이트 블록을 요청했을때 44,48또는 그 이상의 바이트를 얻게되는데 이때 남게되는 여분의 공간이 바로 내부 단편화이다.

  외부 단편화는 할당된 메모리 블록 사이에 빈 공간이 있을때 생겨난다. 만약 애플리케이션이 연속된 세 블럭의 메모리를 할당한 후 가운데를 제가할 때에 외부 단편화가 일어난다. 가운데 블록을 다시 사용할 수도 있지만 모든 자유 메모리 만큼이나 큰 블록을 할당하는 것은 불가능하다. (예제)

 정리를 하자면 3이라는 공간에 10을 넣는다 할때 마지막 1이 남는데 이것을 내부 단편화라 하고, 3씩 메모리를 3개 할당한 후 2번째것을 해제하고 4를 넣는다면 해제한 2번째 공간은 비워두고 새로운 공간에 4를 할당하는 것을 외부 단편화라 볼 수 있다.

 메모리 단편화를 해결하기 위해서 메모리 풀링과 같은 방식을 사용한다. 메모리 풀링이란 동적인 메모리 할당과 해제를 줄이는 방법으로 큰 메모리를 할당해 놓고 필요할때마다 꺼내어 사용하고 다 사용한 메모리는 다시 넣어놓는 과정을 말한다.

신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret

기본적으로 네이버 오픈 API 에서는
샘플 URL   '삼국지'를 검색할 경우 아래와 같은 URL을 접근 한다.
따라서 코드상에서 string 값인 '삼국지'를 Converting 해야 한다.

   http://openapi.naver.com/search?key=test&query=%EC%82%BC%EA%B5%AD%EC%A7%80&display=10&start=1&target=book

- Converting 소스

        string ConvertUtf8(string str)
        {
            UTF8Encoding utf8 = new UTF8Encoding();
            Byte[] encodedBytes = utf8.GetBytes(query);
            string tempStr = "";
            foreach (Byte b in encodedBytes)
            {
                tempStr += "%" + string.Format("{0:X}", b);
            }
            return tempStr;
        }
신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret