process 와 thread

searchortype·2022년 3월 19일
0
post-thumbnail

프로세스의 개요

프로세스?

프로세스는 운영체제에서 하나의 작업 단위이다.
프로세스는 프로그램이 동작하는 동안의 작업단위를 말한다.

프로그램 vs 프로세스

폰노이만 구조에서 프로그램이 실행된다는 것은 해당 코드가 메모리에 올라와서 작업이 진행된다는 의미이다.

  • 프로그램은 저장장치에 저장되어 있는 정적인 상태
  • 프로세스는 실행을 위해 메모리에 올라온 동적인 상태

프로그램에서 프로세스로의 전환

  1. 프로그램을 메모리의 적당한 위치로 가져온다.
  2. 프로세스 제어블록 PCB (작업 지시서)를 만든다.
  3. 전환

제어블록 PCB

하나의 프로세스를 실행하려면 프로세스 id, 메모리 관련 정보, 각종 중간값을 관리해야하는데 이 정보를 보관하는 데이터 구조가 프로세스 제어 블록이다.

  • 프로세스 구분자 프로세스를 구분하는 id
  • 메모리 관련 정보 프로세스의 메모리 위치 정보
  • 각종 중간값 프로세스가 사용했던 중간값이 저장된다. 시분할 시스템에서는 여러프로세스가 번갈아 실행되어 일정 시간 작업을 한 후 일정 시간 작업 후 프로세스에 CPU를 넘겨준다.

프로세스의 상태

프로세스의 5가지 상태 (활성 상태)

  • 생성
    프로그램이 메모리에 올라오고 운영체제로부터 pcb를 할당 받은 상태.
  • 준비
    모든 프로세스가 자기 순서를 기다리는 상태.
  • 대기
    실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태.
  • 실행
    프로세스가 CPU를 할당받아 실행되는 상태. 많은 프로세스 중 실행 상태에 들어가는 프로세스는 cpu 개수 만큼이다.
  • 완료
    프로세스가 종료되는 상태. 완료상태에서는 코드와 사용했던 데이터를 메모리에서 삭제하고 프로세스 제어 블록을 폐기한다.

그 외의 상태

  • 휴식
    프로세스가 일시적으로 쉬고 있는 상태. 사용하던 데이터가 그대로 있고 프로세스 제어 블록도 유지 되기 때문에 프로세스는 멈춘 지점에서 재시작 가능하다.
  • 보류
    프로세스가 메모리에서 잠시 쫓겨난 상태. 보류상태에 들어간 프로세스는 swap영역에 보관된다.
    • 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때 (메모리 용량 초과)
    • 프로그램 오류가 있어서 실행을 미루어야 할 때 (오류)
    • 긴 주기로 반복되는 프로세스라 메모리 밖으로 쫓아도 문제가 없을 때
    • 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때 (지연)

문맥 교환

CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말한다. 실행에서 나가는 프로세스의 PCB에 지금까지의 작업 내용이 저장되고, 실행상태가 되는 프로세스의 PCB의 내용으로 CPU가 다시 세팅된다.

문맥교환이 일어나는 경우

  • 프로세스에게 주어진 시간을 다 사용하면
  • 인터럽트가 걸렸을 때

프로세스의 연산

프로세스가 어떻게 생성되고 복사되는지 알아보자

프로세스의 구조

  • 코드 영역 프로그램의 본문이 기술된 곳 (읽기 전용)
  • 데이터 영역 코드가 실행되면서 사용하는 변수파일 등의 각종 데이터를 모아놓은 곳이다. (읽기/쓰기 가능)
  • 스택 영역 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳이다.

프로세스의 생성과 복사

  • 생성
    프로그램을 실행할 때 새로 생성된다.
    1. 프로그램을 실행하면 운영체제는 프로그램을 메모리로 가져온다.
    2. 코드영역에 넣고 PCB를 생성한다.
    3. 메모리에 데이터 영역과 스택 영역을 확보한다.
    4. 실행한다.

  • 복사
    실행 중인 프로세스로 부터 새로운 프로세스를 복사하는 방법
    • fork()
      • 정의

        • 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
        • 두 프로세스는 부모-자식 관계로 연결 [기존 프로세스(부모) - 새 프로세스(자식)]
      • 동작 과정

        • fork()를 호출하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 PID, 메모리 관련 정보, PPID, CPID를 제외하고 자식 프로세스에 복사되어 똑같은 프로세스가 만들어진다.
      • 장점

        • 프로세스의 생성 속도가 빠르다.
        • 추가 작업 없이 자원을 상속할 수 있다.
        • 시스템 관리를 효율적으로 할 수 있다.

