1. 프로세스

  • 실행중인 프로그램
  • 디스크의 실행 파일이 메모리에 적재된 상태
  • GUI에서 프로그램을 클릭하여 프로세스로 만듬

메모리 상의 프로세스

  • 특정 위치를 할당 받고, 내부적으로는 자신의 메모리를 동적으로 조정한다
  • 텍스트 세션 - 실제 실행 코드
  • 데이터 세션 - 실행부터 종료까지 지워지지 않는 데이터(임시 데이터)들을 저장
  • 힙 세션 - 프로그램 실행 시 동적으로 할당되는 메모리
  • 스택 세션 - 잠깐 생겼다 사라질 데이터들을 저장
  • 각각의 세션은 항상 같은 주소값을 갖지는 않는다

사용자가 힙 영역의 메모리 크기를 조정하며 메모리 문제를 해결할 수 있다

프로세스 상태

프로세스 제어 블록 PCB

  • 각 프로세스는 운영체제에서 PCB에 의해 표현된다
  • 블록은 프로세스가 생성되면 생성되고 소멸하면 소멸한다
  • process state - 프로세스 상태를 표현
  • process number - 프로세스의 번호
  • process counter - 다음에 실행할 주소
  • register - 인터럽트 발생 시 작업하던 정보를 저장 등등

2. 프로세스 스케쥴링

  • 목적: 프로세스 이용률을 최대화하기 위해, cpu 대기시간 최소화
  • 프로세스 스케쥴러는 실행가능한 프로세스 중에서 하나의 프로세스를 선택해 실행한다

스케쥴링 큐

  1. 프로세스가 시스템에 들어온다 -> Job Queue에 등록

  2. 준비 완료 상태에서 실행을 대기한다 -> Ready Queue에 등록
    Ready Queue의 헤더는 다음 PCB를 가리키고 tail은 마지막 PCB를 가리킨다

  3. 입출력 장치의 입출력을 대기한다 -> Device Queued에 등록

프로세스가 순차적으로 큐에 등록되는 도표

스케쥴러 구분

  • 상황에 따라서 다양한 스케쥴러가 사용된다(내부적으로 함)
  1. 단기 스케쥴러
    • CPU 스케쥴러
    • 실행 빈도가 높다 밀리초단위
  2. 중기 스케쥴러
    • 일부 운영체제가 도입한 스케쥴러
    • 메모리에서 프로세스를 제거
    • 메모리 상의 프로세스 수를 완화
    • 스와핑
      중단하다 다시 진행
  3. 장기 스케쥴러
    • 잡 스케쥴러
    • 실행 빈도 낮음 분단위
    • 메모리 상의 프로세스 수 제어. 프로세스가 끝나면 그 빈 자리를 메워줌
    • 입출력 중심과 CPU 중심 스케쥴러를 적절히 혼합하는 것이 중요
      너무 입출력만 기다리면 안되고 너무 입력을 무시해도 안됨

3. 컨텍스트 스위치

  • 인터럽트가 발생해서 실행중이던 프로세스를 중단하고 인터럽트를 발생시킨 작업이 끝날 때까지 기다린 후 다시 실행됨
  • 이 경우 하던 작업을 다시 실행하려면 어떤 정보가 필요할까
    실행중이던 프로세스의 문맥을 저장해야하고
    PCB에 저장해야하고
    컨텍스트 스위치라고 부른다

4. 프로세스의 생성과 종료

  • 프로세스가 실행되는 과정에서도 여러 프로세스가 새로 생성됨
  • 생성하는 프로세스를 부모 프로세스, 생성되는 프로세스를 자식 프로세스
  • 대부분 고유의 프로세스 식별자(pid)로 프로세스를 구분

