1324

프로세스와 스레드의 기술적 차이점은 무엇입니까?

나는 '프로세스'와 같은 단어가 남용되고 하드웨어 및 소프트웨어 스레드가 있다는 느낌을받습니다. 가벼운 프로세스는 어때?얼랑? 하나의 용어를 다른 용어보다 우선 사용해야하는 결정적인 이유가 있습니까?


  • 관련 항목 :stackoverflow.com/questions/32294367/… - zxq9
  • 아마도 각 OS마다 '스레드'가 무엇인지에 대해 다른 생각을 갖고 있다고 말할 수 있습니다. 또는 ' 프로세스 ' 일부 주류 OS &스레드의 개념이 없으므로 일부 내장 OS도 있습니다. 스레드는 '에만 있습니다. - Neil

30 답변


1199

프로세스와 스레드 모두 독립적 인 실행 순서입니다. 일반적인 차이점은 공유 메모리 공간에서 스레드 (동일한 프로세스의 스레드)가 실행되는 반면 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.

나는 "하드웨어"대 "소프트웨어"스레드가 무엇을 말하는지 잘 모르겠습니다. 스레드는 CPU 기능보다는 운영 환경 기능입니다 (CPU는 일반적으로 스레드를 효율적으로 만드는 작업을 수행하지만).

