Home 프로세스와 쓰레드
Post
Cancel

프로세스와 쓰레드

프로그램과 프로세스

  • 프로그램: 저장장치에 저장된 명령문의 집합체 (= 앱, .exe)
  • 프로세스: 실행중인 프로그램(= 하드디스크에 저장된 프로그램이 메모리에 올라가서 실행되는 것)

프로그램과 프로세스를 컴퓨터 관점에서 본다면?

  • 프로그램은 저장장치만 사용하는 수동적인 존재지만,
  • 프로세스는 메모리, CPU, 입출력도 하기 때문에 능동적인 존재이다.

멀티프로그래밍과 멀티프로세싱

  • 메모리의 관점에서
    • 유니프로그래밍: 메모리에 한 개의 프로세스가 올라온 것
    • 멀티프로그래밍: 메모리에 여러개의 프로세스가 올라온 것
  • CPU의 관점에서
    • 멀티 프로세싱: CPU가 여러개의 프로세스를 처리하는 것(시분할 프로세싱)
  • 과거엔..?
    • 유니 프로그래밍 + 멀티프로세싱
      • 메모리가 작아 메모리위에 하나의 프로세스만 올리고, 메모리에 있던 프로그램을 다른 저장장치에 올리고 저장장치에 있던 프로그램을 메모리 위로 가지고 와서 실행하는 식으로 진행함(스와핑)

PCB(Process Control Block)

여러개의 프로세스를 한꺼번에 실행해야하는 경우, 운영체제가 순서를 정해야 한다. 해당 프로세스의 정보를 가지고 있는 PCB를 만들고 저장한다. PCB들은 연결리스트(각 각의 데이터가 서로 연결되어있는 구조) 구조로 이루어져 있다. 프로세스가 끝나면 PCB를 제거한다. (제거해도 연결리스트 구조는 유지된다.)

  • PCB 구조
    • 포인터
    • 프로세스 상태
    • 프로세스 카운터 등등 프로세스에 대한 여러가지 정보가 담겨져있다.

프로세스 상태

현재는 시분할 프로세스로 여러개의 프로세스를 한꺼번에 실행한다. 이 말은 프로세스를 정말 동시에 실행하는 것이 아니라, 아주 빠르게 번갈아가면서 실행하기 때문에 유저들은 동시에 실행하는 것처럼 느껴지게 한다. 즉, 한 번에 하나의 프로세스만 실행이 가능하다.

이런 시분할 처리를 위해 아래의 5가지 상태가 존재한다.

  • 생성상태(New): PCB를 생성해서 메모리에 적재를 요청한 상태
  • 준비상태(Ready): 적재 승인 시 넘어오며 CPU를 사용하기 위해 기다리고 있는 상태(대부분의 프로세스가 여기에 있다.)
  • 실행상태(Running): CPU 스케쥴러에 의해 CPU를 할당받아서 실행되는 상태이며 “실행상태에 있는 프로세스의 수 = CPU의 개수” 이다. 시간도 할당해주기 때문에 할당시간이 초과하면 다시 준비상태로 돌아간다.
  • 대기상태(Waiting): 입출력 요청 시, 입출력이 완료될 때까지 기다리는 상태, 빠른 CPU를 기준으로 생각할때 입출력은 너무 오래 걸리는 작업이기 때문에 입출력을 지시하고 실행되기까지의 시간동안 CPU에게 일을 시키기 위해 생겨난 상태이다. (이전 강의의 인터럽트 참고)
  • 완료상태(Terminated): 프로세스가 완료된 상태, 프로세스가 사용한 데이터와 PCB를 제거한다.

컨텍스트 스위칭

프로세스를 실행하다가 다른 프로세스를 실행해야 할 때, 현재 진행중인 프로세스의 상태를 저장하고 다른 프로세스의 상태값으로 교체하는 상태이다. 실행하던 PCB의 내용을 수정하고(상태값 변경) 실행할 PCB로 CPU를 설정한다.

  • CPU점유시간 초과, 입출력요청 혹은 다른 종류의 인터럽트가 있을시 발생한다.

프로세스 생성과 종료

  • .exe 실행 -> 프로그램 실행 -> 코드영역과 데이터 영역을 메모리에 로드 -> 빈 스택과 빈 힙을 만들어서 공간을 확보한다. -> 프로세스를 관리하기 위해 PCB를 만들어서 값을 초기화한다.

운영체제가 부팅되고 0번 프로세스가 실행될때 위의 과정이 딱 한번 세팅된다. -> 나머지 프로세스들은 새로 생성되는게 아니라 기존의 0번 프로세스를 복사한다.(복사가 생성보다 속도가 빠르기 때문에) -> 0번 프로세스: 부모 / 그외의 프로세스: 자식 -> 하지만 .exec함수로 자식 프로세스에 원하는 값을 덮어넣을 수 있어서 부모 프로세스를 복사해도 부모와 다르게 자식 프로세스가 실행된다.

  • 부모 프로세스가 먼저 종료되거나
  • 자식 프로세스가 종료 후에 exit()명령어 전송 실패하는 경우 메모리에 계속 살아있는 상태(= 좀비 프로세스)가 되고 그러면 컴퓨터가 느려진다. 컴퓨터를 재부팅하면 메모리가 초기화되기때문에 다시 빨라진다.

쓰레드

  • 프로세스: 운영체제가 작업을 처리하는 단위
  • 작업이 늘어날 수록 프로세스의 수가 늘어난다.
  • 프로세스의 수가 늘어난다 = PCB, 코드, 데이터, 스택, 힙영역도 만들어줘야한다. 프로세스가 너무 많아지면 컴퓨터가 느려지고 무거워 질 수 있어서 쓰레드가 생겨났다.
  • 쓰레드는 프로세스 안에 존재하며 1개 이상이 존재할 수 있다.
  • 동일한 프로세스 안에 있는 쓰레드들은 PCB, 코드, 데이터, 힙 영역을 공유한다.
  • 단, 스택은 공유하지 않고 쓰레드마다 하나씩 가지고 있음 이제 운영체제는 쓰레드 단위로 실행할 수 있다.

  • 장단점
    • 안정성: 프로세스는 독립적이라 서로의 이상에 영향을 받지않지만, 쓰레드는 하나의 프로세스 안에 존재하기때문에 프로세스에 이상이 생길 경우, 영향을 받는다.
    • 속도와 자원: 프로세스는 각 각의 고유한 자원이 존재하지만 서로 통신하는데에 비용이 들어간다, 쓰레는 자원을 공유하기때문에 빠르게 공유가 가능하다.
This post is licensed under CC BY 4.0 by the author.

운영체제 들어가기

2022 회고