Post

KOCW_Process/ address space / context / Context Switching

✅ Program

특정 작업을 수행하는 일련의 명령어들의 모음

✅ Multi Programming

  • 일반적으로 CPU는 한 개
  • 따라서 CPU에서 명령이 수행되고 있는 프로그램도 한 개
  • 그러나 CPU가 짧은 시간 단위로 시간을 나누어 프로그램을 수행하고 ➡️ time sharing
  • 여러 프로그램이 메모리에 동시 적재되어 있을 수 있으므로
  • “여러 프로그램이 동시에 실행된다”라고 말할 수 있다.

✅ 프로그램의 실행(Memory load)

프로그램이 실행되고 있다.
1️⃣ 디스크에 존재하던 실행파일이 메모리에 적재된다.
2️⃣ 프로그램이 CPU를 할당받고 명령이 수행된다.

  • 프로그램은 디스크에 저장
  • 실행되면 메모리에 적재
  • 운영체제 커널은 메모리에 올라가 있음
  • 프로그램이 메모리에 적재되면 ➡️ 프로세스

1️⃣ 디스크에 존재하던 실행파일이 메모리에 적재된다.

  • 사실 메모리에 프로그램이 올라가기 전에 한 단계가 더 있음
  • 바로 Virtual Memory
  • 그 프로그램만의 address space, 독자적인 주소 공간이 만들어진다.
  • address space를 바로 virtual memory라고 한다.
  • 실제로는 존재하지 않음


  • 각 프로그램마다 별도의 주소 공간(코드, 데이터, 스택)을 가지며
  • 프로그램마다 독자적으로 존재하는 주소공간을 가상 메모리 또는 논리적 메모리라고 부른다.


  • 실행 파일이 메모리에 적재될 때, 일부분만 올라가고
  • 나머지는 디스크의 특정 영역swap에 내려가 있다.
  • 이는 메모리 공간을 효율적으로 사용하기 위함이다.
  • 그래서 지금 당장 실행되야 할 부분만 메모리에 올라가고
  • 아닌 부분들은 swap에 올라가 있게 된다.

Screenshot 2025-01-04 at 12 31 14

  • address space는 각 프로그램마다 0~n까지 있고 ➡️ virtual address
  • physical memory는 실제 메모리로, 하나 크게 존재한다. ➡️ physical address
  • physical memory의 가장 낮은 주소에 운영체제 커널이 올라가고, 그 위에 현재 실행될 프로그램들이 올라가게 된다.
  • 따라서 virtual address에서 physical addressaddress translation이 필요하다.

✅ Process

Program in execution
운영체제로부터 자원을 할당받는 작업 단위
이 떄 자원: CPU 할당 시간/code, data, stack, heap

  • 프로세스는 독립적인 개체
  • 하나의 프로그램을 여러번 실행 ➡️ 여러개의 프로세스가 메모리에서 실행

✅ Process context

process가 현재 어떤 상태에 있는가?
시간에 따라서 변한다

  • 이 프로세스는 CPU를 얼마나 썼는가?
  • 메모리를 얼마나 가지고 있는가?
  • 함수 어디를 실행하고 있는가?
  • OS는 이 프로세스의 문맥을 아주 중요하게 생각한다.


  • ❓ 프로세스 문맥은 어디에 쓰일까?
  • time sharing 시스템에서 각 프로세스는 짧은 시간동안 CPU를 사용하고, 다른 프로세스에게 또 CPU를 넘긴다.
  • 따라서 CPU를 넘겨받아 이어서 사용하려고 할 때, 이전에 수행했던 작업을 이어서 수행하기 위해 프로세스 문맥이 필요하다.
  • ➡️ process context를 사용헤 context switching을 한다.

☑️ process context 종류

  • ✔️ CPU수행 상태를 나타내는 하드웨어 문맥
  • PC program counter를 살펴보기
  • 각종 register에 어떤 값을 넣고 있는가


  • ✔️ 프로세스 주소 공간
  • 자신의 메모리 공간 data에 무엇을 가지고 있는가?
  • stack에 몇 개의 함수가 있는가?


  • ✔️ 프로세스 관련 커널 자료 구조
  • PCB
  • kernel stack
  • OS의 PCB, stack에 프로세스 문맥에 대한 정보도 저장되어 있을 것임.

✅ 프로세스 주소 공간

