"실"이란 무엇입니까?


237

스레드가 실제로 무엇인지에 대한 좋은 정의를 찾고 이해하려고 노력했습니다 .

나는 분명한 것을 놓칠 것 같지만 스레드가 무엇인지에 대해 읽을 때마다 거의 원형 정의, "스레드는 실행 스레드"또는 "실행중인 작업으로 나누는 방법"입니다. 어 응?

내가 스레드가 정말 아니라고 읽은 내용에서 보이는 뭔가 프로세스처럼, 콘크리트. 실제로는 개념 일뿐입니다. 내가 작동하는 방식을 이해하면 프로세서는 프로그램에 대한 일부 명령 ( 실행 스레드 라고 함 ) 을 실행 한 다음 다른 프로그램의 처리로 전환해야 할 때 상태 를 저장합니다. 현재 어딘가에 실행중인 프로그램 (Thread Local Storage) 그리고 다른 프로그램의 명령을 실행하기 시작합니다. 그리고 앞뒤로. 따라서 스레드는 실제로 현재 실행중인 프로그램의 "실행 경로 중 하나"에 대한 개념 일뿐입니다.

실제로 프로세스 인 프로세스와는 달리 리소스의 재벌 등입니다.

정말 도움이되지 않은 정의의 예로서. . .

에서 위키 백과 :

"컴퓨터 과학의 쓰레드는 실행 쓰레드의 줄임말입니다. 쓰레드는 프로그램이 스스로를 둘 이상의 동시에 (또는 의사와 동시에) 실행되는 작업으로 나누는 방법입니다. 쓰레드와 프로세스는 하나와 다릅니다. 운영 체제를 다른 프로세스에 적용하지만 일반적으로 스레드는 프로세스 내에 포함되며 동일한 프로세스의 다른 스레드는 동일한 리소스를 공유하지만 동일한 멀티 태스킹 운영 체제의 다른 프로세스는 그렇지 않습니다. "

그래서 내가 맞습니까? 잘못된? 실은 무엇입니까?

편집 : 분명히 스레드에는 자체 호출 스택이 주어 지므로 다소 구체적인 입니다.


6
"프로세스"는 추상적 용어 일뿐입니다.
hobbs

스레드 로컬 스토리지는 스레드에 대한 호출 스택입니까?
committedandroider


3
아래 답변은 ... 추상입니다. 한마디로 컴퓨터 프로그램은 한 번에 한 가지 작업 만 수행 할 수 있습니다. 그래서 A, 그 다음 B, C 다음에 ... 현대 시스템에서는 이것이 이상적이지 않습니다. 예를 들어 파일을 다운로드하는 동안 웹을 계속 탐색하려고합니다. 따라서 프로그램에는 이제 하나 이상의 '스레드'가 있습니다. 각 '스레드'는 한 번에 하나의 작업 만 수행 할 수 있지만 다른 스레드는 동시에 작업을 수행 할 수 있습니다 . 스레드 1은 A, B, C를 수행 할 수 있습니다. 스레드 2는 X, Y, Z를 수행 할 수 있습니다. A가 완료 될 때까지 B는 시작할 수 없지만 A와 X 한 번에 발생할 수 있습니다 .
Mohan

@Mohan 대단하지만 프로세스와 다른 점은 무엇입니까?
에릭

답변:


153

스레드는 프로세서 레지스터에 대한 독립적 인 값 세트입니다 (단일 코어의 경우). 여기에는 명령어 포인터 (일명 프로그램 카운터)가 포함되므로 실행 순서를 순서대로 제어합니다. 또한 각 스레드의 고유 메모리 영역을 더 잘 가리 키거나 서로 방해하는 스택 포인터가 포함됩니다.

스레드는 명령 흐름에서 명령이 작동하고 특정 스레드에 속하기 때문에 제어 흐름 (함수 호출, 루프, 이동)의 영향을받는 소프트웨어 장치입니다. 스레드는 종종 일부 우선 순위 지정 체계에 따라 예약됩니다 (프로세서 코어 당 하나의 스레드로 시스템을 설계 할 수는 있지만 모든 스레드가 항상 실행되고 예약이 필요하지 않음).

