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

6. 프로세스 구조와 컨텍스트 스위칭

- 프로세스 구조 deep dive


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

  • 프로세스 (process) 는 일반적으로 어떻게 구성되어 있을까?
    • text(CODE): 코드
    • data: 변수/초기화된 데이터
    • stack: 임시 데이터(함수 호출, 로컬 변수등)
    • heap: 코드에서 동적으로 만들어지는 데이터

OS.xlsx -> ProcessStructure


여기서 잠깐 복습!

  • 스택 (stack)

이 자료구조는 뭐에 쓰이고 왜 강조해서 배웠나?

datastructure.xlsx -> Stack


프로세스와 컴퓨터 구조 복습

  • 프로세스 (process) 는 일반적으로 어떻게 동작할까? - 컴퓨터 구조도 복습

    • text: 코드
    • data: 변수/초기화된 데이터
    • stack: 임시 데이터(함수 호출, 로컬 변수등)
    • heap: 코드에서 동적으로 만들어지는 데이터
  • PC(Program Counter) + SP(Stack Pointer)

OS.xlsx -> ProcessWithCS


여기서 잠깐!

어려우시죠? 지금 듣고 계시는 것만으로도 굉장히 성공하고 계신 것입니다. 정확하게 이해하려면, 깊게 이해할 필요가 있습니다. 깊게 이해하기 어려우면, 막연하게 이해하고 넘어가야 하는데, 막연하다보니 이해가 어렵습니다. 한번 들어서는 이해하기 어렵지만, 여러 기술과 엮이다보니, 설명이 반복될 수 있습니다. 여러 가지 각도에서 결국 설명이 되어지는 것이므로, 꾸준히 듣고 이해하려 노력하다보면, 이해도가 높아집니다.


Heap 이란?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *data;
    data = (int *) malloc(sizeof(int));
    *data = 1;
    printf("%d\n", *data);

    return 0;
}

OS.xlsx -> ProcessWithHeap


프로세스 구조: Stack, HEAP, DATA(BSS, DATA), TEXT(CODE)

DATA를 BSS와 DATA로 분리

출처: http://www.drdobbs.com/security/anatomy-of-a-stack-smashing-attack-and-h/240001832 OS.xlsx -> ProcessAll


가볍게 듣기

스택 오버플로우

  • 주로 해커들의 공격에 활용되었음

출처: http://www.drdobbs.com/security/anatomy-of-a-stack-smashing-attack-and-h/240001832


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

다시 PC, SP에 주목하자.

  • PC(Program Counter) + SP(Stack Pointer)

Stack, HEAP, DATA(BSS, DATA), TEXT(CODE)

OS.xlsx -> ProcessAllWithCS


PCB

PC, SP는 어디에 저장하나?

Process Control Block (PCB) 에 저장!

Process Context Block 이라고도 함

  1. Porcess ID
  2. Register (PC, SP 등)
  3. Scheduling Info (Porcess State)
  4. Memory Info (메모리 사이즈 limit) ...

PCB: 프로세스가 실행중인 상태를 캡쳐/구조화해서 저장


PCB: 리눅스 예

  1. Porcess ID
  2. Register (PC, SP 등)
  3. Scheduling Info (Porcess State)
  4. Memory Info (메모리 사이즈 limit) ...

정리

  • 프로세스 구조

    • Stack, HEAP, DATA(BSS, DATA), TEXT(CODE)
  • PCB

    • 프로세스 상태 정보 - PC, SP, 메모리, 스케쥴링 정보등

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

- 컨텍스트 스위칭


컨텍스트 스위칭

  • Context Switching, 컨텍스트 스위칭, 또는 문맥 교환
    • CPU에 실행할 프로세스를 교체하는 기술
  1. 실행 중지할 프로세스 정보를 해당 프로세스의 PCB에 업데이트해서, 메인 메모리에 저장
  2. 다음 실행할 프로세스 정보를 메인 메모리에 있는 해당 PCB 정보를 CPU에 넣고, 실행

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

컴퓨터 구조 복습 - 레지스터는 어디에?

  1. 실행 중지할 프로세스 정보를 해당 프로세스의 PCB에 업데이트해서, 메인 메모리에 저장
  2. 다음 실행할 프로세스 정보를 메인 메모리에 있는 해당 PCB 정보(PC, SP)를 CPU의 레지스터에 넣고, 실행

마치 레코드판 같은?


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

  1. 다음 실행할 프로세스 정보를 메인 메모리에 있는 해당 PCB 정보(PC, SP)를 CPU의 레지스터에 넣고, 실행

디스패치 (dispatch): ready 상태의 프로세스를 running 상태로 바꾸는 것

OS.xlsx -> ProcessWithCS


인터럽트와 컨텍스트 스위칭

  1. 프로세스 실행 중 인터럽트 발생
  2. 현 프로세스 실행 중단 (이 때 PCB 업데이트)
  3. 인터럽트 처리 함수 실행 (운영체제)
  4. 현 프로세스 재실행 (PCB 정보를 CPU에 넣고 실행)

컨텍스트 스위칭과 성능

컨텍스트 스위칭 시간이 오래 걸리면... 실제로는 굉장히 짧은 시간 (nano second) 단위로, 프로세스 스위칭이 일어남

밀리초(ms) : 1/1,000초 마이크로초(μs) : 1/1,000,000초 나노초(ns) : 1/1,000,000,000초


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

어떻게 하면 조금이라도 컨텍스트 스위칭 시간을 짧게 할 수 있을까?

C언어가 아니라, 어셈블리어로 컨텍스트 스위칭 코드를 작성하면...


여기서 잠깐! - 컴파일러

  • 초기 컴퓨터 프로그램들은 어셈블리어로 작성

    • 서로 다른 CPU 아키텍처가 등장할 때마다 매번 똑같은 프로그램 작성
    • 어셈블리어로는 프로그램 작성 속도가 매우 떨어짐
  • 컴파일러 등장

    • CPU 아키텍처에 따라서는 컴파일러 프로그램만 만들면 됨, 기존 코드는 재작성할 필요 없음
    • 그러나, 어셈블리어로 작성한 코드보다는 속도가 떨어질 수 있음

여기서 잠깐! - 컴파일러

  • 어셈블리어로 작성했다면...

리눅스의 경우 컨텍스트 스위칭 코드는 각 CPU마다 별도로 존재


정리

  • 컨텍스트 스위칭
    • 프로세스 상태 정보를 PCB로부터 CPU에 로드하고, 실행

레코드판 가운데에 핀을 놓는 느낌!