[Tistory] [Operating System] 프로세스 vs 스레드

원글 페이지 : 바로가기

Process(프로세스) & Thread(스레드)? 프로세스는 다음과 같이 정의한다. 운영체제로부터 자원을 할당받은 작업의 단위 스레드는 다음과 같이 정의한다. 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위 한줄로 정의하면 프로세스는 작업의 단위이며 스레드는 실행 흐름듸 단위라고 할 수 있다. 프로그램과 프로세스 정적 프로그램(Static Program) 프로그램은 컴퓨터에서 실행할 수 있는 파일을 통칭한다. 단, 아직 파일을 실행하지 않은 상태이기 때문에 정적 프로그램 줄여서 프로그램이라고 부른다 프로그램은 자바나 C언어를 이용해 코드를 작성하여 완성한다. 즉, 프로그램은 코드 덩어리로 볼 수 있다. 프로세스(Process) 프로세스는 프로그램을 실행시켜 정적인 프로그램이 동적으로 변하여 프로그램이 돌아가고 있는 상태를 뜻한다. 즉, 컴퓨터에서 작업 중인 프로그램을 의미한다. 모든 프로그램은 운영체제가 실행되기 위한 공간을 할당해줘야 실핼될 수 있다. 프로그램을 실행하는 순간 파일은 컴퓨터 메모리에 올라가게되고, 운영체제로부터 시스템 자원을 할당받아 프로그램 코드를 실행한다. 스레드(Thread) 프로세스의 한계 과거에는 프로그램을 실행할 때 하나의 프로세스를 사용하였다. 하지만 기술이 발전됨에 따라 프로그램이 복잡해지고 다채로워짐으로써 프로세스 하나로는 프로그램을 실핼하기에는 한계가 있었다. 동일한 프로그램을 여러 프로세스로 만들게 된다면 그만큼 메모리도 차지하고 CPU에서 할당받는 자원이 중복될 것이다. 스레드는 이러한 프로세스 특성의 한계를 해결하기 위해 탄생 하였다. 스레드의 개념 스레드란, 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위를 말한다. 하나의 프로세스가 실행된다면 여러 작업을 동시에 진행할 수 있다. 즉, 하나의 프로세스 안에서 여러가지 작업의 흐름이 동시에 진행되기 때문에 가능한 것 일련의 작업 흐름들을 스레드라고 하며 여러개가 있다면 이를 멀티(다중) 스레드 라고 부른다. 일반적으로 하나의 프로그램은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다. 즉, 프로세스를 생성하면 기본적으로 하나의 main 스레드가 생성되게 된다. 프로세스 & 스레드의 메모리 프로세스의 자원 구조 프로그램이 실행되어 프로세스가 만들어지면 4가지 메모리 영역으로 구성되어 할당된다. 코드(Code) 영역 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있다. 데이터(Data) 영역 코드가 실행되면서 사용되는 전역 변수나 각종 데이터들이 모여있다. 스택(Stack) 영역 지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간이다. Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 끝나면 완전히 소멸한다. 만일 Stack의 영역을 초과하면 Stack Overflow 에러가 발생한다. 힙(Heap) 영역 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. Stack과 Heap 영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어들기도 하는 동적 영역이다. 코드 영역과 데이터 영역은 선언할 때 크기가 결정되는 정적 영역이다. 스레드의 자원 공유 스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위로서, 스레드가 여러개 있으면 동시에 작업을 진행할 수 있다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능한 것 프로세스의 4가지 영역 중 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 고유하기 때문에 서로 다른 스레드에서 읽고 써야한다. 독립적은 스택을 가지고 있는 것은 독립적인 함수 호출이 가능하다는 뜻 독립적인 함수 호출이 가능한 것은 독립적인 실행 흐름이 추가되었다는 말 즉, stack을 가짐으로써 스레드는 독립적인 실행 흐름을 가질 수 있게 되는 것 반면에 프로세스는 기본적으로 프로세스 끼리 다른 프로세스의 메모리에 직접 접근할 수는 없다. 위처럼 구성된 이유는 하나의 프로세스를 다수의 실행 단위인 스레드로 구분하여 자원을 공유하고, 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 올리기 위해서다. 프로세스의 자원 공유 기본적으로 각 프로세스는 메모리에 별도의 주소 공간에서 실행된다. 따라서 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다. 하지만 특별한 방법을 통해 프로세스가 다른 프로세스의 정보에 접근하는 것이 가능하다. IPC(Inter-Process Communcation) LPC(Local Inter-Process Communcation) 별도의 공유 메모리를 만들어서 정보를 주고 받도록 설정 프로세스의 자원 공유는 단순히 CPU 레지스터 교체뿐만 아니라 RAM과 CPU 사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다는 단점이 있다. 다중 작업이 필요한 경우 스레드를 이용하는 것이 효율적이라, 다중 프로세싱을 지원하지만 다중 스레딩을 기본으로 하고 있다. 프로세스 & 스레드의 동시 실행 원리 여러 작업을 동시에 할 수 있는 것은 컴퓨터의 내부에서 프로세스와 스레드를 동시에 처리하는 멀티 테스킹 기술 때문이다. 동시에 처리하는 것은 CPU가 동시에 여러 프로그램을 실행하는 것이 아닌 내부적으로 복잡한 원리에 의해 처리된다. 멀티 코어와 스레드 CPU 한개는 여러 개의 코어를 가질 수 있다. 코어는 CPU 코어 유닛을 뜻한다. 즉, 4코어는 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛이 4개가 있는 것이다. 4코어 8스레드의 CPU 4코어는 물리적 코어 갯수를 뜻한다. 8스레드는 논리적 코어 갯수를 뜻한다. 이 경우 물리적 코어 한 개가 스레드 두 개이상을 동시에 실행 가능한 것 이를 하이퍼 스레딩(Hyper-Threading) 기술이라고 말한다. CPU의 스레드는 하드웨어적 스레드이며 프로그램의 스레드는 소프트웨어적 스레드를 뜻한다. 컴퓨터를 이용할 때 수십, 수백개의 프로그램을 동시에 실행할 수 있는 것은 병렬성(Parallelism)과 동시성(Concurrency)에 의해 처리된다. CPU의 작업 처리 방식 병령성(Parallelism) 병렬성은 직관적으로 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛인 여러개의 코어에 맞춰 여러개의 프로세스, 스레드를 돌려 병렬로 작업을 동시 수행하는 것을 말한다. 듀얼코어, 옥타코어 등의 명칭이 붙는 멀티 코어 프로세서가 달린 컴퓨터에서 할 수 있는 방식 동시성(Concurrency) 동시성은 둘 이상의 작업이 동시에 실행되는 것을 의미한다. Parallelism은 물리적으로 정말로 동시에 실행하는 것 Concurrency는 동시에 실행하는 것처럼 보이게 하는 것 1개의 코어가 있고 4개의 작업이 있다고 가정 프로세스들을 계속 번갈아가면서 조금씩 처리함으로써 마치 프로그램이 동시에 실행되는 것 처럼 보이는 것 프로세스들을 번갈아가면서 매우 빠르게 처리하기 때문에 컴퓨터를 모르는 사람들이 보면 마치 동시에 돌아가는 것처럼 보이게 된다. 단, 이때 작업들을 번갈아가면서 실행할때 작업들을 아주 잘게 나누어 아주 조금씩만 작업을 수행하고 다음 작업으로 넘어가는 식으로 동작된다. 여러 작업을 동시에 처리하는 것처럼 보이게 만들어, 사용자에게 더 빠른 반응성을 제공하기 위해서다. 진행 중인 작업들을 A → B → C → D 로 번갈아 바꾸는 것을 Context Switching 이라고 부른다. 동시성이 필요한 이유 동시성(Concurrency)은 동시에 돌아가는 것 처럼 보이는 거지, 정말 실제로 동시에 돌아가는 것이 아니기 때문에 최종 작업이 걸리는 시간은 거의 차이가 없을 것이다. 병렬성은 정말로 각 코어에 프로세스를 나눠 실행하는 거니까 듀얼 코어면 반 이상 줄어들 것 첫번째는 하드웨어적 한계 때문 CPU 발열 때문에 성능을 올리기에는 한계에 봉착됬기 때문에 코어의 성능을 올리는 대신 코어를 여러개 탑재하여 쿼드 코어, 옥타 코어 CPU들을 출시하고 있다. 하지만 아무리 코어를 많이 넣어도 수십개의 코어를 넣은순 없으니 결국 하드웨어적 제한이 걸리게 되고 수십수백개의 프로세스를 돌리기 위해선 결국 동시성이 필요한 것 두번째는 보다 논리적인 효율적인 이유 때문 4코어 8스레드의 CPU 환경에서 현재 총 16개의 작업이 있다고 가정하면 그중 8개는 오래 걸리는 작업이고, 나머지 8개는 짧은 시간을 필요로 하는 작업일 경우 만일 최악의 경우 8개의 오래 걸리는 작업이 먼저 동시에 처리되기 시작했다면 나머지 가벼운 8개의 작업은 처리하는데 짧은 시간이 걸리는 데에도 불구하고 현재 처리중인 8개의 작업이 다 끝날때 까지 기다려야 할 것 비효율적인 면을 극복하기 위해 작업을 아주 잘게 나눠 번갈아 가면서 처리하는 동시성 개념을 채택한 것 최대 8개의 작업에 대해서 8개의 논리적인 스레드가 병렬적으로 아주 빠르게 동시적으로 작업을 하면서, 그보다 많은 수십개의 소프트웨어적 스레드가 있다면 적절히 병렬성과 동시성을 섞어 동시에 돌리게 되게 된다. 멀티 프로세스 & 스레드 멀티 프로세스 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것 장점 안전성 메모리 침범 문제를 OS 차원에서 해결 단점 각각 독립된 메모리 영역을 갖고 있어, 작업량 많을 수록 오버헤드 발생. Context Switching으로 인한 성능 저하 Context Switching? 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정 즉, 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던 프로세스 상태를 복구하는 과정을 말함 프로세스는 각 독립된 메모리 영역을 할당받아 사용되므로, 캐시 메모리 초기화와 같은 무거운 작업이 진행되었을 때 오버헤드가 발생할 문제가 존재함 멀티 스레드 하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것 스레드들이 공유 메모리를 통해 다수의 작업을 동시에 처리하도록 해줌 장점 독립적인 프로세스에 비해 공유 메모리만큼의 시간, 자원 손실이 감소 전역 변수와 정적 변수에 대한 자료 공유 가능 단점 : 안전성 문제 하나의 스레드가 데이터 공간 망가뜨리면, 공유 메모리를 갖기 때문에 모든 스레드가 작동 불능 상태에 빠짐 멀티스레드의 안전성에 대한 단점은 Critical Section 기법을 통해 대비함 하나의 스레드가 공유 데이터 값을 변경하는 시점에 다른 스레드가 그 값을 읽으려할 때 발생하는 문제를 해결하기 위한 동기화 과정 출처 https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4 👩‍💻 ‍완전히 정복하는 프로세스 vs 스레드 개념 한눈에 이해하는 프로세스 & 스레드 개념 전공 지식 없이 컴퓨터의 프로그램을 이용하는데는 문제 없어 왔지만 소프트웨어를 개발하는 사람으로서 컴퓨터 실행 내부 요소를 따져보게 될때, 아 inpa.tistory.com https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html [OS] 프로세스와 스레드의 차이 – Heee’s Development Blog Step by step goes a long way. gmlwjd9405.github.io https://velog.io/@aeong98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C [운영체제] 프로세스와 스레드 💡 프로세스와 스레드의 차이? ✅ 프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위✅ 스레드 : 프로세스가 할당받은 자원을 이용하는 \*\*실행 흐름의 단위 💁 멀티스레드의 장단점 ? velog.io https://velog.io/@kwontae1313/%EB%8F%99%EC%8B%9C%EC%84%B1%EA%B3%BC-%EB%B3%91%EB%A0%AC%EC%84%B1%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%B0%A8%EC%9D%B4 동시성과 병렬성의 개념과 차이 😀CS를 준비하면서 동시성과 병렬성을 비교해서 설명하라는 예상질문을 보았다. 근데 비교에서 설명한다면 서로의 차이점에 대해서만 설명하게 되지않을까? 일단 동시성과 병렬성이라는 기본 velog.io https://github.com/gyoogle/tech-interview-for-developer GitHub – gyoogle/tech-interview-for-developer: 👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖 👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖. Contribute to gyoogle/tech-interview-for-developer development by creating an account on GitHub. github.com

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다