03 프로세스와 스레드
프로세스\(_{Process}\)의 개념
- 실행 중인 프로그램(메모리에 적재되어)
- IBM 운영체제에서의 작업\(_{task}\)
- 프로세스는 능동적이다.
- 실행 중에 각종 자원을 요구, 할당, 반납하며 진행
- 프로그램은 디스크의 파일(C드라이브 내 Program파일 등..)로서 수동적
- 프로그램과 프로세스의 분리
- 프로그램: 저장 장치에 저장되어 있고 실행되지 않음
- 프로세스: 실행 중인 프로그램의 실행 단위
운영체제: 프로그램을 실행하기 위한 프로그램 컴퓨터 시스템을 관리, 타 프로그램을 실행하기 위한 소프트웨어임 즉 운영체제도 프로그램의 일부라고 볼 수 있음
- 프로세스는 운영체제의 통제를 받음
- 운영체제가 프로세스 관리를 하기 위한 블록 ⇒ 프로세스 관리 블록(PCB)
- 커널 공간 내 존재
- 커널에 등록된 각 프로세스들에 대한 정보를 저장하는 영역
- 커널에 등록되고 커널의 관리하에 있는 작업
프로그램 실행 순서

프로그램이 실행되기 위해서는 아래 순서를 거침
- 프로그램 디스크에 저장
- 운영 체제에 의해 프로그램이 프로세스로 생성
- 디스크에 저장된 프로그램을 메모리에 적재
- 메모리에서 프로그램을 실행 = 프로세스 실행
프로세스 구성
- 그림은 프로세스의 메모리 구조를 나타낸다.
- 스택\(_{stack}\)
- 0X0000 ~ 0Xffff 범위를 지님 (16진수)
- 2진수로 표현하려면 0000000000000000~ 1111111111111111가 된다.
- 임시 데이터 저장 공간
- 함수 파라메터, 리턴주소, 지역변수
- 0X0000 ~ 0Xffff 범위를 지님 (16진수)
- 힙\(_{heap}\)
- 동적 할당 메모리
- 데이터\(_{data}\)
- 전역변수
- 텍스트\(_{text}\)
- 프로세서가 실행하는 코드
프로세스의 상태
- 프로세스는 실행되면서 자신의 상태\(_{state}\)가 변함
- 프로세스의 상태가 변하는 이유
- 프로세스마다 필요로 하는 자원이 다를 뿐만 아니라, 여러 상황이나 요인에 의해 상태가 변함
- 실행 중에 각종 자원을 요구, 할당, 반납하며 진행
- 5가지 상태
- 생성\(_{new}\): 프로세스 생성
- 준비\(_{ready}\): 프로세서를 할당 받기 위해 대기
- 실행\(_{running}\): 명령어 실행 준비
- 대기\(_{waiting}\): 프로세스가 이벤트 발생을 대기 (I/O 종료나 시그널 수신)
- 종료\(_{terminated}\): 실행 종료
그림에서 각 상태는 다음과 같은 전이\(_{transition}\)를 통해 이동이 가능하다.
- 새로운 상태에서 준비 상태로: 프로세스가 생성되면 준비 상태로 이동
- 준비 상태에서 실행 상태로: 준비중인 프로세스들을 프로세스 스케줄링에 의해 실행 상태로 이동
- 프로세스 스케줄링: 준비 상태에 있는 여러 개의 프로세스 중 한가지를 선택하는 것
- 실행 상태에서 대기 상태로: 실행중인 프로세스는 추가로 자원이 필요한 경우가 발생, 이를 추가로 I/O 장치로 입력받기 위해서 대기 상태로 이동
- 대기 상태에서 준비 상태로: 추가로 I/O장치로 입력이 완료될 경우 준비 상태로 이동
- 준비 상태에서 종료 상태로: 프로세스가 종료되면 종료 상태로 이동 이를 웨이크업 전이 상태라고도 불림
그림에 표시된 이벤트의 종류
- admit: 프로세스가 운영 체제에 의해 허용되는 이벤트
- interrupt: 프로세스가 인터럽트 신호를 수신하는 이벤트
- exit: 프로세스가 종료되는 이벤트
예를 들어, 사용자가 프로그램을 시작하면 프로그램은 새로운 상태로 시작한다. 프로세서 스케줄러가 프로그램을 실행 상태로 이동시키면 프로그램은 실행 상태로 이동한다. 프로그램이 입출력 작업을 수행하면 프로그램은 대기 상태로 이동한다. 입출력 작업이 완료되면 프로그램은 준비 상태로 이동한다. 프로그램이 종료되면 프로그램은 종료 상태로 이동한다.
자원의 개념
- 커널에 의해 다른 주체(process)에게 할당 또는 반납되는 피동적인 개체
- 컴퓨터 시스템의 상태
- 각종 프로세스들과 각종 자원들의 상호작용(interaction) 으로 모델링
프로세스 제어 블록\(_{PCB}\)
- 커널 공간 내에 존재
- 커널에 등록된 각 프로세스들에 대한 정보를 저장하는 영역
- Kernel의 초록색 영역은 운영체제라고 볼 수 있다.
- 즉, 메모리의 일부 공간을 운영체제가 차지하고 있는데 이걸 커널이 사용한다 보면 됨
- 레지스터는 빠르고 메모리는 느림 그래서 PCB 내에 레지스터가 들어있음
- 레지스터에 저장된 정보를 메모리를 통해 사용하는 것보다 레지스터에 직접 접근해서 사용하는게 효율적이기 때문
스레드\(_{Thread}\)
- 명령어들의 한 줄기 혹은 프로그램 제어 흐름
- 프로세스의 실행 단위
- 프로세스의 스레드들은 병행으로 실행되면서 공통의 목표를 위해 협력
- 레지스터, 스택 등 각각의 스레드를 위한 자료 사용
- 프로세스의 자원과, 흐름을 제어함
- 프로세스에 속한 주소 공간은 해당 프로세스에 속한 모든 스레드에 공통
- 멀티 스레드 개별로 메모리 주소를 사용한다.
-
멀티 스레드는 메모리 절약에 용이하다.
- 멀티 스레드의 SR의 경우 하나의 메모리에 각각의 스택을 갖는다. 즉, 하나의 메모리를 쪼개서 사용한다고 생각하면 됨
- 멀티 스레드의 장점
- 사용자 응답성 증가
- 프로세스의 자원과 메모리 공유 가능
- 정제성이 좋음
- 다중 처리로 성능, 효율 향상
프로세스 스케줄링
- 멀티프로그래밍의 목적
- CPU 활용성 극대화를 위해 항상 어떤 프로세스가 실행되도록 유지
- 따라서 CPU에서 실행되는 프로세스를 자주 교환
- 프로세스 스케줄러\(_{Process \ scheduler}\)
- CPU에서 실행 가능한 프로세스를 선택
- 프로세서에서 동작할 수 있는 프로세스는 단 한 개
- 나머지 프로세스들은 대기
프로세스 상태
- 현재 소유/요청하고 있는 자원들의 종류에 따라 구분
- 현재 어떤 상황에 있는지/어떤 일을 하고 있는지
메모리에 적재된 프로세스: 활동 상태
메모리에 적재되지 않은 프로세스: 지연 상태
-
생성 상태\(_{Created \ state}\)
- 사용자가 요청한 작업이 커널에 등록되는 과정
- 새로운 프로세스가 만들어지는 상태
-
준비 상태\(_{Ready \ state}\)
- 메모리에 할당 되어있음
- 메모리가 부족할 경우 지연 상태\(_{Suspended \ ready}\)로 프로세스가 넘어감
- 지연 상태된 프로세스는 가상 메모리에 적재됨
-
실행 상태\(_{Running \ state}\)
- 프로세서에 의해 실행되는 상태
- 선점\(_{Preeemption}\): 실행 → 준비
- 실행중인 프로세스가 프로세서 시간 할당량(time quantum, time slice) 종료, 우선순위 등으로 인하여 자신에게 할당된 프로세서를 반납 → 준비 상태로의 전이
- Timerrunout: 시간할당량 종료로 선점
- 블럭\(_{block}\): 실행 → 대기
- 프로세스가 실행 중 자원을 요청하거나 기타 다른 이유로 system call을 하는 경우 대기 상태로 전이 (프로세스 스스로 전이)
- system call \(\equiv\) SVC(Supervisor Call)
- 커널은 프로세스의 요청을 받기 위한 system call interface를 제공
-
대기 상태\(_{Waiting \ state}\)
- 프로세스가 프로세서 외의 특정 자원을 요청하고 이를 할당 받을 때까지 기다리고 있는 상태
- Wakeup: 대기 → 준비
-
지연 상태\(_{Suspended \ state}\)
- 준비 - 대기와 동일한 상태
- 가상 메모리에 적재되었다는 차이만 존재한다.
- 지연 준비 상태\(_{Suspended \ ready \ state}\)
- 프로세스 생성 후 기억 장치의 양이 부족한 경우
- 준비 상태의 프로세스가 기억 장치 잃은 경우(swap-out)
- 실행 상태에서 선점 당하고 기억 장치도 잃은 경우(swap-in)
- 지연 대기 상태\(_{Suspended \ asleep \ state}\)
- 대기 상태에서 기억 장치를 잃는 경우
-
종료 상태\(_{Terminated}\)
- 프로세스 실행 완료
- 커널이 아닌 사용자 프로그램을 종료하는 것
- 모든 자원 반납
- PCB 등의 프로세스 관리 정보만 남아 있음
- 종료 → 프로세스 존재 삭제
- PCB에 남아 있을 이유가 없어서 삭제함
- 종료 → 프로세스 존재 삭제
프로세스 상태 관리 자료구조 (스케줄링 큐)
- 스케줄링을 위해서 PCB들이 연결되는 큐가 필요
- FIFO 구조를 이용해 여러 프로세스 중 먼저 들어온 프로세스를 실행
- 대기 상태 → 준비 상태로 넘어갈 때 큐에 들어간다는 소리임
- 큐의 종류
- 작업 큐\(_{job \ queue}\): 프로세스가 시스템에 들어가면 작업 큐에 입력
- 준비 큐\(_{ready \ queue}\): 주 기억 장치에 상주, 준비 상태에서 실행을 대기
- 장치 큐\(_{device \ queue}\): 특정 입출력 장치를 대기하는 프로세스들의 리스트
문맥 교환\(_{Context \ switch}\)
- CPU 실행을 다른 프로세스로 전환하기 위해
- 이전 프로세스 상태를 저장 + 새로운 프로세스의 상태를 적재하는 과정
- Context는 해당 PCB에 저장
- CPU 레지스터 값, 프로세스 상태, 메모리 관리 정보
- 주요 단계
- 현재 프로세스의 상태 저장
- PCB or 스택에 현재 실행중인 프로세스의 정보를 저장
- 다음 프로세스의 상태 복원
- 스케줄링에 의해 선택된 다음 실행할 프로세스의 PCB or 스택에서 저장한 상태를 복원한다.
- CPU 할당
- CPU가 다음 프로세스에서 코드를 실행하도록 전환한다.
- 현재 프로세스의 상태 저장
- 발생 시기
- Multitasking
- 준비 → 실행, 실행 → 준비: 이미 실행 중이었던 프로세스를 중지하고 준비 상태인 프로세스를 실행
- 실행 → 대기: 입출력 작업 등으로 인해 대기로 전환 시 문맥 교환 발생
- 인터럽트 처리
- 인터럽트 발생 시 인터럽트를 우선 처리해야 하기 때문에 문맥 교환 발생
- 무조건 문맥 교환이 진행되지는 않음
- 예외) 모드 전환
- 사용자 ↔ 운영체제 간 모드 전환에는 일반적으로 문맥 교환 발생 X
- Multitasking
- 문맥 교환 시간
- 운영체제가 복잡할수록 문맥 교환에 더 많은 작업 요구
- 문맥 교환 중 타 작업 불가능
프로세스 교환
- 프로세스의 교환 발생 원인
- 인터럽트, 트랩, 시스템 호출로 발생
- 실행 중인 프로세스가 인터럽트되어 OS가 다른 프로세스를 실행 상태로 변경, 제어를 넘겨줄 때, 프로세서의 레지스터 내용은 저장해야 함
인터럽트 처리 및 문맥 교환
- 프로세스의 상태 전이, 시스템의 진행과정 이해
- 멀티태스킹을 위해 인터럽트 처리, 문맥 교환 사용
- 인터럽트 개념
- Signal or instruction due to unexpected event
- resulting in CPU process stop
- 예) 하드웨어 신호(인터럽트) → 소프트웨어(커널)
- 인터럽트의 일반적인 종류
- 하드웨어 인터럽트
- 입출력 인터럽트\(_{I/O \ interrupt}\): 입출력 완료
- 타이머 인터럽트\(_{clock \ interrupt}\): 프로세스 시간할당량 종료
- 하드웨어 검사 인터럽트\(_{machine \ check \ interrupt}\): 하드웨어 오류
- 소프트웨어 인터럽트
- 트랩\(_{trap}\): 프로그램 실행 중 오류, 0 나누기, 잘못된 명령 등
- 특정한 명령어: I/O 서비스 필요, system call
- 하드웨어 인터럽트
인터럽트 처리 과정
사용자 모드 → 운영체제 모드로 변경
- 그림 해석
- 인터럽트 발생
- pcb에 기존 실행중인 프로세스 저장
- 인터럽트 핸들러에서 원인을 파악하고 그에 대응하는 ISR을 호출한다.
- ISR에서 인터럽트에 대해 조취를 취한다.
- 문맥 교환을 통해 다시 기존에 실행중인 프로세스를 실행한다.
댓글남기기