프로세스와 스레드

메론보이·2024년 4월 30일
0

운영체제

목록 보기
3/11

프로세스의 개요

프로세스의 개념

  • 현재 실행중인 프로그램
  • 프로세스를 실행하면 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램이 프로세스가 됨

프로세스 제어 블록

  • CPU의 자원은 한정되있기 때문에 프로세스들은 차례대로 돌아가며 한정된 시간만큼만 CPU를 이용함
  • 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고 프로세스에 CPU를 비롯한 자원을 배분함
  • 이를 위한 프로세스 제어 블록을 이용함
  • 프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료 구조임

프로세스 제어 블록 구성요소

프로세스 ID

  • 특정 프로세스를 식별하기 위해 부여하는 고유한 번호

레지스터 값

  • 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원해야함 그래야 이전까지 진행했던 작업들을 그대로 이어 실행할 수 있기 떄문
  • PCB안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담김

프로세스 상태

CPU 스케쥴링 정보

  • 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보가 기록

메모리 관리 정보

  • 프로세스마다 메모리에 저장된 위치가 다르기 때문에 PCB에는 프로세스가 어느 주소에 저장되어 있는지에 대한 정보가 있어야함

사용한 파일과 입출력 장치 목록

  • 프로세스 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시

컨텍스트 스위칭

정의

  • 컨텍스트 스위칭은 운영 체제가 한 프로세스에서 다른 프로세스로 CPU 제어권을 전환하는 과정입니다.
  • 이 과정에서 현재 프로세스의 상태(컨텍스트)를 저장하고, 다음 실행될 프로세스의 상태를 복원합니다.

주요 특징

  • 멀티태스킹 환경에서 프로세스 간 공평한 CPU 자원 분배를 가능하게 합니다.
  • 컨텍스트 스위칭은 시간과 자원을 소모하는 작업으로, 너무 자주 발생하면 시스템 성능에 부정적 영향을 줄 수 있습니다.

왜 쓰는지

  • 다수의 프로세스가 동시에 실행되는 환경에서 각 프로세스가 CPU를 공정하게 사용할 수 있도록 하기 위해 사용됩니다.

언제 쓰는지

  • 멀티프로세싱 환경에서 프로세스가 I/O 작업으로 대기 상태에 들어갈 때, 시간 할당량(time slice)이 끝났을 때, 우선순위가 높은 프로세스가 실행 준비가 되었을 때 등 다양한 상황에서 사용됩니다.

어떻게 쓰는지

  • 현재 실행 중인 프로세스의 레지스터 상태, 프로그램 카운터 등을 프로세스 제어 블록(PCB)에 저장합니다.
    다음 실행할 프로세스의 PCB에서 상태 정보를 복원해 CPU에 로드합니다.

사용 예시

  • 운영체제가 사용자에게 동영상 재생, 문서 편집, 웹 서핑 등 여러 작업을 동시에 수행할 수 있는 환경을 제공하는 경우.

프로세스의 메모리 영역

코드 영역

  • 기계어로 이루어진 명령어가 저장
  • 쓰기는 금지여서 읽기 전용임

데이터 영역

  • 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간 즉 전역 변수가 저장되는 공간

힙 영역

  • 프로그래머가 직접 할당할 수 있는 저장곤간
  • 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 함
  • 만약 반환하지 않는다면 메모리 낭비가 초래되는데 이것을 메모리 누수라 함

스택 영역

  • 데이터가 일시적으로 저장되는 공간
  • 함수의 실행이 끝나면 사라지는 매개 변수 즉 지역 변수가 대표적임

프로세스의 상태

생성 상태

  • 프로세스를 생성 중인 상태
  • 즉 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
  • 프로세스를 관리하는 데 필요한 프로세스 제어 블록이 생성됨

준비 상태

  • 당장이라도 CPU를 할방받아 실행할 수 있지만, 아직 자신이 차례가 아니기에 기다리고 있는 상태
  • 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태

실행 상태

  • CPU를 할당받아 실행 중인 상태
  • 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할수있음

대기 상태

  • 입출력장치의 작업을 기다리는 상태
  • 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태
  • 작업 효율을 높이기 위해 만들어진것

종료 상태

  • 프로세스가 종료된 상태
  • 코드로 사용했던 데이터를 메모리에서 삭제하고 프로세스 제어 블록을 폐기

프로세스 계층 구조

  • 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음
  • 이때 새 프로세스를 생성한 프로세스를 부모 프로세스, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라함

프로세스의 연산

프로세스의 생성과 복사

  • 프로그램을 실행할 때 프로세스가 새로 생성됨 이때 사용자가 프로그램을 실행하면 운영체제는 프로그램을 메모리로 가져와 코드 영역에 넣고 프로세스 제어 블록을 생성함
  • 메모리에 데이터 영역과 스택 영역을 확보한 후 프로세스를 실행함

fork() 시스템 호출의 개념

  • 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
  • fork() 시스템 호출을 사용하면 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어짐