Erlang은 공유 메모리 다중 프로그래밍 모델을 노출시키지 않기 때문에 "프로세스"라는 용어를 사용합니다. "스레드"라고 부르는 것은 메모리를 공유한다는 의미입니다.


  • HyperThreading (tm)에 대한 참조 일 수 있습니까? - RobS
  • 하드웨어 스레드는 아마도 코어 내의 여러 스레드 컨텍스트 (예 : HyperThreading, SMT, Sun 's Niagara / Rock)를 나타냅니다. 이것은 중복 된 레지스터 파일, 파이프 라인을 통해 명령과 함께 수행되는 여분의 비트 및 기타 복잡한 바이 패스 / 전달 논리를 의미합니다. - Matt J
  • @JeshwanthKumarNK : 새 스레드를 생성하면 새 스택에 최소한 충분한 메모리가 할당됩니다. 이 메모리는 프로세스 A의 OS에 의해 할당됩니다. - Greg Hewgill
  • 이 대답은 틀린 것 같습니다. 두 프로세스와 스레드가 모두 독립적 인 실행 순서라면 두 스레드가 포함 된 프로세스는 세 개의 실행 순서가 있어야하며 올바르게 실행되지 않아야합니다. 스레드는 실행 순서입니다. 프로세스는 하나 이상의 실행 순서를 보유 할 수있는 컨테이너입니다. - David Schwartz
  • "하드웨어 스레드들" 개별 하드웨어 리소스 (개별 코어, 프로세서 또는 하이퍼 스레)가 제공된 스레드입니다. "소프트웨어 스레드" 동일한 처리 성능을 위해 경쟁해야하는 스레드입니다. - jpmc26

673

방법

각 프로세스는 프로그램을 실행하는 데 필요한 리소스를 제공합니다. 프로세스는 가상 주소 공간, 실행 코드, 시스템 객체에 대한 열린 핸들, 보안 컨텍스트, 고유 프로세스 식별자, 환경 변수, 우선 순위 클래스, 최소 및 최대 작업 집합 크기 및 실행 스레드를 포함합니다. 각 프로세스는 주로 1 차 스레드라고하는 단일 스레드로 시작되지만 해당 스레드에서 추가 스레드를 작성할 수 있습니다.



스레드는 실행을 위해 예약 할 수있는 프로세스 내의 엔티티입니다. 프로세스의 모든 스레드는 가상 주소 공간과 시스템 자원을 공유합니다. 또한 각 스레드는 예외 처리기, 일정 우선 순위, 스레드 로컬 저장소, 고유 한 스레드 식별자 및 시스템이 예약 될 때까지 스레드 컨텍스트를 저장하는 데 사용할 구조 집합을 유지 관리합니다. 쓰레드 컨텍스트는 쓰레드의 머신 레지스터 세트, 커널 스택, 쓰레드 환경 블록, 쓰레드 프로세스의 주소 공간에있는 사용자 스택을 포함한다. 쓰레드는 자신 만의 보안 컨텍스트를 가질 수 있으며, 이는 클라이언트를 가장하는 데 사용될 수 있습니다.


여기 MSDN에서 이것을 발견 :

프로세스 및 스레드 정보

Microsoft Windows는 선점 형 멀티 태스킹을 지원하므로 여러 프로세스의 여러 스레드를 동시에 실행할 수 있습니다. 다중 프로세서 컴퓨터에서 시스템은 컴퓨터에 프로세서가있는 수만큼의 스레드를 동시에 실행할 수 있습니다.


  • 왜 플로트를 포맷 할 수 없는지 알고 싶은 사람들을 위해 :stackoverflow.com/questions/20708707/… - Computernerd
  • @LuisVasconcellos - 스레드가 없으면 프로세스가 아무 것도하지 않습니다. 프로세스는 메모리에로드 된 일부 코드 및 프로그램 상태 일뿐입니다. 별로 쓸모가 없습니다. 자동차를 타지 않고 길을 나서야하는 것과 같습니다. - Scott Langham
  • @ LuisVasconcellos - 좋습니다. 예, 스레드를 프로세스의 코드를 통해 이동하고 해당 코드의 지침을 수행하는 것으로 생각할 수 있습니다. - Scott Langham
  • 이 답변은 허용 된 답변보다 훨씬 낫습니다.이상프로세스와 스레드의 : 그들은 별도의 우려와 별도의 것들이어야합니다. 사실, 대부분의 운영 체제는 스레드의 발명보다 더 먼 역사를 가지고 있습니다. 따라서 대부분의 운영 체제에서 시간이 지남에 따라 서서히 향상되는 경우에도 이러한 우려는 여전히 다소 얽혀 있습니다. - Solomon Slow
  • @BK 스펄전 (BKSpurgeon) 모든 설명을 할 때마다 한 수준의 이해에서 다음 단계로 독자를 끌어 들여야합니다. 유감스럽게도 모든 독자에게 답변을 제공 할 수는 없으므로 일정 수준의 지식을 갖추어야합니다. 이해하지 못하는 사람들은 이해하지 못하는 용어를 더 많이 검색 할 수 있습니다. 이해할 수있는 기준점에 도달하기 전까지는 이해할 수 없습니다. 나는 당신이 당신의 자신의 대답을 제안 할 것을 제안 할 것이지만, 당신이 이미 가지고있는 것을 보아서 기쁘게 생각합니다. - Scott Langham

246

방법:

  • 실행중인 프로그램 인스턴스를 프로세스라고합니다.
  • 일부 운영 체제에서는 '작업'이라는 용어를 사용하여 실행중인 프로그램을 나타냅니다.
  • 프로세스는 항상 기본 메모리 또는 임의 액세스 메모리라고도하는 주 메모리에 저장됩니다.
  • 따라서 프로세스를 활성 엔터티라고합니다. 컴퓨터가 재부팅되면 사라집니다.
  • 여러 프로세스가 동일한 프로그램과 연관 될 수 있습니다.
  • 다중 프로세서 시스템에서 여러 프로세스를 병렬로 실행할 수 있습니다.
  • 단일 프로세서 시스템에서, 진정한 병렬 처리가 달성되지는 않았지만 프로세스 스케줄링 알고리즘이 적용되고 프로세서는 동시성의 환상을 만들어내는 각 프로세스를 한 번에 하나씩 실행하도록 예약됩니다.
  • 예:'Calculator'프로그램의 여러 인스턴스 실행. 각 인스턴스는 프로세스라고합니다.

실:

  • 스레드는 프로세스의 하위 집합입니다.
  • 이것은 실제 프로세스와 유사하지만 프로세스 컨텍스트 내에서 실행되고 커널에 의해 프로세스에 할당 된 동일한 리소스를 공유하기 때문에 '경량 프로세스'라고합니다.
  • 일반적으로 프로세스에는 제어 스레드가 하나만 있습니다. 한 번에 한 세트의 기계 명령어가 실행됩니다.
  • 프로세스는 명령을 동시에 실행하는 여러 실행 스레드로 구성 될 수도 있습니다.
  • 다중 제어 스레드는 다중 프로세서 시스템에서 가능한 병렬 처리를 활용할 수 있습니다.
  • 단일 프로세서 시스템에서는 스레드 스케줄링 알고리즘이 적용되며 프로세서는 각 스레드를 한 번에 하나씩 실행하도록 예약됩니다.
  • 프로세스 내에서 실행되는 모든 스레드는 동일한 주소 공간, 파일 설명자, 스택 및 기타 프로세스 관련 속성을 공유합니다.
  • 프로세스의 스레드가 동일한 메모리를 공유하므로 프로세스 내 공유 데이터에 대한 액세스를 동기화하는 것이 전례없는 중요성을 갖습니다.

나는 위의 정보를지식 퀘스트! 블로그.


  • 쿠마 : 내 지식으로는 스레드가 같은 스택을 공유하지 않습니다. 그렇지 않으면 각각 다른 코드를 실행할 수 없습니다. - Mihai Neacsu
  • 네, @MihaiNeacsu가 옳다고 생각합니다. 스레드는 " 코드, 데이터 및 파일 "을 공유합니다. 그들 자신의 "레지스터 및 스택"을 갖는다. 내 OS 과정에서 슬라이드 :i.imgur.com/Iq1Qprv.png - Shehaaz
  • 이것은 쓰레드와 프로세스가 어떤 것인지, 그리고 어떻게 서로 관련되어 있는지를 보여줌으로써 매우 유용합니다. 스레드에 대한 예를 추가하는 것이 좋습니다. 특히 프로세스에 대한 예가 하나 더 있습니다. 좋은 물건! - Smithers
  • Kquest.co.cc 링크가 작동하지 않습니다. - Elijah Lynn
  • @Kumar 스레드의 스택 공유 부분에 대한 대답을 수정하십시오. 그것은 혼란을 일으킨다. - Rndp13

100

먼저, 이론적 측면을 살펴 보겠습니다. 프로세스와 스레드의 차이점과 그 차이점을 이해하려면 프로세스가 개념적으로 무엇인지 이해해야합니다.

우리는 다음 절을 가지고 있습니다.2.2.2 고전적인 모형 모형...에서현대 운영 체제 3eTanenbaum :

프로세스 모델은 두 가지 독립적 인 개념, 즉 자원   그룹화 및 실행 때때로 그들을 분리하는 것이 유용합니다.   이것은 스레드가 들어오는 곳입니다 ....

그는 계속한다:

프로세스를 보는 한 가지 방법은 프로세스를 보는 것입니다.   관련 리소스를 함께 그룹화합니다. 프로세스에는 주소 공간이 있습니다.   프로그램 텍스트와 데이터 및 기타 리소스가 포함되어 있습니다. 이들   리소스에는 열린 파일, 하위 프로세스, 보류중인 경보,   시그널 핸들러, 회계 정보 등을 제공합니다. 그들을 넣음으로써   함께 프로세스의 형태로, 그들은 더 쉽게 관리 될 수 있습니다.   프로세스가 가지고있는 다른 개념은 일반적으로 실행 스레드입니다.   스레드로 줄었습니다. 쓰레드는 프로그램 카운터를 가지고 있습니다.   다음에 실행할 명령을 추적합니다. 그것에는 레지스터가 있습니다.   현재 작업 변수를 보유합니다. 그것에는 스택이 있습니다.   실행 기록, 각 프로 시저마다 하나의 프레임이 호출되지만 그렇지 않은 경우   아직 돌아왔다. 스레드가 어떤 프로세스에서 실행되어야하지만,   쓰레드와 그 프로세스는 다른 개념이며 처리 될 수있다.   따로 따로. 프로세스는 자원을 그룹화하는 데 사용됩니다. 실   CPU에서 실행되도록 예약 된 엔티티입니다.

아래로 내려 가면 다음 표가 제공됩니다.

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

그 거래를합시다.하드웨어 멀티 스레딩발행물. 고전적으로, CPU는 단일 프로그램 카운터와 레지스터 세트를 통해 스레드의 상태를 유지하면서 단일 스레드 실행을 지원합니다. 캐시 미스가 발생하면 어떻게 될까요? 주 메모리에서 데이터를 가져 오는 데 오랜 시간이 걸리며, CPU가 유휴 상태에 앉아있는 동안 이런 일이 발생합니다. 그래서 누군가는 기본적으로 다른 스레드가 주 메모리에서 대기하는 동안 다른 프로세스 (어쩌면 다른 프로세스에 있음)가 작업을 완료 할 수 있도록 두 세트의 스레드 상태 (PC + 레지스터)를 가질 생각을 가졌습니다. 이 개념에는 여러 가지 이름과 구현이 있습니다 (예 : HyperThreading 및동시 멀티 스레딩(간단히 SMT).

이제 소프트웨어 측면을 살펴 보겠습니다. 기본적으로 스레드를 소프트웨어 측에서 구현할 수있는 세 가지 방법이 있습니다.

  1. 사용자 공간 스레드
  2. 커널 스레드
  3. 둘의 조합

스레드를 구현하는 데 필요한 모든 기능은 CPU 상태를 저장하고 여러 스택을 유지 관리하는 기능입니다. 대부분의 경우 사용자 공간에서 수행 할 수 있습니다. 사용자 공간 스레드의 장점은 커널에 트랩 할 필요가 없으며 원하는 방식으로 스레드를 예약 할 수 있기 때문에 초고속 스레드 전환입니다. 가장 큰 단점은 I / O (전체 프로세스와 모든 사용자 스레드를 차단하는)를 차단할 수 없다는 점입니다. 이는 우리가 처음부터 스레드를 사용하는 큰 이유 중 하나입니다. 스레드를 사용하여 I / O를 차단하면 많은 경우에 프로그램 설계가 크게 단순 해집니다.

커널 스레드는 블로킹 I / O를 사용할 수있는 이점이 있으며, 모든 스케줄링 문제를 OS에 남겨 둡니다. 그러나 각 스레드 스위치는 상대적으로 느린 커널에 트래핑해야합니다. 그러나 I / O가 차단되어 스레드를 전환하는 경우 I / O 작업으로 인해 이미 커널에 갇히게되어 실제 문제가되지 않습니다.

또 다른 방법은 둘을 여러 개의 커널 스레드가 각각 여러 개의 사용자 스레드를 가지고 결합하는 것입니다.

용어에 대한 질문으로 돌아 가면 프로세스와 실행 스레드가 서로 다른 두 개념이고 사용할 용어의 선택은 사용자가 말하는 것에 달려 있다는 것을 알 수 있습니다. "경량 프로세스"라는 용어에 관해서는 개인적으로 "실행 스레드"라는 용어뿐만 아니라 진행중인 내용을 전달하지 않기 때문에 개인적으로 그 점을 보지 않습니다.


  • 뛰어난 답변! 그것은 많은 전문 용어와 가정을 분해합니다. 그러나이 라인은 어색한 것으로 눈에 띄지 않습니다. "그래서 누군가가 기본적으로 두 세트의 스레드 상태 (PC + 레지스터)를가집니다." - "PC"란 무엇입니까? 여기서 말하는거야? - Smithers
  • @Smithers PC는 실행될 다음 명령어의 주소를 제공하는 프로그램 카운터 또는 명령어 포인터입니다.en.wikipedia.org/wiki/Program_counter - Robert S. Barnes
  • 난 당신이 무슨 짓을했는지 참조.stackoverflow.com/questions/1762418/process-vs-thread/… - Alexander Gonchiy
  • " 스택 " " 프로세스 별 항목 "에 나열되지 않은 항목은 무엇입니까? 프로세스와 스레드 모두 자체 스택을 가지고 있습니다. - stackoverflowuser2010
  • @ stackoverflowuser2010 스택에만 스택이 있습니다. 프로세스라고 부르는 것은 하나의 실행 스레드가있는 프로세스이며 스택이 프로세스가 아닌 스레드입니다. - Robert S. Barnes

66

동시 프로그래밍과 관련하여 더 많은 것을 설명하려면

  1. 프로세스에는 자체 포함 된 실행 환경이 있습니다. 프로세스는 일반적으로 완전한 기본 런타임 리소스 세트를 가지고 있습니다. 특히, 각 프로세스는 자체 메모리 공간을 가지고 있습니다.

  2. 스레드는 프로세스 내에 존재하며 모든 프로세스는 적어도 하나를가집니다. 스레드는 메모리 및 열린 파일을 포함하여 프로세스의 리소스를 공유합니다. 이것은 효율적이지만 잠재적으로 문제가되는 커뮤니케이션을 만듭니다.

평균적인 사람을 염두에두고,

컴퓨터에서 Microsoft Word 및 웹 브라우저를 엽니 다. 우리는이 두 가지를프로세스들.

마이크로 소프트 워드에서는 어떤 것을 입력하면 자동으로 저장됩니다. 이제 편집과 저장이 병렬로 진행되는 것을 보았을 것입니다. 하나의 스레드에서 편집하고 다른 스레드에서 저장합니다.


  • 탁월한 대답은 일을 단순하게 유지하고 모든 사용자가 질문을 보는 것조차도 관련 될 수있는 예를 제공합니다. - Smithers
  • 편집 / 저장은 프로세스 내부의 여러 스레드에 대한 좋은 예입니다! - user645579

44

응용 프로그램은 하나 이상의 프로세스로 구성됩니다. 프로세스는 가장 간단한 용어로 실행 프로그램입니다. 하나 이상의 스레드가 프로세스의 컨텍스트에서 실행됩니다. 스레드는 운영 체제가 프로세서 시간을 할당하는 기본 단위입니다. 스레드는 현재 다른 스레드가 실행중인 부분을 포함하여 프로세스 코드의 일부를 실행할 수 있습니다. 파이버는 응용 프로그램에서 수동으로 예약해야하는 실행 단위입니다. 섬유는 일정을 잡는 스레드의 컨텍스트에서 실행됩니다.

도난당한 사람이리.


  • Linux와 같은 다른 운영 체제에서는 스레드가 일반적으로 상위 프로세스와 동일한 메모리 공간을 공유한다는 점을 제외하고는 운영 체제 수준에서이 둘 사이에 실질적인 차이가 없습니다. (따라서 내 downvote) - Arafangion
  • 좋은 답변 (특히 크레디트)은 두 사람과 각자의 관계를 쉽게 예상되는 "다음 질문"으로 보여주기 때문에 가능합니다. (섬유에 관한 것). - Smithers

24

프로세스는 코드, 메모리, 데이터 및 기타 리소스의 모음입니다. 스레드는 프로세스 범위 내에서 실행되는 일련의 코드입니다. 동일한 프로세스 내에서 (일반적으로) 여러 스레드가 동시에 실행될 수 있습니다.


22

  • 모든 프로세스는 스레드 (기본 스레드)입니다.
  • 그러나 모든 스레드는 프로세스가 아닙니다. 프로세스의 일부 (엔티티)입니다.


  • 조금 더 설명하거나 증거를 포함 할 수 있습니까? - Zim84
  • 그래서 스레드를 포함하지 않는 프로세스는 없습니다. - PeerNet

18

프로세스 및 스레드에 대한 실제 사례 이렇게하면 스레드와 프로세스에 대한 기본적인 아이디어를 얻을 수 있습니다. enter image description here

Scott Langham의 답변에서 위의 정보를 빌 렸습니다.- 감사


17

프로세스는 응용 프로그램의 실행 인스턴스입니다. 그게 무슨 뜻 이죠? 예를 들어 Microsoft Word 아이콘을 두 번 누르면 Word를 실행하는 프로세스가 시작됩니다. 스레드는 프로세스 내의 실행 경로입니다. 또한 프로세스는 다중 스레드를 포함 할 수 있습니다. Word를 시작하면 운영 체제에서 프로세스를 만들고 해당 프로세스의 주 스레드를 실행하기 시작합니다.

스레드는 프로세스가 수행 할 수있는 모든 작업을 수행 할 수 있다는 점에 유의해야합니다. 그러나 프로세스가 여러 스레드로 구성 될 수 있으므로 스레드는 '경량'프로세스로 간주 될 수 있습니다. 따라서 스레드와 프로세스 간의 근본적인 차이는 각 스레드가 수행하는 작업입니다. 스레드는 작은 작업에 사용되는 반면, 프로세스는 더 많은 '중량'작업 (기본적으로 응용 프로그램 실행)에 사용됩니다.

스레드와 프로세스의 또 다른 차이점은 동일한 프로세스 내의 스레드는 동일한 주소 공간을 공유하지만 다른 프로세스는 그렇지 않다는 것입니다. 이를 통해 스레드는 동일한 데이터 구조와 변수를 읽고 쓸 수 있으며 스레드 간의 통신을 용이하게합니다. 프로세스 간 통신 (IPC 또는 프로세스 간 통신이라고도 함)은 매우 어렵고 리소스 집약적입니다.


  • 주어진 순간에 CPU가 단일 프로세스 / 스레드를 처리한다는이 설명에 추가하는 것이 좋습니다. 그리고 CPU가 한 스레드 / 프로세스에서 다른 프로세스로 빠르게 전환하기 때문에 동시 작업의 외관 / 환영 / 효과가 나타납니다 - Casey Flynn
  • "스레드는 작은 작업에 사용되는 반면, 프로세스는 더 많은 '중량'작업 - 기본적으로 응용 프로그램의 실행에 사용됩니다." 프로세스에 프로세서 시간이 없으므로 코드를 실행하지 않으므로 잘못되었습니다. 스레드 만 코드를 실행합니다. - Konstantins Bogdanovs

17

방법:

  1. 프로세스는 무거운 무게 프로세스입니다.
  2. 프로세스는 별도의 메모리, 데이터, 리소스 요법을 가진 별도의 프로그램입니다.
  3. 프로세스는 fork () 메소드를 사용하여 생성됩니다.
  4. 프로세스 간의 컨텍스트 전환에는 많은 시간이 소요됩니다.

예:

브라우저 (Mozilla, Chrome, IE)를여십시오. 이 시점에서 새 프로세스가 실행되기 시작합니다.

쓰레드 :

  1. 스레드는 경량 프로세스입니다. 스레드는 프로세스 내부에 번들로 제공됩니다.
  2. 스레드는 공유 메모리, 데이터, 자원, 파일 등을 가지고 있습니다.
  3. 스레드는 clone () 메소드를 사용하여 작성됩니다.
  4. 스레드 간의 컨텍스트 전환은 Process만큼 시간이 많이 걸리지 않습니다.

예:

브라우저에서 여러 개의 탭 열기.


  • Windows 세상에서 당신은 정확하지만, 리눅스에서는 모든 스레드가 ' 역시 공정하고 무거운 ' (또는 빛). - Neil

12

프로세스와 스레드 모두 독립적 인 실행 순서입니다. 일반적인 차이점은 공유 메모리 공간에서 스레드 (동일한 프로세스의 스레드)가 실행되는 반면 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.

방법

프로그램이 실행 중입니다. 텍스트 섹션, 즉 프로그램 코드, 프로그램 카운터 & 값의 값으로 표현되는 현재 활동을 갖는다. 프로세서의 내용을 등록하십시오. 또한 함수 매개 변수, 반환 된 주소 및 로컬 변수와 같은 임시 데이터와 전역 변수를 포함하는 데이터 섹션이 포함 된 프로세스 스택도 포함됩니다. 프로세스에는 프로세스 런타임 중에 동적으로 할당되는 메모리 인 힙 (heap)도 포함될 수 있습니다.

스레드는 CPU 사용의 기본 단위입니다. 스레드 ID, 프로그램 카운터, 레지스터 세트 및 스택을 포함한다. 그것은 동일한 프로세스에 속한 다른 스레드와 코드 섹션, 데이터 섹션 및 열린 파일 및 신호와 같은 다른 운영 체제 자원을 공유합니다.

- 운영 체제에서 가져온 Galvin


10

쓰레드와 프로세스는 모두 OS 리소스 할당의 원자 단위입니다 (즉, CPU 시간이 어떻게 나누어 져 있는지와 다른 OS 리소스 소유 모델을 설명하는 동시성 모델이 있습니다). 차이점은 다음과 같습니다.

  • 공유 리소스 (스레드는 정의에 따라 메모리를 공유하고 스택 및 로컬 변수를 제외한 다른 프로세스는 소유하지 않으며 프로세스는 메모리를 공유 할 수도 있지만 별도의 메커니즘이 OS에서 유지 관리됩니다)
  • 할당 공간 (프로세스의 커널 공간 대 스레드의 사용자 공간)

위의 Greg Hewgill은 "프로세스"라는 단어의 Erlang 의미에 대해 정확했으며이리Erlang이 가벼운 프로세스를 수행 할 수있는 이유에 대한 논의가 있습니다.


9

Java 세계와 관련된이 질문에 대답하려고합니다.

프로세스는 프로그램 실행이지만 스레드는 프로세스 내의 단일 실행 순서입니다. 프로세스는 다중 스레드를 포함 할 수 있습니다. 스레드는 때로는경량 공정.

예 :

예제 1 : JVM은 단일 프로세스로 실행되며 JVM의 스레드는 해당 프로세스에 속한 힙을 공유합니다. 그래서 여러 스레드가 동일한 객체에 액세스 할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간을 갖습니다. 이것은 메소드의 한 스레드의 호출과 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 보호되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으므로 스레드의 안전을 위해 동기화되어야합니다.

예 2 : 프로그램에서 키 입력을 읽으면 그림을 그릴 수 없습니다. 프로그램은 키보드 입력에 모든주의를 기울여야하며 한 번에 둘 이상의 이벤트를 처리 할 능력이 부족하면 문제가 발생할 수 있습니다. 이 문제에 대한 이상적인 솔루션은 동시에 두 개 이상의 프로그램 섹션을 완벽하게 실행하는 것입니다. 스레드를 사용하면이 작업을 수행 할 수 있습니다. 그림 그리기 그림은 프로세스이며 읽기 키 입력은 하위 프로세스 (스레드)입니다.


  • 좋은 대답, 나는 그것의 범위 (자바 세계)를 정의하고 몇 가지 적용 가능한 예제를 제공하는 것을 좋아한다. (#2) 원래의 질문을해야하는 누구나 즉시 관련 될 수있다. - Smithers

9

스레드와 프로세스의 차이점은 무엇입니까?

프로세스는 응용 프로그램의 실행 인스턴스이고 스레드는 프로세스 내에서 실행 경로입니다. 또한 프로세스는 여러 스레드를 포함 할 수 있습니다. 스레드는 프로세스가 수행 할 수있는 모든 작업을 수행 할 수 있다는 점에 유의해야합니다. 그러나 프로세스가 여러 스레드로 구성 될 수 있으므로 스레드는 '경량'프로세스로 간주 될 수 있습니다. 따라서 스레드와 프로세스 간의 근본적인 차이는 각 스레드가 수행하는 작업입니다. 스레드는 작은 작업에 사용되는 반면, 프로세스는 더 많은 '중량'작업 (기본적으로 응용 프로그램 실행)에 사용됩니다.

스레드와 프로세스의 또 다른 차이점은 동일한 프로세스 내의 스레드는 동일한 주소 공간을 공유하지만 다른 프로세스는 그렇지 않다는 것입니다. 이를 통해 스레드는 동일한 데이터 구조와 변수를 읽고 쓸 수 있으며 스레드 간의 통신을 용이하게합니다. 프로세스 간 통신 (IPC 또는 프로세스 간 통신이라고도 함)은 매우 어렵고 리소스 집약적입니다.

다음은 스레드와 프로세스의 차이점을 요약 한 것입니다.

  1. 스레드는 프로세스보다 프로세스보다 생성하기 쉽습니다. 별도의 주소 공간이 필요하지 않습니다.

  2. 멀티 스레딩은 스레드 한 스레드 만 수정해야하는 데이터 구조 공유 한 번에. 스레드와 달리 프로세스가 동일한 프로세스를 공유하지 않습니다. 주소 공간.

  3. 스레드는 멀리 사용하기 때문에 경량으로 간주됩니다. 프로세스보다 리소스가 적습니다.

  4. 프로세스는 서로 독립적입니다. 쓰레드 동일한 주소 공간을 공유하는 것이 상호 의존적이므로주의해야합니다. 서로 다른 스레드가 서로 밟지 않도록해야합니다.

    이것은 위의 2 번을 말하는 또 다른 방법입니다.

  5. 프로세스는 여러 스레드로 구성 될 수 있습니다.


7

면접관의 관점에서 볼 때 기본적으로 듣고 싶은 3 가지 주요한 것들이 있습니다. 물론 프로세스가 여러 스레드를 가질 수있는 명백한 것들 외에 :

  1. 스레드는 동일한 메모리 공간을 공유하므로 스레드는 다른 스레드 메모리의 메모리에 액세스 할 수 있습니다. 프로세스는 일반적으로 할 수 없습니다.
  2. 자원. 리소스 (메모리, 핸들, 소켓 등)는 스레드 종료가 아닌 프로세스 종료시에 릴리스됩니다.
  3. 보안. 프로세스에 고정 된 보안 토큰이 있습니다. 반면에 스레드는 다른 사용자 / 토큰을 가장 할 수 있습니다.

더 원한다면 Scott Langham의 대답은 모든 것을 다루고 있습니다. 이 모든 것은 운영 체제의 관점에서 나온 것입니다. 다른 언어는 작업, 경량 스레드 등과 같은 다른 개념을 구현할 수 있지만 스레드 (Windows에서는 광섬유)를 사용하는 방법 일뿐입니다. 하드웨어 및 소프트웨어 스레드가 없습니다. 하드웨어와 소프트웨어가 있습니다.예외인터럽트, 또는 사용자 모드와 커널.


  • 보안 토큰을 말하면, 예를 들어, 리눅스에있는 것과 같은 사용자 자격 증명 (사용자 이름 / 패스)을 의미합니까? - user645579
  • 창문에서 이것은 복잡한 토픽이며 보안 토큰 (실제로는 액세스 토큰이라 불림)은 액세스 확인에 필요한 모든 정보를 포함하는 커다란 구조입니다. 이 구조는 권한 부여 후 생성됩니다. 즉, 사용자 이름 / 암호는 없지만 사용자 이름 / 암호를 기반으로하는 SID 목록 / 권한을 의미합니다. 자세한 내용은 여기 :msdn.microsoft.com/en-us/library/windows/desktop/… - AndreiM

7

다음은에 대한 기사 중 하나에서 얻은 것입니다.코드 프로젝트. 나는 그것이 모든 것이 분명하게 필요한 것이라고 설명한다.

쓰레드는 작업 부하를 분리하여 분리하는 또 다른 메커니즘입니다   실행 스트림. 스레드는 프로세스보다 가벼운 무게입니다. 이   즉, 전체 프로세스보다 유연성이 떨어지지 만   운영 체제가 더 적기 때문에 더 빨리 시작될 수 있습니다.   설정. 프로그램이 두 개 이상의 스레드로 구성되어 있으면 모든   스레드는 단일 메모리 공간을 공유합니다. 프로세스에는 별도의 주소 공간이 제공됩니다.   모든 스레드는 단일 힙을 공유합니다. 그러나 각 스레드에는 자체 스택이 제공됩니다.


  • 이미 스레드 대 프로세스를 이해하는 관점에서 나오지 않는 한 확실하지는 않습니다. 그들이 서로 어떻게 관련되어 있는지 추가하는 것이 유용 할 수 있습니다. - Smithers
  • 확실하지 않습니다. 하나의 프로세스와 스레드만을 의미합니까? 각각에 많은 스레드가있는 많은 프로세스가 있다면 어떻게 될까요? 모든 스레드가 단일 메모리 공간을 공유합니까? 그 모든 과정 중? - Green

6

  1. 기본적으로 스레드는 프로세스 스레드가 작동하지 않는 프로세스의 일부입니다.
  2. 쓰레드는 가볍지 만 프로세스는 가볍습니다.
  3. 프로세스 간 통신에는 약간의 시간이 필요하지만 스레드는 더 적은 시간이 필요합니다.
  4. 스레드는 동일한 메모리 영역을 공유 할 수 있지만 프로세스는 별도로 존재합니다.


6

방법: 실행중인 프로그램을 프로세스라고합니다.

: 스레드는 "다른 스레드와 하나"라는 개념을 기반으로 프로그램의 다른 부분과 함께 실행되는 기능이므로 스레드는 프로세스의 일부입니다.


  • 나쁘지 않은데, 질문을하는 누군가에게 외국어가 될 가능성이있는 새로운 개념 ( "다른 사람과")을 소개합니다. - Smithers
  • 게시물은 코드 형식이지만 일반 텍스트 여야합니다. - Heinrich

6

http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

Linus Torvalds (torvalds@cs.helsinki.fi)

화, 1996 년 8 월 6 일 12시 47 분 31 초 +0300 (EST DST)

메시지 정렬 기준 : [날짜] [스레드] [제목] [작성자]

다음 메시지 : Bernd P. Ziller : "Re : get_hash_table의 죄송합니다"

이전 메시지 : Linus Torvalds : "Re : I / O 요청 순서"

1996 년 8 월 5 일 월요일, Peter P. Eiserloh는 다음과 같이 썼습니다.

스레드의 개념을 명확하게 유지해야합니다. 너무 많은 사람들     스레드를 프로세스와 혼동하는 것 같습니다. 다음 토론     리눅스의 현재 상태를 반영하는 것이 아니라 오히려     고차원 토론에 머무려고 노력하십시오.

아니!

"쓰레드"와 "프로세스"가   별도의 개체. 그것이 전통적으로 행해진 방법이지만,   개인적으로 그렇게 생각하는 것은 큰 실수라고 생각합니다. 유일한   그렇게 생각하는 이유는 역사적인 수하물입니다.

스레드와 프로세스는 실제로 한 가지 일뿐입니다.   인위적으로 다른 사례를 구별하려는 시도는   자기 제한.

COE라고 불리는 "실행의 맥락"은 단지 재벌이다.   그 COE의 모든 주. 그 상태는 CPU와 같은 것을 포함합니다.   상태 (레지스터 등), MMU 상태 (페이지 매핑), 권한 상태   (uid, gid) 및 다양한 "통신 상태"(열린 파일, 신호   핸들러 등). 전통적으로 "스레드"와   "프로세스"는 주로 스레드가 CPU 상태 (+ 가능   어떤 다른 최소한의 상태), 다른 모든 상황은   방법. 그러나 그것은 단지하나COE의 전체적인 상태를 나누는 방법이며, 그것을하는 올바른 방법이라고 말하는 것은 없습니다. 자신을 제한하기   그 종류의 이미지에 그냥 바보입니다.

리눅스가 이것 (그리고 내가 일을하고 싶은 방식)에 대해 생각하는 방식은   그곳에~이다."프로세스"또는 "스레드"같은 것은 없습니다. 있다   COE의 전체 성 (Linux에 의한 "태스크"라고 함). 다른 COE   그들의 맥락의 일부를 서로 공유 할 수 있고, 하나는부분 집합의   공유는 전통적인 "스레드"/ "프로세스"설정이지만 그   실제로 하위 집합으로 만 표시되어야합니다 (중요한 하위 집합이지만   그 중요성은 디자인이 아니라 표준에서 비롯됩니다.   Linux 기반의 표준 준수 쓰레드 프로그램을 실행하고 싶다.   너무).

즉, 스레드 / 프로세스 사고 방식을 중심으로 디자인하지 마십시오. 그만큼   커널은 COE 사고 방식을 중심으로 설계되어야하며,   pthreads도서관제한된 pthreads 인터페이스를 사용자에게 내보낼 수 있습니다.   누가 COE를 보는 그 방법을 사용하고 싶어하는지.

COE를 다음과 같이 생각할 때 가능한 일의 예처럼   스레드 / 프로세스에 반대 :

  • 외부 "cd"프로그램을 할 수 있습니다. 유닉스 및 / 또는 프로세스 / 쓰레드에서 전통적으로 불가능한 것입니다. (바보 같은 예입니다.   이러한 종류의 "모듈"을 가질 수 있다는 것입니다.   전통적인 UNIX / threads 설정). 수행 :

클론 (CLONE_VM | CLONE_FS);

자식 : execve ( "external-cd");

/ * "execve ()"는 VM의 연결을 끊습니다.   CLONE_VM을 사용하면 복제 작업이 빨라졌습니다 * /

  • "vfork ()"를 자연스럽게 수행 할 수 있습니다 (최소한의 커널 지원 만 제공하지만 CUA의 사고 방식에 완벽하게 부합합니다).

복제 (CLONE_VM);

자식 : 계속 실행, 결국 execve ()

어머니 : execve를 기다립니다.

  • 외부 "IO deamons"를 수행 할 수 있습니다.

클론 (CLONE_FILES);

자식 : 열린 파일 기술자 등

어머니 : fd의 아이를 열어서 사용하십시오.

위의 모든 작업은 스레드 / 프로세스에 묶여 있지 않기 때문에 가능합니다.   사고 방식. 예를 들어 웹 서버를 생각해보십시오. CGI   스크립트는 "실행 스레드"로 수행됩니다. 너는 그것으로 할 수 없다.   전통적인 스레드는 항상 공유해야하기 때문에   전체 주소 공간, 그래서 당신은 모든 것을 연결해야 할거야.   웹 서버 자체에서 수행하고 싶었습니다 ( "스레드"가 다른 스레드를 실행할 수 없음).   실행 파일).

이를 대신 "실행 컨텍스트"문제로 생각하면   태스크는 이제 외부 프로그램을 실행하도록 선택할 수 있습니다 (=   부모로부터의 주소 공간) 등을 원하는지, 아니면   부모와 모든 것을 공유하는 예제파일   설명자 (하위 "스레드"가   부모님은 걱정할 필요가 있습니다.   하위 "스레드"가 종료되고 부모에서 fd를 사용하지 않습니다).

예를 들어 스레드 된 "inetd"를 생각해보십시오. 낮은 오버 헤드를 원한다.   fork + exec를 사용하면 리눅스에서 "fork ()"대신에 "   각 스레드가 만들어지는 다중 스레드 inetd를 작성합니다.   CLONE_VM (주소 공간을 공유하지만 파일 설명자는 공유하지 않음)   기타). 그런 다음 외부 서비스 인 경우 자녀가 execve 할 수 있습니다 (rlogind,   예를 들어) 또는 내부 inetd 서비스 중 하나 일 수 있습니다.   (echo, timeofday) 어떤 경우에는 그냥 일을하고 종료합니다.

"스레드"/ "프로세스"로는이를 수행 할 수 없습니다.

리누스


5

임베디드 세계에서 나온 프로세스의 개념은 "큰"프로세서에만 존재한다고 덧붙이고 싶습니다. (데스크탑 CPU, ARM Cortex A-9), MMU (메모리 관리 장치) 및 MMU 사용을 지원하는 운영 체제 (예 :리눅스). 소형 / 구형 프로세서 및 마이크로 컨트롤러 및 소형 RTOS 운영 체제 (실시간 운영 체제), freeRTOS와 같이 MMU 지원이 없으므로 프로세스가없고 스레드 만 존재합니다.

서로 다른 메모리에 액세스 할 수 있으며 인터럽트 방식으로 OS별로 예약되므로 병렬로 실행되거나 실제로 병렬로 실행되는 다중 코어로 실행됩니다.

프로세스는 반면에 MMU가 제공하고 보호하는 가상 메모리의 사적인 샌드 박스에서 살고 있습니다. 이것은 다음을 가능하게 해주기 때문에 편리합니다.

  1. 버그가있는 프로세스가 전체 시스템을 손상시키는 것을 방지합니다.
  2. 다른 프로세스 데이터를 보이지 않게하여 보안 유지 도달 할 수 없습니다. 프로세스 내부의 실제 작업은 하나 이상의 스레드에 의해 처리됩니다.


5

  1. 스레드는 공유 메모리 공간에서 실행되지만 프로세스는 별도의 메모리 공간에서 실행됩니다.
  2. 스레드는 경량 프로세스이지만 프로세스는 무거운 프로세스입니다.
  3. 스레드는 프로세스의 하위 유형입니다.


  • 이것은 매우 재귀 적으로 느껴집니다. 아마도 스레드와 프로세스 간의 관계가 확장되면 더 나은 대답이 될 것입니다. - Smithers

4

멀티 스레딩을 통합 한 파이썬 (인터프리터 언어) 알고리즘을 구축하는 동안 이전에 작성한 순차 알고리즘과 비교할 때 실행 시간이 더 좋지 않다는 사실에 놀랐습니다. 이 결과에 대한 이유를 이해하기 위해 필자는 약간의 독서를했으며, 내가 배운 것은 멀티 스레딩과 다중 프로세스 간의 차이점을보다 잘 이해할 수있는 흥미로운 컨텍스트를 제공한다고 믿습니다.

멀티 코어 시스템은 다중 스레드 실행을 수행 할 수 있으므로 파이썬은 멀티 스레딩을 지원해야합니다. 그러나 파이썬은 컴파일 된 언어가 아니며 해석 된 언어입니다.1. 즉, 프로그램을 실행하려면 해석해야하며 인터프리터는 실행을 시작하기 전에 프로그램을 알지 못합니다. 그러나 이것이 알고있는 것은 파이썬의 규칙이며, 그 규칙을 동적으로 적용합니다. 따라서 파이썬의 최적화는 인터프리터 자체의 최적화가되어야하며 실행될 코드는 최적화되어서는 안됩니다. 이것은 C ++와 같은 컴파일 된 언어와 대조적이며 파이썬에서 멀티 스레딩에 영향을 미칩니다. 특히 파이썬은 글로벌 인터프리터 잠금을 사용하여 멀티 스레딩을 관리합니다.

반면에 컴파일 된 언어는 잘 컴파일됩니다. 프로그램은 "전체적으로"처리됩니다. 먼저 구문 론적 정의에 따라 해석 된 다음 언어에 구속받지 않는 중간 표현으로 매핑되고 마지막으로 실행 가능 코드로 링크됩니다. 이 프로세스를 사용하면 컴파일 할 때 모두 사용할 수 있기 때문에 코드를 고도로 최적화 할 수 있습니다. 다양한 프로그램 상호 작용과 관계는 실행 파일이 생성되고 최적화에 대한 강력한 결정이 내려 질 때 정의됩니다.

현대 환경에서 파이썬의 인터프리터는 멀티 스레딩을 허용해야하며 이는 안전하고 효율적이어야합니다. 이것은 해석 된 언어 대 컴파일 된 언어의 차이점이 그림에 들어가는 곳입니다. 인터프리터는 다른 스레드의 내부 공유 데이터를 방해하지 않아야하며 동시에 계산을 위해 프로세서 사용을 최적화해야합니다.

이전 게시물에서 언급했듯이 프로세스와 스레드는 모두 독립적 인 순차 실행이며 프로세스의 여러 스레드간에 메모리가 공유되는 반면 프로세스는 메모리 공간을 격리합니다.

파이썬에서 데이터는 글로벌 인터프리터 잠금 (Global Interpreter Lock)에 의해 다른 스레드에 의한 동시 액세스로부터 보호됩니다. 모든 파이썬 프로그램에서 언제든지 하나의 스레드 만 실행할 수 있어야합니다. 반면에 각 프로세스의 메모리는 다른 프로세스와 분리되어 있으며 여러 코어에서 프로세스를 실행할 수 있기 때문에 여러 프로세스를 실행할 수 있습니다.


1도널드 크 누스 (Donald Knuth)는 컴퓨터 프로그래밍의 기술 : 기본 알고리즘 (Basic Algorithms)의 해석 루틴에 대해 잘 설명합니다.


4

Linux Kernel의 OS보기에서 답변하려고합니다.

프로그램이 메모리로 시작되면 프로세스가됩니다. 프로세스는 컴파일 된 코드 저장을위한 텍스트 세그먼트, 초기화되지 않은 정적 또는 전역 변수 저장을위한 .bss 등과 같은 메모리의 다양한 세그먼트를 갖는 자체 주소 공간을 갖습니다. 각 프로세스는 자체 프로그램 카운터 및 사용자 spcae스택. 커널 내부에서 각 프로세스는 자체 커널 스택 (보안 문제를 위해 사용자 공간 스택과 분리되어 있음)과 구조체task_struct프로세스 제어 블록으로 일반적으로 추상화되어 프로세스의 우선 순위, 상태 (및 다른 많은 청크 전체)와 같은 프로세스에 관한 모든 정보를 저장합니다. 프로세스는 여러 스레드의 실행을 가질 수 있습니다.

쓰레드에 도착하면 프로세스 내부에 상주하며 부모 프로세스의 주소 공간을 파일 시스템 리소스, 보류중인 신호 공유, 데이터 공유 (변수 및 명령어)와 같이 쓰레드 생성 중에 전달할 수있는 다른 리소스와 함께 공유하므로 쓰레드가 가볍고 빠른 컨텍스트 스위칭이 가능합니다. 커널 내부의 각 스레드는 고유 한 커널 스택과task_struct스레드를 정의하는 구조체. 따라서 커널은 다른 엔티티와 동일한 프로세스의 스레드를보고 자체적으로 스케줄 가능합니다. 동일한 프로세스의 스레드는 스레드 그룹 ID (tgid), 그들은 또한 프로세스 ID로 불리는 유일한 id를 가진다 (pid).


4

시각화를 통해 학습하는 것이 더 편한 사람들을 위해, 여기 프로세스와 스레드를 설명하기 위해 만든 편리한 다이어그램이 있습니다.

나는 MSDN에서 정보를 사용했다 -프로세스 및 스레드 정보

Processes and Threads


  • 추가하는 것이 흥미로울 수도 있습니다.다른멀티 스레딩과 멀티 프로세싱의 비교 방법을 살펴 보겠습니다. - Bram Vanroy

3

동일한 프로세스 내의 스레드는 메모리를 공유하지만 각 스레드는 자체 스택과 레지스터를 가지며 스레드는 스레드 특정 데이터를 힙에 저장합니다. 스레드는 독립적으로 실행되지 않으므로 프로세스 간 통신과 비교할 때 스레드 간 통신이 훨씬 빠릅니다.

프로세스는 동일한 메모리를 공유하지 않습니다. 하위 프로세스가 생성되면 상위 프로세스의 메모리 위치가 복제됩니다. 프로세스 통신은 파이프, 공유 메모리 및 메시지 구문 분석을 사용하여 수행됩니다. 스레드 간의 상황 전환은 매우 느립니다.


2

그것들은 거의 동일합니다 ... 그러나 중요한 차이점은 쓰레드가 가볍고 컨텍스트 스위칭, 작업로드 등의 측면에서 프로세스가 무겁다는 것입니다.


  • 당신은 당신의 대답을 확장 할 수 있습니까? - Fiver
  • 스레드는 하위 프로세스이며 코드, 데이터, 프로세스와 같은 공통 리소스를 공유합니다. 두 프로세스가 리소스를 공유 할 수없는 경우 (예외는 프로세스 (상위) 포크가 다른 프로세스 (하위)를 작성한 다음 기본적으로 공유 리소스).이 컨텍스트에서는 스레드가 훨씬 가볍지 만 CPU에 대한 리소스에는 높은 페이로드가 필요합니다. 두 가지 모두 같은 점이 있습니다. 시나리오에서는 I / O로 인해 단일 스레드 프로세스가 차단 된 것으로 간주하고 전체 1이로 이동합니다. 대기 상태이지만 다중 스레드 프로세스가 I / O에 의해 차단 될 경우 해당 스레드는 해당 I / O 관련 스레드 만 차단됩니다. - Nasir Ul Islam Butt

2

필자가 보았던 가장 좋은 짧은 정의는 Michael Kerrisk의 'The Linux Programming Interface'에서 나온 것이다.

현대 UNIX 구현에서 각 프로세스는 다중 스레드를 가질 수 있습니다   실행의. 스레드를 예상하는 한 가지 방법은 프로세스 집합   동일한 가상 메모리를 공유 할뿐만 아니라 다른 가상 메모리를 공유합니다.   속성. 각 스레드는 동일한 프로그램 코드를 실행하고 공유합니다.   같은 데이터 영역과 힙. 그러나 각 스레드에는 자체 스택이 있습니다.   지역 변수 및 함수 호출 연결 정보를 포함합니다. [LPI 2.12]


1

예 1 : JVM은 단일 프로세스로 실행되며 JVM의 스레드는 해당 프로세스에 속한 힙을 공유합니다. 그래서 여러 스레드가 동일한 객체에 액세스 할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간을 갖습니다. 이것은 메소드의 한 스레드의 호출과 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 보호되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으므로 스레드의 안전을 위해 동기화되어야합니다.


1

소유권 단위 또는 작업에서 필요한 리소스와 같은 프로세스를 고려하십시오. 프로세스는 메모리 공간, 특정 입 / 출력, 특정 파일 및 우선 순위 등과 같은 자원을 가질 수 있습니다.

쓰레드는 디스패치 할 수있는 실행 단위이거나 간단한 단어로 일련의 명령을 통한 진행

연결된 질문


관련된 질문

최근 질문