- 컴퓨터에서 연속적으로 실행되고 있는 프로그램
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
- 간단히... 실행중인 프로그램
운영체제로 부터 시스템 자원을 할당받는 작업의 단위가 바로 '프로세스' 이고,
동적인 개념으로는 실행되고 있는 프로그램을 의미한다.
- 프로세스가 할당받은 자원을 이용하는 실행의 단위
- 하나의 프로세스에서 특정한 수행경로
- 하나의 프로세스(실행중인 프로그램)내에서 여러 개의 실행 흐름을 두기 위한 모델
Q : 스레드에서 왜 스택만 따로 할당하는가?
A : 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다. 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.....
한마디로 스택을 스레드끼리 공유하면 스택의 특성때문에 여러 스레드의 작업이 꼬일것... 스택을 생각해보면 FILO인데...데이터가 만약 같이 있으면... 그냥 한꺼번에 쌓일거고...원할한 실행 흐름을 위해 스레드 별로 독립적으로 존재하게됨.(확실하지는 않고 내생각)
Q: 레지스터를 스레드마다 독립적으로 할당하는 이유
A:레지스터(PC)는 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다.
스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당한다.
그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다. 따라서 PC 레지스터를 독립적으로 할당한다.
여러개의 프로세스를 생성해서 이를 이용해 하나의 작업을 병렬적으로 처리하는 과정을 의미한다.
예) 웹 사이트(크롬, 사파리등)의 각 탭
프로세스들은 서로 독립적인 형태로 존재하고 실행되기 때문에 하나의 프로세스에 오류가 발생하거나 죽더라도 다른 프로세스에는 영향을 미치지 않고 정상적으로 실행이 가능하다.
CPU는 한 번에 한 개의 Process만 처리가 가능하다. 우리 눈에는 여러 개의 작업이 동시에 실행되는 것 처럼 보일지 몰라도 CPU는 계속해서 특정 업무를 처리하는 Process들을 바꿔주는 일을 내부적으로 진행하고 있다.
즉 ! 이렇게 현재 진행중이던 Process의 지금까지의 연산결과, 혹은 어디까지 진행되었는지 이러한 정보들을 PCB에 저장하고, 이제 실행되려는 Process에게 CPU를 할당해 주어야 한다.
이렇게 하나의 Process에 대한 정보들을 저장해 놓고, 새로운 Process에 대한 정보를 가져오고 메모리를 할당해주는 이러한 과정을 'Context Switching(문맥교환)' 이라고 한다.
이 문맥교환이 이뤄지기 위해서는 운영체제에서 프로세스들의 정보를 관리하고 있는 PCB에 접근해야 하고 이 과정을 위해서 'System Call' 이라고 불리는 절차를 진행하게 된다.
즉 ! Multi - Process로 진행하게 될 경우, 이러한 Context Switching이 자주 일어나게 될 것이다. 그런데 문제점은 Context Switching 동안(정보를 저장하고 새로운 정보를 설정하는 동안)에는 CPU는 아무런 작업도 하지 못하게 된다.
따라서 이러한 Context Switching이 너무 자주 일어나게 되면 오버헤드가 발생할 수 있고 CPU의 성능 또한 저하될 수 있다.
작업을 진행하던 도중 Process들끼리 서로의 자원을 사용하고 싶은 경우를 생각해보자.
이 경우에는 Process 간의 통신을 진행하면 된다. 이 때 IPC(Inter - Process Communication)를 이용하게 되는데
이는 비용적으로 많은 부담이 든다고 한다.
프로세스는 실행될 때 마다 각각에 고유한 메모리 영역을 할당해 주어야 하기 때문에 프로세스가 많으면 많아질수록
더 많은 메모리 공간을 차지하게 된다.
Context Switching이란?
현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정을 말합니다.
관련 자료 : https://nesoy.github.io/articles/2018-11/Context-Switching
하나의 프로세스 내에서 여러 개의 스레드를 생성함으로써 이를 이용해 작업을 처리하는 과정을 의미한다.
예) Word- 그림도 올리고 맞춤법 검사도 해주는(빨간줄)
먼저 하나의 프로세스 내에서 메모리 공간을 공유하는 형태로 존재하는 스레드이기 때문에 메모리 공간을 멀티 프로세스에 비해서 적게 차지한다는 장점이 있다. 또한 이러한 점 때문에 시스템의 자원 소모를 절약할 수 있다는 장점도 존재한다.
스레드는 이전 글(프로세스와 스레드)에서 스레드는 메모리 공간을 공유한다고 했었다.
즉 ! 별도의 통신 방법 혹은 별도의 자원을 이용해서 스레드 간의 통신을 진행하는 것이 아니라, 공유하고 있는 메모리 영역인
Code , Data , Heap 영역을 통해서 데이터를 주고 받을 수 있다. 따라서 통신에 대한 방법도 훨씬 간단하고 그 비용도 훨씬
절약할 수 있다는 장점이 있다.
스레드의 문맥교환은 프로세스의 문맥교환과 달리 Cache Memory를 비울 필요가 없기 때문에 속도면에서 훨씬 더 빠르고 CPU의 부담도 훨씬 덜 가게 된다. 이러한 점 때문에 시스템의 처리율이 향상되고 프로그램의 응답시간이 단축되어 진다.
멀티 스레드와 멀티 프로세스의 공통점 : 여러개의 작업을 동시에 혹은 병렬적으로 처리함으로써 작업속도를 높일 수 있다는 점!
멀티스레드 vs 멀티프로세스
멀티프로세스 대신 멀티 스레드를 사용하는 이유?
프로그램을 여러 개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이다.
멀티프로세스로 할 수 있는 작업을 멀티 스레딩으로 하는 이유?
프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
프로세스 간의 Context Switching시 오버헤드가 크기 때문.
스레드는 프로세스 내의 메모리를 공유하기 때문에 스레드간 데이터를 주고 받는 것이 간단해지고 시스템 자원소모가 줄어든다.
참고 1 : https://yabmoons.tistory.com/615
참고 2 : https://eun-jeong.tistory.com/20
파이썬 멀티스레딩, 멀티프로세스
https://chacha95.github.io/2020-12-19-python4/