[수업출처] 숙명여자대학교 소프트웨어학부 김주균 교수님 '운영체제' 수업 & [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

+ Recent posts