프로세스의 전환

  • exec()함수

    • 새로운 프로세스로 전환하는 함수
    • 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출
    • 목적
      • 프로세스의 구조체를 재활용하기 위함이다. 새로운 프로세스를 만들려면 프로세스 제어 블록을 만들고 메모리의 자리를 확보하는 과정이 필요하다.
      • 프로세스 종료 후 사용한 메모리를 청소하기 위해 상위 프로세스와 부모-자식관계를 만들어야 한다. exec() 호출 시 새로운 코드영역만 가져오면 되기 때문에 작업이 수월하다.
    • 동작과정
      • 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꾼다.
        (데이터 영역이 새로운 변수로 채워지고, 스택 영역 리셋)
        (각종 레지스터와 사용한 파일 정보 모두 리셋)

프로세스의 계층 구조

운영체제는 프로세스를 효율적으로 관리하기 위해 init 프로세스를 만든 다음 나머지 프로세스를 init 프로세스의 자식으로 만든다.

  • 장점
    • 여러 작업의 동시 처리
    • 용이한 자원 회수
  • 고아 프로세스(좀비 프로세스) 프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스를 고아 프로세스라고 한다. 부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때까지 기다린다. 하지만 아래와 같은 경우 부모 프로세스에 연락이 안된다.
    • 부모 프로세스가 먼저 종료 (고아 프로세스)
    • 자식 프로세스가 비정상 종료 (좀비 프로세스)

스레드

프로세스는 요리 작업 전체

스레드는 요리를 완성하기 위해 수행하는 각각의 조리

스레드의 개념

프로세스가 생성되면 cpu스케줄러는 프로세스가 해야 할 일을 cpu에 전달하고 실제 작업은 cpu가 수행한다. 이 때 cpu 스케쥴러가 cpu에 전달하는 일 하나가 스레드이다.

프로세스와 스레드의 차이

  • 프로세스
    프로세스는 독립적인 존재이다. 서로에게 영향을 미치지 않는다.
  • 스레드
    프로세스는 여러개의 스레드로 구성되고 스레드 끼리는 강하게 연결되어 있다.
  • 멀티테스크
    • 프로세스는 서로 데이터를 주고받을 때 프로세스 간 통신(Inter Process Communication. IPC)을 이용한다.
    • 서로 독립적인 존재이기 때문에 한 프로세스가 비정상 종료를 해도 다른 프로세스가 영향을 받지 않는다.
  • 멀티스레드
    • 변수나 파일 등을 공유하고 전역 변수나 함수 호출 등의 방법으로 스레드 간 통신을 한다.
    • 스레드들은 강하게 연결되어 있기 때문에 한 스레드가 비정상종료를 하게 되면 프로세스 내의 다른 스레드들도 비정상 종료된다.

멀티스레드의 구조와 예

멀티스레드의 구조

  • fork() 프로세스의 단점 fork() 시스템 호출로 프로세스를 복사하면 코드 영역과 데이터 영역의 일부가 메모리에 중복되어 존재하고, 부모-자식 관계지만 서로 독립적인 프로세스이므로 이러한 낭비 요소를 제거할 수 없다.
  • 그렇게 등장한 thread 스레드는 이러한 멀티태스킹의 낭비 요소를 제거하기 위해 사용한다. 비슷한 일을 하는 2개의 프로세스를 만드는 대신 코드, 데이터를 공유하면서 여러개의 일을 하나의 프로세스 내에서 하는 것이다.

멀티스레드의 장단점

  • 장점
    • 응답성 향상 (사용자의 작업 요구에 빨리 응답)
    • 자원 공유
    • 효율성 향상 (불필요한 자원 중복 방지를 막음으로서 시스템 효율 향상)
    • 다중 cpu 지원 (프로세스 처리 시간 단축)
  • 단점
    모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 스레드에 영향을 미친다. 반면 프로세스를 여러개 만드는 방식의 경우 각 프로세스가 독립적이기 때문에 한 프로세스에 문제가 생겨도 다른 프로세스에 영향이 가지 않는다.

