[CS 스터디] 운영체제 4일차 - Process2

강아람·2022년 12월 28일
0

운영체제

목록 보기
4/11
post-thumbnail

📚 멀티 방식

멀티 프로세싱 (Multi-processing)

다수의 프로세서(CPU)가 다수의 프로세스를 실행

  • 하나의 프로세서에 고장이 발생해도 해당 프로세서가 진행중인 작업은 다른 프로세서가 수행하기 때문에 정지되지 않음
  • 여러 개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용한다면 각 데이터를 각 프로세서에게 할당할 필요 없이 하나의 공간에 데이터를 저장한 후 이를 공유하여 사용 가능

멀티 프로그래밍 (Multi-programming)

하나의 프로세서가 하나의 프로세스를 수행하는 동안 다른 프로세스에 접근 가능 (Context Switching)

  • 입출력 작업이 완료될 때까지 기다리는 시간을 낭비하지 않도록 다른 프로세스 처리에 자원을 사용하는 방법

멀티 태스킹 (Multi-tasking)

다수의 작업을 운영체제의 스케줄링에 의해 번갈아 가며 수행

  • 멀티 프로그래밍 방식, 시분할 방식(Time-sharing), 실시간 시스템(Real-time)을 사용하여 수행

멀티 스레딩 (Multi-threading)

하나의 프로세스를 다수의 스레드로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복을 최소화하여 수행 능력을 향상시키는 방법



📚 프로세스 스케줄링

스케줄러(Scheduler)

는 언제, 어떤 프로세스를 선택해서 CPU에서 실행시키는지 선택하는 모듈(Module)


CPU 스케줄링(CPU Scheduling)

Ready Queue에 여러 프로세스가 대기하고 있을 때 어떤 프로세스를 선택해서 CPU 자원을 할당할지 결정
▶ 시스템 자원을 효율적으로 사용하기 위함


성능 척도 (Performance measure)

1. 시스템 성능 척도 (클수록 좋음)

  • CPU 이용률(CPU Utilization) : 전체 시간 중 CPU가 쉬지 않고 일한 시간
  • 처리량(Throughput) : 단위 시간당 수행 완료한 프로세스 수

2. 프로그램 성능 척도 (적을수록 좋음)

  • 소요 시간(Turnaround Time) : 프로세스가 Ready Queue에서 대기한 시간부터 작업을 완료하는데 걸리는 시간
  • 대기 시간(Waiting Time) : 프로세스가 Ready Queue에서 대기한 시간
  • 응답 시간(Response Time) : 프로세스가 처음으로 CPU를 할당받기까지 걸린 시간

결정 시점

CPU 스케줄링 결정 시점은 프로세스의 상태 변화가 발생할 경우이다.



📚 스케줄링 알고리즘

선점형 스케줄링 (Preemptive Scheduling)

어떤 프로세스가 CPU를 할당받아 실행 중에 있어도 다른 프로세스가 실행 중인 프로세스를 중지하고 CPU를 강제로 점유할 수 있음

장점 : 비교적 응답이 빠름
단점 : 처리시간 예측 어려움, 우선순위 프로세스가 계속해서 들어오는 경우 오버헤드 발생 가능


선점형 스케줄링 종류

라운드 로빈 스케줄링(RR, Round Robin Scheduling)
프로세스마다 같은 크기의 CPU 시간을 할당하는 방식이다.
해당 시간동안 프로세스 처리가 완료되지 않으면 Ready Queue의 가장 뒤로 보내져 CPU 할당을 기다린다.


SRTF 스케줄링(Shortest Remaining-Time First Scheduling)
SJF를 선점형으로 바꾼 방식이다.
가장 짧은 시간이 소요되는 프로세스를 먼저 수행하되, 남은 시간이 더 짧다고 판단되는 프로세스가 Ready Queue에 진입하면 CPU를 선점할 수 있다.


다단계 큐 스케줄링(Multilevel Queue Scheduling)
작업들을 여러 종류의 그룹으로 분할하고, 여러 개의 큐를 이용하여 상위 단계 작업이 CPU를 선점한다.
각 큐는 자신만의 독자적인 스케줄링 방식을 가진다.


