[운영체제] 프로세스

.·2021년 7월 9일
0

운영체제

목록 보기
3/6

프로세스 개념

  • 프로세스 : 실행중인 프로그램
  • 프로세스의 현재 상태는 프로그램 카운터값과 프로세서 레지스터의 내용으로 나타냄
  • 프로세스는 스택, 힙, 데이터,프로그램 카운터를 포함한다

프로세스

  • 텍스트 섹션 : 실행 코드
  • 데이터 섹션 : 전역 변수
  • 힙 섹션 : 프로그램 실행 중에 동적으로 할당되는 메모리
  • 스택 섹션 : 함수를 호출할 대 임시 데이터 저장소 (함수 매개변수, 복귀 주소 및 지역 변수)
  • 프로그램카운터 : 다음 실행할 명령어를 지정
  • 실행파일(프로그램)이 메모리에 적재되면 프로세스가 됨

프로세스 상태

  • 프로세스는 실행되면서 그 상태가 변함
  • 생성(new) : 프로세스가 생성중
  • 실행(run) : 명령어들이 실행중
  • 대기(waiting) : 어떤 이벤트가 일어나기를 기다림
  • 준비(ready) : 프로세스가 처리기에 할당되기를 기다림
  • 종료(terminated) : 프로세스의 실행이 종료
  • 대기중이거나 준비중인 프로세스는 많이 존재할 수 있지만 실행중인 프로세스는 딱 하나만 존재

프로세스 제어 블록

  • PCB : Process Control Blokc
  • 각 프로세스는 운영체제에서 프로세스 제어 블록에 의해 표현됨
  • 프로세스 상태 : new, ready, running, waiting, halted
  • 프로그램 카운터 : 이 프로세스가 다음에 실행할 명령어 주소
  • CPU 레지스터들 : 누산기, 인덱스 레지스터, 스택 레지스터, 범용 레지스터, 상태 코드 정보가 포함. 나중에 프로세스가 다시 스케줄 될 때 올바른 실행을 위해 인터러브 발생 시 따로 저장되야 함
  • CPU 스케줄링 정보 : 프로세스 우선순위, 스케줄 큐에 대한 포인터, 매개변수 포함
    -메모리 관련 정보 : 기준 레지스터, 한계 레지스터, 페이지 테이블, 세그먼트 테이블
  • 회계 정보 : CPU 사용 시간, 경과된 실시간, 시간 제한, 잡, 프로세스 번호
  • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록

프로세스 제어 블록은 약간의 회계 데이터와 함께 프로세스를 시작시키거나 다시 시작시키는 데 필요한 모든 데이터를 위한 저장소 역할을 함

프로세스 스케줄링

  • 다중 프로그래밍의 목적 : CPU 이용을 최대화하기 위해 항상 어떤 프로세스가 실행되도록 함
  • 시분할의 목적 : 각 프로그램이 실행되는 동안 사용자가 상호 작용할 수 있도록 함
  • 이를 위해 프로세스 스케줄러는 코어에서 실행 가능한 여러 프로세스 중에서 하나의 프로세스를 선택
  • 대부분의 프로세스는 I/O 바운드 CPU 바운드로 구분
  • I/O 바운드 프로세스는 I/O에 더 많은 시간을 소비
  • CPU 바운드 프로세스는 계산에 더 많은 시간을 소비