memory allocated to a process by the OS

  • 해당 명령을 담은 프로그램의 주소 영역/공간코드 code, 데이터 data, 스택stack으로 구분된다.

  • ✔️ code: 컴파일 타임에 할당

    • CPU에서 수행할 기계어
    • CPU는 code영역에 위치한 명령어를 하나씩 가져와 처리
    • 우리가 작성한 프로그램 함수들의 코드가 CPU에서 실행될 수 있도록 기계명령어로 변환되어 저장됨
    • 프로스램 소스 코드
    • hex 또는 binary형태


  • ✔️ data: 컴파일 타임에 할당

    • 프로그램이 실행되다가 메모리를 사용하는 데이터
      • 전역 변수 global variable등 프로그램이 사용하는 데이터 저장
    • (global 변수, 배열, static 변수)
    • 프로그램 시작과 동시에 할당, 프로그램 종료되어야 메모리에서 소멸

    • data안에는 BSS(Block Stated Symbol)이라는 영역이 존재
    • 초기화되지 않거나/ 초기화를 0으로 하거나/ 초기화를 NULL로 한 전역변수와 정적 변수는 BSS에 위치
    • ❓ 목적: 공간을 효율적으로 활용하기 위해
    • 예를 들어 크기가 큰 배열을 선언만 하고 값은 넣지 않는 경우, 크기만큼 공간을 할당해주지 않고 BSS에 올려 공간 절약


  • ✔️ stack: 런타임에 할당

    • local 변수, parameter위치
    • 어떤 함수를 호출한 후 return할 곳
    • 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터 임시로 저장
    • 함수의 호출과 함께 할당push되고, 함수 호출이 완료되면 메모리에서 소멸pop
    • 메모리의 높은 주소에서 낮은 주소 방향으로 할당


  • ✔️ heap: 런타임에 할당

    • 프로그래머에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역
    • C언어의 malloc(), free()함수
    • 메모리의 낮은 주소에서 높은 주소 방향으로 할당된다.

컴파일 타임 🆚 런타임

  • 컴파일 타임: 사람이 작성한 소스코드컴파일이라는 과정을 통해 기계어 코드로 변환되는데 걸리는 시간
  • 런타임: 컴파일을 마친 기계어가 실행되는 시간, 프로그램이 동작하는 시간

프로세스 context 🆚 프로세스 address space

  • 프로세스 context:
    • state of process
    • OS가 프로세스를 관리하기 위해 대해 알아야 하는 정보를 저장(CPU register, PCB, kernel info)
  • 프로세스 address space: 프로세스에게 할당된 메모리(code, data, stack)

✅ 프로세스의 상태

코딩공책-97

  • ✔️ new
  • 프로세스 생성 후
  • 프로세스를 위한 각종 자료 구조는 생성되었지만
  • 메모리 획득 승인은 받지 못함
  • admitted 받아야 running으로 갈 수 있음

  • ✔️ terminated
  • 프로세스가 종료되었으나 운영체제가 그 프로세스와 관련된 자료구조를 정리 중

  • ✔️ Running
  • CPU에서 기계어를 실행하는 프로세스는 한 개
  • 현재 CPU를 잡고 instruction을 수행 중

  • ✔️ Ready
  • CPU를 쓰려고 기다리는 프로세스
  • 메모리 등 다른 조건은 모두 만족했고, 기다리고 있음
  • ready상태에 있는 여러개의 프로세스 중 하나가 CPU를 할당받는 과정을 CPU 디스패치라고 한다.

  • ✔️ Blocked(wait, sleep)
  • CPU를 줘봐야 소용이 없는 프로세스
  • (오래걸리는 I/O작업 하고 있는 프로세스)

  • OS는 dataPCB를 통해서 각 프로세스의 상태를 관리하고 있다.
  • queue에 줄을 세워서 관리
  • 그리고 CPU는 CPU queue다음에 있는 프로세스에게 CPU를 준다.
  • 그러다가 I/O가 끝나서 interrupt가 들어오면 interrupt 요청한 프로세스의 상태를 ready로 바꾸고 그 프로세스에게 CPU를 준다.

  • ✔️ Suspended(stopped)
  • 외부적인 이유로 프로세스의 수행이 정지된 상태
  • 프로세스는 통째로 disk에 swap out된다.

    • 메모리가 꽉 차서 운영체제 swapper이 디스크로 쫒아냄
    • 사용자가 프로세스를 일시 정지함