다단계 피드백 큐 스케줄링(Multilevel Feedback Queue Scheduling)
입출력 위주와 CPU 위주인 프로세스의 특성에 따라 큐마다 서로 다른 CPU 시간 할당량을 부여한다.
FCFS와 라운드 로빈 방법을 혼합한 방식이다.
새로운 프로세스는 높은 우선순위를 가지지만 프로세스의 실행 시간이 길어질수록 점점 낮은 우선순위 큐로 이동하며, 마지막 단계에서 FCFS 방식을 적용한다.


RM 스케줄링(Rate Monotonic Scheduling)
수행 주기가 가장 짧은 프로세스에 가장 높은 우선순위를 부여하는 실시간 스케줄링 방법이다. 즉, CPU를 더 자주 필요로 하는 프로세스가 더 높은 우선순위를 가진다. (=정적 우선순위 스케줄링)


EDF 스케줄링(Earliest Deadline First Scheduling)
마감시간(deadline)에 따라 우선순위를 동적으로 부여하는 방법이다. 마감시간이 빠를수록 우선순위가 높아진다. 이론적으로 EDF는 최적으로 100% CPU를 사용할 수 있다. (실제로는 문맥 교환 등의 overhead로 인해 100% 사용률은 불가능)



비선점형 스케줄링 (Preemptive Scheduling)

어떤 프로세스가 CPU를 할당 받으면 그 프로세스가 종료되거나 입출력 요구가 발생하여 자발적으로 중지될 때까지 계속 실행되도록 보장

장점 : 모든 프로세스에 대한 요구를 공정하게 처리 가능
단점 : 짧은 작업을 수행하는 프로세스가 긴 작업이 종료될 때까지 대기하는 상황 발생 가능(콘베이 현상)


비선점형 스케줄링 종류

FCFS 스케줄링(First Come First Served Scheduling)
먼저 큐에 들어온 프로세스부터 서비스한다. (=FIFO)


SJF 스케줄링(Shortest Job First Scheduling)
작업시간이 짧은 프로세스부터 서비스한다.

대기중인 프로세스 중 실행시간이 상대적으로 긴 프로세스의 경우, 그 프로세스는 무한대기(Starvation, 기아 상태)에 빠질 수 있다.

Aging(노화) 기법
대기 시간에 제한을 두어 그 시간이 초과되면 그 프로세스의 우선순위를 높여준다.


HRRN 스케줄링(Highest Response Ratio Next Scheduling)
FCFS와 SJF의 단점을 보완하여 프로세스가 할당될 시간(실제 실행 시간)과 대기 시간으로 계산한 우선순위에 따라 서비스한다.

(CPU 실행 시간 + 대기 시간) / CPU 실행 시간
값이 큰 순서로 우선순위 책정


우선순위 스케줄링(Priority Scheduling)
미리 정의한 알고리즘에 따라 프로세스의 우선순위를 결정하여 서비스한다.
우선순위가 동일한 프로세스가 존재할 경우에는 FCFS 방식으로 스케줄링한다.



📚 프로세스 간 통신(IPC)

프로세스는 시스템 내에서 독립적으로 실행되기도 하고, 데이터를 주고받으며 협업하기도 한다.
프로세스 간 데이터를 주고받는 프로세스 간 통신(IPC)에는 같은 컴퓨터 내에 있는 프로세스 뿐만 아니라 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와의 통신도 포함된다.

프로세스 간 통신 종류

프로세스 내부 데이터 통신
하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우의 통신 방법이다.
프로세스 내부의 스레드는 전역 변수나 파일을 이용하여 데이터를 주고받는다.


프로세스 간 데이터 통신
같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우로, 공용 파일 또는 운영체제가 제공하는 파이프를 사용하여 통신한다.


네트워크를 이용한 데이터 통신
여러 컴퓨터가 네트워크로 연결되어 있을 때에도 통신이 가능한데, 프로세스는 소켓을 이용해 데이터를 주고받는다. 이처럼 소켓을 이용하는 프로세스 간 통신을 네트워킹이라고 한다.