스케줄링 큐

  • 프로세스가 시스템에 들어가면 준비 큐에 들어가 준비 상태가 되어 실행되기를 기다림
  • 준비 큐는 연결리스트로 구성
  • 헤더에는 첫번 째 PCB에 대한 포인터가 저장되고 각 PCB는 다음 PCB를 가리키는 포인터 필드를 포함
  • I/O 완료와 같은 특정 이벤트가 발생하기를 기다리는 프로세스는 대기 큐에 삽입

  • 새 프로세스는 처음에 준비 큐에 놓임
  • 프로세스는 실행을 위해 선택되거나 디스패치 될 때까지 기다림
  • 프로세스에 CPU 코어가 할당되고 실행 상태가 되면 여러가지 이벤트 발생
  • 프로세스가 I/O 요청을 보내고 I/O 대기 큐에 놓임
  • 새 자식 프로세스를 만든 다음 다음 자식의 종료를 기다리는 동안 대키 큐에 놓임
  • 인터럽트, 타임 슬라이스가 만료되어 준비 큐로 돌아감
  • 프로세스는 종료될 때 까지 이 주기를 반복하다가 종료 되면 모든 큐에서 제거되고 PCB 및 자원을 반환

CPU 스케줄링

  • CPU 스케줄러 : 준비 큐에 있는 프로세스 중에서 선택된 하나의 프로세스에 CPU 코어를 할당
  • 장기 스케줄러 : 디스크에서 준비 큐로 넣을 프로세스 선택
  • 단기 스케줄러 : 준비 큐에 있는 프로세스 중 CPU 코어를 할당 할 프로세스 선택
  • 단기 스케줄러가 장기 스케줄러보다 더 많이 발생
  • 장기 스케줄러는 다중 프로그래밍의 정도를 제어 함 (메모리에 있는 프로세스 숫자)
  • 장기 스케줄러가 I/O 바운드 프로세스와 CPU 바운드 프로세스를 적절하게 조합해야 함
  • 시분할 시스템에서는 장기 스케줄러를 사용하지 않음
  • 스와핑으로 알려진 중간 형태의 스케줄링 이용
  • 메모리에서 프로세스를 제거하여 다중 프로그래밍 정도를 감소 시킴

문맥교환

  • 인터럽트가 발생하면 시스템은 인터럽트 처리가 끝난 후 문맥을 복구 할 수 있도록 현재 실행중인 프로세스의 문맥을 저장 해야 함
  • CPU 코어를 다른 프로세스로 교환 할 때 이전의 프로세스 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구 해야 함

프로세스에 대한 연산

  • 대부분 프로세스들은 병행 실행될 수 있으며 동적으로 생성되고 제거됨
  • 운영체제는 프로세스 생성 및 종료를 위한 기법을 제공

프로세스 생성

  • 프로세스는 실행되는 동안 여러 개의 새로운 프로세스를 생성할 수 있음
  • 부모 프로세스, 자식 프로세스로 나뉨
  • 프로세스들은 계속해서 프로세스를 생성하며 트리 구조를 형성
  • 프로세스들은 프로세스 식별자(pid)를 통해 구분
  • 리눅스에서는 시스템이 부팅되면 pid가 1인 systemd 프로세스가 생성 됨

자원 분배

  • 자식 프로세스가 자원을 얻는 3가지 방법이 존재
  • 부모, 자식 프로세스가 모든 자원을 공유
  • 부모 프로세스의 일부분만을 공유
  • 부모 프로세스와 자원을 공유하지 않고 OS로부터 직접 얻음

실행

  • 프로세스가 새로운 프로세스를 생성할 때 두가지 방법을 사용
  • 부모는 자식과 병행하게 실행을 계속 실행
  • 부모는 일부 또는 모든 자식이 실행을 종료할 때까지 기다림

주소

  • 새로운 프로세스들은 주소 공간 측면에서 두가지 가능성이 있음
  • 자식 프로세스는 부모 프로세스의 복사본 -> 똑같은 프로그램과 데이터를 지님
  • 자식 프로세스가 자신에게 적재될 새로운 프로그램을 지님

UNIX 예제

  • fork 시스템 콜 : 새로운 프로세스 생성
  • exec 시스템 콜 : 프로세스의 주소 공간을 새로운 프로그램으로 바꿈
  • fork를 통해 새로운 프로세스 생성
  • 새로운 프로세스는 부모 프로세스의 주소의 복사본을 지님
  • 두개의 프로세스가 동시에 실행 됨
  • 자식 프로세스에는 0이 반환되며 부모 프로세스에는 자식 프로세스의 PID 반환
  • exec는 2진 파일을 메모리에 적재하고 실행시킴

