4 minute read

프로세스(테스크)

프로그램을 메모리에 올린 동적인 상태이다. 구체적으로 설명하면 OS가 프로그램을 메모리에 올리고 CPU를 위한 PCB(Process Control Block : 프로세스 제어 블록)을 할당한 상태이다. 프로세스들은 커널 공간에서 실행될 때 각자 스택 공간을 할당받으며 스택 공간 내에서 함수를 실행한다. 모든 프로세스들은 PID(정수타입의 프로세스 ID)를 가지며, task_struct 구조체(PCB) 의 연결리스트를 통해 init 프로세스에서 관리된다.

PID

  • 모든 프로세스는 PID(정수타입의 프로세스 ID)를 가진다.

      *typedef int		__kernel_pid_t;*
    
  • PID를 증가시키면서 부여
  • 대표적인 PID
    • swapper 프로세스: 0
    • init 프로세스: 1
    • kthreadd 프로세스: 2

PCB

  • 프로세스에 대한 정보를 가지고 있는 메모리 블록
    • Process ID = PID
    • 프로세스 상태(Process State):
    • Program Counter: 프로그램 계수기는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
    • CPU 스케줄링 정보: 우선 순위, 최종 실행시각, CPU 점유시간 등
    • 메모리 관리 정보: 해당 프로세스의 주소공간
    • 프로세스 계정보: 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
    • 입출력 상태 정보: 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등

프로세스 종료 과정

프로세스 종료시 부모 프로세스에게 신호를 보낸다. 그런데 부모 프로세스가 종료되면 그 프로세스의 자식들의 경우 조부모(대부분은 init)가 프로세스가된다.

프로세스의 상태

크게 생성(create), 준비(ready), 실행(running), 대기(waiting), 완료(terminated), suspended 상태가 있다. 프로세스가 새로 만들어지는 과정에서는 생성(create) 상태를 가진다. 프로세스가 만들어지면 CPU를 할당받기 위해 대기(ready) 하게 된다. suspended 의 경우 콘텍스트가 메모리가 아니라 보조 저장소에 있는것이 waiting과의 차이점이다.

IPC (프로세스 간 통신)

공유메모리

  • 공유메모리는 만드는 프로세스에 의해 생성된다.
  • 프로세스간 메모리 공간 공유, Read, Write가 모두 필요할시 사용,
  • 파이프, 메시지큐, 소켓 등의 통신을 이용한 기법보다 빠르다. (고성능)

메모리맵

  • 열린 파일을 공유메모리에 매핑해준다.

파이프 (익명)

  • 두프로세스간의 반이중통신(하나는 받고 하나는 보낸다)을 담당한다. 만약 양방향으로 하고싶으면 두파이프 설정하면 된다.
  • 명확한 두프로세스간의 통신에 사용
  • stream의 원리로 작동

네임드 파이프

  • 전혀 모르는 프로세스간의 통신에 이용, 익명파이프랑 비슷하다.
  • stream의 원리랑 작동

소켓

  • 다른 시스템의 프로세스간의 통신에 이용되는 엔드포인드(파일)이다.
  • 소켓은 하나의 프로세스와 매핑된다.

메시지큐

  • 다수 프로세스간의 메시지를 교환할수 있다.
  • 파이프와 다른점은 스트림이 아닌 메시지 기반이다.
    • 메시지라는 경계(타입)가 있다. (파이프는 데이터의 경계가 없음)
    • 메시지 큐는 주어진 타입의 메시지 한개를 가져오거나 쓴다.
    • 파이프의 경우 주어진 용량(size)만큼 데이터를 쓰거나 읽는다.
    • 메시지큐는 순차적인 데이터의 흐름대로 처리되는것이 보장되지 않을수도 있다.
  • 참고자료

세마포어

  • 임계영역 접근시, 상호배제를 위해 사용한다.
  • S(접근가능한 프로세스의 갯수, size), P연산(-1), V(+1)
  • S가 1인 세마포어를 뮤텍스 라고 한다.

스레드(Thread)

  • 가벼운 프로세스
  • Heap, Code, Static Data 영역 자신이 속한 프로세스내의 다른 스레드와 공유한다 → 문맥교환이 빠르다.
  • 스레드는 Stack 영역을 독립적으로 소유한다.
  • 커널에서는 스레드를 다른 프로세스와 동등하게 관리한다. (PCB에서 스레드그룹여부만 다름)

인터럽트 (끼어들기)

  • 마이크로프로세서(CPU)가 프로그램을 실행하고있을 때, 입출력하드웨어 등의 장치에 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다.
  • CPU코어 외부에서 인터럽트를 거는 경우가 일반적이지만, CPU 내부에서 실행하면서 걸리는 경우도 있다. (0으로 나누기, 허용되지 않는 메모리침범등의 exception도 인터럽트를 통해 처리된다.)
  • 인터럽트를 소프트웨어적으로 실행할수도 있다.해당 실시간 라이브러리 함수에 의해 소프트웨어 인터럽트가 실행된다. 이것을 시스템 콜 이라 부른다.

시스템콜

일반적인 프로그램들은 사용자 모드에서 실행되므로 커널 모드에 대한 직접적인 접근이 불가능하다. 하지만 커널에 접근할 수 없으면 사용자 모드의 프로세스들이 파일을 쓰거나 불러올 수 없고 그래픽 처리, 네트워크 통신과 같은 거의 모든 작업을 할 수 없다. 따라서 커널에 요청하여 커널 모드에서 처리하고 그 결과를 사용자 모드의 프로그램에게 전달하는 것이 바로 시스템 콜이다.

