ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CS : OS : Process
    Computer Science/OS 2021. 3. 25. 12:08
    728x90

    Process

     

     

    • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
    • 운영체제로부터 시스템 자원을 할당받는 작업의 단위
    • 프로세스는 각각 독립된 메모리 영역을 할당받는다.
    • 각 프로세스는 별도의 주소 공간에서 실행되고, 한 프로세스는 다른 프로세스의 변수나 구조에 접근할 수 없다.
    • 접근하려면, IPC(프로세스 간 통신)를 사용해야 한다. (pipe, file, socket 등)

     

     

    Thread

     

     

    • 프로세스 내에서 실행되는 여러 흐름의 단위
    • 프로세스가 할당받은 자원을 이용하는 실행의 단위
    • 각각의 스레드는 code, data, heap 영역은 공유하고, stack 영역은 따로 할당받는다.
    • 각각의 스레드는 힙 메모리는 서로 읽고 쓸 수 있고, 레지스터와 스택을 별도로 가진다.

     


     

     Multi-Processing

     

    • 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여, 각 프로세스가 하나의 작업(task)을 처리하도록 하는 것

     

    • 장점
      • 여러 개의 자식 프로세스 중 하나에 문제가 발생하면, 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.

     

    • 단점
      • context switching 과정에서 오버헤드가 발생한다.
      • 프로세스는 각각 독립된 메모리 영역을 할당받기 때문에, 이러한 프로세스 사이에서 공유하는 메모리가 없다. 때문에, context switching 발생 시 cache의 모든 메모리를 모두 reset하고 다시 불러와야 한다.
      • context switching에 대한 설명은 아래 참조

     


     

    Multi-Thread

     

    • 하나의 프로세스를 다수의 실행 단위로 구분하여, 자원을 공유하고, 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것

     

    • 사용자와 상호작용을 하는 application에서 single-thread로 network. DB와 같은 긴 작업(long-running task)을 수행하는 경우, 해당 작업을 처리하는 동안 사용자와 상호작용이 불능인 상태가 될 수 있다. 때문에 multi-thread 방식이 선호된다.

     

    • multi-thread로 구성된 프로그램은 multi-core 구조에서 core 1개 당 thread 1개가 할당되어 병렬처리 된다. single-thread의 경우 multi-core여도 1개의 core만 사용한다.

     

    • 사용 이유
      • 프로세스 개념으로 동시에 처리하던 일을 스레드 개념을 사용할 경우, '메모리 공간'과 시스템 자원의 소모'가 줄어든다.
      • 공유 메모리, 메시지 파싱, 파이프라인 등 IPC 방식을 활용하여 통신하는 프로세스의 방식에 비하여 스레드의 통신 방법은 훨씬 간단하다.
      • 스레드는 'data', 'code', 'stack' 영역을 공유하기 때문에, 'stack' 영역에 대해서만 context switching이 이뤄지기 때문에, 프로세스보다 빠르고 간단하지만, 에 대한 동기화 작업이 별도로 필요하다.

     

    • 장점
      • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어, 자월을 효율적으로 관리할 수 있다.
      • 스레드 간 데이터를 주고 받는 것이 간단해져, 시스템 자원 소모가 줄어든다.
      • 스레드 간 작업량이 작기 때문에, context switching이 빠르다. 시스템 처리량이 증가한다.
      • 스레드 간 통신의 부담이 적다.

     

    • 단점
      • 설계가 어렵고, 디버깅이 까다롭다.
      • 단일 프로세스 시스템의 경우, 효과를 기대하기 어렵다.
      • 해당 프로세스 밖에서 해당 스레드를 제어할 수 없다.
      • 자원 공유에 있어 동기화 문제가 발생한다.
      • 하나의 스레드의 문제는, 전체 프로세스에 영향을 미친다.

     

     

    Multi-Thread의 동기화 문제

     

     

    • 서로 다른 스레드가 일부 영역을 공유하기 때문에, 동기화 작업이 필수적으로 필요하다.
    • 동기화를 통해 작업 순서와 공유 자원에 대해 컨트롤 한다.
    • 동기화 작업 시, 과도한 lock으로 인한 병목 현상, 성능 저하 현상을 방지해야 한다,
    • 따라서, 동기화가 필요한 부분에 대해 'synchronized' 키워드를 활용한다.
    • 특정 메소드에 대해 메소드 전체를 동기화 할 것인지, 메소드 내부의 특정 부분에 대해서만 동기화 할 것인지 등에 대해 고민이 필요하다.

     


    Multi-Threaded Server

     

    • 계속 request를 만들어내는 클라이언트가 존재한다고 가정할 때, 이 클라이언트의 요청을 수행하는 서버는 스레드를 생성해서 요청을 받아들인다.

     

    • single-processor를 사용하는 서버이고, 프로세싱에 2ms, input-output delay에 8ms가 소요된다고 가정하면 하나의 스레드는 1초에 100개의 요청으로 처리할 수 있다.

     

    • 스레드가 2개라고 가정할 때, 1번 스레드가 프로세싱을 마치고 8ms 동안의 input-output delay가 있는 동안 2번 스레드가 2ms의 프로세싱을 수행할 수 있다. 이 경우 1초에 125개의 요청을 처리할 수 있게 된다.

     

    • 이번엔 I/O에 걸리는 시간을 줄이기 위해 cache를 사용한다고 가정할 때, hit ratio가 75%라고 가정하면, 평균 I/O 시간은 (0.75x0 + 0.25x8)로 2ms가 된다. input-output delay가 2ms가 되는 것이다. 이때에는 1초에 500개의 요청을 처리할 수 있다.

     

    • 결과적으로, 여러 개의 스레드를 사용하면 요청을 처리하는 데에 걸리는 시간을 크게 단축시킬 수 있다.

     


     

    Context Switching (문맥 교환)

     

    • CPU가 한 개의 task(or process or thread)를 실행하고 있는 상태에서 interrupt 요청에 의해 다른 task로 실행이 전환되는 과정에서, 기존의 task 상태 및 register 값에 대한 정보(context)를 저장하고 새로운 task의 정보(context)로 교체하는 작업
    • 이 때 context란, CPU가 다루는 task에 대한 정보이며, 대부분의 정보는 register에 저장되고, PCB(Process Control Block)으로 관리된다.
    • 프로세스의 경우, 운영체제에 의해 PCB라는 구조로 관리되고, 스레드의 경우, 프로세스 내의 TCB라는 구조로 관리된다.

     

    • PCB의 주 저장 내용
      • Process State : 프로세스 상태
      • Program Counter : 다음에 실행할 명령어 address
      • Register : 프로세스 레지스터 정보
      • Process number : 프로세스 번호

     

    • context switching이 필요한 이유
      • 컴퓨터가 한 번에 하나의 task만 처리할 수 있다면, 반응 속도가 매우 느리고 사용하기 불편할 것이다. 이를 해결하기 위해 multitasking 개념이 필요하고, CPU는 여러 개의 task를 번갈아가며 실행하게 된다. 이 때 task의 이전 상태를 저장하고 불러오는 과정을 거쳐야 하고 이를 context switching이라고 한다.

     

    • context switching cost
      • Cache 초기화
      • Memory Mapping 초기화
      • Kernel이 항상 실행되어야 한다.

     


     

    Critical Section (임계 영역)

     

    • 다중 프로그래밍 시스템에서, 여러 프로세스들이 공유하고 있는 자원을, 한 시점에 하나의 프로세스만 접근할 수 있도록 지정된 영역을 의미힌다.
    • 한 번에 한 프로세스만 접근 가능하다.
    • 한 프로세스가 임계 영역의 자원을 독점할 수 없다.

     

    • thread-safe 하지 않는 code

     

     

     

    • thread-safe 한 code

     


     

    Mutex (Mutual Exclusion, 상호 배제)

     

    • 여러 프로세스들이 동시에 독립적으로 진행됨으로 인해, 발생하는 자원 사용의 문제점을 해결하는 기법 중 하나
    • 자원에 대한 접근이나 공유 데이터에 대한 접근 시 발생하는 문제이며, 커널 내에서 해결하여야 한다.
    • 키(key)가 두 개 이상인 뮤텍스를 세마포어(semaphore)라고 한다.

     


     

    Deadlock (교착 상태)

     

    • 상호 베제에 의해 나타나는 문제점이다.
    • 하나의 프로세스가 일부 자원을 독점하고, 다른 프로세스가 이를 무한히 기다리고 있는 상태이다.

     

    • deadlock 발생 조건
      • Mutual Exclusion (상호 배제) : 한 자원에 대한 여러 프로세스의 동시 접근 불가
      • Hold and Wait (점유와 대기) : 자원을 가지고 있는 상태에서 다른 프로세스가 자원의 반납을 기다리는 것
      • Non Preemptive (비선점) : 다른 프로세스의 자원을 강제로 가져올 수 없음
      • Circle Wait (순환대기) : 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있는 것

     

    • deadlock 해결 방법
      • Prevention (예방) : 위 네가지의 발생 조건 중 하나만 해결해도 교착 상태는 예방 가능하다.
      • Avoidance (회피) : 교착 상태의 가능성을 배제하지 않고 적절하게 피한다. (예 : 은행원 알고리즘)
      • Detection (탐지) : 교착 상태 발생 시, 원일을 해결한다. (예 : 자원할당 그래프)
      • Recovery (복구) : 교착 상태 발생 시, circle wait를 배제하고나, 자원을 중단하는 등의 메모리 할당 기법을 사용한다. (예 : 프로세스 선점, 프로세스 중지)
      • Ignorance (무시) : 교착 상태 발생 시, 이를 무시한다. 대부분의 운영체제에서 사용하는 방식이다.

     

    • 예방과 회피의 차이점
      • 예방 : deadlock 발생 조건 4가지 중 하나를 아예 불가능하게 바꿔버리는 것이다.
      • 회피 : deadlock 발생 여부를 계속해서 check하여 deadlock의 가능성을 검사하고 이에 따라 작업을 회피하는 등의 조치를 취한다.

     

    • 예방과 회피보다, 탐지와 복구를 더 많이 사용하는 이유
      • 예방과 회피를 사용할 경우, deadlock을 방지할 수 있지만, 자원을 효율적으로 사용하지 못한다. 
      • 또한, 특히 회피의 경우 특정 알고리즘을 통해 계속해서 check 해야 하는데 이는 많은 overhead가 발생하는 조건이다.

    ** 수정중 **

    CPU Scheduling (스케줄링)

     

     

    • 선점 스케줄링 (Preemptive)
      • 우선 순위가 높은 프로세스가 CPU를 차지한다.
      • 우선 순위가 높은 프로세스가 빠르게 처리될 필요가 있다면, 이러한 방식이 유용하다.
      • 선점이 일어날 경우 오버헤드가 발생되고, 처리 시간을 예측하기 어렵다.

     

    • SRT (Shortest Remaining Time)
      • 현재 처리 중인 프로세스의 남은 시간보다 더 짧은 프로세스가 ready queue에 들어오면, 해당 프로세스가 바로 선점된다.

     

    • RR (Round-Robin)
      •  

     

     

     

    • 비선점 스케줄링 (Non-Preemptive)
      • 프로세스가 스스로 CPU를 놓아줄 때(=작업이 완료될 때), 다음 프로세스가 CPU를 차지할 수 있다.

     

    728x90

    'Computer Science > OS' 카테고리의 다른 글

    CS : OS : Memory  (0) 2021.03.25
    CS : OS : Kernel  (0) 2021.03.25
    Pintos Project #3 : Thread scheduling  (2) 2020.05.29
    Pintos Project #2 : Alarm Clock의 개선  (0) 2020.05.29
    Pintos Project #1 : Pintos 환경 구축 (3/3)  (0) 2020.05.29

    댓글

kxmjhwn@gmail.com