[수업출처] 숙명여자대학교 소프트웨어학부 김주균 교수님 '운영체제' 수업 & [OS? Oh Yes!]
1. 프로세스
- 시분할 시스템에서 메모리의 한 부분을 차지하는 작업, 동시에 CPU라는 자원을 분배해 주어야 하는 대상이 되는 작업들
- CPU를 할당받는 단위이자 주어진 자원들의 소유자로서의 역할
- 수행 중인 프로그램 = 프로그램과 데이터를 기본으로 정상적인 실행을 위해 필요한 환경을 시스템으로부터 부여받은 능동적인 존재
2. 프로세스 제어 플록(PCB)
- 프로세스에 대한 모든 것을 표현하는 테이블 형태의 자료구조
- 프로세스 하나가 만들어진다는 것은 PCB 하나가 만들어진다는 말과 같음
- 운영체제가 프로세스를 관리한다는 것은 해당 PCB에 대한 행동(생성, 수정, 관련 리스트 연결, 삭제 등)
- 기본적으로 메모리에 저장
- 프로세스 번호, 프로세스 상태(준비, 실행, 대기, 보류 등), 프로세스 우선순위, 프로그램 카운터 값(PC), 메모리 포인터, 문맥 데이터, 할당받은 자원들에 대한 목록, 계정 정보, 입출력 정보 등
3. 프로세스 상태 변화

