Dev-Kyuu
article thumbnail
Published 2022. 12. 10. 09:41
| ETC | 프로세스와 스레드 ✏️ Java

✏️ 프로그램과 프로세스, 스레드 

프로그램

: 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태

: 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았고, 움직이지 않은 상태라는 뜻

: ex.  윈도우의 *.exe 파일이나 MacOS의 *.dmg 파일 등등

 

프로세스

:  프로그램을 실행하여 파일이 컴퓨터 메모리에 올라가여 실행중인 상태

: 운영체제로부터 자원을 할당받는 작업의 단위

 

스레드 

: 할당 받은 자원을 이용하는 실행 단위

 

🔎 프로세스와 스레드 어떤점이 다른데?

 

이전에는 프로그램 실행시 실행부터 끝까지 프로세스 하나만을 사용해서 진행하였지만 시간이 지날수록 프로그램이 복잡해지고 

프로세스 하나만을 이용해 프로그램을 실행시키기 어려워져 더 작은 실행단위의 개념인 스레드가 생기게 되었다.

 

그럼 어떠한 점이 다를까?

스레드는 프로세스와 다르게 스레드간 메모리를 공유하며 작동한다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행흐름의 일부가 된다.

스레드를 코드에 비유하자면 스레드는 코드 내에 선언된 함수들이 되고 따라서 main 함수 또한 일종의 스레드라고 볼 수 있게 되는 것이다.

 

하지만 스레드가 메모리를 공유함으로서 발생하는 단점도 있다.

 

프로세스는 프로세스를 실행하다가 예기치못한 오류가 발생해서 프로세스가 강제로 종료된다면,  다른 프로세스와 공유하고 있는 파일을 손상시키는 경우가 아니라면 영향을 주지 않는다.

 

하지만 메모리를 공유하는 스레드는 Code/Data/Heap 메모리 영역의 내용을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.

 

스택 영역
  • 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간으로
    따라서 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고, 이는 독립적인 실행 흐름이 추가되는 것이다. 결과적으로 실행 흐름의 추가를 위한 최소 조건이 독립된 스택을 제공하는 것이다. 
코드 영역
  • 프로세스는 독립적인 구조이기 때문에 다른 프로세스의 Code영역에 있는 함수를 호출할 수 없다.
  • 쓰레드는 Code영역을 공유하기 때문에 두 개 이상의 쓰레드가 자신이 포함된 프로세스의 Code영역에 있는 함수를 호출할 수 있다.
데이터 영역 / 힙 영역
  • 전역 변수와 동적 할당된 메모리 공간을 공유할 수 있고, 이를 통해 쓰레드 간 통신을 할 수 있지만  동시에 메모리에 접근하기 때문에 주의해야 한다.

 

 

 

profile

Dev-Kyuu

@kyuu_ng

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!