운영체제 (CSE30101) - Ch03: Process (2)

‍정진철·2022년 10월 1일
0

Schedulers

스케줄러

  • 어떤 프로세스에 자원을 할당할지 결정하는 운영체제 커널의 모듈 및 시스템 소프트웨어이며 한정적인 메모리를 어떤식으로 다양한 프로세스가 공유하며 사용할 수 있을지 결정한다.

✅ 프로세스는 자신의 임무를 완료한 후 사라질 때 까지 많은 큐를 돌아다님.
이 때 프로그램들은 제한된 CPU를 서로 사용하고 하는데 OS는 이러한 프로세스들 중 하나를 택하는데 바로 scheduler 가 이러한 역할을 담당.

✅ 실행 준비가 완료된 프로세스들은 준비큐(Ready Queue)에 놓이며
프로세스는 프로세서를 할당 받을 때 까지 준비 큐에서 대기함.


스케줄러 종류

1) Job Queue - Job Scheduler(Long-term scheduler)
2) Ready Queue - CPU Scheduler(Short-term scheduler)
3) Medium-term scheduler / Swapper

✅  Job Scheduler ( Long - term scheduler)

  • 작업 스케줄러, 승인 스케줄러라고도 한다.
  • Job Queue의 순서를 정해준다.
  • 한정된 메모리에 많은 프로세스가 한꺼번에 메모리에 올라올 때, 대용량 메모리(디스크)에 임시로 저장되는데, 이 큐에 저장된 프로세스 중 어떤 프로세스를 메모리에 할당하여 ready queue로 보낼지 결정한다.
  • 따라서 장기 스케줄러에 의해 new->ready 상태로 전이를 승인받음.

Ready Queue - CPU Scheduler(Short-term scheduler)

  • 프로세스 스케줄러, CPU 스케줄러 라고도함.
  • 우선 CPU에게 필요한 데이터를 확보해주고 메모리에 있는 프로세스 중 하나를 선택해서 프로세서(CPU)에게 할당함.
  • 준비큐에 있는 프로그램 중 먼저 도착한 프로세스에게 CPU할당 (dispatch)
  • 단기 스케줄러에 의해서 ready -> running 상태로 전이.

✅ Medium-term scheduler / Swapper

  • 여유공간(메모리)를 마련하기 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄(swapping)
  • 프로세스에게서 메모리를 할당 해제 (ready -> suspended)
  • 현 시스템에서 메모리에 너무 많은 프로그램이 동시에 운영되는 것을 조절 하는 역할.
  • suspended(stopped) : 외부적인 이유로 프로세스가 메모리에서 디스크로 강등? 당한 상태, 스스로 event를 기다리는 waiting 상태와 달리 외부적인 요인으로 인해 정지 되었기 때문에 스스로 다시 동작 불가능.

Queueing diagram


✅ 프로세스 스케줄링은 일반적으로 큐잉 다이어그램(Queueing diagram) 이라고 함.
✅ 두가지 타입의 큐(ready queue, device queue) 존재
✅ 원은 queue를 서비스하는 자원이며, 화살표는 시스템에서 프로세스들의 흐름을 표현.
✅ 새로운 프로세스는 처음에 ready queue에 놓이며 프로세스는 CPU를 할당 받을 때(dispath)까지 ready queue에서 대기.
✅ 프로세스에 CPU가 할당되어 실행되면 아래 사건들 중 하나가 발생 할 수 있음.
1) 프로세스가 I/O 요청하여 I/O 큐에 넣어질 수 있음.
2) 프로세스가 child process를 생성하고 그 프로세스의 종료를 기다릴 수 있음.
3) 프로세스가 interrupt의 결과에 따라 강제로 CPU로부터 제거되어 ready queue에 다시 놓일 수 있음.

✅ 1),2) 와 같은 경우에는 프로세스가 결국 대기 상태에서 준비 상태로 전환된 다음 다시 준비 큐로 들어감.
✅ 프로세스는 종료될 때 까지 이러한 주기를 계속적으로 반복.
✅ 프로세스가 완전히 종료되면 모든 큐에서 사라지고 PCB 및 자원이 반환됨.


Ready queue and various I/O device queues

✅ PCB 저장하는 큐의 종류
1) Job Queue -> 모든 프로세스 저장 (Job = Process)
2) Ready Queue -> 자원할당을 받기 위해 대기하는 큐
3) Device Queue -> 특정 I/O 장치 사용을 대기하는 프로세스들의 집합

✅ 프로세스들은 실행 동안 여러 queue들 사이를 이동함
✅ 프로세스가 종료되면 queue에서 제거되며 할당된 자원과 PCB 반납.


Operations on Processes

프로세스의 생성

✅ 운영체제가 최초의 프로세스를 생성하면 이미 존재하는 프로세스가 다른 프로세스를 복제 생성함
✅ 이때 기존 프로세스를 부모 프로세스라고 하며 새로 생긴 프로세스를 자식 프로세스라고 함.
✅ 부모 프로세스가 자식 프로세스를 복제 생성한다.
✅ 프로세스 세계에서는 자식 프로세스가 먼저 죽고, 이를 부모 프로세스가 처리함.