Blocked 🆚 Suspended

  • 공통점: CPU없음

  • Blocked:

    • 자신이 요청한 event가 만족되면 ready
    • 프로세스가 CPU만 빼앗겼을 뿐, I/O장치에서 뭔가 작업을 하고 있음
    • 적극적으로 일을 하고 있기는 함
  • Suspended:

    • 메모리에 없는 상태
    • 외부(운영체제 또는 사람)에서 resume해 주어야 active
    • 메모리가 필요한 일을 아예 못함!
    • 하지만 I/O는 할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- new: 프로세스 생성 중
- ready: 메모리에 올라옴
- running: 기다리다가 CPU 할달 받음

1. 오래걸리는 작업이 필요함(수행하다가 I/O가 필요함)
➡️ waiting = blocked
- 오래걸리는 작업이 끝나면
➡️ ready

2. timer가 작동함
➡️ ready

3. 작업이 끝남, 종료
➡️ terminate

4. 사용자가 프로세스를 일시정지시킴(break key)
➡️ suspended

5. 시스켐이 여러 이유로 프로세스를 중단시킴
(메모리에 너무 많은 프로세스가 올라옴)
➡️ suspended

  • 프로세스 Arunning하다가 system call로 운영체제를 호출하면 프로세스 A의 상태는?
  • 프로세스 A 입장에서는 계속 running이다.
  • CPU는 없지만 I/O입력이라든가 계속 일을 하고 있으니까
  • 하지만 wait/blocked로 상태를 표시
  • 다만 전에는 user mode였다면 이제는 kernel mode, monitor mode이다.


  • 프로세스 Arunning하다가 interrupt가 들어오면 프로세스 A의 상태는?
  • 프로세스 A가 CPU를 가지고 있었는데 디스크가 interrupt
  • CPU는 운영체제에게 넘어간다.
  • 프로세스 A의 상태는 본인과 상관없는 이유로 CPU가 넘어갔지만, running이다.
  • interrupt직전에 돌고 있던 프로세스를 그냥 running하고 있다고 간주한다.
  • 다만 마찬가지로, 전에는 user mode였다면 이제는 kernel mode, monitor mode이다.
  • 하지만 프로세스 A상태를 ready로 보기도 함

Screenshot 2025-01-08 at 12 54 41

  • Activate: CPU는 못 쓰지만 I/O는 할 수 있음
  • Admit: new에서 ready
  • Dispatch: ready에서 running으로
  • Activate🟰 swap in: 외부에서(운영체제 또는 사람)이 swap in 메모리에 다시 넣기 해 주어야 한다.
  • Suspend 🟰 swap out: 메모리에서 쫒겨남
  • Blocked suspended: 메모리에 없는 상태
  • Ready suspended: 메모리에 없는 상태, 하지만 I/O는 할 수 있음

✅ PCB에 어떤 내용이 들어있는가

PCB: Process Control Block
in OS kernel data
운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보

☑️ PCB 구성 요소(구조체로 유지)

Screenshot 2025-01-05 at 13 51 32

OS가 프로세스에 관한 정보를 저장하기 위해 사용하는 데이터 구조이다.
acts as a repository

  • ✔️ OS가 관리상 사용하는 정보
  • process state, Process Id
  • scheduling information, priority
  • process with highest priority will get the CPU in the next turn

  • ✔️ CPU수행 관련 하드웨어 값
  • 프로세스 문맥 context
  • PC program counter: CPU빼앗기기 전 어디까지 실행했었는지, 이어서 실행하기 위해
  • (그래서 프로세스 A한테서 CPU 빼앗기 전에 프로세스 A PCB안에 저장을 해둔다. )
  • registers


  • CPU의 PC, register 🆚 OS kernel data PCBPC, register
  • CPU의 PC, register: CPU가 어디까지 실행했는지, CPU연산 값 register에 저장
  • OS kernel data PCBPC, register: CPU를 빼앗기 전 해당 프로세스를 어디까지 실행했는지 저장
  • 각 프로세스마다 각각의 data PCB, 각 PC, register가 있다

  • ✔️ 메모리 관련
  • code, date, stack위치 저장

  • ✔️ 파일 관련

✅ Context Switching 문맥 교환

CPU 제어권을 한 프로세스에서 다른 프로세스로 넘겨주는 과정
반드시 한 프로세스process A에서 다른 프로세스process B로 넘어가야 함

