산타는 없다

프로세스와 스레드 본문

Computer Science/운영체제

프로세스와 스레드

LEDPEAR 2021. 8. 22. 17:22
반응형

프로세스

프로세스는 실행되고 있는 프로그램의 인스턴스라고 생각할 수 있습니다. 즉, 실행중인 프로그램을 의미하며, 작업(job), 태스크(Task)라고도 합니다.
(인스턴스[instance] : 컴퓨터 저장공간에서 할당된 실체)

이러한 프로세스는 운영체제로 부터 CPU 시간 메모리 등의 시스템 자원을 할당받아 실행됩니다. 운영체제는 자원을 할당해준 프로세스를 관리하기 위해 PCB(Process Control Block)를 생성하여 저장하고 프로세스가 완료되면 제거합니다.

각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수가 자료구조에 접근할 수 없습니다.

만약, 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신(IPC, inter-process communication)을 사용해야 합니다. 프로세스 간 통신 방법으로는 파이프, 파일, 소켓 등을 이용한 방법이 있습니다.


프로세스 메모리

프로세스는 운영체제로 부터 메모리 영역을 할당받습니다.

할당 받은 메모리 영역을 4개 영역으로 나누어 사용하는데 Code(Text), Data, Stack, Heap으로 이루어져 있습니다.

Code와 Data 영역은 프로그램이 시작되고 종료될 때 까지 메모리에 남아 있으며 Stack과 Heap 영역은 실행 중(RunTime) 할당되는 크기가 바뀝니다.

  1. Code(Text) 영역
    • 코드 영역은 텍스트 영역이라고도 하며 실행할 프로그램의 코드가 저장되는 영역입니다.
    • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.
    • 실행 파일을 구성하는 명어들이 적재되며 함수, 제어문, 문자열 상수를 제외한 리터럴 상수(Literal Constant) 등이 저장됩니다.
    • 코드 영역은 읽기만 가능한 메로리 영역이기 때문에 데이터를 저장하려고 하면 분할 충동을 일어켜 프로세스가 중지됩니다.
    • 때문에 변경되지 않는 프로그램 코드와 상수가 저장됩니다.
  2. Data 영역
    • 전역 변수, 정적(static) 변수, 배열, 구조체, 각종 문자열이 저장되는 영역입니다.
    • 상수 중 문자열 상수는 Data 영역에 저장됩니다.
    • Data영역은 .rodata, .data, BBS 영역으로 나뉜다
    • .rodata 영역는 상수키워드(const)선언 된 변수나 문자열 상수가 저장된다.
    • .data 영역은 초기값을 가진 전역변수가 저장된다
    • BBS(Block started by symbol) 영역은 초기화 되지 않은 전역변수가 저장된다.
    • BBS 영역은 C의 startup 함수가 main()을 실행하기 전에 NULL로 초기화 된다
  3. Stack 영역
    • 함수의 매겨변수, 복귀 주소와 로컬 변수와 같이 임시적인 자료를 저장하는 영역입니다.
    • 할당될 데이터의 크기와 영역의 크기는 컴파일 타임에 결정되나 실제 할당은 런타임에 수행됩니다.
    • 스택 영역은 함수(지역, 필드)의 호출과 함께 할당되며, 함수의 호출이 완료되면(필드를 벋어나면) 소멸합니다.
    • 스택 영역은 후입선출(LIFO) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다.
    • 때문에 메모리는 높은 주소에서 낮은 주소의 방향으로 할당됩니다. (쌓이는 방식)
    • 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 합니다.
  4. Heap 영역
    • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역입니다.
    • 때문에 런타임 시 크기가 결정되고 할당됩니다.
    • 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
    • stack과 다르게 필드를 벋어나도 해제가 되지 않고 사용자가 직접 해제 해야합니다.

스레드

스레드는 CPU 이용의 기본 단위로 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 구성됩니다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션 그리고, 열린 파일이나 신호와 같은 운영체제 자원들을 공유합니다.

전통적인 중량 프로세스는 하나의 제어 스레드를 가지고 있지만 현대의 컴퓨터에서 동작하는 거의 모든 소프트웨어 응용들은 멀티 스레드를 이용합니다.

멀티 스레드의 장점은 사용자에 대한 향상된 응답성, 프로세스 내의 자원 공유, 경제성 및 더 효율적인 다중 처리 코어의 이용과 같은 규모 적응성 요소 등입니다.


스레드 메모리

스레드는 프로세스 안에 존재하며 프로세스의 자원을 공유합니다. 이때 공유하는 자원의 영역은 code, data, heap영역이며 각 스레드는 고유의 stack메모리 영역과 레지스터을 갖게 됩니다.

같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유하기 때문에 동일한 메모리 영역을 여러 스레드에서 접근할 수 있습니다. 

 

반응형
Comments