본문 바로가기
🖥️ Computer Science

프로세스와 스레드 정리

by GroovyArea 2024. 3. 3.

01_프로세스의 개요

프로세스의 개념


  • 프로그램
    • 저장장치에 저장 된 정적 상태
  • 프로세스
    • 실행 중인 프로그램
    • 하나의 작업 단위
    • 실행을 위해 메모리에 올라온 동적 상태

요사 모형에의 비유


일괄 작업 방식

  • 한 번에 하나만 작업 처리
  • 작업 효율이 떨어진다.

시분할 방식

  • 여러 개의 작업에선 일괄 작업 방식이 비효율적이다.
  • 시간을 적당히 배분하여 CPU 1개가 여러 프로세스를 동시 처리
  • 예상 치 못한 상황 처리
    • 작업을 마무리 하지 못한 상황에서 다른 작업을 처리하는 상황 발생

프로그램 -> 프로세스 전환

  • 프로세스가 될 때 프로그램은 메모리에 올라 온다.
    • 이 때, 작업 지시서인 프로세스 제어 블럭 이 만들어진다.
    • 프로세스를 처리하는데 필요한 다양한 정보가 들어 있다.
    • 프로그램이 프로세스가 되었다는 것은 프로세스 제어 블럭을 OS 로 부터 할당 받았다는 것을 의미한다.
  • 프로세스 제어 블럭의 대표적인 3가지
    • 프로세스 구분자 : pid
    • 메모리 관련 정보
      • 실행하려는 프로세스의 메모리 저장 위치
      • 메모리 보호를 위한 경계, 한계 레지스터 포함
    • 각종 중간 값
      • 프로세스가 사용했던 중간 데이터
      • 프로세스가 작업을 이어 갈 때 활용
  • 프로세스 제어 블럭은 OS 영역에 만들어진다.
  • 프로세스 종료 시 제어 블럭은 폐기 된다.

프로세스의 상태

  • 생성 상태
    • 프로세스가 메모리에 올라온 상태
    • 프로세스 제어 블럭 생성, 같이 메모리로 옮겨짐
  • 준비 상태
    • CPU 를 할당 받을 때까지 기다리는 상태
    • 준비 QUEUE 에서 대기
    • 실제로는 다수 준비 큐 운영
    • 큐를 운영하는 방식은 CPU 스케쥴러가 결정
  • 실행 상태
    • CPU 를 할당 받아 실제 작업을 수행하는 상태
    • 프로세스는 CPU 사용 권리 획득
    • 할당 받은 시간 (타임 슬라이스) 동안 작업 미완료 시 준비 상태로 복귀
      • "타임 아웃"
    • 입출력 요청 시, block 함수를 실행, 대기 상태로 옮김
  • 완료 상태
    • 프로세스가 작업을 마친 상태
    • 프로세스 제어 블럭 폐기를 의미
    • exit 함수 호출
    • 강제 종료 (abort) 시, 직전 메모리 상태를 저장장치로 이동 -> 코어 덤프

  • CPU 는 프로세스를 실행 하는 동안 클럭에게 타임 슬라이스 알림을 요청한다.
  • 타임 슬라이스 만료 시, 클럭은 인터럽트를 사용한다.

  • 대기 상태
    • 프로세스가 IO 관련 작업 요청을 실행한 경우, 대기 상태로 바뀐다.
    • 작업의 효율성을 위함
    • 요청 완료 시, CPU 스케쥴러는 프로세스를 실행 상태로 만든다.
    • IO 장치 별 큐에서 대기
    • IO 요청 작업 완료 시, wake up 함수 호출 -> 인터럽트
  • 휴식 상태
    • 프로세스가 작업을 일시적으로 쉬고 있는 상태
    • 프로세스 제어 블럭도 유지되므로, 멈춘 지점으로부터 재시작 가능
  • 보류 상태
    • 프로세스가 메모리에서 잠시 쫓겨난 상태 (일시 정지 상태)
      • 메모리가 모자란 경우, 프로그램 오류, 부적절한 프로세스, 우선 순위가 낮은 프로세스, IO 요청 작업이 지연될 때
    • 스왑 영역에 보관 된다.