복제는 ?

  • 부모 프로세스의 주소공간 내용을 그대로 자식 프로세스의 주소공간으로 복사함.
  • 부모 프로세스와는 다른 자식 프로세스의 프로그램을 실행해야 할 경우 복제된 주소공간 위에 새로운 프로그램의 주소공간을 덮어씌워 실행.

✅ 프로세스의 트리(계층 구조) 형성
✅ 프로세스는 자원을 필요로함
-> 운영체제한테 할당 받음.
-> 부모와 공유함.

✅ 자원의 공유
-> 부모와 자식이 모든 자원을 공유하는 모델
-> 일부를 공유하는 모델
-> 전혀 공유하지 않는 모델

fork

  • 운영체제는 자식 프로세스의 생성을 위해 fork() 시스템 콜 제공.
  • 새로운 프로세스를 생성
  • 프로세스가 해당 시스템 콜 호출 시 CPU의 제어권이 커널로 넘어가고 커널은 fork를 호출한 프로세스를 복제하여 자식 프로세스를 생성.
  • fork를 수행하면 부모 프로세스의 주소 공간을 비롯해 프로그램 카운터 등 레지스터 상태, PCB 및 커널 스택 등 모든 문맥을 그대로 복제해 자식 프로세스의 문맥을 형성.
  • 따라서 자식 프로세스는 부모 프로세스가 수행한 길을 그대로 밟지 않고 부모 프로세스가 현재 수행하고 있는 시점부터 수행을 시작함.
  • 생성된 자식 프로세스의 id(pid)를 반환함.
  • 부모 프로세스가 먼저 호출될 시, 자식 프로세스가 먼저 실행될 지 알 수 없음.

exec

  • fork 시스템 콜만으로는 같은 코드에 대해 조건을 분기하는 정도로 밖에 사용 못함.
  • 자식 프로세스에게 부모 프로세스와는 독자적인 프로그램을 수행할 수 있는 메커니즘이 바로 exec 시스템 콜.
  • 이 시스템 콜은 프로세스의 주소 공간에 새로운 프로그램을 덮어 씌운 후, 새로운 프로그램의 첫 부분 부터 다시 실행하도록 함.
  • 따라서 새로운 프로그램을 수행하기 위해서 fork 시스템 콜로 복제 프로세스를 생성한 후, exec 시스템 콜로 해당 프로세스의 주소공간을 새롭게 수행하려는 프로세스의 주소 공간으로 덮어 씌우면 됨.
  • 코드와 static data를 load 및 덮어쓰기를 하고, stack과 heap을 초기화해 실행.
  • 사용자가 원하는 프로그램을 실행시킬 수 있음.
  • exec과 fork를 분리한 이유는 프로세스가 끝나기 전 무언가를 하고 싶을 수 있기 때문임.

✅ exit

  • 프로그램이 끝날 때 운영체제에게 자신이 끝났음을 알리는 자발적 종료에 해당하는 시스템 콜
  • 마지막 statement 수행 후 exit 시스템 콜 수행.
  • 프로그램에 명시적으로 적지 않더라도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌.

✅ abort

  • 프로세스를 '비'자발적으로 종료할 때 사용.
  • 부모 프로세스가 자식 프로세스를 강제로 종료.
    -> 자식 프로세스가 한계를 넘어서는 자원 요청
    -> 자식에게 할당된 task가 더 이상 필요치 않음.
  • 키보드로 kill, break 등 요청 시
  • 부모가 종료하는 경우
    -> 부모 프로세스가 종료되기 전 자식들이 먼저 종료됨.

✅ wait

  • 자식 프로세스가 종료되기를 기다리면서 부모 프로세스가 봉쇄 상태에 머무르도록 할 때 사용.
  • 부모 프로세스가 fork 후 wait을 호출하면 자식 프로세스가 종료될 때 까지 부모 프로세스를 봉쇄 상태에 머무르게 하고 자식 프로세스가 종료되면 부모 프로세스를 준비 상태로 변경.

Two issues in process termination
**
텍스트**

✅ Zombie Process (unerased process, ghost process)

  • 자식 프로세스가 종료됬지만 부모 프로세스가 자식 프로세스의 종료 상태를 회수 하지 않았을 경우 남아있는 자식 프로세스를 zombie process 라고함 ( 자식 프로세스가 작업을 끝낸 후 exit() 했지만 부모 프로세스가 wiat()을 하지 않은 경우)

  • 종료된 프로세스 일 경우 프로세스의 정보가 프로세스 테이블에 남게 되는데 부모 프로세스가 wait()을 하지 않으면 자식 프로세스가 exit() 되지만 정보가 남아있는 상태임.

✅ Orphan Process

  • 자식 프로세스가 exit() 하기 전에 부모 프로세스가 exit() 하는 경우
    (wiat()을 실행 할 프로세스가 없다 즉, 자식 프로세스를 회수 해 줄 부모 프로세스 존재가 없음)

