Process

Oak_Cassia·2022년 1월 26일

프로세스

프로세스 = 실행 중인 프로그램
프로세스의 현재 활동은 프로그램 카운터 값과 프로세서 레지스터의 내용으로 나타낸다.

데몬: 사용자와 상호작용 없이 작업만 수행하는 백그라운드 프로세스

  • 시스템 데몬: 커널이 실행되는 전체 시간 동안 실행되는 프로그램

메모리 사용자 영역

스택

  • 임시 데이터 저장장소
  • 매개변수, 지역 변수, 함수 복귀 주소
  • 스택 트레이스: 특정 시점 스택 영역에 저장된 함수 호출 정보
  • 프로그램 실행 중에 동적으로 할당되는 메모리
    - 사용자가 직접 할당 가능한 공간
    - 메모리 누수/GC
    데이터
  • 프로그램 실행 중 유지할 데이터 저장
  • 정적, 전역 변수, (bss영역: 초기화 되지 않은 변수)
    텍스트 섹션
  • 실행 코드
  • 읽기 전용

    스택(높은 주소에서 낮은 주소)과 힙(낮은 주소에서 높은 주소)이 서로의 방향으로 커져도 OS는 겹치지 않게 해야한다.


PCB(process control block)

  • 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기
    - PCB가 남아있으면 좀비
  • 프로세스 메타 데이터 저장
    - PID
    - 프로세스 상태
    - 프로그램 카운터
    - 레지스터
    - CPU 스케줄링 정보
    - 메모리 관리 정보
    - 회계정보: 언제 만들어졌는지 등
    - 입출력 상태: 프로세스가 사용한 장치 관련 정보
  • PCB는 프로세스 테이블의 형태로 관리

프로세스가 실행 된다는 것은 CPU 자원을 할당받았다는 것
타이머 인터럽트로 정해진 시간만큼 CPU를 사용하고 준비상태로 전환
이후 다른 프로세스가 실행 됨

context switch

  • 문맥은 PCB에 백업된다.
  • CPU의 현재 상태 백업 후 중지, 다시 실행 시 복구
  • 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업
  • 오버헤드 존재
    - 캐시 미스 가능성
    - 교환 작업
    - 메모리 -> 레지스터

process state

  • new: 프로세스 생성
    - 메모리에 적재되어 PCB 할당
    - (승인되면 ready)
  • ready: 프로세스가 처리기에 할당되기를 기다린다.
    - CPU할당을 기다리는 상태
    - (스케줄 디스패처에 의해 running)
  • running: 명령어들 실행
    - 일정 시간 실행 후 준비 상태로
    - 실행 도중 I/O를 사용하면 대기 상태로
    - (인터럽트에 의해 ready, i/o 또는 이벤트 기다리면 waiting)
  • waiting: 프로세스가 이벤트 발생을 기다리는 상태
    - 실행이 불가능한 조건일 때의 상태
    - (i/o 또는 이벤트 완료 ready)
  • terminated: 프로세스 실행 종료
    - PCB 삭제

디스패치: CPU의 사용 권한을 프로세스에게 주어 준비 상태에서 실행상태로 전환되는 것
비동기 입출력의 경우는 계속 실행 상태일 듯


멀티 프로세스: 여러 프로세스를 실행

  • 프로세스간 자원 공유하지 않음
  • PID 다름
  • 파일과 I/O 자원 독립적으로 할당
  • 독립적으로 실행되어 다른 프로세스에 영향을 주지 않음
    멀티 스레드
  • 스레드 ID
  • PC
  • 레지스터 값
  • 스택
    - 스레드마다 다음에 실행할 주소를 가질 수 있음
    - 연산 중 임시 저장 값 소유
  • 자원의 공유
    - 코드
    - 데이터
    - 힙
    - 열린 파일과 같은 프로세스 자원
  • 한 스레드의 문제가 전체 프로세스의 문제가 될 수 있음

IPC(inter-process Communication)

정보 공유, 계산 가속화, 모듈성 목적

  • shared memory system: 프로세스 간 공유 메모리 영역 사용하여 통신

    • 시스템 콜, 변수, 파일을 사용하여 마치 자신의 메모리 영역을 읽고 쓰는 것처럼 통신
      • 커널영역을 거치지 않는 경우가 많음
        • 빠르지만 Race condtion 가능성
      • 생산자 프로세스는 정보 생산, 소비자는 정보 소비
      • unbounded buffer: 버퍼의 크기에 한계가 없다.
      • bounded buffer: 비어 있으면 소비자가 대기, 꽉 찼으면 생산자가 대기
  • Message Passing system: 커널을 거쳐 데이터 송수신

    • 시스템 콜이 명확히 나누어져 있음
    • 동기화 문제는 적으나 느림
    • 파이프
      • 단방향(일반 파이프)/양방향(파이프 2개) 통신
        • 반 이중 방식(한 번에 한 방향)
        • 전 이중 방식
        • unnamed(익명): 부모, 자식 관계만 통신, 통신 종료 후 파이프 제거
        • 지명: 양방향 통신, 임의의 프로세스와 통신
    • 직접통신: 통신의 수신자 또는 송신자의 이름을 명시해야 한다. 대칭성
      이 기법의 비대칭성 변형은 송신자만 수신자 이름으 지명하며 수신자는 송신자의 이름을 제시할 필요가 없다.
    • 간접 통신: 메시지가 mailbox나 port로 전송된다.
  • blocking 보내기: 송신하는 프로세스가 수신 프로세스 또는 메일 박스에 수신될 때까지 봉쇄된다.

  • nonblocking 보내기: 송신하는 프로세스가 메시지를 보내고 작업을 재시작한다.

  • blocking 받기: 메시지가 이용 가능할 때까지 수신 프로세스가 봉쇄된다.

  • nonblocking 받기: 유효한 메시지 또는 null을 받는다.

  • rendezbou: 둘다 봉쇄형일 때 랑데부

  • buffering: 통신 중 메시지는 임시 큐에 들어 있다.
    - zero capacity: z의 길이 0. 수신자가 메시지를 받을 때 까지 송신자 대기
    - bounded capacity: 유한한 길이, 링크가 꽈차면 송신자 대기
    - unbounded capacity: 무한한 길이 송신자는 봉쇄되지 않는다.

