공룡책 Study - 3장

bo-yoon·2022년 3월 5일
0

공룡책 공부하기!

0. 도입

  • 프로세스는 실행 중인 프로그램을 말한다.
  • 프로세스는 현대 컴퓨팅 시스템의 단위이다.
  • 하나의 시스템은 일부는 사용자 코드를 실행하고 일부는 운영체제 코드를 실행하는 프로세스의 집합체이다.



1. 프로세스 개념

→ 초창기 : 컴퓨터는 작업(job)을 실행하는 일괄처리 시스템이었고, 사용자 프로그램 또는 Task를 실행하는 시분할 시스템이 뒤를 이었다.

→ 현대적인 용어로 프로세스로 변경되었다.

프로세스

  • 실행중인 프로그램
  • 메모리에 로드된 프로그램

프로세스의 메모리 배치는 일반적으로 여러 세션으로 구분된다.

  • text : 실행 코드
  • 데이터 세션 : 전역변수
  • 힙 세션 : 프로그램 실행 중에 동적으로 할당되는 메모리
  • 스택세션 : 함수를 호출할 때 임시 데이터 저장 장소

프로세스의 상태

  • new : 프로세스가 생성중이다
  • running : 명령어들이 실행되고 있다.
  • waiting : 프로세스가 어떤 이벤트 (입출력 완료 또는 신호의 수신 같은)가 일어나길 기다린다.
  • ready : 프로세스가 처리기에 할당되길 기다린다.
  • terminated: 프로세스의 실행이 종료되었다.

프로세스 제어 블록 (PCB)

  • 특정 프로세스와 연관된 여러 정보를 수록한다.
  • 주요 정보
    • 프로세스 상태
    • 프로그램 카운터 : 이 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
    • CPU 레지스터들: accumulater, 인덱스 레지스터, 스택 레지스터, 범용레지스터 들과 상태 코드 정보가 포함된다.
    • CPU 스케줄링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터와 다른 스케줄 매개변수를 포함
    • 메모리 관리 정보 : 정보는 운영체제에 의해 사용되는 메모리 시스템에 따라 기준(base) 레지스터와 한계(limit) 레지스터의 값을 가져옴
    • accounting 정보 : 이 정보는 CPU 사용 시간과 경과된 실시간, 시간 제한, 계정 번호
    • 입출력 상태 정보 : 이 정보는 이 프로세스에 할당된 입출력 장치들과 열린 파일의 목록 등을 포함

스레드 (Threads)

  • 프로세스 안에 작업의 단위



2. 프로세스 스케줄링

  • 다중 프로그래밍의 목적은 CPU 이용을 최대화하기 위해 항상 어떤 프로세스가 실행되도록 하는데 있다.
  • 시분할의 목적은 각 프로그램이 실행되는 동안 사용자가 상호 작용할 수 있도록 프로세스 들 사이에서 CPU 코어를 빈번하게 교체하는 것이다.
  • 목적을 달성하기 위해 프로세스 스케줄러는 코어에서 실행 가능한 여러 프로세스 중 하나의 프로세스를 선택한다.
  • 현재 메모리에 있는 프로세스 수를 다중 프로그래밍 정도라고 함

스케줄링 큐

  • 프로세스가 시스템에 들어가면 Ready Queue 에 들어가서 준비 상태가 되어 CPU 코어에서 실행되기를 기다린다.
  • 프로세스가 디스크와 같은 장치에 I/O 요청시에는 wait Queue 에 삽입한다.

CPU 스케줄링

  • CPU 스케줄러의 역할은 준비 큐에 있는 프로세스 중에서 선택된 하나의 프로세스에 CPU 코어를 할당하는 것이다.

문맥 교환 (Context Switch)

  • 인터럽트는 운영체제가 CPU 코어를 현재 작업에서 뺏어 내어 커널 루틴을 실행할 수 있게 한다. 인터럽트가 발생한다면 시스템은 인터럽트 처리가 끝난 후에 문맥을 복구할 수 있도록 현재 실행 중인 프로세스의 현재 문맥을 저장할 필요 있다. 이때 문맥은 PCB에 표현된다.
  • 일반적으로 커널 모드건 사용자 모드건 CPU의 현재 상태를 젖아하는 작업을 수행하고(state save) 나중에 연산을 재개하기 위하여 상태 복구 작업을 수행한다. (state restore)
  • 이 작업을 문맥 교환이라고 한다.



3. 프로세스에 대한 연산

  • 운영체제는 프로세스 생성 및 종료를 위한 기법을 제공해야한다.

