프로세스와 컨텍스트 스위칭

김유진·2023년 4월 21일
0

CS지식 정리

목록 보기
3/7

프로세스

프로세스 구조

  • 정적공간(READ ONLY)
    * CODE: 컴파일된 코드가 저장되어 있는 공간

    • DATA: 초기화 된 gobal / static 변수 등이 저장되는 공간
    • BSS: 초기화 되지 않은 global/static 변수 등이 저장되는 공간
  • 동적 공간
    * STACK: 함수 내에서 사용되는 지역변수, 파라미터, RET(RETURN) 주소 등이 저장되는 공간

    • HEAP: 동적 메모리 할당 함수들에 의해 할당 / 반환되는 공간

스택의 동작 예시 - 스택 프레임

  1. 처음에는 기존 함수의 베이스 포인터를 스택에 저장하기 위해 push ebp 연산을 수행.

  2. esp가 가리키는 지정(기존 함수에서 사용하던 스택 위치)을 edp에 넣어 이를 새 함수의 base pointer로 지정한다.

    l
  3. 에필로그 부분의 leave/ret은 leave: move rsp,rbp -> pop rbp이고, ret: pop rip -> jmp rip이다. 이는 기존 함수로 돌아가기 위해서 저장해 놓았던 이전 함수의 stack pointer(프롤로그 부분에서 mov rbp, rsp로 저장)를 복원시키고 베이스 포인터 역시 기존 함수의 베이스 포인터로 복원시킨뒤 (이후rsp=rsp+4),이 함수로 넘어오기 전 위치가 저장된 값을 rip에 담고(pop rip)이후 rip로 돌아간다.

esp: Extended Stack Poinater (sp) 스택포인터 (현재 스택의 최상단의 주소 값을 저장하고 있는 레지스터

  • 위에서 스택은 낮은 주소일수록 최상단의 주소라고 했음으로 항상 가장 낮은 주소를 가지고 있다)

ebp: Extended Base Pointer (FP) 현재 스택 프레임의 베이스 주소를 갖는다. (스택 프레임의 최하단 주소)

아래 사진이 esp,rsp 차이를 확연히 보여주는 것 같아요.(bit가 다름 64, 32)
https://stackoverflow.com/questions/20637569/assembly-registers-in-64-bit-architecture


힙의 동작 예시 - 동적 할당

정수형 포인터 변수인 data를 생성한 뒤,malloc 함수를 이용해서 int size(4byte or 8byte)만큼의 공간을 할당 한다.
이후 data 변수를 해당 영역을 가리키는 포인터 변수로 만든 뒤, 그 영역에 1을 넣는다.
이 겨웅 stack에는 *data라는 변수가 생기고, heap에는 malloc을 통해 int의 크기만큼의 공간이 할당된다.

컨텍스트 스위칭

PCB

A와 B라는 프로그램이 있다고 가정해 보자. OS는 프로그램 A가 실행되던 도중 어떠한 이유로 프로그램 A가 ready 혹은 waiting 상태가 되도록 하고 프로그램 B를 실행하려고 한다. 이때, 추후 프로그램 A의 실행을 위해서 OS는 프로그램 A의 진행 정도를 알고 있어야 할 것이다.
이를 위해서 운영체제에서는 PCB(Process Control Block)이라는 자료구조(구조체)를 만들어 사용한다.Linux의 경우 task_struct라는 구조체를 이용한다.

운영체제에서는
* 실행 중지할 프로세스 정보를 해당 프로세스이 PCB에 업데이트해서 메모리 저장

  • 다음 실행할 프로세스 정보를 메모리에 있는 해당 PCB 정보를 CPU의 레지스터에 넣고 실행
profile
끊임없이 발전하는 개발자

0개의 댓글