유저모드와 커널모드

유저모드

유저(사용자)가 접근할 수 있는 영역을 제한적으로 두고, 프로그램의 자원에 함부로 침범하지 못하는 모드

커널모드

모든 자원에 접근 명령을 할수 있다.

문맥교환

문맥(Context) 이란 CPU의 모든 register 데이터를 말한다. 즉, 현재 task를 실행하는 도중의 CPU register의 모든 정보가 하나의 context다. 현재 실행중인 task 또는 process의 모든 정보도 포함한다. Task의 stack pointer, 이름, 우선순위, 시작 주소 등 모든 정보를 TCB (Task Control Block)이라는 곳에 구조체 리스트로 저장한다.

문맥교환이란 CPU가 이전의 프로세스 상태를 PCB에 보관하고, 또 다른 프로세스의 정보를 PCB에 읽어 레지스터에 적재하는 과정이다.

  • IO 요청시, 시분할 타임아웃시 발생하게 된다.
  • 작업이 다른 물리적 패키지의 CPU로 마이그레이션되면 “캐시 유사” 항목이 두 CPU 모두에서 공유되지 않을 수 있으며 마이그레이션 비용이 상대적으로 클 수 있다
  • 가상주소에서 물리주소로의 빠른변환을 도와주는 TLB 캐시미스로 인해 발생하는 간접비용도 있다.

멀티쓰레드

멀티 스레드란, 일반적으로 하나의 프로세스에 하나의 스레드가 작업하는 것과 달리 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것을 말한다. 이때 여기서 말하는 스레드는 프로세스 내의 작업 단위이다.

장점

  • 자원의 공유(heap, data, code)
    • 프로세스가 가진 자원을 스레드들이 공유하게 되어 작업은 원활하게 진행할 수 있다.
    • 불필요한 자원의 중복을 막아주어 효율성을 높여준다.
    • 멀티프로세스의 경우 IPC를 써야 한다.

단점

  • 쓰레드 하나에 문제가 터지면 프로세스전역에 문제가 생길수 있다.
  • 동기화 문제가 있다.

스케줄링

  • 다중 프로그래밍 환경에서 자원을 분배하는 기법
    • 메모리에 여러 프로그램을 상주시켜, 여러프로그램을 실행하는것처럼 처리하는 시스템
    • 복수의 CPU를 사용한 처리를 멀티프로세싱 시스템 이라 한다.
  • 방법들이 장단점이 있음
  • 비선점형
    • 자발적으로 종료되록 유도
    • 일괄처리에 적합, 문맥교환 오버헤드가 적음
    • 처리율이 떨어질수 있음
    • FCFS(FIFO), SJF(Shortest job first)
  • 선점형
    • 실행중인 프로세스를 중지시키고 다른 프로세스에 할당
    • 라운드로빈, SRTF(Shortest Remaining-Time First Scheduling), 다단계큐, 다단계 피드백 큐(에이징을 통한 기아 상태 예방)
  • 기아상태
    • 자원을 할당받지 못하고 있는 상태

데드락

  • 자원을 얻기 위해 서로 경쟁하는 상황이 발생하여 프로세스들이 대기상태에서 무한히 대기하는 상태
  • example (**HikariCP Dead lock)**
  • 발생조건 (4가지가 모두 발생해야한다)
    • 상호배제: 자원은 한번에 한 프로세스만 사용할수 있다.
    • 점유대기: 자원을 점유한채 다른 필요한 자원을 얻기 위해 대기한다.
    • 비선점: 강제로 빼앗을수 없음
    • 순환대기: 프로세스들이 상대방이 필요한 자원을 점유 한 상태로 상대방이 가지고 있는 자원을 요청하고 있는 상태다

데드락 예방, 회피, 복구

예방 (4가지 상황중 하나를 막는다)

  • 상호 배제(mutual exclusion)는 자원의 공유가 불가능하다는것을 의미한다. 그렇다면 readonly 방식을 통해 하나의 자원을 공유해서 쓸수 있도록 한다.
  • 점유 대기 방지(Hold and Wait Prevention)를 한다. 한번에 자원을 할당할때 필요한 자원들을 모두 할당하는 방법이 있다. 하지만 당장바로 필요한 자원도 할당할수 있어 비효율적일수 있다.
  • 선점형 스케줄링 기법을 활용한다.
  • 프로세스가 획득하는 자원의 순서를 맞춰서 순환대기를 방지할수 있다.

회피 (자원들의 부가정보를 활용하여 알고리즘을 이용하여 회피)

  • 자원 할당 그래프 알고리즘 (싱글 인스턴스일때, 사이클이 발생하지 않도록 예방)
  • 은행원 알고리즘 (자원최대 요구량 - 현재 점유한 자원의 양만큼 또 요청을 할수 있는지를 체크하여 자원을 할당해준다)

복구

  • 프로세스를 종료시킨다.
  • OOM killer

교착상태 무시

교착상태를 무시하는 방법이다. 교착상태를 주기적으로 탐지하거나 예방하게 되면 오버헤드가 많이 발생한다. 주로 Window, Linux등 운영체제에서 사용하는 방법이다.

Leave a comment