YSU System Final

Created
Created
2023 Dec 19 16:27
Creator
Creator
Seonglae ChoSeonglae Cho
Editor
Edited
Edited
2023 Dec 20 12:38
Refs
Refs

Signal

struct
task_struct
에서 signal 처리를 위하여 사용되는 자료구조를 모두 나열하고 설명하시오
  1. struct sigpending pending:
      • 프로세스에 private pending 신호들의 목록을 유지합니다 즉 프로세스에 아직 처리되지 않은 신호들을 나타냅니다.
  1. struct signal_struct *signal:
      • 프로세스의 shared signal descriptor를 가리키는 포인터이고, 프로세스나 프로세스 그룹에 전달된 신호들을 관리합니다.
  1. struct sighand_struct *sighand:
      • 프로세스의 signal handler들을 가리키는 포인터입니다. 이 구조체는 각 신호에 대응하는 신호 핸들러의 정보를 포함합니다.
  1. sigset_t blocked:
      • 이 비트마스크는 프로세스가 차단하고 있는 신호들을 나타냅니다. 차단된 신호들은 프로세스에 의해 처리되지 않습니다.
 
 
 
user defined signal handler를 사용하면 어떤 문제가 발생하고, Linux에서는 어떠한 해결 방안을 제시하였는지 쓰시오.
  • 문제: 사용자 정의 신호 핸들러를 사용할 때 문제는 커널 모드 스택과 사용자 모드 스택 간의 전환에 있습니다. 신호 핸들러가 사용자 모드에서 호출되고 종료되면, 원래의 실행 컨텍스트로 정확하게 복귀해야 합니다. 이 과정에서 스택 관리와 관련된 작업이 필요합니다.
  • Linux의 해결 방안
      1. 하드웨어 컨텍스트 복사: 커널 모드 스택에 저장된 하드웨어 컨텍스트를 현재 프로세스의 사용자 모드 스택으로 복사합니다.
      1. 사용자 모드 스택 수정: 신호 핸들러가 종료될 때 sigreturn() 시스템 호출이 자동으로 활성화되어 하드웨어 컨텍스트를 커널 모드 스택으로 다시 복사하고 사용자 모드 스택의 원래 내용을 복원합니다.
      1. handle_signal(): 프레임 설정, 신호 플래그 평가, 신호 핸들러 시작 및 종료 등의 작업을 포함합니다.
 
 

Locking in interrupt context

single processor 환경의 interrupt context에서 lock을 걸 경우, 왜 local interrupt disable을 하는지 쓰시오.
  • Critical Section 보호: Local CPU에서 모든 인터럽트를 비활성화하는 것은 커널 문장의 시퀀스가 critical section으로 운영되도록 보장합니다. 이는 인터럽트 핸들러가 현재 코드를 선점(preempt)하지 못하게 함으로써, critical section 내의 코드가 중단되지 않고 연속적으로 실행될 수 있도록 합니다.
  • Kernel Preemption 비활성화: 인터럽트를 비활성화하면 커널 선점도 함께 비활성화해 다른 프로세스나 스레드에 의해 현재 실행 중인 코드가 중단되지 않도록 합니다.
 
Multiple processor 환경의 interrupt context에서 lock을 걸 경우에는, global 대신 local interrupt를disable 하는 이유를 쓰시오
  • 글로벌 락하면 커널방에 있는 CPU 하나만 사용 가능하므로 아주 비효율적인 라킹이다. 그래서 동기화 매커니즘으로 확장성있게 해결이 좋다
 
 

blocking lock

