프로세스의 개념
프로세스의 문맥(context)
- CPU 수행 상태를 나타내는 하드웨어 문맥
- 프로세스의 주소 공간
- 프로세스 관련 커널 자료 구조
- PCB (Process Control Block)
- 커널 스택
프로세스의 상태
프로세스는 상태(state)가 변경되며 수행된다
- Running
- Cpu를 잡고 instruction을 수행중인 상태
- Ready
- CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
- Blocked(wait,sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- Process 자신이 요청한 이벤트(예: IO)가 즉시 만족되지 않아 이를 기다리는 상태
- 예) 디스크에서 file을 읽어와야 하는 경우
- New : 프로세스가 생성중인 상태
- Terminated : 수행(execution)이 끝난 상태
Process Control Block(PCB)
- 운영체제가 각 프로세스를 관리하기 위해 프로세스 당 유지하는 정보 (각 프로세스마다 하나의 PCB를 할당하여 프로세스를 관리한다)
- 다음의 구성 요소를 가진다(구조체로 유지)
- (1) OS가 관리 상 사용하는 정보
- process state, Process ID
- scheduling information, priority
- (2) CPU 수행 관련 하드웨어 값
- Program counter, registers
- (3) 메모리 관련
- (4) 파일 관련
문맥 교환 (Context Switch)
- CPU가 다른 프로세스나 스레드로 전환되는 상황
- CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
- 시스템콜이나 인터럽트 발생 시 반드시 컨텍스트 스위치가 일어나는 것은 아니다
문맥 교환이 발생해도 CPU의 캐시 메모리는 그대로 유지된다고 한다.
프로세스 스케줄링 큐
- 작업 큐(Job Queue) : 작업 큐는 시스템에 도착한 작업들(작업 단위)을 저장하는 큐이다. 이 큐에는 아직 CPU를 할당받지 못한 작업들이 대기하게 된다. 작업 큐는 장기 스케줄러 (Long-term Scheduler 또는 ㅓJob Scheduler)에 의해 관리되며, 시스템에 새로운 작업이 들어올 때 해당 큐에 추가된다
⇒ 현재 시스템 내에 있는 모든 프로세스의 집합
- 준비 큐(Ready Queue) : 준비 큐는 CPU를 할당받을 준비가 된 프로세스들이 대기하는 큐이다. 준비큐는 단기 스케줄러(Short-term Scheduler 또는 CPU Scheduler)에 의해 관리되며, CPU를 할당받기 위해 경쟁하게 된다
⇒ 현재 메모리 내에 있음
- 디바이스 큐(Device Queue) : 입출력 디바이스와 관련된 작업들이 대기하는 큐로 입출력 작업을 처리하기 위해 디바이스의 디바이스 드라이버에 의해 사용하고 관리되는 큐이다. CPU와는 독립적으로 동작한다. 입출력 디바이스는 자신만의 버퍼와 상태를 가지고 있어, 디바이스와의 입출력 작업은 일반적으로 CPU의 간섭 없이 비동기 적으로 처리된다. 입출력 디바이스는 작업을 처리하는 동안 CPU를 사용할 수 없기 때문에 입출력 작업을 요청한 프로세스는 디바이스 큐에 해당 작업을 저장하고, 작업이 완료되면 해당 작업을 디바이스 큐에서 제거하고 결과를 받아 올 수 있다. 디바이스 큐는 시스템의 입출력 처리를 조절하고, 다수의 입출력 디바이스와의 동시작업을 가능하게 함으로써 시스템의 효율성과 처리량을 향상시킨다.
⇒ 대기 큐와 같이 입출력 작업을 처리하지만 대기큐는 프로세스 스케줄링을 위해 사용되는 큐이고, 디바이스 큐는 입출력 작업을 처리하기 위해 사용되는 큐이다. 대기 큐와 디바이스 큐는 서로 다른 목적과 처리 방식을 가지고 있으며, 각각 다른 관리 주체에 의해 관리된다.
- 대기 큐(Waiting Queue 또는 Blocked Queue) : 대기 큐는 입출력(I/O) 작업 등의 완료를 기다리는 프로세스들이 대기하는 큐. 입출력 작업 등의 완료를 기다리는 동안 CPU를 사용할 수 없는 프로세스들이 이 큐에 대기하게 된다. 대기 큐는 입출력 작업을 처리하는 등의 특정 이벤트가 발생하면 준비 큐로 이동될 수 있다
- 종료 큐(Termination Queue 또는 Exit Queue): 종료 큐는 실행이 완료된 프로세스들이 대기하는 큐. 프로세스가 실행을 마치면 종료 큐로 이동되며, 이후에 프로세스의 종료 처리 등이 이루어진다
- 다중 큐(Multi-level Queue) : 다중 큐는 서로 다른 우선순위를 가진 프로세스들이 여러 개의 큐에 할당되는 경우에 사용되는 큐의 집합이다. 각 큐는 독립적인 스케줄링 알고리즘을 사용하거나, 같은 알고리즘을 사용하되 각 큐마다 다른 우선순위를 부여하여 프로세스들을 스케줄링 할 수 있다
스케줄러 (Scheduler)
- 장기 스케줄러(Long-Term Scheduler)
프로세스가 메모리로 로드되는 시점에서(초기 단계) 실행될 지 여부를 결정하는 스케줄러. 메모리에 프로세스를 스왑인/스왑아웃하는 작업을 수행 (요새는 중기 스케줄러로 대체됨)
- 시작 프로세스 중 어떤 것들을 레디 큐로 보낼지 결정
- 프로세스에 메모리(및 각종 자원)을 주는 문제
- degree of Multiprogramming을 제어
- time sharing system에는 보통 장기 스케줄러가 없다 (무조건 ready)
- 단기 스케줄러(Short-Term Scheduler)
메모리에 적재된 프로세스 중 어떤 프로세스에게 CPU를 할당하여 실행시킬지 결정한다. CPU의 할당과 실행 중인 프로세스들의 상태를 감시하며, 실행 가능한 프로세스들 중에서 다음에 실행할 프로세스를 선택하여 CPU를 할당하는 역할 수행한다.
- 어떤 프로세스를 다음번에 running 시킬지 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야 한다(millisecond 단위)
- 중기 스케줄러(Medium-Term Scheduler or Swapper)
실행 중인 프로세스 중에서 일부 프로세스를 메모리에서 내려거나 메모리로 적재한다. 메모리 부족 상황에서 프로세스들을 외부 저장매체로 스왑아웃하거나, 저장매체에 있던 프로세스를 메모리로 스왑인하여 실행 가능한 상태로 만드는 역할을 수행
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아낸다
- 프로세스에게서 메모리를 뺏는 문제
- degree of Multiprogramming을 제어
보통 우선순위 큐, FIFO, 다단계 큐, 라운드 로빈 등은 모두 단기 스케줄러에 해당한다
일부 현대의 운영체제에서는 장기 스케줄러의 역할을 중기 스케줄러가 대체한다. 장기 스케줄러의 개념이나 용어를 사용하지 않을 수도 있다. 원래는 메모리에 뭘 올릴지 장기 스케줄러가 결정했는데 지금은 메모리에 다 올려놓고 중기 스케줄러가 그걸 쫓아낸다. 시스템 입장에서는 중기스케줄러는 두는게 더 효과적이다
- 중기 스케줄러로 인해 생겨난 상태 - Suspended
Thread
컴퓨터 프로그램에서 실행되는 독립적인 작업흐름을 의미한다. 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되어, 각 스레드는 독립적인 작업을 수행하면서 프로세스의 자원에 접근할 수 있다.
스레드는 프로세스 내에서 가벼운 작업 단위(CPU를 수행하는 단위)로, 프로세스와 달리 독립적인 주소 공간을 갖지 않고 프로세스의 주소 공간을 공유한다. 이로써 스레드 간의 통신과 데이터 공유가 용이해진다. 또한, 동일한 일을 수행하는 다중 스레스가 협력하여 높은 처리율과 성능 향상을 얻을 수 있고, 스레드를 사용하면 병렬성을 높일 수 있다
- 스레드의 장점
- 응답성 - 빠르다.
- 자원 공유
- 경제성 - 빠르다는 의미지만 응답성과는 다름. 프로세스 하나 안에 쓰레드를 추가하는 것은 오버헤드가 크지않다. 오버헤드는 문맥교환이 크다. —> 여기까지는 cpu가 하나 일 때 얻을 수 있는 장점
- cpu가 여러 개있는 환경에서 쓰레드를 뒀을 때 얻을 수 있는 장점 - 각각의 쓰레드가 서로 다른 cpu에서 병렬적으로 일할 수 있다
- 스레드의 구성
- program counter
- register set
- stack space
- 스레드가 동료 스레드와 공유하는 부분 (=task)
- code section
- data section
- OS resources
스레드 간의 경쟁 조건과 데드락과 같은 문제에 주의해야한다
- 경쟁 조건
두 개 이상의 스레드가 공유된 자원(공유 변수, 파일, 메모리 등)에 접근하려고 할 때, 그 접근이 서로 겹쳐서 예기치 않은 결과가 발생하는 상황을 말한다. 경쟁 조건은 스레드들이 동시에 자원에 접근하며, 각각의 스레드가 원하는 순서나 타이밍으로 접근하는 것을 보장할 수 없기 때문에 발생할 수 있다.
- 데드락
둘 이상의 스레드나 프로세스가 서로가 가진 자워을 얻기위해 서로 기다리는 상태로 빠지는 현상. 각 스레드나 프로세스가 서로의 자원을 점유한 상태에서 서로가 릴리즈 하는 것을 기다리다가 아무런 동작도 수행하지 못하는 상태가 되며, 작업이 진행되지 않고 멈춰버리는 현상이 발생한다. 데드락을 피해기 위해서는 네 가지 조건이 동시에 충족되지 않도록 해야한다.
- 상호 배제 : 자원은 한번에 하나의 스레드만이 점유할 수 있어야한다. 즉, 자원은 동시에 여러 스레드에 의해 동시에 접근되지 않아야한다
- 점유와 대기 : 스레드가 이미 자원을 점유한 상태에서 다른 자원을 요청할 때, 해당 자원이 사용 가능 할 때까지 스레드가 대기하지 않도록 해야한다.
- 비선점 : 한 스레드가 점유한 자원은 그 스레드가 직접 릴리즈 하기 전까지 다른 스레드에 의해 선점될 수 없어야한다. 즉, 다른 스레드가 점유한 자원을 강제로 빼앗아올 수 없도록 해야한다
- 순환 대기 : 스레들이 자원을 점유하고 있을 때, 사이클 형태로 자원을 대기하는 상황을 피해야한다. 이를 위해서 자원에 우선 순위를 부여하거나, 자원의 점유 순서를 정해두는 등의 방법을 사용하여 순환 대기 조건을 방지할 수 있다.