fork()와 exit()

  1. fork() 시스템 콜로 새로운 프로세스 생성 (복제)
  2. 두 프로세스 중 한 프로세스가 exec() 시스템 콜을 사용
    자신의 메모리 공간을 새로운 프로그램으로 교체
  3. exex() 시스템 콜은 바이너리 파일을 메모리로 적재(?)
    프로그램 실행 시작
  4. 자식 프로세스가 종료될 때까지 부모는 wait()

  • 자식 프로세스에게 보이는 pid는 0, 부모에게 보이는 pid는 1이상
  • 자식 프로세스는 리소스 권한, 스케쥴링 속성을 부모로부터 상속
  • 부모는 wait() 시스템 콜로 자식이 종료되기를 대기
  • 부모는 자식이 종료되면 wait()을 벗어나 프로세스를 재개하고 exit()으로 종료
  • 최종적으로 실행이 종료되면 exit()을 통해 운영체제에게 삭제를 요청한다
    • 부모 프로세스가 대기중이라면 상태 값을 리턴
    • 운영체제에 의해 모든 프로세스의 자원들은 할당 해제된다
  • 부모가 자식을 종료시킬 경우 - abort()
    • 자식이 자원을 초과할 경우
    • 자식이 더이상 필요하지 않을 경우
    • 부모는 종료되었는데 자식이 종료되지 않았을 때
  • (?)좀비 프로세스 : 종료되었지만 부모가 아직 wait() 콜을 하지 않은 프로세스
  • 고아 프로세스 : 부모가 wait()을 콜하는 대신 종료하게 되면 자식은 고아가 됨

5. 프로세스 간의 통신

  • 프로세스는 다른 프로세스와 협력하는 관계인 경우가 많음
  • 협력 프로세스는 데이터를 공유라고 프로세스에 영향을 주고 받음
  • 목적 - 정보 공유, 계산 가속화, 모듈성, 편의성
  • 원칙적으로 OS는 프로세스간의 메모리 공유를 금지하고 있다
  • 두 가지 모델이 있다

공유메모리 모델

  • 프로세스들이 공유 메모리 영역을 구축해야함 (OS 제공x)
    • 생산자와 소비자의 관계
      소비자가 소모하는 속도가 생산자가 생성하는 속도가 같지 않음
      중간에 버퍼를 두어 공유메모리로 사용한다
      버퍼가 반드시 사용 가능해야함
    • 버퍼 종류
      • 무한 버퍼: 버퍼 크기 무제한
      • 유한 버퍼: 버퍼 크기 고정
        비면 소비자 대기
        꽉차면 생산자 대기

메시지 전달 모델

  • send(message)와 receive(message)연산을 제공

  • 통신 연결을 통해 프로세스 간 메세지를 송수신

  • 논리적 구현 방법

    1. 직접 통신
      송수신자의 이름을 명시
      정확히 두 프로세스 사이에만 연관됨
      대칭 주소 지정 : 송수신자 모두 이름 지정
      비대칭 주소 지정 : 발신자에서 수신자의 이름 지정
    2. 간접 통신
      공유 메일함을 통한 송수신
      두 개 이상의 프로세스와 연결 가능
      공유메일함은 프로세스 혹은 운영체제에 권한

      동기화

      • Blocking 모드
        Send: 보낸 메세지가 수신될 때까지 송신자를 블록(또 송신 못함)
        Receive: 도착한 메세지가 있을 때까지 수신자 블록
      • Non-Blocking 모드 (계속 뭔가 함)
        Send: 메세지를 보낸 후 다른 작업
        Receive: 유효한 메세지를 받거나 null수신

      버퍼링
      통신 프로세스 간 교환되는 메세지는 임시 대기열(zb)에 존재

      • 용량zero : 최대 길이가 0이기 때문에 대가하는 메세지가 있을 수 없다
      • 제한된 용량 : 메세지가 가득 차면 발신자는 공간이 확보할 때까지 차단됨
      • 무한 용량 : 발신자는 절대 차단하지 않음

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

소켓 통신

  • 소켓 : 서버 간의 통신을 위한 end point
    네트워크를 통해 통신하는 프로세스들은 프로세스당 한 쌍의 소켓이 있다
    IP주소와 Port 번호를 조합해서 각 소켓을 식별한다
  • 클라이언트 - 서버 아키텍처
    서버는 특정 포트를 열고 그 포트로 들어오는 클라이언트의 요청을 대기한다(listen 상태)
    요청을 받으면 서버는 클라이언트 소켓으로부터의 연결 요청을 수락하며 연결됨

원격 프로시저 호출

  • IDL을 사용해서 서버의 호출 규약을 정의
  1. IDL은 뼈대 코드를 생성한다
  2. 클라이언트와 서버에 RPC가 생성된다
  3. 클라이언트 루틴에서 Stub을 거쳐 서버 Stub으로 요청을 보낸다
  4. 서버는 Stub에서 응답을 생성하여 클라이언트로 보낸다
    (서버 Stub 내부적으로만 진행하여 서버 루틴은 응답을 보낸 것을 모른다)

profile
안녕하세요. Chat JooPT입니다.

0개의 댓글