-
[OS] 프로세스와 스레드(Process vs Thread)CS/OS 2022. 6. 21. 22:55728x90
Process & Thread
컴퓨터가 어떠한 일을 하는 상태를 프로세스라고 합니다.
우리가 오늘날 쾌적하게 컴퓨터를 사용할 수 있는건 운영체제가 여러 프로세스를 함께 돌리기 때문입니다.
프로세스를 돌리는 방식은 두가지입니다.
- 동시성(Concurrency)
- 작업을 조금씩 바꿔가면서 진행하는 것. Context Switch 알고리즘을 사용한다.
- 병렬성(Parallelism)
- 프로세스 하나에 코어가 여러개 달려 각각 여러개 작업을 하는 것 입니다.
- cpu의 속도가 발열 등의 제한으로 발전 속도가 느려지자 코어를 여러개 다는 방식을 선택한 것입니다.
자 이제 컴퓨터는 여러개의 프로세스를 돌릴 수 있게 됐는데 하나의 프로세스 내에서도 여러개의 일을 하고싶습니다.
예를 들어, 인터넷에서 게임을 설치 하면서 웹 서칭도 하고 싶은 것 처럼요.
즉, 한 프로세스 내에 여러 작업이 동시에 가능해야 합니다. 이 갈래들이 스레드입니다.
다른 예로,
프로세스는 프로세스 별로 주방(냉장고, 싱크대, 조리도구 등)을 배정받아 요리를 한다. 프로세스가 요리를 하다가 15분이 지나면 하던 요리를 멈추고 사진을 찍어서 어디까지 요리를 했는지, 싱크대에 어떤 재료들이 있었는지, 냉장고에 어떤 재료들이 있었는지 기록을 한다. 그 다음 다른 프로세스를 위해 냉장고, 싱크대, 조리도구 모두 처음 상태로 세팅을 하고 넘겨준다.
여러 프로세스가 각각 요리를 하면 몇몇 프로세스가 요리를 망치거나 주방에서 무슨 일이 발생하더라도 주방을 따로 쓰기 때문에 다른 프로세스들의 요리에는 영향이 없다.
스레드는 한 주방에서 싱크대와 조리도구만 따로 배정받아 사용하고 냉장고는 공용으로 사용을 한다. 따라서 15분이 지난 후 다른 스레드에게 자리를 비워줘야 할 때 싱크대와 조리도구만 정리하면 되므로 프로세스에 비해 세팅 시간과 비용이 적게 든다.
스레드는 냉장고를 공용으로 사용하므로 한 스레드가 특정 재료를 독점적으로 사용하면 다른 스레드들이 그 재료를 사용할 수 없는 문제가 발생할 수 있다. 그리고 한 스레드에 무슨 일이 생기면(불이 난다던가) 한 주방에서 다 같이 요리를 하므로 모든 스레드에 문제가 생길 수 있다.
Process(프로세스)
프로그램이 실행되면(OS로부터 시스템 자원을 할당받으면) 프로세스가 된다
⇒ 자바 코드(프로그램)이 시스템 자원을 할당받아 실행되기 시작하면 프로세스가 된다
⇒ 프로그램이 실행되면 프로세스이다
프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다
⇒ 독립된 메모리 공간에서 실행되므로 한 프로세스는 다른 프로세스의 변수나 자료 구조에 접근할 수 없다
프로세스는 한 개 이상의 스레드를 갖는다.
Thread(스레드)
스레드는 프로세스 내에서 실제로 수행되는 작업이다
스레드는 독립된 Stack 영역과 레지스터를 할당 받고, 프로세스의 Code, Data, Heap 영역을 공유한다
⇒ Heap 영역을 공유하므로 한 스레드가 Heap 메모리의 값을 변경하면, 다른 스레드가 그 변경 결과를 즉시 볼 수 있다
스레드별로 별도의 스택 영역과 PC 레지스터를 갖는 이유
스택은 함수 호출 시 전달되는 파라미터, 되돌아 갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다
⇒ 독립적인 함수 호출이 가능하다 ⇒ 독립적인 실행 흐름이 가능하게 된다
⇒ 독립적인 실행 흐름을 위한 조건으로 독립된 스택을 할당한다
스레드는 CPU를 할당받았다가 스케줄러에 의해 반환한다
⇒ 어디까지 수행했는지 Context를 기록할 필요가 있다
⇒ 독립된 PC 레지스터를 할당해 스레드별로 Context를 기록할 수 있도록 한다
멀티프로세스 vs 멀티스레드
프로세스와 스레드의 차이점
⇒ 프로세스는 독립된 Stack, Code, Data, Heap 영역을 갖는다
⇒ 스레드는 독립된 Stack을 갖고, Code, Data, Heap 영역을 공유한다
멀티프로세스
하나의 프로그램을 다수의 프로세스로 구성하여 프로세스 별로 태스크를 처리
장점
- 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 해당 자식 프로세스에만 영향이 간다
코드의 안정성 향상, 디버깅에 유리
단점
- Context Switching 시 오버헤드 발생
Context Switch 시에는 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모된다
⇒ Context Switch가 발생하면 캐쉬에 있는 모든 데이터를 리셋하고 다시 캐쉬 정보를 불러와야 한다
- 복잡한 IPC
하나의 프로그램에 속하는 프로세스들 사이의 데이터를 공유할 수 없다
⇒ 파이프, 파일, 소켓 등 추가적인 IPC 기법이 요구된다
멀티스레드
하나의 프로그램을 다수의 스레드로 구성하여 스레드 별로 태스크를 처리
장점
- 시스템 자원 관리의 효율성 향상
프로세스에 비해 자원을 할당하는 횟수가 줄어들어 자원 관리의 효율성이 증가한다
- 시스템 처리 비용 감소
프로세스간 데이터 전송에 비해 스레드 간 데이터 전송이 간단하고 시스템 자원 소모량도 적다
메모리 영역을 공유하므로 Context Switch 시 빠르다
단점
- 자원 공유(동기화 문제)에 대해 고려해야 한다
- 하나의 스레드에 문제가 발생하면 프로세스 전체에 영향을 끼친다
728x90 - 동시성(Concurrency)