실제로 명령 포인터의 값과 해당 위치에 저장된 명령은 명령 포인터의 새 값을 결정하기에 충분합니다. 대부분의 명령어의 경우 이는 단순히 명령어 크기만큼 IP를 전진 시키지만 제어 흐름 명령어는 예측 가능한 다른 방식으로 IP를 변경합니다. IP가 취하는 일련의 값은 프로그램 코드를 통해 직조하는 실행 경로를 형성하여 "스레드"라는 이름을 갖게됩니다.


10
+1. 스레드는 일련의 레지스터 값보다 더 "콘크리트"하지 않습니다.
Greg Hewgill

6
"값 세트"는 무엇입니까? 그들은 무엇인가? 스레드를 어떻게 정의 합니까?
richard

20
@Richard : CPU 레지스터의 정확한 목록은 아키텍처에 따라 다르지만 명령어 포인터와 스택 포인터는 거의 보편적입니다. 이 스레드 (레지스터 값 세트)가 프로세서 코어에로드되고 스레드가 실행되는 한 스레드를 정의 합니다 . 프로세서가 스레드에 필요한 명령을 가져오고 스레드 레지스터를 업데이트하고 있습니다. 컨텍스트 전환이 필요한 경우 프로세서는이 레지스터 값 세트를 메모리에 저장하고 일반적으로 인터럽트 서비스 로직의 일부로 다른 스레드에 속하는 세트를로드합니다.
Ben Voigt

4
고마워 벤. 매우 도움이됩니다.
richard

2
안녕하십니까 @ BenVoigt. 나와 같은 멍청한 자들에 대한 몇 가지 설명은 "프로세서 레지스터"란 무엇입니까? "명령 포인터"및 "스택 포인터"란 무엇입니까?
BKSpurgeon

215

스레드는 실행 컨텍스트이며 CPU가 명령 스트림을 실행하는 데 필요한 모든 정보입니다.

책을 읽고 있는데 지금 휴식을 취하고 싶었다가 다시 멈춘 지점에서 다시 읽고 싶을 것입니다. 이를 달성하는 한 가지 방법은 페이지 번호, 줄 번호 및 단어 번호를 적어 두는 것입니다. 책을 읽기위한 당신의 처형 상황은이 3 가지 숫자입니다.

룸메이트가 있고 동일한 기술을 사용하는 경우 사용하지 않는 동안 책을 가져 와서 중지 한 위치부터 다시 읽을 수 있습니다. 그런 다음 다시 가져 와서 원래 있던 곳에서 다시 시작할 수 있습니다.

스레드도 같은 방식으로 작동합니다. CPU는 동시에 여러 계산을하고 있다는 착각을줍니다. 각 계산에 약간의 시간을 소비함으로써 그렇게합니다. 각 계산에 대한 실행 컨텍스트가 있기 때문에 그렇게 할 수 있습니다. 친구와 책을 공유 할 수있는 것처럼 많은 작업이 CPU를 공유 할 수 있습니다.

보다 기술적 인 수준에서 실행 컨텍스트 (따라서 스레드)는 CPU 레지스터 값으로 구성됩니다.

마지막 : 스레드는 프로세스와 다릅니다. 스레드는 실행 컨텍스트이며 프로세스는 계산과 관련된 많은 리소스입니다. 프로세스에는 하나 이상의 스레드가있을 수 있습니다.

설명 : 프로세스와 관련된 리소스에는 메모리 페이지 (프로세스의 모든 스레드가 동일한 메모리보기를 가짐), 파일 설명자 (예 : 열린 소켓) 및 보안 자격 증명 (예 : 방법).


20
더 나은 비유는 사람과 CPU를 동일시하고 (둘 다 무엇 인가를 수행), 주소 공간과 동일시합니다 (모두 존재합니다). 이렇게하면 다른 책의 책갈피는 다른 프로세스의 스레드와 같습니다. 하나 이상의 책갈피가있는 단일 책은 다중 스레드 프로세스의 아날로그 일 것입니다. 이는 사람들이 "스레드"라고 할 때 일반적으로 의미하는 것입니다. 단일 프로세서 시스템에서 작동하지만 다중 처리에 대해 이야기 할 때 다소 분해됩니다. 어느 CPU가 함수 f ()를 실행하는지는 신경 쓰지 않지만 11 장을 읽는 사람 중요합니다.
Solomon Slow

