윤개발

2. 프로세스와 스레드 본문

컴퓨터과학/운영체제

2. 프로세스와 스레드

DEV_SJ 2021. 5. 16. 23:59
  • 프로세스는 프로그램을 메모리 상에서 실행중인 것 + PCB(프로세스 제어 블록)을 생성한 것
  • 스레드는 프로세스 안에서 실행되는 흐름 단위

프로세스 하나마다 1개 이상의 스레드를 가지고 있다.

프로세스는 별도의 주소공간을 할당받는다.

  • 코드영역 - 요리책
  • 데이터 영역- 요리 재료, 전역변수와 정적 변수
  • 힙영역- 동적 할당된 데이터
  • 스택영역 - 조리도구, 지역변수, 매개변수, 리턴 값 - 스레드가 할당받는 영역

프로세스는 자신만의 공간을 할당받아 사용하지만 스레드는 다른 스레드와 공간과 자원을 공유하면서 사용한다.

PCB에는 아래 정보가 포함된다.

  • 포인터 - 준비상태나 대기상태의 큐 구현을 위해 사용된다.
  • 프로세스 구분자(PID), 프로세스 상태, 프로세스 우선순위, 할당 자원 정보
  • 메모리 관련 정보 - 프로세스의 메모리 위치, 경계레지스터
  • 각종 중간 값 - 어디까지 실행되었는지 저장하는 프로그램 카운터(PC)

PCB는 운영체제 메모리 공간에서 관리된다.

프로세스 상태

생성-준비-실행-(대기)-(준비)-(실행)-완료

프로세스 복사

fork(): 프로세스를 복사하는 시스템콜

  • 자식 프로세스는 프로세스 구분자PID, 참조하는 메모리위치, PPID등이 변경된다.
  • 복사를 하므로 생성보다 속도가 빠르다.
  • 추가 자원 없이 자원을 상속한다.
  • 계층 구조를 사용해서 자식 프로세스가 종료하면 부모프로세스가 종료되므로 자원을 효율적으로 관리할 수 있다.

exec(): 프로세스는 그대로 둔 채 내용만 바꾸는 시스템호출이다. 완전히 다른 프로세스가 된다.

  • 대부분의 영역을 그대로 사용할 수있고 코드영역만 가져오면 된다.
  • 스택이 레셋되고 데이터 영역이 초기화된다.

운영체제의 모든 프로세스는 init프로세스의 자식프로세스가 된다.

  • 계층 구조로 동시에 여러작업을 처리하고(fork) 종료된 프로세스의 작업 회수가 용이하다.
  • 부모가 자식을 기다리지 않고 종료해버리거나 비정상 종료되면 자식 프로세스는 좀비나 고아프로세스가 되며 자원화수가 안되어 낭비된다.

멀티 태스킹

여러 프로세스가 동시에 실행되고 관리되는 것 처럼 보이지만 CPU는 프로세스들을 번갈아가며 실행하고 관리하는데 이를 문맥교환 이라고 한다. (Context switching)

  • Context switching - 프로세스가 CPU를 사용중인 상태에서 다른 프로세스가 사용하기위해 상태를 보관하고 교환하는 것을 말한다. - 스케줄러에 의해 발생된다.
    • 현재 수행중인 프로세스의PCB 정보를 저장하고 교환되는 PCB를 읽어서 수행한다.
    • 인터럽트 상황에서 발생한다. ⇒ I/O, cpu 사용시간 만료
  • PCB를 참조하여 문맥 교환을 한다.

프로세스간 통신은 프로세스 동기화에서 다룸

스레드

CPU 스케줄러가 CPU에게 실제 전달하는 일 하나가 스레드이다.

각각의 프로세스는 약하게 연결되어있지만 프로세스들 끼리는 강하게 연결되어있다.

스레드마다 각자의 스택과 레지스터 영역을 가지고 프로세스의 힙영역을 공유한다.

  • 스택을 독립적으로 사용하는 이유 - 스택은 함수 호출시 인자, 돌아가는 주소 값등을 저장하는 공간이므로 독립적인 실행 흐름을 위해 따로 할당한다.
  • 레지스터 독립적으로 사용하는 이유 - 마찬가지로 독립적으로 수행하기 위해 레지스터도 따로 할당된다.

멀티스레드

멀티스레드는 변수나 파일 등을 공유하고 전역변수나 함수호출등의 방법으로 스레드간 통신을 한다.

  • 공유가 가능한 부분을 제외하고 실행 관련된부분을 나누어 관리하면 자원의 중복사용을 피할수 있다.
  • 다중cpu 에서는 멀티스레드를 동시에 처리하여 시간이 단축된다.
  • 스레드를 많이 생성하면, context switching이 많이 일어나서 성능 저하 (프로세스 교환간에도 일어나지만 스레드 사이에서도 일어난다. ⇒ 프로세스와 다르게 stack 영역만 스위칭하면 된다.)
  • 하나의 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다.

멀티프로세스대신 멀티스레드를 사용하는 이유

쉽게 설명하면 프로그램을 여러개 켜는거 보다 하나의 프로그램에서 여러 작업을 해결하는 것

문맥교환이 적게 일어나기 때문에 자원의 효율성이 늘어난다.

하지만 동기화 문제에 대해서 고민해야한다. 또한 하나의 스레드에서 오류가 발생하면 프로세스 전체로 번지게된다.

용어차이

멀티스레드 - 프로세스에서 여러개의 스레드로 나누는 기법

멀티태스킹 - CPU에서 시분할 방식을 통해 스레드를 처리하는 방법

멀티프로세싱 - 여러개의 CPU에서 스레드를 처리하는 기법

CPU 멀티스레드 - 하드웨어 적인 방법으로 파이프라이닝을 통해 스레드를 여러개 처리하는 방법

'컴퓨터과학 > 운영체제' 카테고리의 다른 글

6. 물리메모리  (0) 2021.05.17
5. 교착상태  (0) 2021.05.17
4. 프로세스 동기화  (0) 2021.05.17
3. cpu 스케쥴링  (0) 2021.05.17
1. 하드웨어 구성  (0) 2021.05.16
Comments