OS 공부의 시작으로 프로세스 주소 공간을 공부하겠다!
혹시 잘못된 부분이 있다면 알려주세요! 저로 인해 잘못된 내용을 공부하게 되는 것을 원하지 않습니다😥
프로그램 vs 프로세스 vs 스레드
항상 프로세스를 공부할 때면, 먼저 프로그램 /프로세스/ 스레드를 비교해서 정의해놓고 시작한다.
개념을 확실히 하고 넘어가보자.
프로그램?
실행가능한 파일, 어떤 동작을 하기 위해 작성된 지시사항들의 집합을 포함
Chrome.exe, Kakao.exe 같은 것이다. Primary memory가 아니라 Secondary memory에 저장된다. Primary memory에 로드되어 커널에 의해 실행된다.
프로세스?
실행중인 프로그램 인스턴스, OS가 프로그램을 메모리에 올려 실행시킴
Chrome.exe를 더블 클릭해서 실행시킨 것을 프로세스라고 한다. 윈도우 작업관리자에서 실행중인 프로세스를 볼 수 있다.
스레드?
프로세스의 가장 작은 실행 단위, OS가 프로세스를 만들고 메인 스레드를 실행함
프로세스는 최소 1개의 스레드를 갖는데, 메인 스레드라고 한다.
이해안되는게 굉장히 많을 수 있다. 하지만 여기선 프로세스 메모리 구조에 대해서 공부하는게 목표!임을 잊지 말고 넘어가버리자. 어차피 뒤에서 계속 나온다.
프로세스 메모리 구조
프로세스 메모리 구조는 코드, 데이터, 힙, 스택 4개의 영역으로 이루어져 있다. 하나씩 어떤게 담기는지와 그 특징에 대해서 알아보겠다. 위 사진을 통해 간단히 확인할 수 있다.
- 코드
데이터 종류 | 특징 |
프로세스가 실행할 코드가 기계어로 번역되어 저장됨 | - 프로그램의 시작부터 끝까지 메모리에 남음 - Read-Only로 중간에 바꿀 수 X |
- 데이터
데이터 영역은 또 2가지로 나누어 볼 수 있다. Data와 BSS 영역이다.
영역 | 데이터 종류 | 특징 |
Data 영역 | 초기화된 전역 변수, static 변수 | - 프로그램의 시작과 함께 할당되어, 프로그램 종료시 소멸 - Read-Write |
BSS 영역 | 초기화되지 않은 전역 변수 |
+ 궁금해진 내용 .. 왜 이렇게 2개의 영역으로 나누었을까?
초기화된 변수는 초기값을 저장해야해서 ROM에 저장된다. 초기화하지 않은 데이터까지 ROM에 저장하면 필요한 ROM의 크기가 커져 비용이 많이 들게 된다. 따라서, 초기화되지 않은 데이터는 RAM에 저장하도록 한다.
+ 그럼 초기화되지 않은 전역변수로 선언하는게 더 빠를까?....그냥 재밌어보이는 글이라서 추가함~!!
RAM이 읽는 속도가 더 빨라서 더 빠를 것 같다. (100퍼 뇌피셜!!!!)
- 힙
데이터 종류 | 특징 |
C에서 malloc, Java에서 new/ 배열/ class 객체 같이 동적으로 할당되는 것들이 저장됨 | - C와 같은 경우, 사용한 메모리 영역 해제 필요 (안하면 Memory Leak 발생, Java는 GC에 의해 해제됨) - 런타임시 크기가 결정됨 |
- 스택
데이터 종류 | 특징 |
함수의 호출과 관계되는 지역 변수와 매개 변수가 저장됨 | - LIFO 방식에 따라 동작되는 구조 - 컴파일 타임에 크기가 결정됨 (무한히 할당 X - StackOverFlow) - 사용하고 소멸되는 것이 반복되어 메모리 용량이 불확실 => Stack은 아래부터 채워 올리고, Heap은 위에서 부터 채움 |
+ 스택과 힙은 같은 공간을 사용한다.이때 메모리를 채우다가 Heap에서 Stack 영역 침범 => HeapOverFlow, Stack에서 Heap 영역 침범 => StackOverFlow
🧨스택이 컴파일 타임에 크기가 결정된다는게 뭔소리야~!
아 스택은 고정된 크기를 갖는다고 한다. 아닌가?!??? 맞는거 같은뎅,,, 다시보겠다,,ㅠㅠ
https://unix.stackexchange.com/questions/127602/default-stack-size-for-pthreads
🧨 왜 이렇게 메모리 구조를 나누었을까?
Segmentation의 모습이다. 나중에 자세히 하겠지만, 공유와 보호가 장점이다. 관련 글은 다음에 작성하겠다!
https://study.com/academy/lesson/memory-segmentation-definition-purpose.html
알아야할 KEY WORD- 컴파일 vs 런타임
컴파일 = 코드 -> 기계어
런타임 = 컴파일을 마치고, 프로그램이 동작되어지는 때
출처
https://en.wikipedia.org/wiki/Process_(computing)
https://javaconceptoftheday.com/differences-between-program-vs-process-vs-threads/
https://coding-lks.tistory.com/118
http://www.tcpschool.com/c/c_memory_structure
https://velog.io/@underlier12/OS-14-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B5%AC%EC%A1%B0
https://velog.io/@goserimgoserimgo/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
'CS > OS' 카테고리의 다른 글
📌프로세스와 스레드 (0) | 2021.06.12 |
---|