프로세스 제어 블럭


프로세스 제어 블럭 구성

  • 포인터 : 프로세스 제어블럭의 첫번째 블럭에 저장 (큐 구현할때 이용)

  • 프로세스 상태 : 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등 (두 번째 블럭에 저장)

  • 프로그램 구분자 : 운영체제 내에서 프로세스를 구별하기 위한 것

  • 프로그램 카운터 : 다음에 실행 될 명령어의 위치 저장

  • 프로세스 우선순위 : CPU 스케줄러가 준비상태에서 실행상태로 옮길 때 사용

  • 각종 레지스터 정보 : 자신이 사용하던 레지스터의 중간 값

  • 메모리 관리 정보

  • 활당된 자원 정보 : 입출력 자원, 오픈 파일

  • 계정 정보

  • 부모 프로세서 구분자, 자식 프로세스 구분자


  • 포인터의 역할
    • 같은 IO 를 기다리는 프로세스끼리 모아 놓는다.
    • 이 때, 포인터를 통해 이전, 다음 순서를 알 수 있다.

문맥 교환

  • 프로세스 간 작업 전환을 의미
  • 프로세스 제어 블럭의 내용이 변경 된다.
  • 인터럽트 시에도 발생한다.

03_프로세스의 연산

프로세스의 구조

  • 코드 영역
    • 프로그램의 본문이 기술된 영역 (텍스트 영역)
    • 읽기 전용으로 처리 됨 (자기 자신을 수정하는 프로그램은 존재하지 않는다.)
  • 데이터 영역
    • 코드가 실행되며 사용하는 변수나 파일 등의 각종 데이터를 모아 놓는 영역
    • 데이터는 변하는 값이므로 읽기와 쓰기가 가능하다.
  • 스택 영역
    • 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아 놓은 곳
    • 프로세스 내에서 함수를 호출하면, 원래 프로그램으로 되돌아올 위치를 이 영역에 저장
    • 사용자에게는 보이지 않음

프로세스의 생성과 복사

  • fork() 시스템 호출의 개념
    • 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
    • 커널에서 제공, 일종의 시스템 호출
    • 새로운 워드 프로세스를 실행하면 이 시스템 호출이 실행된다. (새로 만드는 것보다 속도가 훨씬 빠르다.)
    • 부모 - 자식 관계로 연결된다.
  • fork() 시스템 호출의 동작 과정
    • 프로세스 제어 블럭을 포함한 부모 프로ㅔ스 영역의 대부분이 자식 프로세스에 복사 되어 동일한 프로세스가 생성 된다.
      • 프로세스 구분자가 바뀐다.
      • 메모리 관련 정보가 바뀌낟.
      • ppid, cpid 가 바뀐다. 자식 프로세스의 cpid 는 -1
  • fork() 시스템 호출의 장점
    • 프로세스의 생성 속도가 빠르다.
    • 추가 작업 없이 자원을 상속 가능하다.
    • 시스템 관리를 효율적으로 할 수 있다.

프로세스의 전환

  • exec() 시스템 호출의 개념
    • 기존의 프로세스를 새로운 프로세스로 전환하는 함수
    • 프로세스의 구조체를 재활용하기 위한 목적
    • 이미 생성 된 PCB, Memory, 부모-자식 관계를 그대로 사용 가능하다.
    • OS의 작업이 한결 수월해짐.
  • exec() 시스템 호출의 동작 과정
    • 코드 영역에 있는 기존 내용을 지우고, 새로운 코드로 변경, 스택 영역이 리셋
    • pid, ppid, pcid 불변, Program counter registry 값 등 각종 레지스터와 사용한 파일 정보가 리셋 됨.

04. 프로세스의 계층 구조

유닉스의 프로세스 계층 구조

  • 유닉스에서 커널이 처음 메모리에 올라와 부팅이 되면, 커널 관련 프로세스를 여러 개 생성한다.
  • init 프로세스는 전체 프로세스의 출발점이 된다
  • 하위 프로세스의 경우, 모두 자식이 되는 트리 구조를 이룬다.