프로세스 종료

  • 프로세스가 마지막 문장의 실행을 끝내고 exit 시스템 콜을 사용하여 운영체제에 자신의 삭제를 요청하면 종료함
  • 이 시점에서 프로세스는 자신을 기다리는 부모 프로세스에 상태 값을 반환
  • 프로세스의 모든 자원이 할당 해제되고 운영체제로 반납
  • 부모 프로세스는 다음과 같은 이유로 자식 프로세스를 종료 시킬 수 있음
  • 자식이 자신에게 할당된 자원을 초과하여 사용
  • 자식에게 할당된 태스크가 더 이상 필요 없음
  • 부모 프로세스가 exit를 할 때, 부모가 exit 한 후 자식이 실행하는 것을 허용하지 않는 경우
  • 부모 자식을 종료할 때 자식 프로세스를 전부 종료 하는것을 연쇄식 종료라 부름

프로세스 간 통신

  • 병행 프로세스들은 독립적이거나 협력적인 프로세스
  • 독립적 프로세스 : 다른 프로세스들과 데이터를 공유하지 않음
  • 협력적 프로세스 : 시스템에서 실행중인 다른 프로세스들과 영향을 주고 받음
  • 프로세스 협력 허용 이유 : 정보 공유, 계산 가속화, 모듈성

IPC

  • IPC : InterProccess Communication
  • 공유메모리, 메시지 전달 두가지 기법 존재
  • 공유메모리 모델에서는 공유된 메모리에 데이터를 읽고 씀
  • 메시지 전달 모델에서는 협력 프로세스들 사이에 교환되는 메시지를 통함

메시지 전달

  • 충돌을 회피할 필요가 없어 적은 양의 데이터를 교환하기 유용
  • 공유 메모리보다 구현하기 쉬움
  • 시스템 콜을 사용해 커널 간섭 등의 부가적인 시간이 더 필요

공유 메모리

  • 빠른 속도와 소통이 편리
  • 메시지 전달 모델보다 속도가 더 빠름
  • 공유 메모리 영역을 구축할 때만 시스템 콜 사용

공유 메모리 시스템에서의 프로세스 간 통신

  • 통신하는 프로세스들이 공유 메모리 영역을 구축
  • 공유 메모리 영역은 공유 메모리 세그먼트를 생성하는 프로세스의 주소 공간에 위치
  • 다른 프로세스들은 이 세그먼트를 자신의 주소 공간에 추가
  • 일반적으로 OS는 한 프로세스가 다른 프로세스의 메모리에 접근하는 것을 금지
  • 공유 메모리는 둘 이상의 프로세스가 이 제약조건을 제거하는 것에 동의
  • 그 후 프로세스들은 공유 영역에 읽고 씀으로써 정보를 교환

생산자-소비자 문제

  • 생산자 프로세스는 정보를 생산하고 소비자 프로세스는 정보를 소비함
  • 컴파일러는 어셈블리 언어를 생산하고 어셈블러는 이를 소비
  • 생산자와 프로세는 동시에 실행되며 공유 메모리(버퍼)를 통해 소통
  • 생산자와 소비자가 반드시 동기화되어야 생산되지 않은 항목들을 소비자가 소비하려고 시도하지 않음
  • 무한 버퍼(unbounded buffer), 유한 버퍼(bounded buffer) 존재
  • 무한 버퍼는 버퍼의 크기에 한계 X
  • 유한 버퍼는 버퍼의 크기가 고정되어 있어 버퍼가 비어 있으면 소비자는 대기하고 버퍼가 채워져 있으면 생산자가 대기
  • 공유 버퍼는 두개의 논리 포인터 in과 out을 지닌 원형 배열로 구성

