ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [운영체제] 프로세스
    개발/OS 2022. 4. 11. 00:30

    프로세스

    실행중인 상태의 프로그램을 프로세스라 한다.

    프로세스는 각각 독립된 주소공간을 할당받으며 각 메모리는 정해진 영역을 가지고 있다.

    • 코드 - 코드 자체를 구성하는 영역
    • 데이터 - 전역 변수, 정적 변수, 배열 등을 저장하는 영역
    • 스택: 지역변수, 매개변수, 리턴값을 저장하는 영역
    • 힙: malloc이나 new와 같이 메모리를 동적 할당 시 사용되는 영역

    스택과 힙은 같은 공간을 공유하며, 서로의 공간을 침범할 경우 오버플로우가 일어난다.

     

    프로세스의 상태

    프로세스는 실행되는 동안 상태가 바뀐다.

     

    멀티 프로세스

    하나의 컴퓨터에 여러 CPU를 장착해 여러 프로세스가 하나의 프로그램을 병렬적으로 처리할 수 있다.

    이 경우 몇몇 프로세스가 오작동해도 프로그램을 정상 동작할 수 있으므로 안정성이 확보된다.

    프로그램이 복잡한 계산을 많이 필요로 하는 경우 스레드 보다 프로세스가 빠르기 때문에 멀티 프로세스 방식이 유리하다.

     

    PCB(Process Control Block)

    여러 프로세스가 생길 경우 각 프로세스의 정보를 담은 데이터와 이를 저장할 공간이 필요하다.

    이 데이터를 프로세스 메타데이터라 하고, 이를 저장할 공간을 PCB라 한다.

    메타데이터에는 PID, 프로세스 상태, 프로세스 우선순위, 메모리 관리 정보, 프로세스 소유자 등과 같은 정보가 있다.

     

    프로세스 스케쥴링

    CPU사용을 최대화하기 위해서 CPU코어에 빠른 프로세스 스위칭이 필요하다.

    스케쥴러가 이를 담당하여 프로세스 스케쥴링 방법과 우선순위에 따라서 다음에 실행할 프로세스를 결정한다.

    다양한 스케줄링 기법은 다음에 자세히 알아보고, 이 기법에 의해 정해진 스케줄링 순서를 큐에 저장해 사용한다.

    스케줄링 큐에는 두 종류가 있다.

    • Ready queue - 메인 메모리에서 실행 대기상태에 있는 모든 프로세스가 저장 된 큐
    • Wait queues - 입출력 장치와 같은 이벤트 발생을 기다리는 프로세스가 저장된 큐

     

    Context Switching

    CPU가 한 프로세스에서 다른 프로세스로 전환하는 것.

    보통 인터럽트에 의한 전환이나, CPU사용 시간을 모두 소진하였을 때 발생한다.

    이 과정에서 기존 프로세스는 현재 상태를 모두 PCB에 저장하고 대기상태가 되며,

    새로운 프로세스는 PCB로부터 상태 정보를 읽어와 실행된다.

    각 프로세스는 독립적이므로 전환과정에서 캐시를 초기화 해주어야하고,

    이 과정에서 CPU는 아무것도 안하는 상태가 되기 때문에 오버헤드가 발생한다.

     

    프로세스 생성

    부모 프로세스가 자식 프로세스를 생성한다.

    각각의 프로세스는 PID를 이용해 구분한다.

    부모는 자식 프로세스가 종료될 때 까지 대기한다.

    fork()는 새로운 메모리에 새 프로세스를 할당하며, 부모의 작업을 그대로 복사하여 fork() 다음부터 실행된다.

    exec()은 기존 프로세스의 메모리에 새 프로세스를 덮어씌운다. 인자로 받은 파일이나 함수를 실행한다.

     

    프로세스 종료

    자식 프로세스가 먼저 종료되어야 한다.

    자식이 종료되었는데, 부모에게 신호가 전달되지 않아 부모의 대기상태가 끝나지 않을 경우 -> 좀비

    자식이 종료되지 않았는데, 부모가 종료되는 경우 -> 고아

     

    프로세스간 통신

    각 프로세스는 독립된 공간을 사용하므로 특별한 방법들을 사용해 자원을 공유한다.

     

    공유메모리

    특정 메모리 공간을 프로세스들이 공유하여 사용한다.

    프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해달 프로세스에 공간을 할당하고,

    이후 모든 프로세스는 해당 공간에 접근하여 읽고 쓸 수 있다.

    대량의 정보를 다수의 프로세스에게 배포 가능하다.

    중개매체가 없기 때문에 모든 공유 IPC중에 가장 빠르다.

     

    파이프

    통신을 위한 메모리 공간을 생성하여 프로세스가 데이터를 주고받게끔 한다.

    1. 익명파이프

    • 통신할 프로세스를 명확하게 알 수 있는 경우에 사용한다. (부모-자식, 형제)
    • 두 프로세스를 연결하면, 하나의 프로세스는 쓰기, 다른 하나는 읽기만 가능한 단방향 통신
    • 두 개의 파이프를 만들어야 양방향(전이중) 통신이 가능하므로 낭비가 있다.

    2. Named 파이프

    • 서로 모르는 프로세스간 통신에 사용할 수 있다.
    • 통신을 위해서 FIFO라는 형태의 파일을 사용한다.
    • 마찬가지로 전이중 통신을 위해서는 두 개의 파이프가 필요하다.

    소켓

    네트워크 소켓 통신을 통해 데이터를 공유한다.

    각 프로세스가 하나의 포트(소켓)을 맡아 데이터를 송수신한다.

    두 프로세스가 서로 확인 과정을 거치면 1대1로 데이터를 주고받으며, 클라이언트 - 서버의 관계를 갖는다.

    원격에서 프로세스간 데이터를 공유할 때 사용할 수 있으며 전이중 통신이 가능하다.

     

    메세지 큐

    입출력 방식은 named파이프와 동일하다.

    파이프 대신 메모리 공간을 사용하며, 다수의 프로세스간 메세지 전달이 가능하다.

    '개발 > OS' 카테고리의 다른 글

    [운영체제] 스레드  (0) 2022.04.12
    [운영체제] OS의 구조(2)  (0) 2022.02.21
    [운영체제] OS의 구조  (0) 2022.02.18
    [운영체제] 운영체제란?  (0) 2022.02.17

    댓글

Designed by Tistory.