11. Linux Kernel & Program Execution

chelseey·2024년 11월 18일

Linux Kernel

: 메모리에 상주(memory-resident)하는 코드

• 대체로 C 언어로 작성되며, 특정 하드웨어에 의존적인 일부는
어셈블리 언어로 작성됨.
• 다른 프로그램이 커널 함수 호출 가능. (system call을 통해 수행)

❯ 커널의 주요 구성 요소

• 프로세스 관리 (Process Management)
: 실행 중인 프로그램(프로세스)을 관리.
프로세스의 생성, 종료, 스케줄링을 담당.

• 파일 시스템 (File System)
: 파일의 저장, 접근, 권한 관리를 수행.

• 입출력 시스템 (I/O System)
: 장치와의 데이터 송수신을 관리.

Process

: 실행 중인 프로그램

❯ 프로세스의 context (문맥 : 상황을 설명하는 사실들)

• Hardware Context
: CPU 실행 상태를 저장.
ex. 레지스터(Register), 프로그램 카운터(PC).

• User Address Space
: 프로세스의 독립적인 메모리 주소 공간.

ex. 코드(Code), 데이터(Data), 스택(Stack) 등.

• Kernel Space
: 운영체제 커널이 관리하는 메모리 공간.

PCB (Process Control Block):
프로세스의 상태, 우선순위, 메모리 정보 등을 저장.
Kernel Stack :
커널 모드에서의 함수 호출 정보 저장.

Process의 address space

• Stack (스택)
: 함수 호출 시 매개변수, 반환 주소, 로컬 변수 등을 저장하는 영역.
LIFO (Last In, First Out) 구조로 동작.
함수 호출이 끝나면 메모리가 자동으로 해제됨.

예제) 함수 F1, F2 호출 시 로컬 변수, 반환 주소가 저장됨.

• Dynamic Data (Heap)
: 런타임 시 동적으로 메모리를 할당받는 공간.
malloc() 또는 new와 같은 함수로 할당하며, 프로그래머가 명시적으로 해제해야 함.

예제) int *a = malloc(sizeof(int)); // 힙에서 동적 메모리를 할당

• Static Data (데이터)
: 전역 변수와 정적 변수(Static 변수)가 저장되는 영역.
프로그램이 실행되는 동안 메모리가 유지됨.

예제) static int b // 데이터 영역에 저장됨.

• Code (코드)
: 프로그램의 실행 코드(명령어)가 저장되는 영역.
읽기 전용(Executable Code Only)으로 보호됨.

예제) main(), F1, F2 함수의 명령어 // Code 영역에 저장됨.

• Reserved Area
: 시스템이 사용하는 예약된 공간으로, 접근이 제한됨.

Program Execution

: 파일 시스템의 실행 파일이 실제 메모리에서 프로세스로 변환되는 과정

• 파일 시스템의 실행 파일 → 메모리의 프로세스 변환
: 실행 파일은 메모리에 로드된 후 프로세스가 되어 실행됨.

• 커널의 역할
: 프로세스 간 자원 관리를 담당하며, 메모리와 CPU를 효율적으로 분배.

• 독립된 주소 공간
: 각 프로세스는 서로 독립된 메모리 공간을 사용하여 실행.

동작 과정

프로세스 실행:
CPU는 프로세스 A 또는 B를 실행합니다.
메모리에서 데이터를 읽고 명령어를 실행.
I/O 요청 및 처리:
프로세스가 I/O 요청을 하면 CPU는 요청을 I/O 컨트롤러에 전달.
컨트롤러가 장치와 상호작용하여 작업을 수행.
I/O 작업 완료:
작업이 완료되면 컨트롤러가 CPU에 완료 신호를 보냄.
대기 중이던 프로세스가 Ready 상태로 전환.
타이머 관리:
타이머가 설정된 시간이 지나면 현재 실행 중인 프로세스를 중지하고, 다음 프로세스를 실행.