메시지 전달 시스템에서의 프로세스 간 통신

  • 메시지 전달 방식은 동일한 주소 공간을 공유하지 않고 프로세스들이 통신을 하고 동작을 동기화할 수 있도록 허용하는 기법 제공
  • 프로세스들이 네트워크에 의해 연결된 다른 컴퓨터에 존재할 수 있는 분산환경에서 유용
  • send, receive 명령을 이용
  • 프로세스들이 통신을 원하면 이들 사이에 통신 연결이 설정되어야 함
  • send, receive 연산을 논리적으로 구현하는 방법은 다음과 같음
  • 직접 vs 간접
  • 동기식 vs 비동기식
  • 자동 vs 명시적 버퍼링

직접 연결

  • 통신을 원하는 각 프로세스는 통신의 수신자, 송신자 이름을 명시
  • 프로세스들은 상대의 신원을 알면 자동으로 연결이 구축 됨
  • 연결은 두 프로세스 사이에만 연관
  • 통신하는 프로세스들의 각 쌍 사이에는 정확이 하나의 연결이 존재
  • 대칭성 : 송신자와 수신자 프로세스가 모두 통신을 위해 상대방의 이름을 제시
  • 비대칭성 : 송신자만 수신자의 이름을 지명
  • 모듈성을 제한한다는 단점이 존재
  • 프로세스의 이름을 바꾸면 모든 다른 프로세스의 지정 부분을 검사해야 함
  • 간접 연결은 메일 박스를 통해 이루어짐

동기화

봉쇄형(blocking)

  • 봉쇄형은 동기식이라고도 불림
  • 송신 프로세스는 메시지가 수신 프로세스 또는 메일박스에 수신될 때까지 봉쇄 됨
  • 수신 프로세스는 메시지가 이용 가능할 때까지 봉쇄
  • 봉쇄형 메시지 전달을 사용하면 생산자-소비자 문제가 간단히 해결 됨

비봉쇄형(non-blocking)

  • 비봉쇄형은 비동기식이라고도 불림
  • 송신 프로세스가 메시지를 보내고 작업을 재시작
  • 수신 프로세스가 유효한 메시지 또는 null을 받음

버퍼링

  • 통신하는 프로세스들에 의해 교환되는 메시지들은 임시 큐에 들어가 있음
  • 무용량 큐 : 송신자는 수신자가 메시지를 수신할 때까지 기다림
  • 유한 용량 큐 : 큐는 n의 길이를 지니며 최대 n개의 메시지를 받을 수 있음
  • 링크가 만원이면 송신자는 큐 안에 공간이 이용 가능할 때까지 봉쇄 됨
  • 무한 용량 큐 : 송신자는 봉쇄되지 않음
  • 무용량은 버퍼가 없는 메시지 시스템이라 불리고 다른 두가지는 자동 버퍼링이라 불림

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

소켓을 활용한 통신

  • 아이피 주소, 포트 번호를 접합해 구별
  • 두가지 이상의 소켓을 통해 통신함
  • TCP, UDP 통신이 존재
  • JAVA에서는 TCP 소켓은 Socket 클래스로 구현
  • UDP 소켓은 DatagramSocket 클래스로 구현

원격 프로시저 호출

  • RPC : Remote Procedure Calls
  • IPC와 유사하며 IPC 기반 위에 만들어짐
  • 전달되는 메시지들은 구조화 되어 있음
  • 스텁 : 클라이언트에 제공되며 필요한 자세한 사항을 숨겨줌
  • 클라이언트가 원격 프로시저를 호출하면 RPC는 그에 대응하는 스텁을 호출하고 필요로 하는 매개변수를 건내 줌
  • 스텁이 원격 서버의 포트를 찾고 매개 변수를 정돈 해 메시지를 전달
  • 서버 측 스텁은 메시지를 수신한 후 적절한 서버의 프로시저를 호출한 후 반환 값을 도려줌

profile
지금부터 공부하고 개발한것들을 꾸준하게 기록하자.

0개의 댓글