프로세스와 스레드
누구나 프로그램이 무엇인지 알고있을 것입니다.
프로세스와 스레드가 뭔지 알아보기 전에 프로그램이 무엇인지에 대해서 알아보도록 하겠습니다.
프로그램?
프로그램이란 쉽게 말하면 코드 덩어리 입니다.
프로그램이란, 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 말합니다.
윈도우의 *.exe 파일이나 MacOS의 *.dmg 파일 등등 사용자가 눌러서 실행하기 전의 파일을 말합니다.
프로세스와 스레드에 대해서 알아보려고 했는데, 프로그램을 왜 알아보는거지?
이런 의문이 들 수도 있습니다.
우리가 이때까지 프로그램에 대해 알아본 이유에 대해서 알아보도록 하겠습니다.
프로그램이 프로세스가 되는 과정
프로그램과 프로세스는 한 끝 차이입니다.
프로그램을 실행하여 동적인 상태의 프로그램을 프로세스라고 하는 것입니다.
저장장치에 존재하던 프로그램(.exe)이 실행될 때 실행 파일의 복사본은 메모리에 올려지고
CPU가 메모리 상에 있는 exe 파일을 해석하고 실행하는 것입니다.
위 내용을 그림으로 나타내면 아래와 같습니다.
프로세스는 뭘까?
앞에서 본 것과 같이 프로그램을 실행한 것,
컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램 것이라고 할 수 있습니다.
프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적(動的)인 상태라고 하며 이 상태의 프로그램을 프로세스라고 한다.
프로그램이 프로세스가 되면서 어떤 일이 일어날까요?
1. 프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당 받습니다.
운영체제는 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해 줍니다.
* 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없습니다.
code: 컴파일된 소스 코드가 저장되는 영역
data: 코드가 실행되면서 사용한 변수나 파일들의 각종 데이터들이 모여있는 영역
stack: 호출된 함수, 지역변수 등 임시 데이터
heap: 동적으로 만들어지는 데이터
참고: 접근은 할 수 있지만 너무 비효율적이다.
프로세스 간 정보를 공유하는 방법에는 다음과 같은 방법들이 있다.
다만 이 경우에는 단순히 CPU 레지스터 교체뿐만이 아니라 RAM과 CPU 사이의 캐시 메모리까지 초기화되기 때문에
앞서 말했듯 자원 부담이 크다.
IPC(Inter-Process Communication)을 사용한다.
LPC(Local inter-Process Communication)을 사용한다.
별도로 공유 메모리를 만들어서 정보를 주고받도록 설정해주면 된다.
2. 해당 프로세스에 대한 정보를 담고 있는 PCB 블럭이 함께 생성이 됩니다.
1) 포인터 : 부모프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보 등.
2) 프로세스 식별자(Process ID)
3) 프로세스 상태(Process State) : 생성(create), 준비(ready), 실행 (running), 대기(waiting), 완료(terminated) 상태가 있습니다.
4) 프로그램 계수기(Program Counter) : 이 프로세스가 다음에 실행할 명령어의 주소를 가리킵니다.
5) CPU 레지스터 및 일반 레지스터
6) 메모리 관리 정보 : 해당 프로세스의 주소 공간 등
스레드
프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위입니다.
과거에는 하나의 프로그램을 실행할 때 한개의 프로세스만 사용하여 진행이 가능하였지만 시간이 흐를수록 프로그램이 복잡해져 프로세스 하나만으로는 부족한 상황이 도래하였습니다.
프로세스보다 더 작은 실행 단위 개념이 필요하게 되었고 이것이 바로 스레드입니다.
스레드는 프로세스와 달리 메모리를 서로 공유할 수 있습니다.
이에 대해 더 자세히 설명하자면, 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고,
나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.
메모리를 공유하는건 어떤 장점이 있을까요??
우리는 컴퓨터를 할 때 한가지의 프로그램만 사용하지는 않습니다.
예를 들어서 친구와 카톡을 하기 위해서 카카오톡을 접속하고
게임을 하기 위해서 롤을 접속합니다.
사실 우리 컴퓨터는 한 번에 한가지 일만 할 수 있습니다.
PCB_1 (롤), PCB_2(카톡)
롤을 실행한 경우에는 PCB_1
카톡이 대기상태로 바뀌게 되고
카톡을 실행한 경우에는
롤이 대기 상태로 변하는 작업을 반복해서 진행합니다.
이러한 현상을 컨텍스트 스위칭이라고 합니다.
컨텍스트 스위칭
컨텍스트 스위칭이란 멀티 프로세스 환경에서 발생합니다.
CPU가 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 값을 저장하고 다음 프로세스를 수행할 수 있도록 프로세스의 상태 또는 값을 교체하는 것입니다.
한마디로 다른 프로세스를 실행할 때, 기존 데이터를 백업하고 다른 데이터를 들고오는 작업이라고 말할 수 있겠습니다.
프로세스는 메모리를 공유하지 않는다고 앞서 언급을 하였었는데,
콘텍스트 스위칭이 일어날 때 메모리의 모든 데이터와 상태를 백업하고 변경해야 하기 떄문에 매우 힘들고 피곤한 작업입니다.
반면에 스레드는 공유 자원이 있기 때문에 모든 것을 다 빼고 새로 넣을 필요가 없다는 장점이 있습니다.
멀티 프로세스와 멀티 스레드
멀티 프로세스
멀티 프로세스는 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)을 처리하도록 하는 것입니다.
쉽게 말해서 계산기 두개를 켜서 작업을 진행하는거죠
각각의 계산기의 결과는 서로 영향을 미치지 못합니다.
장점
여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.
단점
Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하게 된다.
프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어, Context Switching가 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 한다.
프로세스 사이의 어렵고 복잡한 통신 기법(IPC)
프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다.
멀티스레드
하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것이다.
윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있다.
웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.
장점
시스템 자원 소모 감소 (자원의 효율성 증대)
프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
시스템 처리량 증가 (처리 비용 감소)
스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
스레드 사이의 작업량이 작아 Context Switching이 빠르다.
간단한 통신 방법으로 인한 프로그램 응답 시간 단축
스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
단점은 아래와 같습니다.
주의 깊은 설계가 필요하다.
디버깅이 까다롭다.
단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
다른 프로세스에서 스레드를 제어할 수 없다. (즉, 프로세스 밖에서 스레드 각각을 제어할 수 없다.)
멀티 스레드의 경우 자원 공유의 문제가 발생한다. (동기화 문제)
하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
프로세스나 스레드가 강제 종료가 된다면 어떻게 될까?
프로세스
프로세스는 공유하고 있는 파일을 손상시키는 경우가 아니라면 아무런 영향을 주지 않는다.
스레드
Code/Data/Heap 메모리 영역의 내용을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.
Reference
운영체제 #1_ 스레드와 프로세스, 멀티프로그래밍,멀티태스킹,멀티스레딩,멀티프로세싱
안녕하세요. 문범우입니다. 이번 포스팅에서는 스레드(Thread) 와 프로세스(Process) 에 대해서 알아보겠습니다. 스레드에 대해 좀 더 명확히 이해하기 위해서는 먼저 프로세스에 대한 개념이 필요
doorbw.tistory.com
프로세스와 스레드의 차이
프로세스와 스레드의 차이는 프로세스와 스레드, 그리고 프로그램이 작동하는 방식에 대해서 잘 이해하고 있는지 확인하기 위해 기술면접에서 단골 질문 사항으로 나온다.
velog.io
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/@jwkim/cs-os-multiprocess-multithread
멀티프로세스와 멀티쓰레드
멀티프로세스와 멀티쓰레드의 정의와 비교
velog.io
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://m.blog.naver.com/rhkdals1206/221575121342
OS :: 컨텍스트 스위칭 (Context Switching)
* 컨텍스트 * 레지스터 (Register) (출처 : https://m.blog.naver.com/mjnms/220460825993) * 하드디스크 ...
blog.naver.com