프로세스 생성

  • 실행되는 동안 프로세스는 여러 개의 새로운 프로세스 들을 생성할 수 있다.
  • 생성하는 프로세스는 부모 프로세스, 새로운 프로세스는 자식 프로세스라고 한다.
  • 이 결과 프로세스는 트리를 형성한다.
  • pid
    • 프로세스 아이디, 정수형
    • 시스템의 각 프로세스에 고유한 값을 가지도록 할당된다.
  • 프로세스가 자식 프로세스를 생성 할 때, 자식 프로세스는 자원을 운영체제로 부터 직접 얻거나, 부모 프로세스가 가진 자원의 부분 집합만 사용하도록 제한 할 수 있다.
  • 프로세스가 자식 프로세스를 생성할 때, 두 프로세스를 실행하는 방법은 2가지이다.
    • 1) 부모는 자식과 병향하게 실행을 계속한다.
    • 2) 부모는 일부 또는 모든 자식이 실행을 종료할 때 까지 기다린다.
  • 주소 공간 측면에서 볼때
    • 1) 자식 프로세스는 부모 프로세스의 복사본이다( 자식 프로세스는 부모와 똑같은 프로그램과 데이터를 가진다)
    • 2) 자식 프로세스가 자신에게 적재될 새로운 프로그램을 가지고 있다.

프로세스 종료

  • 프로세스가 마지막 문장의 실행을 끝내고, exit 시스템 콜을 사용하여 운영체제에 자신의 삭제를 요청하면 종료한다.
  • 이 시점에서 프로세스는 자신을 기다리고 있는 부모 프로세스에 (wait 시스템 콜을 통해) 상태값(통상 정수값) 을 반환할 수 있다.
  • 물리 메모리와 가상 메모리, 열린 파일, 입출력 버퍼를 포함한 프로세스의 모든 자원이 할당 해제되고 운영체제에 반환된다.
  • 연쇄적 종료 : 몇몇 프로그램에서는 부모 프로세스가 종료한 이후에 자식 프로세스가 존재할 수 없어 모두 종료된다.
  • 좀비 프로세스 : 프로세스가 종료할 때, 부모 프로세스가 아직 wait() 을 호출하지 않아 데이터가 남아 있는 경우
  • 고아 프로세스 : 부모 프로세스가 wait 을 호출하는 대신 종료한 경우



4. 프로세스 간 통신 ( Interprocess Communitcation : IPC)

  • 프로세스가 협력 환경을 제공하는 이유는?
    • 1) 정보 공유
    • 2) 계산 가속화
    • 3) 모듈성
  • 따라서 협력적 프로세스들은 데이터를 교환할 수 있는, 즉 서로 데이터를 보내거나 받을 수 있는 프로세스간 통신(IPC) 기법이 필요하다.
  • IPC 기법 종류
    • 공유 메모리
    • 메시지 전달



5. Shared-Memory (공유 메모리) 시스템에서의 프로세스 간 통신

  • 공유 메모리를 사용하는 프로세스 간 통신에서는 통신하는 프로세스들이 공유 메모리 영역을 구축해아한다.
  • 통상 공유 메모리 영역은 공유 메모리 세그먼트를 생성하는 프로세스의 주소 공간에 위치한다. 이 공유 메모리를 사용하고자 하는 프로세스는 이 세그먼트를 자신의 공간에 추가해줘야한다.
  • 이때, 공유 메모리는 둘 이상의 프로세스가 접근하지 않게 제어해주어야 한다.
  • “프로세스들이 메모리 영역을 공유할 것을 필요로 하며, 공유 메모리에 접근하고 조작하는 코드가 응용 프로그래머에 의해 명시적으로 작성되어야 한다.



6. Message-Passing (메시지 전달) 시스템에서의 프로세스 간 통신

  • 메시지 전달 방식은 통신하는 프로세스 들이 네트워크에 의해 연결된 다른 컴퓨터들에 존재할 수 있는 분산환경에서 유용하다.(chat 프로그래밍)
  • 메시지 전달 시스템은 최소 2가지 연산을 제공한다
    • send(message)
    • receive(message)
  • 만약, 프로세스 P와 Q가 통신을 원한다면, 반드시 서로 메시지를 보내고 받아야 한다. 이들 사이에 통신 연결이 설정되어 있어야 한다.
  • 하나의 링크와 send()/receive() 연산을 논리적으로 구현하는 방법은 3가지 있다.
    • 1) 직접 또는 간접 통신
    • 2) 동기식 또는 비동기식 통신
    • 3) 자동 또는 명시적 버퍼링

동기화

  • 메시지 전달은 봉쇄형(blocking) 이거나 비봉쇄형(nonblocking) 방식으로 전달된다. 이 방식은 각각 동기식, 비동기식이라고 알려져 있다.
    • blocking send : 송신하는 프로세스는 메시지가 수신 프로세스 또는 메일 박스에 의해 수신될 때까지 봉쇄된다.
    • nonblocking send: 송신하는 프로세스가 메시지를 보내고 작업을 재시작한다.
    • blocking receive : 메시지가 이용 가능할 때까지 수신 프로세스가 봉쇄된다.
    • nonblocking receive : 송신하는 프로세스가 유효한 메시지 또는 null을 받는다.