@ pwnall, 나와 같은 다른 사람들에게 어려운 개념을 소화해 주셔서 감사합니다! 멀티 스레딩에 멀티 스레딩이 포함되어 있습니까 (또는 잘못된 용어를 사용하는 경우 많은 CPU에서 프로세스를 병렬로 실행)?
aerijman

51

공식적으로 스레드를 정의하려면 먼저 스레드가 작동하는 경계를 이해해야합니다.

컴퓨터 프로그램은 일부 저장소에서 컴퓨터 메모리로로드되어 실행을 시작할 때 프로세스가 됩니다. 프로세스는 프로세서 또는 프로세서 세트에 의해 실행될 수 있습니다. 메모리의 프로세스 설명에는 프로그램의 현재 위치 (즉, 현재 실행중인 명령)를 추적하는 프로그램 카운터, 레지스터, 변수 저장소, 파일 핸들, 신호 등과 같은 중요한 정보가 포함됩니다.

스레드는 독립적으로 다른 코드의 실행 가능한 프로그램 내에서 같은 일련의 명령이다. 그림은 개념을 보여줍니다. 여기에 이미지 설명을 입력하십시오

스레드는 동일한 프로세스 주소 공간 내에 있으므로 프로세스 의 메모리 설명에있는 많은 정보를 스레드간에 공유 할 수 있습니다.

스택 (스레드 당 다른 메모리 영역에 대한 스택 포인터), 레지스터 및 스레드 특정 데이터와 같은 일부 정보는 복제 할 수 없습니다. 이 정보는 스레드가 프로그램의 기본 스레드 및 프로그램 내의 하나 이상의 다른 스레드와 독립적으로 예약 될 수 있도록합니다 .

멀티 스레드 프로그램을 실행하려면 명시적인 운영 체제 지원이 필요합니다. 다행히도 대부분의 최신 운영 체제는 NPTL을 통한 Linux, BSD 변형, Mac OS X, Windows, Solaris, AIX, HP-UX 등과 같은 스레드를 지원합니다. 운영 체제는 다른 메커니즘을 사용하여 멀티 스레딩 지원을 구현할 수 있습니다.

여기서 그래픽으로 개념이 표현됩니다.

여기 에서 주제에 대한 자세한 정보를 찾을 수 있습니다. 그것은 또한 내 정보 출처였습니다.

나를 단지에서 오는 문장을 추가 할 수 있도록 임베디드 시스템 소개 에 의해 에드워드 리Seshia를 :

스레드는 동시에 실행되고 메모리 공간을 공유하는 필수 프로그램입니다. 그들은 서로의 변수에 접근 할 수 있습니다. 이 분야의 많은 실무자들은“스레드”라는 용어를보다 좁게 사용하여 메모리를 공유하는 프로그램을 구성하는 특정 방법을 나타내며, [기타]는 명령형 프로그램이 동시에 실행되고 메모리를 공유하는 모든 메커니즘을 광범위하게 나타냅니다. 이러한 넓은 의미에서 스레드는 운영 체제가 전혀 없어도 거의 모든 마이크로 프로세서에서 인터럽트 형태로 존재합니다 (베어 아이언).


45

프로세스는 필요한 경우 네트워크를 사용하여 데이터를 공유하는 두 대의 다른 컴퓨터를 사용하는 두 사람과 같습니다. 스레드는 동일한 컴퓨터를 사용하는 두 사람과 같습니다. 데이터를 명시 적으로 공유 할 필요는 없지만 신중하게 전환해야합니다.

개념적으로 스레드는 동일한 주소 공간에서 윙윙 거리는 여러 작업자 꿀벌입니다. 각 스레드에는 자체 스택, 자체 프로그램 카운터 등이 있지만 프로세스의 모든 스레드는 동일한 메모리를 공유합니다. 두 개의 프로그램이 동시에 실행되고 있다고 생각하지만 둘 다 동일한 객체에 액세스 할 수 있습니다.

이것을 프로세스와 대조하십시오. 프로세스마다 고유 한 주소 공간이 있으므로 한 프로세스의 포인터를 사용하여 다른 프로세스의 개체를 참조 할 수 없습니다 (공유 메모리를 사용하지 않는 한).

