Home 쓰레드, 프로세스, 메모리 구조
Post
Cancel

쓰레드, 프로세스, 메모리 구조

스레드, 프로세스 etc 에 대해서 대충 이해한만큼만 정리하기.
참고한 자료들은 스레드와 프로세스, 메모리구조,유튜브-스택/힙-c,유튜브-스택/힙-java 이다.

1. 프로세스

  • 시스템 자원을 할당 받는 하나의 프로그램 인스턴스
  • 한 프로그램(실행파일)은 여러개의 프로세스로 이루어질 수도 있고, 하나의 프로세스로 이루어 질 수도 있다.
  • 각각의 프로세스들은 시스템 자원인 메모리를 할당 받는데, 코드, 데이터, 스택, 힙 이다.
  • 각 프로세스들은 서로 독립된 자원을 사용하고 공유하기 위해서는 서로 소통하기 위해 IPC 필요하다.

2. 스레드

  • 프로세스 내의 작업 흐름
  • 한 프로세스 내에 여러 스레드 있을 수 있다. (멀티스레딩)
  • 스레드는 개별적인 스택, 레지스터값을 가진다. (스택은 메모리 ram , 레지스터 값은 cpu에 별도 저장- 스레드 작업 시간 할당 받아서 작업 어디까지 했는지 기록)
  • 힙 등의 메모리는 한 프로세스내 다른 스레드끼리 공유한다.

멀티 스레딩 이란?

  • 하나의 프로세스를 다수의 작업으로 쪼개서 여러개의 스레드가 한 프로세스 수행토록 하는 것
  • 힙 영역, 데이터 영역 등을 같이 사용하기에 한 스레드에서 수정한걸로 다른 스레드에 반영하고 이런게 빠르다.
  • 프로세스간 통신처럼 ipc 필요한게 아니기에 자원 낭비가 적다.
  • 물론 다수의 스레드가 공유하는 부분에 대해서 동기화 작업에 대한 고려 필요하다.
  • 스레드가 cpu코어 수보다 많은 스레드 실행시에는 정해진 시단 동안 번갈아가며 수행하게되고 수행 스레드가 교체될때, 각 작업을 어디까지 했고, 다음 작업에 필요한 데이터를 읽어오는 작업 (context change) 필요

그럼 여기서 말하는 코드, 데이터, 스택, 힙이란?

코드
실제로 기계가 해석할 수 있는 코드가 load 되는 부분.
컴파일 후 로드된다.

데이터
글로벌 변수나 static 변수가 저장되는 곳
프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸됨

스택
런타임에 직접적인 할당이 되지만, 크기 같은건 컴파일시에 결정된다.
즉 할당은 dynamic이지만 크기는 static인것. 코드에서 주소로 직접 접근이 가능하다.
사용이 끝나면 LIFO 로 사라진다.


코드에서 주소로 직접 접근이 불가한 동적 할당 영역이다.
스택에 여기 접근 가능한 변수를 할당해놓고 간접적으로 접근 가능하다.
c++ 에서는 포인터가 그 역할을 하고, java 에서는 new 로 객체 생성하는게 그 예이다.
여기 생기는 변수는 c++ 에서 처럼 직접 해제해주던가 java 처럼 gc가 알아서 정리한다.

This post is licensed under CC BY 4.0 by the author.