어떤 통신 방식을 이용할지 결정할 때는 오버헤드를 고려해야 한다. 예를 들어 같은 컴퓨터에 있는 프로세스끼리도 소켓을 이용하여 통신을 할 수 있다. IP주소로 127.0.0.1과 같인 루프백 주소를 사용하면 된다. 다만 소켓을 사용하려면 많은 전처리를 해야하기 때문에 다른 프로세스 간 통신 방법보다 느리다. 그래서 같은 프로세스 간 통신에는 소켓을 거의 사용하지 않는다.



전역 변수를 이용한 통신

전역 변수를 이용한 통신은 공동으로 관리하는 메모리를 이용해 데이터를 주고받는 것이다.
데이터를 보내는 쪽에서 전역 변수에 값을 쓰고, 데이터를 받는 쪽에서 전역 변수의 값을 읽는다.

단점 : Busy waiting (전역 변수 값이 변할 때까지 반복해서 체크해야 함)


파일을 이용한 통신

파일은 열기(open), 쓰기(write), 읽기(read), 닫기(close)로 구성된다.
하나의 프로세스가 파일을 쓰면 다른 프로세스는 파일의 내용을 읽는 방식으로 통신한다.


파이프를 이용한 통신

  • PIPE : 익명의 PIPE를 통해 동일한 PPID를 가진 프로세스 간 단방향 통신을 지원한다. 따라서 부모 프로세스와 자식 프로세스 또는 같은 부모의 자식 프로세스 등 서로 관련있는 프로세스 간 통신에 사용된다. 양방향 통신을 위해서는 읽기, 쓰기용 파이프가 하나씩 필요하다.
  • Named PIPE : 이름을 가진 PIPE를 통해 프로세스 간 단방향 통신을 지원한다. 서로 다른 프로세스들이 PIPE의 이름을 알면 통신 가능하다. 따라서 연관없는 프로세스 간 통신에 사용된다.
  • Message Queue : 메모리를 사용한 PIPE로, 구조체 기반으로 통신한다. 커널에서 제공하는 통신 기능이다.

소켓을 이용한 통신

다른 컴퓨터에 있는 프로세스와 통신하기 위해서는 컴퓨터의 위치를 파악하고, 해당 컴퓨터의 어떤 프로세스와 통신을 할 것인지 결정해야 한다. 소켓은 프로세스 동기화를 지원하기 때문에 데이터를 받는 쪽 프로세스가 busy waiting하지 않아도 된다는 장점이 존재한다.


공유메모리를 이용한 통신

메모리의 일정 영역을 공유하는 방식이다.



📚 프로세스 생성과 소멸

프로세스 생성

부모 프로세스가 자식 프로세스(서브 프로세스)를 생성하면 운영체제로부터 자원을 할당하거나 부모 프로세스의 자원을 공유한다.

1) fork()

부모 프로세스는 자식 프로세스를 생성하기 위해 fork() 함수를 호출한다. 새로운 프로세스는 부모 프로세스의 주소공간을 복사하여 생성한다. 이로써 부모 자식 프로세스 간 통신이 원활하게 이루어진다.


2) exec()

자식 프로세스는 exec() 함수를 호출하여 자신의 주소 공간에 새로운 프로그램을 올린다.


(이후는 종료 과정)

3) wait()

자식 프로세스가 실행되는 동안 부모 프로세스의 task가 모두 끝났을 경우 자식 프로세스가 종료될 때까지 ready queue에서 자신을 제거하기 위해 wait() 함수를 호출한다. (자식 프로세스가 종료되길 기다림)


4) exit()

자식 프로세스가 종료디ㅗ면 exit() 함수를 호출하여 프로세스를 종료시킨다.



프로세스의 종료

자발적 종료

자식 프로세스는 마지막 명령을 수행한 후 부모에게 결과 데이터를 전달하고, 운영체제에게 이를 알린 후 종료를 위해 exit() 시스템 호출을 사용한다. 종료 시 모든 자원은 운영체제로 반환된다.