버퍼링

  • 통신하는 프로세스들에 의해 교환되는 메시지는 임시 큐에 들어가 있다. 이러한 큐를 구현하는 방식은 3가지 있다.
    • 1) 무용량(zero capacity) : 큐의 최대 길이가 0이다. 즉, 링크는 자체 안에 대기하는 메시지를 가질 수 없다.
    • 2) 유한 용량(bounded capacity) : 큐는 유한한 길이 n 을 가진다. 즉, 최대 n 개의 메시지가 그안에 들어있을 수 있다.
    • 3) 무한 용량( unbounded capacity) : 큐는 잠재적으로 무한한 길이글 가진다. 따라서 메시지들이 얼마든지 큐안에 대기할 수 있다.



7. IPC 시스템의 사례

  • 각자 다른 4가지 IPC 시스템이 있다.

POSIX 공유 메모리

  • POSIX 는 공유 메모리를 위한 API를 제공한다.

Mach 메시지 전달

  • Mash 운영체제는 프로세스간 통신의 기본 형태로 메시지 전달을 사용한다.

Windows

  • Windows는 메시지 전달 방식도 제공한다. 윈도우의 메시지 전달 설비는 고급 로컬 프로시저 호출 설비(ALPC)라고 한다.
  • 윈도우는 두 프로세스 간에 연결을 구축하고 유지하기 위해 포트 객체를 사용한다. 연결 포트, 통신 포트라는 두가지 유형의 포트를 사용한다.
  • ALPC 채널이 생성되면 다음 3가지중 하나의 메시지 전달 기법이 선택된다.
    • 256 바이트의 작은 메시지 같은 경우 포트의 메시지 큐가 중간 저장소로 사용하고 메시지는 프로세스에서 프로세스로 복사 된다.
    • 대용량 메시지는 섹션 객체를 통해 전달되어야 한다. 세션 객체는 채널과 연관된 공유 메모리의 영역이다.
    • 너무 많은 경우 API를 사용한다.

파이프

  • 파이프는 두 프로세스가 통신할 수 있게 전달자로서 동작한다.
  • 파이프를 구현할 때는 다음 4가지 문제에 대해 고려해야 한다.
    • 파이프가 단방향 통신 또는 양방향 통신을 허용하는가?
    • 양방향 통신이 허용된다면 반이중 방식인가 전이중 방식인가? 반이중 방식은 한순간에 한 방향 전송만 가능하고 전이중 방식은 동시에 양방향 전송이 가능하다.
    • 통신하는 두 프로세스 간에 부모-자식과 같은 특정 관계가 존재해야만 하는가?
    • 파이프는 네트워크를 통하여 통신이 가능한가, 아니면 동일한 기계 안에서 존재하는 두 프로세스끼리만 통신할 수 있는가?

일반 파이프

  • 일반 파이프는 생상자-소비자 형태로 두 프로세스 간의 통신을 허용한다. 생산자는 파이프의 한 종단(쓰기 종단)에 쓰고, 소비자는 다른 종단(읽기 종단)에서 읽는다.
  • 단방향 통신만 가능하다.
  • 양방향을 사용하려면 파이프 2개를 사용해야한다.
  • 윈도우 시스템의 일반 파이프는 익명 파이프라고 불린다.
  • 통신하는 두 프로세스는 부모-자식 관계를 가져야 한다.

지명 파이프

  • 일반 파이프는 프로세스들이 서로 통신하는 동안에만 존재한다.
  • 통신도 양방향으로 가능하며 부모-자식 관계도 필요하지 않는다.



8. 클라이언트 서버 환경에서 통신

  • 클라이언트 서버에서 사용할 수 있는 두가지 다른 통신
    • 소켓
    • 원격 프로시저 호출(RPCs)

소켓(Socket)

  • 소켓은 통신의 극점(endpoint) 를 뜻한다. 두 프로세스가 네트워크 상에서 통신을 하려면 양 프로세스마다 하나씩, 총 두개의 소켓이 필요해진다.
  • 각 소켓은 IP 주소와 포트 번호 두 가지를 접합(concatenate) 해서 구별한다.
  • 일반적으로 소켓은 클라이언트-서버 구조를 사용한다. 서버는 지정된 포트에 클라이언트 요청 메시지가 도착하기를 기다리게 된다. 요청이 수신되면 서버는 클라이언트 소켓으로 부터 연결 요청을 수락함으로 연결이 완료된다.

원격 프로시저 호출 ( Remote Procedure Calls, RPC)

  • 네트워크에 연결된 두 시스템 사이의 통신에 사용하기 위하여 프로시저 호출 기법을 추상화하는 방법으로 설계되었다.
  • 프로세스들이 서로 다른 시스템위에서 돌아가기 때문에 원격 서비스를 제공하기 위해 메시지 기반 통신을 사용하고 이 메시지는 구조화 되어 있다.
profile
개발 로그 🍎 🍎 🍎

0개의 댓글