[ 3장 프로세스와 관련된 여러가지 오퍼레이션 ]
3장에서 배울 내용
< 프로세서에 대한 Introduction- Process states. Scheduling, Process Operations >
< Inter process Communications- Shared Memory , Message Passing >
Process
l 프로세서
- 정의 : 실행 중에 있는 프로그램을 말한다.
- 프로세스는 디스크에 있는 프로그램뿐만 아니라 프로세스를 실행하기 위한 여러가지 자원들도 포함해 말한다.
- 자원들 – text section : 프로그램 코드
Program Counter : 다음에 실행되어야 하는 메모리 주소
Stack : 동적 메모리
Data section : 전역변수를 저장하는 부분
Heap :
l 프로세스는 Time – shared 시스템에서 사용하는 기본단위이다.
프로세스는 두가지 경우처럼 표현될 수 있다.
1. i/o 바운드 프로세스 : i/o작업이 많을 경우
2. Cpu 바운드 프로세스 : computations(계산)의 작업이 많을경우
이 책에서 프로세서의 상태는 총 5가지의 state가 존재한다.
1. New : 프로세서가 처음 만들어진 상태
2. Running : 프로세서가 cpu를 할당 받아 실행하는 상태
3. Waiting : 어떠한 작업이 일어나기를 기다리고 있는 상태
4. Ready : cpu를 할당받을 준비가 되어있을 때
5. Terminated : 프로세스가 끝나게 된 상태
l 프로세서 상태 다이아그램

l PCB
- 프로세서와 관련된 모든 정보는 PCB에 저장된다.

실행과정 = Context switch 과정
현재 실행하고 있는 프로세스 p0의 모든 상태를 PCB에 저장하게 된다.
P1이 시작되어야하기 때문에 PCB1을 다시 원상복귀 시킨다.
P1을 실행할 때 그 값으로 원상복귀 시켜야한다.
원상복귀가 되면 다시 P1이 실행된다.
이후 P1의 상태를 pcb에 저장한 후 다음에 실행해야하는 P0의 PCB0으로부터 원상복귀 시킨다.
이후 P0을 실행한다.
3. 프로세스 스케쥴링
프로세스 스케쥴링의 역할 : CPU를 항상 바쁘게 만들기 위해 실행한다.
어떤 프로세서에게 CPU를 할당할 것인가를 결정
예시 ) 우리가 마트에 가면 계산할 때 줄을 슨다 -> 줄 스는 것을 하나의 큐로 생각
줄을 슨 손님 한 명씩 계산원이 계산 -> 큐에서 하나씩 뺴서 계산
위 예시처럼 운영체제는 여러가지 큐를 관리한다
Job queue : 시스템의 모드 프로세스 set
Ready queue : 메모리에 올라갈 준비가 되어있는 작업들을 저장, cpu가 할당될 준비가 되 어있는 작업들을 저 장
Device queue : 각 디바이스마다 디바이스 큐 존재, 그 디바이스를 액세스 하고자 하는 프로세스를 저장
프로세스 스케쥴링은 여러 개의 state가 바뀌는 과정에서 여러가지 스케쥴링 큐를 왓다갔다하며 동작한다.