fork() 시스템 호출의 동작과정

  • fork() 시스템 호출을 하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어짐
  • 단 바뀌는 부분도 있는데
    프로세스구분자
    메모리위치
    부모 프로세스 구분자와 자식 프로세스 구분자
    가 바뀐다

fork() 시스템 호출의 장점

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

프로세스의 전환

  • exec() 시스템 호출은 기존 프로세스를 새로운 프로세스로 전환하는 함수임

정리해보면

  • fork(): 새로운 프로세스를 복사하는 시스템 호출
  • exec(): 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출,
    시스템 호출을 하면 현재의 프로세스가 완전히 다른 프로세스로 전환됨

사용목적

  • 프로세스의 구조를 재활용하기 위함
  • 새로운 프로세스를 만들려면 프로세스 제어 블록을 만들고 메모리의 자리를 확보하는 과정이 필요함
  • 또한 프로세스 종료한 후 사용한 메모리를 청소하기 위해 상위 프로세스와 부모-자식 관계를 만들어야함
  • 그러나 exec() 시스템 호출을 사용하면 이미 만들어진 프로세스 제어 블록,메모리 영역, 부모-자식 관계를 그대로 사용할수있어 효율적임

exec() 시스템 호출의 동작 과정

  • exec() 시스템 호출은 기존 프로세스 구조를 그대로 둔 채 내용만 바꾸어 새로 실행하는것
  • 각종 프로세스 구분자(PID,PPID,CPID)만 남겨두고 나머지 내용을 새로운 것으로 바꿈
  • 데이터 영역이 새로운 데이터로 채워지고 스택 영역이 리셋됨

스레드

정의

  • 프로세스를 구성하는 실행의 흐름 단위
  • 스레드는 프로세스 내에서 각기 다른 스레드ID, 프로그램카운터
    값을 비홋한 레스터스 값, 스택으로 구성
  • 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램카운터, 레지스터,스택)만을 유지한 책 프로세스 자원을 고유하며 실행됨

멀티프로세스와 멀티스레드

멀티프로세스

정의

  • 여러 프로세스를 동시에 실행하는 것
  • 각 프로세스는 독립된 메모리 영역(코드, 데이터, 힙, 스택)을 가집니다.
  • 프로세스들은 서로의 메모리에 접근할 수 없으며, IPC(Inter-Process Communication, 프로세스 간 통신) 메커니즘을 사용하여 통신

왜쓰는지:

  • 안정성이 중요한 경우 사용합니다.
  • 하나의 프로세스에 문제가 생겨도 다른 프로세스에 영향을 미치지 않습니다.
  • 독립된 메모리 공간 때문에 서로 다른 작업을 분리하여 운용할 때 사용합니다.

언제쓰는지:

  • 다중 처리기 시스템에서 병렬 처리가 필요할 때 주로 사용합니다.
  • 각각의 작업이 서로 다른 자원을 사용하거나, 영향을 주지 않아야 할 때 유용합니다.

어떻게쓰는지:

  • 운영 체제에서 프로세스 생성 API를 사용하여 여러 프로세스를 생성하고 관리합니다.
  • IPC 기술을 활용하여 프로세스 간의 데이터 교환 및 동기화를 합니다.

사용예시:

  • 웹 서버에서 각 클라이언트의 요청을 별도의 프로세스로 처리하는 경우
  • 데이터베이스 관리 시스템(DBMS)에서 여러 사용자의 쿼리를 동시에 처리하는 경우

멀티스레드

정의와 특징

  • 멀티스레드는 하나의 프로세스 내에 여러 스레드가 동시에 작동하는 것을 의미합니다.
  • 각 스레드는 프로세스 내의 자원(데이터 세그먼트, 코드 세그먼트, 힙)을 공유하며, 개별적인 스택 영역을 가지고 실행됩니다.
  • 스레드 간의 자원 공유로 인해 통신과 데이터 교환 비용이 낮지만, 동기화 문제가 발생할 수 있습니다.

왜쓰는지:

  • 자원의 효율적인 사용과 빠른 응답 시간이 필요할 때 사용합니다.
  • 프로세스 내의 작업들이 많은 공통 데이터를 접근할 필요가 있을 때 유리합니다.

언제쓰는지:

  • 사용자 인터페이스가 반응성을 유지해야 하면서 백그라운드 작업을 동시에 처리해야 할 때.
  • 입출력(IO), 대규모 연산 등의 작업을 병렬로 처리해야 할 때 사용합니다.

어떻게쓰는지:

  • 프로그래밍 언어나 라이브러리가 제공하는 스레드 생성 API를 통해 사용합니다.
  • 스레드 간의 동기화(예: mutex, semaphore)를 고려하여 설계해야 합니다.

사용예시:

  • 웹 브라우저에서 한 스레드가 사용자 인터페이스를 처리하고, 다른 스레드가 동시에 데이터를 로딩하는 경우
  • 문서 편집기에서 실시간으로 문서 저장 및 철자 검사를 하는 경우

참고

스레드

0개의 댓글