비자발적 종료

일반적으로 부모 프로세스는 자식 프로세스가 종료되기를 기다렸다가 연쇄적으로 종료되지만, 여러가지 이유로 인하여 자식들 중 하나의 실행을 종료할 수 있다.

1) 부모 프로세스가 자식 프로세스를 강제로 종료시키는 경우 ▶ abort() 호출

자식이 자신에게 할당된 자원을 초과하여 사용하거나 자식에게 할당된 태스크가 더 이상 필요 없을 때

2) 키보드로 kill, break를 친 경우

3) 부모 프로세스가 종료된 경우

부모가 exit() 함수를 호출하는데, 운영체제는 부모가 exit()를 호출한 후에 자식이 실행을 계속하는 것을 허용하지 않는 경우 ▶ cascading termination(연쇄식 종료)



좀비 프로세스 & 고아 프로세스

좀비 프로세스

자식 프로세스가 부모 프로세스보다 먼저 죽는 경우 부모 프로세스가 종료 상태를 회수하기 위해 커널이 자식 프로세스의 최소한의 정보(PID, 종료 상태 등) 를 남겨둔다.

부모 프로세스는 wait() 함수를 호출하여 이 상태를 회수하면 남은 모든 정보가 제거되어 자식 프로세스는 완전히 소멸된다.

위와 같은 진행상황에서 부모 프로세스가 wait() 함수를 호출하지 않아 최소한의 정보가 메모리에 남아있는 경우를 좀비 프로세스라고 한다.


고아 프로세스

부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우 부모 프로세스가 없는 자식 프로세스를 말한다.

운영체제는 이러한 고아 프로세스를 허용하지 않으며 부모 프로세스가 먼저 종료되면 자식 프로세스의 새로운 부모 프로세스로 init(PID = 1)가 설정된다.

init 프로세스는 자식 프로세스가 종료될 때까지 기다린 후 wait 함수를 호출하여 고아 프로세스의 종료 상태를 회수하여 좀비 프로세스가 되는 것을 방지한다.

고아 프로세스는 프로세스 자신이 시스템의 자원을 낭비할 수 있고, 시스템이 프로세스가 종료될 때까지 추적을 해야 하기 때문에 성능 저하의 원인이 된다.


질문 1

CPU 스케줄링 알고리즘은 선점형과 비선점형으로 나눌 수 있는데, 각각의 특징과 종류 하나씩 말하고 설명하세요.

선점형은 어떤 프로세스가 CPU를 할당받아 실행 중에 있어도 다른 프로세스가 CPU를 뺏을 수 있습니다. 비선점형은 어떤 프로세스가 CPU를 할당받으면 그 프로세스가 종료되거나 입출력 요구가 발생하여 자발적으로 중지될 때까지 계속 실행되도록 보장합니다.
선점형에는 프로세스마다 같은 크기의 CPU 시간을 할당하는 방식인 라운드 로빈 스케줄링이 있고, 비선점형에는 FIFO 방식의 First Come First Served(FCFS) 스케줄링 방법이 있습니다.

질문 2

프로세스의 종료에는 자발적과 비자발적 종료가 있습니다. 프로세스가 비자발적으로 종료되는 경우 3가지를 설명하세요.

부모 프로세스가 자식 프로세스를 어떠한 이유로 강제로 종료시키는 경우, 사용자가 키보드에 kill, break를 쳤을 경우, 부모 프로세스가 종료되었을 경우 비자발적으로 종료됩니다.

질문 3

좀비 프로세스와 고아 프로세스에 대해 안다면 간단하게 설명해 주세요.

좀비 프로세스는 부모 프로세스가 자식 프로세스에 대한 정보를 지우지 않아 완전히 소멸되지 않은 상태의 프로세스이고, 고아 프로세스는 부모 프로세스가 자식 프로세스보다 먼저 종료되어 부모 프로세스가 없는 프로세스입니다.

0개의 댓글