4. Scheduler
총 3개의 Scheduler 존재
① Short term Scheduler / CPU Scheduler :
다음에 실행할 프로세스를 선택하고 CPU를 할당한다. 상당히 빠르게 동작한다.
② Long term Schedular / job Scheduler :
Ready-Queue에 가져올 프로세스를 선택한다. 사용자가 제출한 job들중에 누구를 메모리에 올릴 것인가를 판단한다.
이 스케쥴러가 CPU Bound 프로세서만 readyqueue에 집어 넣게 되면 cpu만 주로 사용하고 io장치는 계속 놀기 때문에 io bound process와 cpu bound process를 적절히 잘 섞어 넣어줘야 두 프로세스를 바쁘게 만들어 줄 수 있다.
그래서 Long term porcess가 두개 의 프로세스를 잘 섞어서 두개의 장치를 모두 바쁘게 만들어줘야 한다.
③ Medium-term scheduler
어떤 프로세서를 실행하려고 하는데 현재 이용가능한 메모리가 충분하지 않다.
è 그러면 이미 할당 되어있는 프로세서들을 디스크에 잠시 저장,
è 그러면 그 프로세서가 사용한 메모리 공간이 비어있게 되어 빈 그 공간을 덩치 큰 프로세서에게 할당해준다.
è 어떤 프로세서를 메모리에서 디스크로 swap out, swap in 시킬것이냐를 결정하는 것을 결정하는 것이 medium-term scheduler의 역할이다
l Context Switch (중요)
여러 개의 프로세서가 동시에 실행하는 공간을 만들어 준다.
A 프로세서를 실행하다가 B프로세서로 CPU가 할당되면
A프로세서가 실행하고 있는 Context( ==PCB(A)에 저장 되어있는 모든 내용들)을
저장하고 B프로세서가 실행해야 하는 Context를 이용해서 B프로세서를 실행해야 한다
è 이 과정을 Context Switch라고 한다.
Context switch의 시간이 짦을수록 프로세서가 실제로 일하는 (실행하는) 시간이 더 길어져 좋다 à Context switch 는 짦을수록 좋다.
그럼 이 context switch 과정을 줄이기 위해서 가장 좋은 방법 :
이 과정을 하드웨어로 처리한다. 하드웨어로 구현하게 되면 프로세서에 상관없이 작업이 가능하기 떄문이다
l Process와 관련된 여러가지 Operations
1. Process creation
- Parent process는 children process를 만들어 부모 자식간의 관계가 형성된다
- 프로세서마다 id를 할당해주어 이 id를 가지고 운영체제가 프로세스를 관리한다.
- 프로세스를 만들게 되면 트리구조를 가지게 된다.
- 부모 프로세서가 자식 프로세서를 생성할 때는 여러가지 옵션들이 존재 한다.
ü 부모가 가진 것을 자식도 공유할지 안할지
(완전 공유, 일부 공유, 공유하지 않음)
ü 부모가 실행되면 자식도 같이 동시에 실행할 지, 따로 따로 실행할지 등등
ü 또한 디자인 초이스들이 존재한다.
ü 앞서 언급된 옵션들을 지원할건지 어떻게 구현할 건지를 판단해야한다.
- 예시로는 Unix
ü Fork : 부모와 똑 같은 자식 프로세서를 생성한다.
ü Exec : 이 함수를 호출한 프로세서의 메모리 내용을 완전히 바꿀 수 있다.
ü

ü
ü 부모 프로세서와는 다른 프로그램을 Load해서 실행시킬 수 있다.
ü 부모 프로세서가 Fork를 호출하면 부모랑 똑 같은 자식이 생성된다.
ü 부모와 자식 프로세서간의 차이점 : pid값이 0이면 자식이고
pid값이 0보다 크면 부모이다
ü Wait : 자식으로부터 부모로 데이터 출력
ü Exit : 프로그램 종료
반환되는 값들을 전달하고 프로세서가 종료된다.(모든 소스들이 리소스된다)
ü 만약 자식 프로세서가 할당된 리소를 초과할 경우는 abort이용하여 자식프로세서를 종료 시킬 수 있다.
ü 자식 프로세서가 할당된 작업은 더 이상 필요하지 않다.
ü 부모 프로세서가 종료되는 경우, 일부 운영체제는 부모 프로세서가 자식 프로세서를 진행 할 수 없도록 한다.
(모든 자식 프로세서 종료)
l IPC : 데이터를 주고 받는 방법
- 개요 : 복잡한 프로그램 같은 경우에는 프로세스 하나로는 문제 해결 불가능한 경우 존재
è 그래서 여러 개의 프로세스를 만들어서 프로그램의 목적 달성
이렇게 다중 프로세서를 가지고 작업하면 당연히 속도가 빨라진다.
다중 프로세서에서 기능들을 여러가지 프로세서로 나눠서 기능을 구현하게되면
전체 소프트웨어가 상당히 모듈러 하게 구성된다.
다중 프로세서에서 협업을 하며 소프트웨어가 동작하기 위해서는 데이터를 주고받아야돼
è IPC 이용 (데이터를 주고 받는 방법)
두가지 모델 존재한다.

1. Shared memory ( 공유 메모리 )
- 문제 : Producer – Consumer Problem
Producer 프로세서 : 계속 해서 작업을 만들어낸다.
Consumer 프로세서 : 프로듀서가 만들어내는 작업을 가지고 와서 부가적인 처리를한다
- 이 두 프로세서 사이에는 큐가 존재한다.
프로듀서 프로세서는 버퍼에 아이템을 계속해서 입력한다. 컨슈머 프로세서가 입력된 아이템을 가져와서 후처리를 한다.

- 이 문제를 공유메모리 방법을 이용하여 구현하려면 버퍼가 공유되어야 한다.
그래서 버퍼를 공유메모리에 저장한다.
프로듀서는 버퍼에 값을 쓰고, 컨슈머는 버퍼에 쓰여진 값을 가지고 와서 처리한다.
버퍼의 경우 사이즈가 정해져있으면 bounded, 정해져 있지 않으면 unbouned