1) 생성
- 사용자가 요청한 작업이 커널에 등록되고 PCB가 만들어져 프로세스가 만들어진 다음, 준비나 보류 준비 상태로 되기 위해 잠시 거치는 상태
- 메모리 공간을 검사하여 충분한 공간이 있으면 메모리를 할당하며 준비 상태로 바꿔주고, 그렇지 못할 경우 보류 준비 상태로
2) 준비
- CPU를 할당받기 위해 기다리고 있는 상태
- CPU만 주어지면 바로 실행할 준비가 되어있는 상태
- 큐 또는 리스트가 사용됨
3) 실행
- CPU를 할당(Dispatch)받아 실행 중인 상태
- 단일 CPU 시스템에서는 한 개의 프로세스만 실행 상태에 있음
- CPU 스케줄링 정책에 의해 CPU를 뺏길 수 있으며 이 경우 준비 상태로 바뀜
- 시간 할당량이 소진되어 CPU를 뺏기는 경우를 시간 종료라고 함 → 인터럽트가 동원되어 처리
- 입출력이 필요하여 시스템 호출을 하면 대기 상태로 바뀌게 되고, 준비 상태의 프로세스 중 하나가 다음으로 실행됨
4) 대기
- 프로세스가 실행되다가 입출력 처리를 요청하거나, 바로 확보될 수 없는 자원을 요청할 때
- CPU를 양도하고 요청한 일이 완료되기를 기다리며 대기하는 상태
- 큐 또는 리스트가 사용됨
- 요청한 일이 완료되면 준비 상태로 바뀌면서 CPU를 기다림
5) 종료
- 프로세스가 종료될 때 아주 잠시 거치는 상태
- 할당되었던 모든 자원들이 회수되고 PCB만 커널에 남아있는 상태
- 운영체제가 시스템에 남아있는 프로세스의 흔적들을 최종 정리 후 PCB를 삭제하면 프로세스가 완전히 사라짐
- 준비, 실행, 대기 상태 → 활성 상태: 메모리 공간의 일정량 부여받음
- 활성 상태에 있는 프로세스 개수: Multi-programming degree
- 메모리가 부족하거나 다른 이유에 의해 메모리를 회수당한 경우 → 보류 상태
- 보류 상태) PCB는 메인 메모리에 저장, Multi-programming degree - 1
6) 보류
- 프로세스가 메모리 공간을 뺏기고 디스크로 나가는 경우
- 이 경우 스왑되어 나간다고 하고(Swapped Out), 다시 메모리로 들어오면 스왑되어 들어온다 함(Swapped In) → Swapping
- 보류 준비 상태
- 생성된 프로세스가 바로 메모리를 받지 못할 때나,
- 준비 또는 실행 상태에서 메모리를 잃게 될 때를 위해 필요
- 실행 상태의 프로세스가 CPU를 반납하면서 준비 상태로 바뀔 때 메모리까지 잃어야 하는 경우(Suspended)
→ 충분한 메모리 공간의 확보를 위해 준비 상태의 프로세스를 보류시킬 수밖에 없는 경우
→ 높은 우선순위의 보류 대기 상태 프로세스가 준비 상태가 되면서 실행 상태의 프로세스로부터 CPU를 뺏는 경우
- 메모리의 여유가 생기거나 준비 상태의 프로세스가 전혀 없을 때 대기 상태의 프로세스를 보류 대기로 만들고, 메모리 공간이 확보되면 준비상태로 바뀌게 됨(Resume) → Swapping
- 보류 대기 상태
- 대기 상태일 때 메모리 공간을 잃은 상태
- 준비 상태의 프로세스가 아예 없어 대기를 보류 대기로 만드는 경우
- 준비 상태의 프로세스가 있었다고 해도 메모리의 여유 공간을 더 확보하기 위해
- 특별한 경우가 아니면 입출력이나 기다리던 사건의 종료 시 보류 준비 상태가 됨
- 메모리의 여유가 생겼을 때 대기시켰던 원인이 곧 해소될 것으로 판단되는 프로세스가 보류 대기 상태에 있는데, 보류 상태 중인 어떤 프로세스보다 우선순위가 높은 경우에는 그 프로세스에게 메모리를 주고 대기 상태로 만드는 것이 더 효과적일 것
- 보류 상태의 필요 이유
- 일차적으로 메모리 공간의 확보를 위해
- 실행되는 프로세스의 현재 결과가 바라던 것이 아닌 오류가 보일 때
- 시스템에 위해를 가할 수 있는 수상한 행동을 보일 때
- 주기적인 일이어서 다음 주기의 실행 때까지 메모리를 회수해도 문제되지 않을 때 등
4. 문맥교환
- 프로세스의 상태 변화는 인터럽트에 의해 처리됨
- 인터럽트 이전에 실행되던 프로세스가 인터럽트 처리 후에 계속 실행될 때도 있고, 다른 프로세스로 CPU가 할당될 때도 있음
- 인터럽트 처리 전후의 프로세스가 같은 경우 문맥교환을 위해 필요한 양이 적음 (PCB의 일부분만 보관)
- 다른 경우 문맥의 저장, PCB에서 관련 데이터들의 변경과 함께 PCB를 적절한 상태의 큐로 옮기기, 스케줄링, 그 프로세스의 PCB 변경과 문맥의 복원 등이 필요함
- 모드 스위칭: 인터럽트 처리 전후의 프로세스가 같은 경우 (사용자 모드 - 커널 모드의 변경만 생김)
- 프로세스 스위칭(문맥교환): 인터럽트 처리 전후 프로세스가 다른 경우
5. 스레드 Thread
- 하는 일은 서로 다르지만 관련 있는 작은 일들이 모여 프로세스를 구성한 경우, 세분된 작은 일들을 스레드라 함
- 프로세스는 부여된 자원의 소유자로서, 스레드는 스케줄링의 단위(CPU를 할당받는 단위)로서 존재
- 프로세스가 가지는 자원을 공유하면서, 각자는 자신의 실행환경(프로그램 카운터로 표현되는 현재 실행 위치, 스택, 레지스터 값)을 따로 가짐
- 다중 스레딩: 하나의 프로세스를 다수의 스레드로 만들어 실행하는 것
- 다수의 실행 단위들이 존재하여 작업의 수행에 필요한 자원들을 공유하기 때문에 자원의 생성과 관리가 중복되는 것을 줄일 수 있음
- 다중 스레딩에서 프로세스란 보호와 자원의 할당 단위
- 프로세스의 코드와 데이터를 수용하기 위한 가상주소 공간과 CPU, 다른 프로세스의 파일들, 입출력에 사용되는 자원에 대한 보호된 액세스를 보장하기 위한 단위
- 스레드 각각은 스레드의 수행 상태, 예를 들어 실행, 준비 등과 실행 상태가 아닐 경우를 위한 스레드 문맥, 각자의 실행 스택, 자신이 속한 프로세스가 가지는 메모리와 자원에 대한 접근 권한을 가짐
- 한 스레드에 의해 메모리의 데이터가 변경될 경우 다른 스레드들은 변경된 데이터를 사용하게 됨
- 열린 파일은 다른 스레드들에게도 열린 상태로 사용됨
- 단일 스레드 프로세스: PCB, 사용자 주소 공간, 사용자 스택과 커널 스택
- 다중 스레드 프로세스
- 프로세스) PCB, 사용자 주소 공간 : 스레드들과 공유
- 스레드) 스레드 제어 블록, 사용자 스택과 커널 스택
- 스레드의 생성, 삭제, 스위칭에 소요되는 시간과 비용이 프로세스 단위로 이루어질 때보다 빠르고 저렴
- 프로세스 간의 통신은 커널의 개입을 필요로 하지만, 한 프로세스 내 스레드 간 통신은 커널의 개입이 필요없음
- CPU 스위칭을 위한 스레드 단위의 자료는 유지되어야 하며, 프로세스 단위로 행해지는 보류, 종료 등은 전체 스레드에 동일한 영향 미침
6. 스레드 상태와 동기화 Synchronization
- 스레드 역시 실행, 준비, 대기의 상태를 가짐 (메모리 자원은 프로세스 단위로 할당되기 때문에 보류 상태는 없음)
- 대기는 레지스터 값, 프로그램 카운터(PC), 스택 포인터 등의 보관이 요구되며, 스레드의 종료는 해당 스레드의 레지스터 값들과 스택을 없앰
- 주소 공간과 자원 공유 → 특정 스레드가 변경시킨 내용이 다른 스레드에 바로 영향 미침
- 상호 간의 간섭이나 데이터 파괴 등을 방지하기 위한 스레드 실행의 동기화가 요구됨
→ 프로세스 간의 동기화에서 발생하는 문제와 해결책과 동일
7. 스레드의 종류
1) 사용자 레벨 스레드
- 스레드 라이브러리에 의해 관리됨
- 스레드 라이브러리의 메모리에서의 위치는 사용자 공간
- 스레드와 관련된 모든 행위는 사용자 공간에서 이루어지므로 커널은 스레드의 존재를 알지 못함
- 커널은 스레드들의 행위를 프로세스의 행위로 인식함
- 스레드 라이브러리는 스레드의 생성, 소멸을 위한 코드와, 스레드 간의 메시지나 데이터의 전달, 스레드의 스케줄링, 스레드 문맥의 보관, 재 저장 등을 담당
- 스레드를 지원하지 않는 운영체제에서도 사용 가능
- 특정 스레드의 실행에서 대기는 소속된 프로세스의 대기 초래
- 당시 실행중이던 스레드는 지금 실제로 실행 중이 아니지만 스레드 라이브러리에 의해 실행으로 계속 간주되고 있다가 나중에 CPU가 다시 이 프로세스에 할당되었을 때 계속 실행해 나갈 수 있도록 해줌
- 스레드의 실행 중 프로세스의 시간 초과가 될 경우 커널은 프로세스의 스위칭 수행
- 당시 실행중이던 스레드 역시 실행 상태로 유지되다가 프로세스가 CPU 받으면 다시 실행됨
- 스레드의 스위칭 도중 프로세스 스위칭이 일어나도 CPU를 다시 받았을 때 스레드의 스위칭이 계속 진행되도록 함
- 스레드 스위칭에 커널의 개입 필요 없음 (모드 스위칭 필요 없음)
- 스레드 간의 스위칭 시 운영체제가 정한 스케줄링(프로세스 스케줄링)에 따를 필요 없고, 응용 별로 독자적인 스케줄링 사용할 수 있음
- 스위칭은 스레드 라이브러리에 있는 스위칭 프로그램에 의해 결정됨
- 특정 스레드의 대기가 프로세스 내의 모든 스레드들의 대기를 초래하며, 다중처리 환경이 주어진다해도 스레드 단위의 다중처리가 되지 못한다는 단점 (CPU는 프로세스 단위로 할당되기 때문)
2) 커널 레벨 스레드
- 모든 스레드의 관리를 커널이 하는 경우
- 스케줄링은 커널에 의해 스레드 단위로 이루어지므로 사용자 레벨 스레드의 단점을 극복할 수 있음
- 다중처리의 환경일 경우 한 프로세스 내의 다수 스레드는 각각 CPU를 할당받아 병렬 실행 가능
- 한 스레드의 대기 시 같은 프로세스에 속한 다른 스레드로 스위칭 가능
- 같은 프로세스에 속한 스레드 간의 스위칭에도 커널의 개입 필요 → 모드 스위칭 요구됨
- 커널 레벨 스레드라 해도 다중처리가 아닌 환경이라면 어차피 하나밖에 없는 CPU를 가동하기 때문에 시간적인 차이가 없을 것이라고 생각할 수 있음
- 단일 처리기 환경에서 다른 서버에 있는 프로시저 호출하고 그 다음 또 다른 서버에 있는 프로시저 호출하는, 즉 두 번의 순차적인 원격 프로시저 호출(RPC)을 수행하는 일을 할 때
- 스레드 없이 프로세스로 한 경우는 RPC 이후 서버로부터 결과를 받을 때까지 기다린 후 다음 RPC 호출을 실행함
- 스레드가 있는 경우 첫번째 호출을 한 스레드에게 맡기고 대기가 될 때 바로 다른 스레드를 실행시켜 두번째 호출을 실행함
- 두 개의 스레드가 대기 중인 시간대가 중복된 만큼 전체 일의 종료 시간이 앞당겨짐
'Software > OS' 카테고리의 다른 글
[OS] 4장. CPU 스케줄링 (0) | 2022.04.18 |
---|---|
[OS] 2장. OS 상식과 인터럽트 (0) | 2022.04.10 |
[OS] 1장. OS의 정의와 역사, 기능 (0) | 2022.03.05 |