☑️ Context Switching 과정

코딩공책-96

1
2
3
4
5
6
7
8
- system call, interrupt occurs
- OS saves process context(PC and registers) to process PCB
- change process state to running ➡️ blocked/ready/exit
- put PCB in the appropriate queue(block queue, ready queue)
- select next process to be run
- change process state to running
- bring process context(PC and registers) from process PCB
- CPU runs process

☑️ CPU가 다른 프로세스에게 넘어갈 때 OS역할

1
2
1. CPU를 내어주는 프로세스 상태를 그 프로세스 PCB에 저장
2. CPU를 새롭게 얻는 프로세스 상태를 PCB에서 읽어옴
  • CPU에서 실행시킬 프로세스를 변경하기 위해
  • 원래 실행중이던 프로세스의 process context를 자신의 PCB에 저장하고
  • 새로운 프로세스의 process context를 세팅하는 과정


  • 👎🏻 Context Switching은 context를 PCB에 저장하고 또 context를 불러오는 두 가지 과정이 필요하므로
  • 모드 변경에 비해 훨씬 큰 overhead

🆚 Mode switch

Mode switch: 프로세스 실행 중 interrupt/system call이 발생하여 CPU제어권이 OS로 넘어가 운영체제 커널 코드가 실행되는 것

  • CPU제어권이 운영체제로 넘어가기 전 현재 실행중인 프로세스의 process contextPCB에 저장하지만,
  • 이는 context swtiching은 아니다.
  • 왜냐하면 프로세스의 실행 모드만이 유저모드 ➡️ 커널 모드로 바뀌는 것 뿐
  • CPU를 점유하는 프로세스가 다른 프로세스로 바뀌지는 않기 때문
  • 오버헤드가 적다.


  • Context Switch와 Mode switch 공통점:
  • 현재 CPU에서 실행중인 프로세스의 process contextPCB에 저장한다.


  • Context Switch와 Mode switch 차이점:
  • Context Switch가 오버헤드가 훨씬 크다

context switching ⭕️❌

코딩공책-98

  • context switching ⭕️
1
2
3
4
5
6
7
8
9
10
CPU Process A running: 🏴 user mode
🛑 interrupt or system call or timer
ISR or system call function: 🏳️ kernel mode
➡️ Context switching
CPU Process B running: 🏴 user mode

💡 OS has to save context to PCB
- Much more burden for OS
- big overhead
(cache memory flush)
  • context switching ❌ mode switching
1
2
3
4
5
6
7
8
9
10
CPU Process A running: 🏴 user mode
🛑 interrupt or system call
ISR or system call function: 🏳️ kernel mode
➡️ back to user mode
CPU Process A running: 🏴 user mode

➡️ This is NOT context switching, this is mode switching
💡 OS does save context to PCB
- user mode에서 kernelmode 로 바뀌는 건 부담이 비교적 크지 않음
- 모든 context를 다 save할 필요는 없으니까
  • 공통점: OS에서 context를 PCB에 저장해야 함
  • 🆚 차이점: context switching이 훨씬 부담이 크다, big overhead

✅ CPU dispatch

  • process in ready state gets CPU

✅ 프로세스를 scheduling하기 위한 queue

OS는 프로세스를 모두 queue에 넣고 관리한다.

  • ✔️ Job Queue
  • 현재 시스템 내에 있는 모든 프로세스

  • ✔️ Ready Queue
  • 현재 메모리 내에 있고
  • CPU를 당장 얻어도 되는, 기다리고 있는 프로세스
  • ready queue에 줄 세우는 방법은 CPU scheduling방법에 따라 달라진다

  • ✔️ Device Queues
  • 특정 자원을 기다리는 프로세스 줄 세우기 위해 장치별로 장치 큐가 있다.
  • 예를 들어 디스크 콘트롤러에서 I/O 기다리고 있는 프로세스
  • 그러면 디스크 콘트롤러디스크 I/O 큐에 서 있는 순서대로 I/O 작업 수행
  • I/O가 완료되면 디스크 콘트롤러가 CPU에 인터럽트,
  • 프로세스는 이제 I/O 큐에서 빠져나와 CPU큐에서 기다리게 된다.

Screenshot 2025-01-04 at 17 02 14

This post is licensed under CC BY 4.0 by the author.