일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- C
- vue3
- RxJS
- alexnet
- 큐
- 배열
- 이진탐색
- cors
- 프로세스
- 프로그래머스
- 자바스크립트
- 코딩테스트
- 컨테이너
- Machine Learning
- 포인터
- pytorch
- GraphQL
- 자료구조
- APOLLO
- RT scheduling
- 웹팩
- 연결리스트
- 프론트엔드
- 알고리즘
- 브라우저
- 스택
- 연결 리스트
- 타입스크립트
- 해시테이블
- 릿코드
- Today
- Total
프린세스 다이어리
[OS] 프로세스 구조와 레지스터 알아보기 본문
1. 프로세스의 구조
프로세스는 크게 stack, heap, data, code로 구성되어 있다. 프로그램 소스가 컴파일되어 기계어로 code 부분에 저장이 되고, 글로벌 변수는 data에 저장이 되고, 함수 및 지역변수 등이 선언되면 stack으로 들어간다.
stack - 임시 데이터(함수 호출, 로컬 변수 등) 저장
heap - 코드에서 동적으로 만들어지는 데이터 저장
data - 변수, 초기화된 데이터
code(text) - 컴파일된 코드
이렇게 프로세스가 구성되어 CPU가 코드를 읽으며 실행을 한다. 위에 파이썬 코드에서는 heap 영역에 해당하는 변수는 없지만 C에서 malloc() 동적 메모리 할당 시 heap 공간에 메모리가 생성이 된다.
int main()
{
int *data;
data = (int*) malloc(sizeof(int));
*data - 1;
printf("%d\n", *data);
return 0;
}
위의 C 코드에서는 data는 동적으로 할당된 메모리 주소 즉 heap에 할당된 메모리 주소를 가리키게 된다.
data 영역은 두 가지로 다시 나뉘는데, 초기화되지 않은 전역변수가 들어가는 BSS와 초기값이 있는 전역 변수가 들어가는 Data 부분이다.
int global_data1;
int global_data2 = 1;
int main() {
...
}
위에서 global_data1은 초기값 없이 선언만 해 주었고, global_data2는 초기값을 넣어주었기 때문에 각각 BSS, data 구역에 해당이 된다.
2. 레지스터란?
레지스터는 CPU가 프로세스를 처리하는 데 필요한 정보를 일시적으로 기억하는 저장장치다. PC(Program Counter)와 SP(Stack Pointer)가 주요한 기능이다. PC는 코드를 한 줄 한 줄 가리키는 주소 레지스터이며, SP는 코드의 함수가 실행될 때 스택 프레임의 최상단 주소를 가리키는 레지스터다. 이 두 가지는 프로세스가 컨텍스트 스위칭(Context Switching)을 하는 등의 중요한 역할을 하도록 도와준다. 여기서 콘텍스트 스위칭이란, 스케줄러에 의해 프로세스가 전환되는 메커니즘을 칭한다. 이전 글에서는 프로세스가 수시로 바뀐다는 식으로 표현했었다.
3. 콘텍스트 스위칭의 원리
레지스터가 콘텍스트 스위칭에 어떤 역할을 하는지 정리해보았다. 레지스터의 PC, SP는 PCB(Process Control Block)이라는 다른 공간에 저장이 되어 CPU가 한 프로세스를 잠시 멈추고 다른 프로세스를 실행해도, PCB에 저장된 값을 가지고 다시 돌아와서 실행할 수 있도록 도와준다. PCB는 프로세스 ID, 레지스터 값(PC, SP 등), 스케줄링 상태(ready, block, running 등), 메모리 리밋 등의 다양한 정보를 담고 있다.
코드가 한 줄 한 줄 실행이 되면서, 현재 컨텍스트 주소를 가리키는 레지스터의 값이 바뀐다. PC는 현재 코드의 어느 부분을 실행하고 있는지 주소가 저장되고, SP에는 현재 스택 프레임의 최상단 주소를 가리킨다. 이것이 Process a라고 한다면, 잠시 멈춰서 process b로 콘텍스트 스위칭을 할 때, process a가 관리하고 있는 PCB라는 저장 공간에 넣고, process b를 실행한 다음에, 다시 돌아올 때 레지스터를 기존 것으로 업데이트한다.
컨텍스트 스위칭이 일어날 때 PCB에 process a의 PC, SP 값을 저장하고, 다시 돌아올 때 그 콘텍스트를 가져와서 CPU에 알려준다. CPU는 어차피 코드를 한 줄 한 줄 실행하기 때문에 주소를 보고 그냥 재실행하면 된다. process b도 마찬가지로 이 프로세스가 관리하는 PCB에 콘텍스트를 저장해 놓고, 다시 돌아왔을 때 레지스터를 업데이트한다.
콘텍스트 스위칭은 1초에 100번 이상이 발생하기 때문에 오버헤드를 줄여줘야 한다. 콘텍스트 스위칭 시간을 짧게 하기 위해 이식성을 포기하고서라도 C가 아닌 어셈블리어로 컨텍스트 스위칭 코드를 작성한다.
'운영체제, 컴퓨터 구조' 카테고리의 다른 글
가상 메모리 등장한 이유, 가상 메모리 이용하는 원리 (0) | 2021.10.22 |
---|---|
[OS] 멀티 프로세스와 멀티 스레드, 둘 중에 뭐가 좋아? (1) | 2021.10.05 |
[OS] 인터럽트란? 인터럽트 발생 상황과 내부 동작 방식 (0) | 2021.10.05 |
[OS] 프로세스 상태(Ready, Running, Blocked)와 선점형/비선점형 스케줄러 (0) | 2021.10.04 |
[OS] 프로세스 스케줄러(Process Scheduler) 알고리즘 정리 (0) | 2021.10.04 |