kernel의 blocking lock들을 나열하고 설명하시오
  1. Semaphore
    (
    Counting semaphore
    )
      • 다중 프로세스 또는 스레드 간의 동기화를 위해 사용됩니다.
      • 세마포어는 정수 값으로 표현되며, 특정 자원에 대한 접근을 조정합니다. 프로세스/스레드는 세마포어를 감소(decrement)시켜 자원을 점유하고, 작업 완료 후 증가(increment)시켜 자원을 해제합니다.
      • 자원이 사용 중일 때, 다른 프로세스/스레드는 세마포어가 해제될 때까지 블록됩니다.
  1. Mutex Semaphore
      • 공유 자원에 대한 독점적 접근을 제공합니다.
        Busy waiting
      • 한 번에 하나의 스레드만 mutex를 소유할 수 있으며, 다른 스레드는 소유자가 mutex를 해제할 때까지 블록됩니다.
      • Mutex는 소유자가 해제하기 전까지 다른 스레드의 접근을 차단합니다.
  1. Completion Semaphore
      • 특정 작업이 완료되었음을 다른 스레드에 알리는 데 사용됩니다.
      • Completion 메커니즘은 일종의 신호 플래그로 작용하며, 한 스레드가 작업을 완료하면 다른 스레드에게 신호를 보냅니다.
      • 신호를 기다리는 스레드는 신호가 발생할 때까지 블록됩니다.
      • Special case of semaphores
  1. BKL
      • 과거에 커널의 동시 접근을 제한하기 위해 사용되었습니다.
      • BKL은 한 번에 하나의 스레드만 커널의 큰 부분에 접근할 수 있게 했습니다.
      • BKL을 소유한 스레드가 해제하기 전까지 다른 스레드는 커널의 해당 부분에 접근할 수 없습니다.
 
 
 

synchronization

single processor 환경에서 deferrable function에 대한 동기화를 하려면 어떻게 해야 하는가?
  • Deferrable function은 처리를 지연시킬 수 있는 so함수로, 일반적으로 인터럽트 핸들러와 비슷한 맥락에서 사용됩니다. 이들은 인터럽트 컨텍스트에서 실행되지 않고, 커널의 소프트웨어 인터럽트나 작업 큐를 통해 실행됩니다.
  • Single Processor 환경에서의 동기화 방법:
    • Local Interrupt Disabling: Single Processor 환경에서는 주로 로컬 인터럽트를 비활성화하여 deferrable function의 실행 중에 인터럽트로 인한 선점을 방지합니다. 이는 local_irq_disable()local_irq_enable() 매크로를 사용하여 수행할 수 있습니다.
    • Softirq 또는 Tasklet 사용: Softirq 또는 Tasklet 메커니즘을 활용하여 deferrable function을 동기화할 수 있습니다. 이 메커니즘들은 하드웨어 인터럽트 처리가 완료된 후에 실행되므로, 인터럽트 컨텍스트와의 동기화 문제를 효과적으로 관리할 수 있습니다.
 
 
multiple processor 환경에서도 동일한가?
  • Spin Lock 사용: 다중 프로세서 환경에서는 spin lock을 사용하여 deferrable function 간의 동기화를 달성할 수 있습니다. Spin lock은 여러 CPU에서 동시에 실행되는 deferrable function들 사이에서 상호 배타적인 접근을 제공합니다.
  • Per-CPU 변수 활용: 각 CPU에 대한 데이터를 별도로 유지하는 Per-CPU 변수를 사용하여 deferrable function의 동기화를 달성할 수 있습니다. 이 방법은 공유 데이터에 대한 접근을 각 CPU에 로컬라이즈하므로 lock이 필요하지 않은 경우에 유용할 수 있습니다.
  • Interrupt Disabling: 다중 프로세서 환경에서는 이것만으로 충분하지 않습니다. 따라서 spin lock이나 다른 동기화 메커니즘과 결합하여 사용되어야 합니다.
 

physical memory mapping

kernel의 일부 memory space는 physical memory에 direct mapping된다. 이 방식의 장점을 쓰시오.
  • 효율적인 메모리 할당: 커널 영역에서의 메모리 할당은 항상 물리적 RAM에 위치합니다. 이는 메모리 할당과 접근의 효율성을 크게 향상시킵니다.
  • 간단한 주소 변환: 물리 주소와 가상 주소 간의 변환은 단순한 덧셈 및 뺄셈 연산으로 가능합니다 (예: 가상 주소 = 물리 주소 + 3GB). 이러한 간단한 계산은 커널에서 메모리 관리를 더욱 효율적으로 만듭니다.
 