• Virtual Memory (가상 메모리)
: 각 프로세스는 독립적인 가상 메모리 주소 공간을 가짐.
가상 주소는 실제 물리 메모리의 주소와 다를 수 있으며, 이를 MMU(Memory Management Unit)가 변환함.

프로세스 A와 B의 가상 주소는 같은 범위를 사용할 수 있지만, 서로 다른 물리 메모리에 매핑되기 때문에 충돌하지 않음.

• Physical Memory
: 실제 메모리(RAM)로, 커널과 모든 사용자 프로세스가 공유.

User 영역: 사용자 프로그램(프로세스 A와 B)의 코드, 데이터, 스택이 로드됨.
Kernel 영역: 운영체제 커널의 코드와 데이터를 저장함.

• Address Translation (주소 변환)
: 가상 메모리 주소를 물리 메모리 주소로 변환하는 과정.
MMU(Memory Management Unit)와 커널이 함께 이 작업을 수행.

→ 프로세스 간 메모리 충돌 방지, 물리 메모리를 효율적으로 활용.

• Swap Area
: 물리 메모리가 부족할 때 디스크의 일부를 확장 메모리로 사용하는 공간.

Kernel Address Space

• Data
: 커널이 프로세스 관리를 위해 사용하는 데이터.

PCB (Process Control Block)
: 각 프로세스에 대한 정보를 저장하는 데이터 구조.
프로세스 ID (PID)
프로세스 상태 (State: 실행 중, 대기 중 등)
CPU 레지스터 정보
메모리 정보 (코드, 데이터, 스택 등 주소 정보)
파일 디스크립터 (열려 있는 파일 정보)

→ 프로세스 A의 PCB와 프로세스 B의 PCB가 각각 독립적으로 관리됨.

• Stack (스택)
: 커널 스택은 커널 내부에서 함수 호출 (function call) 시 생성되는 메모리 공간.

함수 호출과 반환 주소, 로컬 변수 저장.
→ 프로세스 A와 프로세스 B는 각각 독립적인 커널 스택을 가짐.

• CPU, MEM, DISK (하드웨어)

CPU
: 프로세스 실행을 위한 연산 작업 수행.
PCB와 커널 스택을 참조하며 작업을 실행.

MEM (메모리):
코드, 데이터, 스택이 로드되는 물리 메모리.

DISK (디스크):
실행 파일, 데이터 파일 등이 저장된 파일 시스템.

프로세스 관리 과정

• 프로세스 생성

  1. 실행 파일이 디스크에서 메모리로 로드됨.
  2. 커널은 새로운 PCB를 생성하여 프로세스 정보를 기록.
  3. 프로세스마다 고유한 커널 스택이 생성.

• Context Switching
: CPU가 하나의 프로세스에서 다른 프로세스로 작업을 전환하는 과정.

  1. 현재 실행 중인 프로세스의 CPU 레지스터 상태를 PCB에 저장.
  2. 다음 실행할 프로세스의 PCB를 참조하여 레지스터 상태를 복원.
  3. 해당 프로세스의 커널 스택을 활성화.

• 시스템 콜 처리
: 사용자 프로세스가 커널에 자원 요청 시 발생.

  1. 사용자 모드에서 시스템 콜이 호출되면 커널 모드로 전환.
  2. 커널 스택을 사용하여 요청 처리.
  3. 작업 완료 후 다시 사용자 모드로 복귀.

Kernel Stack

: 프로세스가 커널 코드를 호출할 때 사용하는 스택
여러 프로세스가 함께 사용하는 공유 코드로 이루어져 있지만, 각 프로세스마다 독립적인 커널 스택을 사용.

User Stack (사용자 스택)

: 프로세스가 사용자 모드에서 실행될 때 사용하는 스택.
일반 사용자 프로세스는 하나의 사용자 스택만 사용.

Process States (프로세스 상태)