이해해야 할 핵심 사항은 다음과 같습니다.

  • 프로세스와 스레드 모두 "동시에 실행될 수 있습니다".
  • 프로세스는 기본적으로 메모리를 공유하지 않지만 스레드는 동일한 프로세스에서 모든 메모리를 다른 스레드와 공유합니다.
  • 프로세스의 각 스레드에는 자체 스택과 자체 명령 포인터가 있습니다.

"프로세스는 기본적으로 아무 것도 공유하지 않는다"고하지만 유 추적으로 "프로세스는 서로 다른 두 대의 컴퓨터를 사용하는 두 사람과 같으며 네트워크를 사용하여 필요할 때 데이터를 공유하는 사람과 같다"고 말합니다.
committedandroider

@committedandroider : 좋은 전화. 프로세스가 기본적으로 메모리를 공유하지 않지만 스레드는 모든 메모리를 공유 한다고 대답하기 위해 대답을 편집했습니다 .
Joey Adams

36

나는 ABRAHAM SILBERSCHATZ, PETER BAER GALVIN 및 GREG GAGNE의 Operating Systems Concepts 책에서 많은 내용을 사용하고 사물에 대한 내 자신의 이해를 사용할 것입니다.

방법

모든 응용 프로그램은 컴퓨터에 텍스트 (또는 코드) 형식으로 상주합니다.

우리는 프로그램 자체가 과정이 아니라고 강조합니다. 프로그램은 디스크에 저장된 명령 목록이 포함 된 파일 (종종 실행 파일이라고 함)과 같은 수동 엔터티입니다.

애플리케이션을 시작할 때 실행 인스턴스를 만듭니다. 이 실행 인스턴스를 프로세스라고합니다. 편집 : (내 해석에 따르면 클래스 및 클래스의 인스턴스와 유사하며 클래스의 인스턴스는 프로세스입니다.)

프로세스의 예로는 Chrome이 있습니다. Chrome을 시작하면 3 개의 프로세스가 생성됩니다.

브라우저 프로세스는 사용자 인터페이스와 디스크 및 네트워크 I / O를 관리합니다. Chrome이 시작되면 새로운 브라우저 프로세스가 생성됩니다. 하나의 브라우저 프로세스 만 작성됩니다.

렌더러 프로세스에는 웹 페이지를 렌더링하기위한 논리가 포함되어 있습니다. 따라서 HTML, Javascript, 이미지 등을 처리하기위한 논리가 포함되어 있습니다. 일반적으로 새 탭에서 열린 각 웹 사이트에 대해 새 렌더러 프로세스가 작성되므로 여러 렌더러 프로세스가 동시에 활성화 될 수 있습니다.

• 사용 중인 각 유형의 플러그인 (예 : Flash 또는 QuickTime)에 대해 플러그인 프로세스가 작성됩니다. 플러그인 프로세스에는 플러그인 코드와 플러그인이 연관된 렌더러 프로세스 및 브라우저 프로세스와 통신 할 수 있도록하는 추가 코드가 포함되어 있습니다.

이것에 대답하려면 먼저 프로세서가 무엇인지 알아야한다고 생각합니다. 프로세서는 실제로 계산을 수행하는 하드웨어입니다. 편집 : (두 숫자 추가, 배열 정렬, 기본적으로 작성된 코드 실행과 같은 계산)

이제 스레드 정의로 넘어갑니다.

스레드는 CPU 사용기본 단위입니다 . 스레드 ID, 프로그램 카운터, 레지스터 세트 및 스택으로 구성됩니다.

편집 : 인텔 웹 사이트의 스레드 정의 :

스레드 또는 실행 스레드는 단일 CPU 코어를 통해 전달되거나 처리 될 수있는 기본 순서의 명령 시퀀스에 대한 소프트웨어 용어입니다.

따라서 Chrome 애플리케이션의 렌더러 프로세스가 숫자 배열을 정렬하면 정렬은 스레드 / 스레드 스레드에서 수행됩니다. (쓰레드에 관한 문법은 혼란스러워 보입니다)

사물의 나의 해석

프로세스는 실행 인스턴스입니다. 스레드는 CPU 액세스를 통해 계산을 수행하는 실제 작업자입니다. 프로세스에 대해 여러 스레드가 실행중인 경우 프로세스는 공통 메모리를 제공합니다.