멀티스레드 모델

커널 스레드(1 to 1)

  • 커널이 멀티스레드를 지원한다.
  • 하나의 사용자 스레드가 하나의 커널 스레드와 연결
  • 장점
    • 커널 레벨에서 모든 작업을 지원한다. 때문에 멀티 cpu를 사용할 수 있다.
    • 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있다.
    • 보안에 강하고 안정적이다.
  • 단점
    • 문맥 교환 시 오버헤드 때문에 느리게 작동한다.

사용자 스레드 (1 to N)

  • 운영체제가 멀티스레드를 지원하지 않을 때 사용하는 방법으로 초기 스레드 시스템에서 이용되었다.
  • 라이브러리를 사용하여 구현한다.
  • 문맥교환이 필요없다. (라이브러리가 해줌)
  • 장점
    • 속도가 빠르다.
  • 단점
    • 여러개의 cpu를 동시에 사용할 수 없다. 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문이다.
      cpu를 여러 개 갖추고 멀티스레드를 지원하는 커널의 경우 스레드를 여러 cpu에 나누어 작업시키는 것이 가능하다. 하지만 커널 입장에서 사용자 스레드는 하나의 프로세스로 인식되기 때문에 작업을 나눌 수 없다.
    • 보안에 취약하다.
      커널 레벨에서는 공유 변수를 보호하는 장치가 있지만 사용자 스레드에서는 커널이 아닌 라이브러리에서 구현해야하기 때문이다.

멀티레벨 스레드 or 하이브리드 스레드(M to N)

  • 사용자 스레드와 커널 스레드를 혼합한 방식
  • 장점
  • 하나의 커널 스레드가 대기 상태에 들어가면 다른 커널 스레드가 대신 작업해 사용자 스레드보다 유연하게 작업할 수 있다.
  • 단점
    • 오버레드로 인해 사용자 스레드 만큼 빠르지 않다.
  • 빠르게 움직여야 하는 스레드는 사용자 스레드
  • 안정적으로 움직여야 하는 스레드는 커널 스레드

동적 할당 영역과 시스템 호출

프로세스의 동적 할당 영역

프로세스는 코드 영역, 데이터 영역, 스택 영역, 힙영역으로 이루어져 있다.

  • 정적 할당 영역 코드 영역과 데이터 영역은 프로세스가 실행되기 직전에 위치와 크기가 결정되고 실행되는 동안 변하지 않는다.
  • 동적 할당 영역 스택 영역과 힙 영역은 프로세스가 실행되는 동안 만들어지는 영역으로, 크기가 늘어났다 줄어들기도 한다.
    • 스택 영역
      • 프로세스를 작동하기 위해 커널이 유지하는 자료구조
      • 스레드가 작동하는 동안 추가되거나 삭제되는 동적할당 영역
      • 호출한 함수가 종료되면 함수를 호출하기 전 코드로 되돌아야 하는데 되돌아올 메모리의 주소를 스택에 저장한다.
      • 스택은 변수 사용 범위에 영향을 미치는 영역을 구현할 때 사용한다.
    • 힙 영역
      • 동적으로 할당되는 정수 영역
      • 필요할 때 메모리를 차지 했다가 필요 없을 때 메모리를 반환한다. (ex. malloc())

exit()와 wait() 시스템 호출

  • exit()
    • 작업 종료를 알려주는 시스템 호출
    • exit() 혹은 return()을 사용함으로서 자원 회수가 빠르게 이루어 질 수 있다.
    • 반환값을 통해 정상 종료가 되었는지 (0) 비정상 종료(-1)가 되었는지 알 수 있다.
  • wait()
    • 고아 프로세스가 생기는 것을 방지하기 위해 wait() 시스템 호출을 한다.
    • 부모 프로세스는 wait() 함수에서 자식 프로세스가 끝나기를 기다린다. 때문에 부모 프로세스가 먼저 끝나는 경우는 없다.
    • 전면 프로세스와 후면 프로세스 윈도우 창이 여러개 있다고 할 때, 맨 앞의 창(전면 프로세스)은 키보드가 먹지만 다른 창(후면 프로세스)에서는 키보드 안먹힘

reference : 쉽게배우는 운영체제

0개의 댓글