이 코드에는 심각한 문제가 존재한다.
synchoronization for shared variables 문제 발생
이 문제는 프로듀서와 컨슈머 프로세서 둘다 동시에 공유된 데이터 변수들에 대해 액세스가 가능하다. 두 프로세서가 read 이면 상관이 없지만 둘중하나가 write이거나 둘다 write일 경우 데이터가 깨지는 문제가 발생한다.
공유메모리를 사용하기 위해서는 데이터가 깨지는 것으로부터 안전하게끔 데이터를 보호해주는 보호 장비가 필요하다
è Synchoronization
2. Message passing
- 운영체제가 메시지를 받아 목적지로 전달해 주는 방법이다.
- 메시지 패싱에는 두가지의 동작들이 제공된다.
데이터를 보내는 방법(send) : P , 데이터를 받는 방법(receive) : Q
- P와 Q 사이에는 반드시 링크가 존재해야 데이터를 주고 받을 수 있다.
- 링크를 통해 데이터를 주고받는다.
- 메시지 패싱에는 여러가지 디자인 초이스들이 있다..
언제 링크가 프로세스 사이에 만들어지는가
링크를 공유해서 사용할 수 이씅것인지
한번에 보낼수있는 데이터는 얼마냐
메시지는 고정된 크기를 가져야하나
링크를 통해 데이터를 주고받을 수 있는지, (양방향인지, 단방향인지)
- 링크는 당연히 두 프로세서를 호출 할 때 자동으로 만들어진다.
- 링크는 정확하게 두 개의 프로세서로 관계를 맺어
- 링크는 unidirectional 혹은 bidirectional하게 구성 가능
l Indirect Communication
- 직접 메시지를 보내는게 아니라 중간의 매개체를 통해 메시지를 보내는 것
- 프로세서가 아니라 메일 박스로 데이터를 주고받는 것
- 그 중간 매개체 = Mail box
- Mail box 메일박스들 끼리만 데이터를 주고 받을 수 있다.
- 동일한 메일 박스를 공유하게 될 경우 두 개의 프로세서 사이에 링크가 존재하게 된다.
l Synchronization
Blocking : 데이터를 보내면 받아야 되는 놈이 받을 때까지 기다리는 것
데이터가 받는 놈한테 전달될때까지 계속 기다리고 있다
UnBlocking : 받아야 되는 놈이 받든 말든 작업이 끝나게 된다.
l 버퍼링
- 링크에 첨부된 메시지 대기열
- 용량 제로 – 메시지 0개
- 송신자는 수신기를 기다려야 합니다(렌데즈)
- 한계 용량 – 메시지 길이 n개 유한
- 대기열이 가득 찬 경우 발송인은 대기해야 합니다.
- 무한 확장 용량 – 무한 길이
- 발송인은 기다리지 않음
l 클라이언트 서버 시스템
- 소켓
Ip,포트 -> 소켓
보내는 놈의 소켓 받는 놈의 소켓을 이용해 링크가 만들어짐
소켓을 통해 바이트 스트림을 주고받을 수 있다
- Remote Procedure Call ( RPC)
데이터를 주고받을 때 함수 콜하는 것처럼 데이터를 주고 받자
- Marshalling: 중요한 역할,
예시 : 한쪽 프로세스는 유닉스 다른 프로세스는 지닉스
둘은 다른 방법을 사용, 이를 일치하는 작업이 필요하다.
이 일치시키는 작업 : Marshalling
- MIDl 이용해서 포말한 프로토타입을 선언하게 되면 프로파일에 의해 함수에 해당하는 코드로 변환
- 클라이언트 쪽에서는 컴파일러를 통해 함수를 호출
- 이 내용이 stub통해서 필요한 데이터 포맷으로 변환이 되서 해당하는 서버로 데이터를 주게 된다.
- 스켈로톤에서는 이쪽에서 보내진 데이터를 remote object서버에 맞게끔 변환해서 사용
l 파이프
- 쉽게말하면, 자바에서 스트림이라고 생각하면 된다. 바이트스트림을 보내는 도구,
- Ordinary pipes
두개의 프로세스가 Unidirectional : 보내는 파입 따로, 받는 파이프 따로
이럴 경우 파이프를 생성한 프로세서가 끝나면 더 이상 존재하지 않아
è 이를 보완한게 named 파이프
- Named pipes
양방향
부모-자녀 관계 불필요
명명된 파이프가 구축되면 여러 프로세스로 소통 가능
통신과정이 끝난 후에도 명명된 파이프가 계속 존재함
Pipe와 Message Passing의 차이점은
Pipe : Bit Stream, 받는 쪽에서 비트를 알아서 재구성해서 자기가 원하는 형태의 데이터를 만든다.
Message Passing : 메시지 포맷이 이미 고정되어있어 고정된 메시지 포맷을 따라서 데이터를 주고받는다.
'운영체제 ( OS )' 카테고리의 다른 글
[운영체제 ] 6주차 정리본 (0) | 2021.04.26 |
---|---|
[운영체제 ] 5주차 정리본 (0) | 2021.04.26 |
[운영체제] Thread 정리본 (0) | 2021.04.26 |
[운영체제] [ 1주차 내용 정리 전 필기본] (0) | 2021.03.25 |
[운영체제] [ Thread ] (0) | 2021.03.25 |