시그널

  • 프로세스에게 이벤트 발생을 알림
  • SIGINT: controll C
  • SIGTERM: 프로세스 종료
  • 시그널 핸들러가 인터럽트와 유사하게 실행
  • 프로세스는 직접 시그널을 발생시킬 수 있고 일부 시그널 핸들러 재정의 가능

클라이언트 서버 환경 통신

  • 소켓: IP와 포트번호 접합해서 구별. 서버가 소켓에 데이터를 쓴다. 그리고 소켓을 닫고 다른 요청을 기다린다. 클라이언트는 소켓을 생성하고 서버와의 연결을 요청, 연결 후 그 소켓으로부터 읽을 수 있다. 서버로부터 데이터를 받은 뒤 소켓을 닫는다.

RPC(remote procedure calls)

  • 네트워크에 연결된 두 시스템 사이의 통신
  • 프로시져 호출기법을 추상화. 메시지 기반 통신
  • 각 메시지에는 원격지 포트에서 listen 중인 RPC디먼의 주소, 실행될 함수의 식별자. 함수에 전달될 매개변수가 포함되어야 한다. 이 때 포트는 메시지 패키지의 시작 부부에 포함되는 정수이다. 시스템은 네트워크 주소를 하나 가지고 서비스를 구분하기 위해 포트를 여러 개 가질 수 있다.
  • RPC는 클라이언트가 원격 호스트의 프로시저 호출하는 것을 마치 자기의 것을 호출하는 것 처럼 해준다.
  • RPC 시스템은 클라이언트 쪽에 스텁을 제공하여 통신하는데 필요한 자세한 사항을 숨겨준다.
  • 보통원격 프로시저 마다 다른 stub이 존재한다.

    stub: 원격 서버의 포트를 찾고 매개변수를 정돈(Marshall) 한다.
    parameter marshalling: big-endian 과 little-endian의 차이를 조정한다.
    big-endian: 낮은 주소에서 높은 바이트의 데이터 부터 저장
    little-endian: 낮은 주소에서 낮은 바이트의 데이터 부터 저장
    XDR(external data representation): 데이터를 기종 중립적인 XDR로 바꿔 전송한다. 정확히 한번 처리되어야 한다.(네트워크 오류에도 불구하고)


스케줄링 큐

  • 준비 큐
    • CPU할당을 기다린다.
    • 준비 큐 헤더가 첫 PCB를 가리키고 각 PCB는 준비 큐 다음의 PCB를 가리킨다.
  • 대기 큐
    • I/O 완료 같은 특정 이벤트를 기다린다.

CPU 스케줄링

프로세스에 대한 연산

  • 프로세스 식별자(pid)를 사용하여 프로세스 구분
  • 부모는 자식과 병행하게 실행을 계속한다.
  • 부모는 일부 또는 모든 자식이 실행을 종료할 때까지 기다린다.
  • 자식 프로세스는 부모 프로세스의 복사본이다.
    (같은 프로그램과 데이터를 가진다.)
  • 자식 프로세스가 자신에게 적재될 새로운 프로그램을 가지고 있다.

리눅스

  • 새로운 프로세스는 fork()시스템콜로 생성된다. pid=fork() 이때 pid는 자식 프로세스의 값
  • exec()를 호출하면 기존 파일 위에 이진 파일을 메모리에 적재한다.
  • 부모는 wait() 시스템 콜을 호출하면 자식 프로세스가 끝나길 기다린다.
  • createProcess()는 자식 프로세스를 생성할 때 주소 공간에 명시된 프로그램을 적재한다.

프로세스의 종료

  • 마지막 문장 실행 후 exit 시스템 콜을 사용하여 OS에 자신 삭제 요청. Wait 시스템 콜을 통해 부모에 상태 값 반환
  • 자식이 할당된 자원을 초과할 때, 부모가 자식의 상태를 검사할 수 있는 방편이 있어야 한다.
  • 자식에게 할당된 태스크가 더 이상 필요 없을 때
  • 부모가 exit 하는데 OS는 부모가 exit한 후 자식이 실행을 계속하는 것을 허용하지 않는 경우(연쇄식 종료 cascading termination)

zombie process
프로세스의 종료 상태가 저장되는 블록의 항목은 부모가 wait()을 호출할 때까지 남는다. 이 때 wait() 전 테이블에 남아있는 자식 프로세스

orphan process
부모 프로세스가 wait()대신 종료했을 때 남은 자식 프로세스. init의 자식 프로세스가 된 후 init이 wait()호출

profile
https://velog.io/@oak_cassia/A-Game-Developers-Vision

0개의 댓글