프로세스 계층 구조의 장점

  • 프로세스의 계층 구조는 동시에 여러 작업을 처리하고 종료된 프로세스의 자원을 회수하는 데 유용하다.
    • 프로세스를 계층 구조로 만들면, 관계 간 책임이 분명해져, 시스템을 관리하기 수월하다.
    • 작업을 마친 프로세스의 자원을 회수할 때 특히 편리하다.

미아 프로세스

  • 부모 프로세스가 먼저 종료되거나, 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안 되는 경우, 사용하던 자원이 그대로 남게 된다.
  • "좀비프로세스"
  • OS 는 반환 되지 못한 자원을 회수하는 자원 회수를 주기적으로 해야 한다.
  • C 언어의 return, exit 함수는 자식 프로세스의 작업이 끝난다는 것을 부모에게 알리는 것이다.
  • 이를 통해 부모는 동기화가 가능하다.
  • 이는 현대 객체 지향 언어에도 동일하게 적용한다. ex) Java 의 Object 클래스

4. 스레드

스레드의 개념

  • 프로세스의 코드에 정의된 절차에 따라 CPU 에 작업 요청을 하는 실행 단위

프로세스의 스레드의 차이

  • 스레드
    • 스레드는 프로세스 내부에서 서로 강하게 연결 되어 있다.
  • 멀티태스크
    • 서로 독립적인 프로세스는 데이터를 주고받을 때 프로세스 간 통신 IPC 통신을 이용한다.
  • 멀티스레드
    • 멀티스레드는 변수나 파일 등을 공유하며 전역 변수나 함수 호출 등의 방법으로 스레드 간 통신을 한다.
  • 멀티프로세싱
    • CPU 를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경
    • 병렬 처리에서의 슈퍼스칼라 기법과 같다.
    • 여러 개의 CPU 혹은 하나의 CPU 내 여러 개의 코어에 스레드를 배정하여 동시에 작동
    • 동일한 네트워크에 여러 컴퓨터에 스레드를 나누어 협업하는 분산 시스템도 멀티프로세싱이다.
  • CPU 멀티스레드
    • 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법

멀티스레드의 구조와 예

  • 멀티태스킹의 낭비 요소를 제거하기 위해 사용한다.
  • 응답성 향상에 도움이 된다.
  • 자원 공유가 원활하다.
  • 효율성 향상에 도움이 된다.
  • 하지만, 한 스레드에 문제가 생길 경우, 전체 프로세스에 영향을 미친다.

멀티스레드 모델

  • 커널 스레드

    • 커널이 직접 생성하고 관리하는 스레드
    • 커널이 멀티스레드를 지원하는 방식하나의 사용자 스레드가 하나의 커널 스레드와 연결되기 때문에, 1 to 1 모델이라 부른다.
    • 독립적으로 스케쥴링 되므로 특정 스레드가 대기 상태에 들어가도 작업을 계속할 수 있다.
    • 또한 커널이 제공하는 보호 기능과 같은 모든 기능을 사용 가능함.
  • 사용자 스레드

    • 라이브러리에 의해 구현된 일반적인 스레드
    • 커널 입장에서 이 스레드는 하나의 프로세스처럼 보인다.
    • 커널 스레드와 1:N 관계
    • 라이브러리가 직접 스케쥴링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요 없다.
    • 여러 개의 스레드가 하나의 커널 스레드와 연결 되므로, 커널 스레드가 IO 작업을 위해 대기 상태일 때 연결 된 모든 사용자 스레드도 대기한다.
    • 한 프로세스의 타임 슬라이스르 여러 스레드가 공유하므로, 여러 개의 CPU 를 동시에 사용할 수 없다. 하지만 커널의 경우 스레드를 여러 CPU 에 나누어 작업시키는 것이 가능하다.
    • 또한 사용자 레벨 스레드는 보안에 취약하다. 커널 레벨에서는 공유 변수를 보호하는 장치가 있다.
  • 멀티레벨 스레드

    • 사용자 레벨, 커널 스레드를 혼합한 방식
    • 문맥 교환의 오버헤드가 있어 빠르진 않다.

반응형