ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Thread & Process - 2
    TIL 2023. 12. 28. 01:45
    728x90

    프로세스 & 스레드의 생명 주기

    프로세스와 스레드는 각각의 생명 주기를 가진다. 운영체제는 이 생명 주기를 관리하고 프로세스와 스레드를 조정해서 시스템 자원을 효율적으로 사용할 수 있게 된다.

    프로세스 스케쥴링

    운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업이다. 프로세스의 우선순위, 작업량 등을 고려해서 효율적으로 배치한다. 이를 통해 운영체제는 효율적으로 CPU를 사용해서 시스템 전반적인 성능을 향상시킨다.

    스케쥴링은 운영체제의 특징과 시스템 요구사항에 따라 여러 알고리즘 방식으로 동작된다.

    FCFC(First-Come, First-Served), SJF(Shortest-Job-First)등이 있다.

    프로세스 상태

    프로세스의 상태는 프로세스가 실행되는 동안 변경되는 고유 상태를 의미한다. 프로세스가 생성되어 실행되기 까지 프로세스는 여러가지 상태를 갖고, 상태의 변화에 따라 프로세스가 동작된다. 프로세스는 일반적으로 다음과 같은 상태를 가진다.

    • 생성(new) : 프로세스가 생성되고 아직 준비가 되지 않은 상태
    • 준비(ready) : 프로세스가 실행을 위해 기다리는 상태. CPU를 할당받을 수 있는 상태, 언제든지 실행될 준비가 되어있다.
    • 실행(running) : 프로세스가 CPU를 할당받아 실행되는 상태.
    • 대기(waiting) : 특정 이벤트(입출력 요청 등)가 발생해서 대기하는 상태. CPU를 할당받지 못하며, 이벤트가 발생해서 다시 ready 상태로 전환될 때까지 대기
    • 종료(terminated) : 프로세스가 실행을 완료하고 종료된 상태. 더 이상 실행될 수 없으며, 메모리에서 제거

    프로세스 상태 전이

    프로세스가 실행되는 동안 상태가 운영체제에 의해 변경되는 것을 말한다. 운영체제는 프로세스의 상태를 감시하고 프로세스 상태를 기반으로 프로세스 스케쥴링을 통해 프로세스를 관리하고 제어한다.

    예를 들어 ready 상태에 있는 여러 프로세스 중에서 어떤 프로세스를 running 상태로 바꿀지, terminated 상태에 있는 프로세스를 제거하고 ready 상태에 있는 다른 프로세스를 선택할지 스케쥴링 알고리즘에 의해 동작된다.

    프로세스 컨텍스트 스위칭

    CPU가 한 프로세스에서 다른 프로세스로 전환될 때 발생하는 일련의 과정을 말한다. CPU는 한 번에 하나의 프로세스만 실행할 수 있으므로, 여러 개의 프로세스를 번갈아 가며 실행하여 CPU 활용률을 높이기 위해 컨텍스트 스위칭이 필요하다.

    동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(context)를 보관하고 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.

    다음번 프로세스는 스케쥴러가 결정한다. → 컨텍스트 스위칭의 주체는 스케쥴러

     

    PCB (Process Control Block)

    PCB는 운영체제에서 프로세스의 상태 정보를 저장하는 중요한 자료구조다. 컨텍스트 스위칭 시 프로세스의 상태를 저장하고, 나중에 같은 작업을 이어서 수행할 수 있게 한다.

     

    운영체제는 PCB에 담긴 프로세스 고유 정보를 통해 프로세스를 관리하고, 프로세스의 실행 상태를 파악하고 우선 순위를 조정하며, 스케쥴링을 수행하고 다른 프로세스와의 동기화를 제어한다.

    PCB에는 다음과 같은 정보가 포함되어 있다.

     

    포인터 (Pointer): 프로세스의 현재 위치를 나타낸다.

    프로세스 상태 (Process state) : 프로세스의 각 상태(생성, 준비, 실행, 대기, 종료)를 저장한다.

    프로세스 아이디 (Process ID) : 프로세스의 고유 식별자다.

    프로그램 카운터 (Program counter) : 다음 실행 명령어의 주소를 저장

    레지스터 : CPU 레지스터에 있는 정보를 저장한다.

    메모리 제한 (Memory Limits) : 운영체제에서 사용하는 프로세스의 메모리 사용 범위 정보

    열린 파일 목록 (List of open file) : 프로세스에 의해 열린 파일들의 목록

     

     

    Process Context Switching 과정

    두 개의 프로세스 간에 컨텍스트 스위칭 과정을 다음과 같이 표현할 수 있다.

     

     

    Context Switching Overhead

    컨텍스트 스위칭은 빠른 반응성과 동시성을 제공하지만, 실행되는 프로세스가 변경되는 과정에서 프로세스의 상태, 레지스터 값 등이 저장되고 불러오는 작업이 수행되므로 시스템에 부담을 주게 된다.

    P1 프로세스가 execute에서 idle이 될 때 P2 프로세스가 바로 execute가 되지 않고 조금 있다가 execute가 되는 걸 볼 수 있다. 이때의 간극이 바로 컨텍스트 스위칭으로 발생하는 오버헤드이다.

     

     

    컨텍스트 스위칭 오버헤드는 다음과 같은 상황에서 발생한다.

    1. PCB 저장 및 복원 비용 : 컨텍스트 스위칭 과정에서 프로세스의 상태와 레지스터 값 등이 저장되고 복원되는 데 비용이 발생한다.
    2. CPU 캐시 메모리 무효화에 따른 비용 : 새로운 프로세스로 전환되면서, CPU의 캐시 메모리에 저장된 데이터가 무효가 된다. → 메모리 접근 시간 증가, 성능 저하
    3. 프로세스 스케쥴링 비용 : CPU 스케쥴링 알고리즘에 의해 새로운 프로세스가 선택되는 과정에서 오버헤드가 발생한다.

    컨텍스트 스위칭은 프로세스 뿐만 아니라 스레드 간에서도 발생한다. (멀티 스레드)

    여러 개의 스레드가 동시에 돌아가므로 프로그램 성능이 무조건 상승할 것이라고 예상할 수 있지만, 과도한 컨텍스트 스위칭 오버헤드는 오히려 성능이 떨어지는 현상을 야기하게 된다.

     

     

    스레드 스케쥴링

    프로세스 스케쥴링과 마찬가지로 스레드 스케쥴링은 운영체제에서 멀티 스레드를 관리하고, CPU자원을 사용할 수 있는 스레드를 선택하고 할당해주는 작업이다.

    이 과정에서 스레드의 우선순위나 실행 시간을 고려하며, 다양한 알고리즘(예: 라운드 로빈, 우선순위 기반 스케쥴링)이 사용된다.

    프로세스 스케쥴링과는 달리, 하나의 프로세스 내에서 여러 스레드가 동작하기 때문에, 스레드 간 상호작용과 동기화 문제를 고려해야 한다.

     

    스레드 상태

    다음과 같은 4가지 형태를 가진다.

    1. new : 생성된 상태이지만 아직 시작되지 않음.
    2. runnable : 실행을 기다리는 상태, CPU 할당을 받을 준비가 되어 있음.
    3. blocked : 특정 이벤트 대기로 인해 실행되지 않는 상태.
    4. terminated : 실행을 완료하고 종료된 상태. 메모리에서 제거된다.

     

    Thread Context Switching

    멀티 스레드 환경에서 스레드 간의 실행을 전환하는 기술이다. 프로세스 컨텍스트 스위칭과 차이점은 하나의 프로세스 내에서 스레드들이 교환된다는 점이다.

     

     

     

    TCB (Thread Control Block)

    PCB와 유사하게 각 스레드마다 운영체제에서 유지하는 스레드에 대한 정보를 담고 있는 자료구조이다. TCB는 PCB 안에 위치한다.

     

    위 그림을 보면 PCB와 TCB는 LinkedList로 구현되어 있다.

    스레드의 상태정보, 스레드 id, 우선순위 정보 등이 저장된다. 스레드가 생성될 때 운영체제에 의해 생성되며, 스레드가 실행을 마치고 소멸될 때 함께 소멸된다.

    스레드 간의 자원 공유와 동기화도 TCB를 사용해서 관리된다.

    뮤텍스나 세마포어 같은 동기화 기법을 사용할 때 해당 스레드의 뮤텍스나 세마포어 정보를 관리하고 스레드가 해당 자원에 대한 접근 권한을 획독하거나 반납할 때 TCB 정보를 업데이트 한다.

    cf)

    뮤텍스 : 임계 구역에 1개의 스레드만 들어갈 수 있음

    세마포어 : 임계 구역에 여러 스레드가 들어갈 수 있고, counter를 두어서 허용 가능한 스레드를 제한

     

    프로세스 컨텍스트 스위칭 vs 스레드 컨텍스트 스위칭

    두 기술 모두 멀티태스킹 환경에서 여러 프로세스 혹은 스레드를 동시에 실행하기 위한 기술이지만, 몇 가지 차이점을 가진다.

    1. TCB가 PCB보다 가볍다

    프로세스 내의 스레드들은 프로세스가 할당받은 text, data, heap 영역 메모리를 공유한다. TCB에는 stack과 간단한 레지스터 포인터 정보만을 저장하므로 더 빨리 읽고 쓸 수 있다.

    2. 캐시 메모리 초기화 여부

    CPU 캐시 메모리는 CPU와 메인 메모리 사이에 위치한다. CPU에서 한 번 이상 읽어들인 메모리의 데이터를 저장하고 있다가, CPU가 다시 그 메모리에 저장된 데이터를 요구할 때, 메인 메모리를 통하지 않고 곧바로 데이터를 전달해주는 용도이다.

     

    그런데 프로세스 컨텍스트 스위칭이 일어나면, 다른 프로세스 실행으로 인해 CPU가 새로운 명령어와 데이터를 로드해야하므로 CPU 캐시 메모리를 초기화해야 한다. 이로 인해 오버헤드가 발생한다.

    스레드 컨텍스트 스위칭의 경우 프로세스 내 스레드 간에 stack과 레지스터 값 등 일부 컨텍스트 정보만 변경되므로 CPU 캐시 메모리는 초기화되지 않는다.

    다만 스레드가 다른 CPU 코어에서 실행될 때는 해당 CPU 코어의 캐시 메모리에 스레드 컨텍스트 정보가 로드되어야 하므로 초기화 될 수 있다.

    3. 자원 동기화 문제

    프로세스 내의 스레드들은 text, data, heap 영역을 공유한다. 따라서 스레드 컨텍스트 스위칭이 발생해서 다른 스레드가 heap 영역의 공유 데이터에 접근할 때, 이전 스레드가 이미 공유 자원을 사용하고 있는 경우 동기화 문제가 발생할 수 있다.

    ex) 두 개의 스레드가 동시에 하나의 변수를 수정

    이를 스레드 간의 경쟁 조건(race condition)이라고 한다.

    프로세스는 기본적으로 독립되는 공간이지만, 공유 자원을 사용하는 경우에 똑같이 경쟁 조건이 발생할 수 있다.

    ex) 여러 개의 프로세스가 동시에 파일 시스템에 접근해서 동일한 파일을 수정.

    이를 해결하기 위해 각 상황에 적절한 공유 자원에 대한 동기화 메커니즘이 필요하다.

    728x90
Designed by Tistory.