편집 : 더 많은 컨텍스트를 제공하는 데 도움이되는 기타 정보

모든 현대 컴퓨터에는 둘 이상의 스레드가 있습니다. 컴퓨터의 스레드 수는 컴퓨터의 코어 수에 따라 다릅니다.

동시 컴퓨팅 :

Wikipedia에서 :

동시 컴퓨팅은 순차적으로 (다음 시작 전에 하나를 완료하는 대신) 겹치는 시간 동안 (동시에) 여러 계산이 실행되는 컴퓨팅 형태입니다. 이것은 시스템의 속성이며 개별 프로그램, 컴퓨터 또는 네트워크 일 수 있으며 각 계산 ( "프로세스")마다 별도의 실행 지점 또는 "제어 스레드"가 있습니다.

그래서 4 숫자의 합계를 계산하는 프로그램을 작성할 수 있습니다.

(1 + 3) + (4 + 5)

이 스레드 (실행 스레드에서 실행되는 하나의 프로세스)를 계산하는 프로그램에서 다른 스레드에서 실행하여 다른 프로세스를 계산하여 (4 + 5) 계산하고 결과를 원래 프로세스로 반환 할 수 있습니다. 원래 프로세스는 (1 + 3)의 합을 계산합니다.


5
이것이 실제 답변입니다
Suhail Mumtaz Awan

1
많은 도움이되었습니다. 이것이 바로 설명입니다.
Dinesh Kumar

이 답변의 큰 가치는 필요한 경우 자세한 내용을 찾을 수있는 참조 서적을 제공한다는 것입니다. @chatuur 감사합니다!
desa

7

불행히도 스레드가 존재합니다. 실은 유형의 것입니다. 당신은 하나를 죽일 수 있고 다른 사람들은 여전히 ​​실행 중입니다. 새 스레드를 생성 할 수 있습니다. 각 스레드가 자체 프로세스는 아니지만 프로세스 내부에서 개별적으로 실행됩니다. 멀티 코어 머신에서는 동시에 2 개의 스레드를 실행할 수 있습니다.

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf


1
"무형의 무언가"를 만드는 것은 무엇입니까? TLS와 해당 호출 스택에 저장된 데이터입니까?
richard

이해를위한 추상화가 아닙니다 ... 실제로 여러 스레드로 가장 한 단일 스레드 인 경우 OP는 옳을 것입니다. 그러나 예,이 데이터로 인해 유형화 될 수 있다고 말할 것입니다. .
Orbit

날 밝히세요. . . 그래서 대답은 무엇입니까?
richard

@Richard는 시맨틱에 대한 토론에 참여하지 않고 OP에 개념적으로 명확하게 시도하려는 내 대답을 인용했습니다.
Orbit

@richard TLS 란 무엇입니까?
committedandroider

6

스레드는 실행 규칙이있는 메모리 컨텍스트 (또는 Tanenbaum이 스레드를 더 잘 배치하는 방법, 자원 그룹화)에 지나지 않습니다. 소프트웨어 구조입니다. CPU는 스레드가 무엇인지 알지 못합니다 (일부 예외는 일부 프로세서에는 하드웨어 스레드가 있음). 명령을 실행합니다.

커널은 스레드 및 프로세스 개념을 도입하여 메모리 및 명령어 순서를 의미있는 방식으로 관리합니다.


5

이것은 야후 답변에서 가져온 것입니다 :

스레드는 응용 프로그램의 아키텍처에 영향을받지 않는 코딩 구성입니다. 단일 프로세스에는 종종 여러 스레드가 포함될 수 있습니다. 스레드는 동일한 변수를 공유하기 때문에 서로 직접 통신 할 수도 있습니다.

프로세스는 자체 상태 정보가있는 독립적 인 실행 단위입니다. 또한 자체 주소 공간을 사용하며 프로세스 간 통신 메커니즘을 통해서만 다른 프로세스와 상호 작용할 수 있습니다.

그러나 간단한 용어로 쓰레드는 다른 "작업"과 같습니다. 예를 들어 한 종이에 수식을 작성하는 등 무언가를하고있을 때를 생각해보십시오. 그것은 하나의 스레드로 간주 될 수 있습니다. 그리고 또 다른 실은 다른 종이에 다른 것을 쓰는 것입니다. 멀티 태스킹이 시작됩니다.

