Process

Oak_Cassia·2022년 1월 26일
0

프로세스

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

스택
함수를 호출할 때 임시 데이터 저장장소

프로그램 실행 중에 동적으로 할당되는 메모리
데이터
전역 변수, (bss영역: 초기화 되지 않은 변수)
텍스트 섹션
실행 코드

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

process state

  • new: 프로세스가 생성 중이다.
    (승인되면 ready)

  • ready: 프로세스가 처리기에 할당되기를 기다린다.
    (스케줄 디스패처에 의해 running)

  • running: 명령어들이 실행되고 있다.
    (인터럽트에 의해 ready, i/o 또는 이벤트 기다리면 waiting)

  • waiting: 프로세스가 이벤트가 일어나기를 기다린다.
    (i/o 또는 이벤트 완료 ready)

  • terminated: 프로세스 실행 종료

PCB(process control block)
프로세스와 연관된 여러 정보를 수록, 프로세스 상태, 프로그램 카운터 CPU 레지스터들, CPU 스케줄링 정보, 메모리 관리 정보, 회계정보, 입출력 상태

스케줄링 큐

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

CPU 스케줄링

context switch

  • 문맥은 PCB에 표현된다.
  • 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()호출

IPC(inter-process Communication)

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

  • shared memory system: 생산자 프로세스는 정보를 생산, 소비자는 정보를 소비

    • unbounded buffer: 버퍼의 크기에 한계가 없다.
    • bounded buffer: 비어 있으면 소비자가 대기, 꽉 찼으면 생산자가 대기
  • Message Passing system:

    • 직접통신: 통신의 수신자 또는 송신자의 이름을 명시해야 한다. 대칭성
      이 기법의 비대칭성 변형은 송신자만 수신자 이름으 지명하며 수신자는 송신자의 이름을 제시할 필요가 없다.
    • 간접 통신: 메시지가 mailbox나 port로 전송된다.
  • blocking 보내기: 송신하는 프로세스가 수신 프로세스 또는 메일 박스에 수신될 때까지 봉쇄된다.

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

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

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

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

  • buffering: 통신 중 메시지는 임시 큐에 들어 있다.

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

pipes

  1. 단방향 통신 or 양방향 통신
  2. 반 이중 방식(한순간에 한방향), 전 이중 방식(full duplex)
  3. 부모, 자식 관계
  4. 네트워크, 동일한 기계 안
  • 일반 파이프: 한 종단에서 쓰고 다른 종단에서 읽는다. 단방향 통신
    (양방향은 파이프 두 개 설치)
    윈도우에서는 익명 파이프라고 한다. 한 쌍의 프로세스 통신, 통신 종료 후 파이프 제거
  • named pipes: 양방향 통신, 부모 자식 관계X, 여러 프로세스가 이용 가능

클라이언트 서버 환경 통신

  • 소켓: 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로 바꿔 전송한다. 정확히 한번 처리되어야 한다.(네트워크 오류에도 불구하고)

profile
rust로 뭐할까

0개의 댓글