• Running
: 프로세스가 CPU를 점유하고 명령어(Instruction)를 실행 중인 상태.

• Ready
: 프로세스가 실행 준비를 완료한 상태로, CPU 할당을 기다리는 상태.
실행이 가능한 상태지만, CPU를 점유하지 않음.
CPU가 사용 가능해지면 Running 상태로 전환.

• Blocked (Wait, Sleep)
: 프로세스가 특정 작업(I/O 작업 등)의 완료를 기다리는 상태.
ex. 디스크에서 파일을 읽어오는 작업, 네트워크에서 데이터 수신을 대기.
작업이 완료되면 Ready 상태로 전환.

• Suspended (Stopped)
: 외부적인 이유(사용자 명령, 시스템 관리 등)로 프로세스가 중단된 상태.
메모리에서 디스크의 Swap 영역으로 데이터를 옮길 수 있음.
ex. 사용자가 Ctrl+Z를 눌러 Foreground 프로세스를 중지.

State Transitions

Ready → Running
: CPU가 프로세스에 할당될 때.

Running → Ready
: CPU 할당이 종료되거나, 다른 프로세스가 우선순위로 인해 스케줄링될 때.

Running → Blocked
: 프로세스가 I/O 작업 등의 외부 작업을 기다릴 때.

Blocked → Ready
: 대기 중이던 작업(I/O 등)이 완료될 때.

Running → Suspended
: 사용자 요청 또는 시스템 관리로 인해 프로세스가 중단될 때.

Suspended → Ready
: 중단 상태에서 다시 활성화될 때.

Process 의 실행

프로세스 실행 모델

• CPU
: 프로세스 A와 B를 번갈아 실행.
명령어 실행과 I/O 요청 처리.

• Memory
: 여러 프로세스(A, B)와 커널 공간으로 구성.
각 프로세스는 독립된 메모리 공간을 가짐.

• I/O Device
: 디스크, 키보드, 프린터, 모니터 등이 포함됨.

• Controller
: 각 I/O 장치에 연결된 하드웨어 제어 장치.
CPU와 I/O 장치 간 데이터를 중계.

• Timer (타이머)
: CPU 스케줄링을 위한 시간 제어 장치.
특정 프로세스가 CPU를 독점하지 않도록 제어.

동작 과정

  1. 프로세스 실행:
    CPU가 프로세스 A 또는 B를 실행.
    메모리에서 데이터를 읽고 명령어를 실행.
  2. I/O 요청 및 처리:
    프로세스가 I/O 요청을 하면 CPU는 요청을 I/O 컨트롤러에 전달.
    컨트롤러가 I/O 장치와 상호작용하여 작업을 수행.
  3. I/O 작업 완료:
    작업이 완료되면 컨트롤러가 CPU에 완료 신호를 보냄.
    대기 중이던 프로세스가 Ready 상태로 전환.
  4. 타이머 관리:
    타이머가 설정된 시간이 지나면 현재 실행 중인 프로세스를 중지하고, 다음 프로세스를 실행.

프로세스 상태와 I/O queue

• Ready Queue
: CPU가 사용 가능해질 때 실행 준비가 완료된 프로세스가 대기하는 공간.

• Blocked (I/O Queue)
: I/O 작업을 대기하는 상태.
I/O 작업 완료 시 Ready Queue로 다시 이동.

ex.
Disk I/O Queue: 디스크 작업 대기 중인 프로세스(A).
Keyboard I/O Queue: 키보드 작업 대기 중인 프로세스(B).