인텔 프로세서에는 "하이퍼 스레딩"(AMD도 있음)이 있으며 여러 "스레드"또는 멀티 태스킹을 훨씬 더 잘 수행 할 수 있어야합니다.

스레드 처리 방법의 물류에 대해 잘 모르겠습니다. 나는 그들 사이에 프로세서가왔다 갔다하는 것에 대해 들었지만, 이것에 대해 100 % 확신하지 못하고 다른 누군가가 그것에 대답 할 수 있기를 바랍니다.


인텔 프로세서는 어떻게 여러 스레드를 더 잘 처리합니까? 단일 코어의 경우 한 번에 하나의 스레드 만 실행해야합니다. 프로세서가 앞뒤로 움직이는 것에 동의합니다. 당신은 정말로 그렇게 잘 할 수 없습니까?
committedandroider

일부 사용 사례에서 더 나은 성능을 제공하는 최적화입니다. 하이퍼 스레딩에 대한 내용은 여기를 참조하십시오. en.wikipedia.org/wiki/Hyper-threading
Jeremy Friesner

5

대답은 시스템과 구현에 따라 크게 다르지만 가장 중요한 부분은 다음과 같습니다.

  1. 스레드에는 독립적 인 실행 스레드가 있습니다 (즉, 컨텍스트 전환 후 다시 전환 할 수 있으며 원래 위치에서 실행을 재개 할 수 있습니다).
  2. 스레드는 수명이 있습니다 (다른 스레드에 의해 작성 될 수 있으며 다른 스레드가 완료 될 때까지 대기 할 수 있음).
  3. 아마도 "프로세스"보다 적은 수하물이 부착되어있을 것입니다.

그 외에도 언어 런타임에 의해 단일 프로세스 내에서 스레드가 구현 될 수 있고, 스레드는 코 루틴 (coroutine)이 될 수 있으며, 스레드는 스레드 라이브러리에 의해 단일 프로세스 내에서 구현되거나 스레드는 커널 구성 일 수 있습니다.

가장 친숙한 Linux를 포함한 여러 최신 유닉스 시스템에서는 모든 것이 스레드입니다. 프로세스는 단지 부모와 상대적으로 적은 것을 공유하는 스레드 유형 입니다 (즉, 자체 메모리 매핑, 자체 파일 테이블 가져 오기) 읽기 권한, man 2 clone특히 플래그 목록은 여기에서 정말 유익합니다.


프로세서가 한 스레드에서 다른 스레드로 이동할 때 컨텍스트 전환입니까 (동일한 프로세스에서 다른 프로세스로)?
committedandroider

-1

나는 그 대답에 정말로 만족하지 않기 때문에 여기에 내 자신을 추가 할 것입니다 :) 스레드는 프로세서에 대한 작업을 예약하기위한 커널 추상화입니다. 다른 사람들과 작업을 공유


1
-1 커널이 스레드를 작성할 필요가 없습니다. 커널 레벨을 지원하는 스레드는 실제로 커널에 의해 스케줄됩니다 (일부 종류의 syscall이 발행 됨). 그러나 사용자 라이브러리 레벨을 지원하는 스레드가 있으며 스레드 테이블이 사용자 공간에 있습니다.
AleksandrH

-1

프로세스와 스레드의 차이점을 먼저 설명하겠습니다.

프로세스는 {1..N} 수의 스레드를 가질 수 있습니다. 가상 메모리 및 가상 프로세서에 대한 간단한 설명.

가상 메모리

프로세스가 실행을 위해 기본 메모리에 있다고 생각할 수 있도록 스왑 공간으로 사용됩니다.

가상 프로세서

가상 메모리와 동일한 개념으로 프로세서를위한 것입니다. 프로세스에는 프로세서를 사용하는 것이 유일한 것으로 보입니다.

OS는 가상 메모리와 가상 프로세서를 프로세스에 할당하고 프로세스 간 스왑을 수행하고 실행을 처리합니다.

프로세스 내의 모든 스레드는 동일한 가상 메모리를 공유합니다. 그러나 각 스레드에는 개별 가상 프로세서가 할당되어 개별적으로 실행될 수 있습니다.

따라서 메모리를 절약하고 CPU를 최대한 활용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.