IPC ( Inter - Process Communication )

✅ IPC는 프로세스들 간의 통신과 동기화를 이루기 위한 메커니즘을 의미.
✅ 메시지 전달방식 (커널을 통한 메시지 전달) 과 공유 메모리 방식 (일부 주소 공간 공유)이 있음.


Multiprocess in Application Program

멀티 프로세스

  • 하나의 응용프로그램을 여러 개의 프로세스로 구성해 각 프로세스가 하나의 작업을 처리하도록 하는 것

✅ 브라우저 프로세스는 유저 인터페이스, 디스크, 네트워크 I/O 를 관리함
✅ 랜더 프로세스는 웹페이지를 랜더링하고 HTML, JavaScript를 다룸
-> 새롭게 만들어진 웹사이트 마다 새로운 renderer 가 부여됨.
-> 샌드박스에서 디스크와 네트워크 I/O를 제한하면서 안전성에 대한 위험을 최소화하며 운영함.
✅ 플러그 인 타입 마다 각각의 플로그 인 프로세스 존재


IPC (Inter Process Communication)

프로세스 간 통신 : 프로세스들끼리 서로 데이터를 주고받는 행위 또는 그에 대한 방법

✅ 프로세스는 완전히 독립된 실행객체이고 독립되어 있다는 것은 다른 프로세스들에게 영향을 받지 않는 다는 것이다.
✅ 하지만 서로 독립된 존재들인만큼 서로 통신하는 과정에 있어 어려움이 존재하는데 이를 위해서 커널 영역에서 IPC라는 내부 프로세스 간 통신을 제공하고 프로세스는 커널이 제공하는 IPC설비를 이용해 프로세스 간 통신을 할 수 있다.

  • 커널(Kernel) 이란 ?

운영체제 자체도 소프트웨어 이므로 CPU 위에 올라가 사용 가능한데, 메모리 공간의 제약으로 인해 운영체제의 일부분만 CPU 위로 올라가게 되는데 이렇게 올라가게 된 즉 메모리에 상주하는 운영체제의 일부를 커널이라고 함( 보통 운영체제라고 하면 이러한 커널을 의미함) 즉, 커널은 메모리에 상주하는 부분으로써 운영체제의 핵심적인 부분을 의미.

IPC 종류

1) 메시지 전달 (Message Passing)

✅ 커널이 제공하는 API를 이용해서 커널 공간을 통해 통신한다. 메시지 큐(Message Queue)를 사용해 송신 프로세스는 큐에 enqueue, 수신 프로세스는 큐에 dequeue 하며 상호간 통신. 메시지 큐는 커널 단에서 관리됨.

- 파이프 (쉘에서 사용하는 파이프)
- 소켓(TCP/IP) - 로컬에서도 통신이 가능하며 원격에서도 통신 가능.

2) 메모리 공유 (Shared Memory)

✅ 프로세스끼리 특정 공통의 메모리 영역을 공유하며 상호간 통신 하는 방법.

데이터 자체를 공유하도록 지원하며, 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근할 수 있다. 공유 메모리는 커널에서 관리됨.

✅ 대량의 정보를 다수의 프로세스에게 배포 할 수 있음.

✅ 중개자 없이 곧바로 메모리에 접근 할 수 있기에 모든 IPC 중에서 가장 빠르게 작동 가능.


Client - Server Communication

Socket(소켓)

✅ Unix 도메인 소켓 또는 IPC 소켓은 동일한 호스트 운영체제에서 실행되는 프로세스간 데이터를 교환하기 위한 데이터 통신 엔드 포인트임.
✅ 네트워크 소켓 통신을 통해 데이터를 공유
-> 데이터 교환을 위해 양쪽 PC에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고받음.
-> 이 때 각각 PC의 PORT를 담당하는 소켓은 가각 하나의 프로세스 이다.
-> 즉 해당 프로세스는 임의의 PORT를 맡아 데이터를 송수신 하는 역할을 진행하는 프로세스 이다.
-> 각각의 PC에서 프로세스를 통해 타 PC PORT에 연결하라는 명령을 보내게 되면 두 프로세스는 서로 확인 과정을 거쳐 연결을 진행하고 연결 후 마치 PIPE와 같이 1대1로 데이터를 주고 받음.

✅ 클라리언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용함.
✅ 양방향 통신이 가능해짐.
✅ 서버 <-> 클라이언트 환경을 구축하기에 용이함.
✅ 중대형 애플리케이션에서 주로 사용.

RPC (Remote Procedure Call)

✅ RPC 방법은 분산 네트워크 망에서 많이 사용되는 방식.
✅ RPC 이용 시 프로그래머는 함수가 실행 프로그램의 로컬 위치에 있든 원격 위치에 있든 동일한 코드 이용 가능.
✅ 분리된 PC에 저장된 데이터를 마치 내 PC에 존재하는 것 처럼 데이터를 가져와 사용하는 통신방법.


profile
WILL is ALL

0개의 댓글