동작 과정

  1. Ready Queue → Running (파란 화살표)
    CPU가 사용 가능해지면 Ready Queue에서 첫번째 프로세스 A가 CPU를 할당받아 Running 상태로 전환.

  2. Running → Disk I/O Queue (파란 화살표)
    프로세스 A가 실행 중 디스크 작업을 요청.
    Disk I/O Queue로 이동하여 작업 완료를 대기.

  3. Disk I/O Queue → Ready Queue (파란 화살표)
    디스크(I/O) 작업이 완료되면 프로세스 A는 Ready Queue로 복귀.

  4. Running → Keyboard I/O Queue (주황 화살표)
    프로세스 B가 실행 중 키보드 작업을 요청하며 Keyboard I/O Queue로 이동.

  5. Keyboard I/O Queue → Ready Queue (주황 화살표)
    키보드 작업이 완료되면 프로세스 B는 Ready Queue로 복귀.

System Call을 통해 Kernel Mode로 전환

: 프로세스가 I/O 요청(read, write, etc.)과 같은 시스템 호출(System Call)을 할 경우

• Kernel Address Space
Code: 커널 코드가 저장된 영역으로, 시스템 호출 처리.
Data: 커널에서 관리하는 데이터 저장소. I/O 작업 요청 저장.
Stack: 함수 호출 및 실행 상태를 저장하는 공간.

System Call (read()) 과정

  1. Ready Queue → Running
    CPU가 Ready Queue에서 A 프로세스를 선택하고 실행.

  2. Running → Kernel Mode (System Call)
    프로세스 A가 read() 시스템 호출을 요청.
    사용자 모드에서 실행 중인 프로세스가 시스템 호출 인터페이스를 통해 커널 모드로 전환됨.
    이때 프로세스는 CPU 제어권을 커널에 넘김.

  3. Kernel 작업 수행
    커널은 Kernel Address Space의 Code와 Data를 사용하여 요청된 작업을 처리.
    프로세스가 I/O 작업 요청을 한다면, I/O가 해당 작업을 완료할 때까지 해당 프로세스는 I/O Queue에 들어가 대기.

  4. I/O 작업 완료 → Ready Queue 복귀
    I/O 작업이 완료되면, 해당 프로세스는 다시 Ready Queue로 이동하여 CPU를 대기.
    Ready Queue로 돌아오는 순간, 프로세스는 사용자 모드(User Mode)로 전환될 준비를 함.

System Call

• I/O 작업은 커널을 통해서만 가능.
: 사용자 프로세스(P1)는 직접 I/O 장치를 다룰 수 없으므로,
반드시 커널에 요청해야 함.

• System Call은 사용자 모드와 커널 모드 간의 다리 역할을 함.

• 사용자 프로세스가 직접 하드웨어에 접근하지 못하도록 제한하여, 시스템 안정성과 보안을 유지.

System call vs. Library

I/O를 위해 라이브러리 함수를 사용하지만, 라이브러리 함수는 직접 I/O 작업을 수행하지 못함.
→ 모든 I/O 작업은 결국 System Call (read(), write())을 호출하여 처리됨.

작업 흐름 : main() 함수에서 input() 호출 → scanf() 호출 → read()

scanf()는 사용자 주소 공간(Library 함수)에 위치하며 데이터를 포맷팅, 버퍼를 관리.
read()는 커널 모드로 전환되어 실제 데이터를 디스크/입출력 장치에서 읽어옴.

Functions in Program

• User-defined Function (사용자 정의 함수)
: 프로세스의 Address Space 안에 존재, code 영역에 저장됨.

• Library Function (라이브러리 함수)
: 사용자 프로그램에서 직접 정의하지 않고 외부에서 제공받아 사용하는 함수.
실행 파일에 포함되어 있음.

ex. printf(), scanf(), strcpy().

사용자 프로그램의 Address Space 안에 존재, code 영역에 저장됨.
공유 라이브러리 형태로 프로그램에서 호출됨.

• Kernel Function (커널 함수)
: 운영체제 커널에서 제공하는 함수로, 시스템 호출(System Call)을 통해 접근할 수 있음.

ex. read(), write(), fork(), exec().

Kernel Address Space 안에 존재, code 영역에 저장됨.

0개의 댓글