direct mapping되는 space는 1GB 중 896MB 뿐이다. 그 이유에 대하여 쓰시오.
  • Kernel Address Space의 다른 용도 사용: 커널은 주소 공간의 마지막 128MB를 다른 목적으로 예약해야 합니다. 이러한 예약은 커널이 효율적으로 작동할 수 있게 하며, 다양한 커널 기능을 지원합니다.
  • 특별한 메모리 매핑을 위한 공간 확보:
     
     

    physical frame

    struct page은 왜 사용하는가? zone과 mem_map과 연결지어서 설명하시오.
    1. page의 사용 목적
      1. zone과의 연결
        1. mem_map과의 연결
           

          memory allocation

          kmalloc과 vmalloc의 차이점에 대하여 쓰시오.
          • 물리적 연속성: kmalloc은 연속적인 물리 메모리를 할당하는 반면, vmalloc은 비연속적인 물리 메모리를 사용합니다.
          • 할당 크기와 메커니즘: kmalloc은 작은 메모리 할당에 적합하고 Buddy 시스템을 사용하는 반면, vmalloc은 큰 메모리 할당에 적합하고 Fixmap 영역을 활용합니다.
          • 성능과 사용 사례: kmalloc은 빠른 접근을 필요로 하는 상황에 적합하고, vmalloc은 큰 메모리 할당이 필요한 경우에 사용됩니다.
          1. kmalloc:
            1. vmalloc:
               
               
              vmalloc을 사용하지 않을 수 있는지 쓰시오.
              • 성능 이점: vmalloc을 사용하지 않을 경우, 시스템의 복잡성이 감소하고 성능이 향상될 수 있습니다. vmalloc은 가상 메모리를 물리 메모리에 매핑하는 추가적인 계산을 요구하기 때문에, 연속적인 물리 메모리를 사용하는 kmalloc이 성능 면에서 이점을 가집니다.
              • Fixmap 영역의 부담 감소: vmalloc은 커널의 Fixmap 영역을 사용합니다. 이 영역은 크기가 제한적이며, vmalloc 사용을 줄임으로써 이 영역에 대한 부담을 줄일 수 있습니다.
              결론적으로, vmalloc은 특정 상황에서 필요하지만, 모든 상황에서 필수적인 것은 아닙니다.
               

              process memory space

              process에 새로운 memory region을 할당하는 상황을 모두 적고 설명하시오.
              1. 새로 생성된 프로세스:
                1. 다른 프로그램 로딩:
                  1. 파일에 대한 메모리 매핑 수행:
                    1. 프로세스의 사용자 모드 스택에 데이터 추가:
                      1. 다른 프로세스와 데이터 공유:
                        1. 프로세스의 동적 영역(힙) 확장:
                           
                           

                          CoW

                          COW에 대해 설명하고, page fault handler과 엮어서 구현 방식을 설명하시오.
                          1. 개념: COW는 메모리 관리 전략으로, 두 프로세스가 같은 물리적 메모리 페이지를 공유할 수 있게 합니다. 이전의 UNIX 시스템에서는 fork()를 사용하여 부모 프로세스의 전체 주소 공간을 자식 프로세스에 복사했는데, 이는 비용이 많이 들고 시간이 오래 걸리는 작업이었습니다.작동 방식: COW에서는 페이지 프레임을 복제하는 대신, 부모와 자식 프로세스가 페이지 프레임을 공유합니다. 쓰기 가능한 영역의 페이지는 '읽기 전용'으로 설정됩니다.
                          1. Page Fault Handler와의 연계:
                             
                             

                            VFS는 무엇이고, 왜 사용하는가?
                            VFS layer is core concept of File System implementation to provide the same interface to user mode processes and a kernel abstraction for all different file system implementations. VFS is a kernel software layer that handles all system calls related to a standard UNIX filesystem.
                            • 통일된 인터페이스 제공: 사용자 모드 프로세스에 표준 UNIX 파일 시스템과 관련된 통일된 인터페이스(open/close/read/write 등)를 제공합니다.
                            • 커널 추상화 제공: 다양한 파일 시스템 구현에 대한 커널 추상화를 제공하여, 모든 커널 구성 요소가 동일한 추상 인터페이스를 사용할 수 있게 합니다.
                             
                             
                            VFS를 구성하는 4가지 자료구조를 쓰고, 설명하고, 자료구조 간 관계에 대해 설명하라
                            1. superblock
                              1. inode
                                1. dentry
                                  1. file
                                    • superblock과 inode
                                      • inode와 dentry
                                        • dentry와 file
                                           
                                           
                                           
                                           
                                           

                                           

                                          Recommendations