CS / / 2024. 10. 7. 15:02

Linux Kernel & Program Execution

Linux Kernel

  • memory resident part of Linux(메모리가 상주하는 부분)
  • 대부분이 C언어로 작성됨 (성능 상의 이유 혹은 하드웨어 의존적인 일부 코드만 어셈블리 언어로 작성)
  • 함수들로 구성
    • 다른 프로그램이 커널 함수를 호출할 수 있음
    • 이를 system call이라고 부름
  • 커널의 주요 구성
    • 프로세스 관리(process management)
    • 파일 시스템(file system)
    • 입출력 관리 시스템(I/O system)

 

Process

  • Process is a program in exeution(프로세스는 실행중인 프로그램)
  • Process의 context(문맥)
    • hardware context: CPU 수행상태
      • Registers, Program counter(PC)
    • user address space: 메모리 상태
      • 프로세스의 독자적인 메모리 주소 공간
      (virtual memory = logical memory)
      • code, data, stack으로 구성
    • kernel space: 커널이 관리하는 부분
      • PCB(Process Control Block): kernel은 process의 각종 정보(상태, 우선순위)를 PCB에 보관함
      • PCB: 운영 체제 커널의 자료 구조 각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거됨
      • kernel stack

 

Process의 address space

  • Loader가 compile된 binary code를 address space의 ‘Code’부분에 올려줌

 

Program Execution

  • 파일 시스템에서 파일을 실행할 때, 해당 프로세스는 사용자 주소 공간(user address space)에서 실행됨. 운영 체제는 프로세스를 생성하고, 그 프로세스의 코드, 데이터, 스택 등을 사용자 주소 공간에 로드함.
  • 커널 주소 공간(kernel address space)은 운영 체제의 핵심 구성 요소와 데이터 구조가 존재하는 영역으로, 사용자 프로세스가 직접 접근할 수 없음. 대신, 커널은 시스템 호출 등을 통해 사용자 프로세스와 상호작용함. 따라서 실행된 프로그램이 커널과 상호작용할 필요가 있을 때만 커널 주소 공간이 관련됨.

  • compile해서 실행파일 A랑 B가 만들어지고, 로그인해서 실행하면 프로세스의 address space가 생김
  • kernel address space는 시스템이 시작됐을 때부터 있었음
  • virtual memory와 physical memory를 분리시켜서 수행 → address translation만 잘 관리해주면 여러 프로그램이 동시에 돌아가는데 도움이 됨
  • kernel이랑 user영역 분리해야 안전함
  • swap area: 적은 메모리 공간에서도 큰 프로그램 수행 가능
    • 메모리 공간이 크면 백업, 복원 확률이 줄어서 속도가 빨라짐

 

Kernel Address Space

  • 기본 구조는 user address space랑 비슷함. (code, data, stack)
  • process가 여러 개면 PCB도 늘어남

 

Kernel Stack

  • kernel stack
    • 프로세스는 커널의 함수를 호출할 수 있음**(system call)**
    • kernel은 여러 프로세스가 같이 사용하는 공유 코드
    • 프로세스 별로 별도의 kernel stack을 둠
      • 프로세스가 시스템 콜로 커널 코드 수행 시 private space 보장
      • 커널 내에서 함수 호출 시 상태 저장
  • user stack
    • 일반 사용자 프로세스는 하나의 스택만 존재

 

Process States

  • Running
    • CPU에서 instruction을 수행중인 상태
  • Ready
    • CPU를 기다리는 상태
  • Blocked(wait, sleep)
    • I/O 등 오래 걸리는 작업의 완료를 기다리는 상태
    • ex) 디스크에서 file을 읽어와야 하는 경우 shell이 command를 foreground로 실행시키고 기다리는 경우
  • suspended (stopped)
    • 외부적인 이유로 프로세스의 수행이 정지된 상태
    • 프로세스는 메모리에서 디스크 swap area로 쫓겨난다(반드시 쫓겨나는건 아님)
    • ex) foreground process에 대해 control-z를 누른 경우

 

Process의 실행

  • A, B가 로딩이 돼서 각각의 address space(user process)가 만들어짐

  • Ready queue에 process가 들어있으면, 하나씩 꺼내서 cpu가 할당함
  • Ready → Running → Blocked → Ready → Running

 

System Call

  • user space에서 돌던 프로그램이 kernel space에 있는 어떤 함수를 call할 때 “system call을 한다”
  • I/O는 사용자 프로세스가 직접 하지 못함 → 모든 I/O는 커널을 통해서만 가능
  • user영역에서 kernel 영역에 들어가면 kernel mode에서 동작

 

System call vs Library

  • System call: 커널(kernel)의 주소 공간에 있는 코드
    • read()
  • Library: 사용자(user) 프로세스의 주소 공간에 있는 코드
    • scanf(), getchar(), gets(), fscanf(), fgetc(), fgets(), fread(), …
  • 프로그래머는 I/O를 위해 라이브러리 함수를 주로 사용
  • 그러나, 라이브러리의 모든 I/O함수는 결국 system call을 함
  • (라이브러리 함수는 사용자 프로그램이므로 직접 I/O를 할 수 없음)
  • 많은 I/O 관련 라이브러리 함수가 존재하지만 결국 read() 혹은 write() 시스템 콜로 귀결

 

Functions in Program

  • 사용자 정의 함수 myspace()
    • 자신의 프로그램에서 정의한 함수
  • 라이브러리 함수 printf()
    • 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
    • 자신의 프로그램의 실행 파일에 포함되어 있음

  • 커널 함수 read(), write()
    • 운영체제 프로그램의 함수
    • 커널 함수의 호출 = 시스템 콜
    • 커널 함수 중 일부는 인터럽트 처리 루틴

💡 TCP 통신 코드 짤 때 쓴 read, write, socket, .. 함수들도 다 커널 함수

 

 

Program Execution

  • printf() : user mode → write() : kernel mode
  • scanf() : user mode → read() : kernel mode

'CS' 카테고리의 다른 글

프로세스 & 스레드  (0) 2024.10.24
엔디안이란? (빅엔디안 / 리틀엔디안)  (0) 2024.10.24
[c언어] TCP/IP Socket 통신 흐름  (0) 2024.10.07
Transport Layer - TCP  (0) 2024.10.07
Linux Kernel & Process Management  (1) 2024.10.07
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유