새소식

CS/OS

프로세스(Process) 와 쓰레드(Thread) 정리

  • -

 

1. 프로그램과 프로세스
2. 멀티프로그래밍과 멀티프로세싱
3. PCB
4. 프로세스 상태
5. 컨텍스트 스위칭
6. 프로세스 생성과 종료
7. 쓰레드

 

프로그램과 프로세스

프로그램과 프로세스

  • 프로그램
    • 하드디스크등과 같은 저장장치에 저장된 명령문의 집합체
    • 애플리케이션이나 앱이라고도 불리고 윈도우 운영 체제에서는 exe 파일
    • 컴퓨터 관점에서 하드디스크 즉 저장장치만 사용하는 수동적인 존재
  • 프로세스
    • 하드디스크에 저장된 프로그램이 메모리에 올라갔을 때 실행 중인 프로그램
    • 프로세스는 메모리도 사용하고 운영체제의 CPU 스케줄링 알고리즘에 따라서 CPU도 사용하고 필요에 따라 입력과 출력을 하기 때문에 능동적인 존재

프로세스의 구조

코드 영역, 데이터 영역, 스택 영역 힙 영역

  • 코드 영역
    • 자신을 실행하는 코드가 저장되어 있음
  • 데이터 영역
    • 전역 변수와 static 변수가 저장되어 있음
  • 스택 영역
    • 지역 변수와 함수 호출을 했을 때 필요한 정보들이 저장됨
  • 힙 영역
    • 프로그래머가 동적으로 메모리를 할당하는 데 쓰임

 


 

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

유니 프로그래밍, 멀티 프로그래밍, 멀티 프로세싱

  • 유니 프로그래밍
    • 메모리에 오직 하나의 프로세스가 올라온 것
  • 멀티 프로그래밍
    • 메모리에 여러 개의 프로세스가 올라온 것
  • 멀티 프로세싱
    • 유닛 프로그래밍과 멀티 프로그래밍은 메모리의 관점으로 정의했다면, 멀티 프로세싱은 CPU 관점으로 정의한 것
    • CPU가 여러 개의 프로세스를 처리하는 것

⇒ 오늘날의 OS는 멀티 프로그래밍과 멀티프로세싱 두 개가 공존

 


 

PCB

프로그램이 메모리에 올라가서 실행 중인 상태를 프로세스라고 한다. 운영체제는 여러 개의 프로세스를 전부 다 관리하고 공평하게 실행시켜야 한다.

프로세스가 만들어지면 운영체제는 해당 프로세스의 정보를 가지고 있는 PCB를 만들고 저장한다.

 

 

PCB

  • PCB들은 연결 리스트라는 자료 구조로 저장된다.
  • 운영체제는 프로세스가 종료되면 연결 리스트에서 해당 프로세스의 PCB를 제거한다.

PCB의 구조

  • 포인터
    • 부모와 자식 프로세스에 대한 포인터
    • 할당된 자원에 대한 포인터
    • 프로세스의 한 상태에서 다른 상태로 전환될 때 저장하는 포인터
  • 프로세스 상태
    • 현재 프로세스의 5가지 상태→ 생성, 준비, 실행, 대기 완료를 나타냄
  • 프로세스 ID
    • 프로세스를 식별하기 위한 숫자가 저장된다
  • 프로그램 카운터
    • 다음에 실행될 명령어의 주소를 포함하는 프로그램 카운터를 저장
    • 오늘날 OS는 시분할 처리로 여러 프로세스를 짧은 시간 동안 번갈아 실행함.어떤 프로세스가 실행되다가 ->  다른 프로세스에게 CPU를 뺏기고 -> 다시 실행될 때 원래 실행하던 명령어가 실행되어야 하기 때문에 프로그램 카운터가 꼭 있어야 한다.
  • 레지스터 정보
    • 프로세스가 실행될 때 사용했던 레지스터 값들이 저장된다.
  • 메모리 관련 정보
    • 프로세스가 메모리에 있는 위치 정보, 메모리 침범을 막기 위한 경계 레지스터 값 등이 저장된다.
  • CPU 스케줄링 정보
    • CPU 스케줄링에 필요한 우선순위, 최종 실행 시간, CPU 점유 시간 등이 저장됩니다.

 


프로세스 상태

사용자가 프로그램을 실행시키면 메모리에 올라가면서 프로세스가 생성된다. 오늘날의 운영 체제에는 동시에 수많은 프로세스가 실행된다.

시분할 시스템을 사용하는 운영체제는 여러 개의 프로세스를 돌아가면서 실행한다.

 

프로세스는 시분할 처리를 위한 5가지 상태를 가지고 있다

 

프로세스의 5가지 상태

  1. 생성 상태
    • PCB를 생성하고 메모리의 프로그램 적재를 요청한 상태
    • 메모리의 프로그램 적재를 승인받으면 준비 상태로 넘어간다.
  2. 준비 상태
    • CPU를 사용하기 위해 기다리고 있는 상태
    • 준비 상태에 있는 프로세스는 이후에 배울 CPU 스케줄러에 의해 CPU가 할당된다.
    • 대부분의 프로세스는 이 준비 상태에 있다.
  3. 실행 상태
    • 실행 상태는 준비 상태에 있는 프로세스가 CPU 스케줄러에 의해 CPU를 할당받아 실행되는 상태이다.
    • 실행 상태에 있는 프로세스의 수는 == CPU의 갯수.
    • 실행 상태에 있는 프로세스도 CPU를 무한정 쓸 수 있는 것이 아니라 부여된 시간만큼만 사용할 수 있다.
    • CPU 스케줄러는 부여된 시간을 초과하면 할당된 CPU를 강제로 빼앗음 ->  프로세스는 다시 준비 상태로 돌아간다.
  4. 대기 상태
    • 대기 상태는 프로세스가 입출력 요청을 하면 입출력이 완료될 때까지 기다리는 상태를 의미한다.
      • 특정 프로세스가 입출력 요청을 하면 입출력이 완료될 때까지 CPU를 기다리게 하는 건 굉장히 비효율적임.
      • 대신 입출력 요청을 한 프로세스를 대기 상태로 두고 다른 프로세스에게 CPU를 할당한다.
        • 그러다가 시간이 지나서 입출력 작업이 완료되면 대기 상태에 있던 프로세스에게 CPU 할당 기회를 준다.
        • 이렇게 하면 CPU 에게는 쉬는 시간을 주지 않고 일을 시킬 수 있다.
  5. 완료 상태
    • 완료 상태는 프로세스가 종료된 상태.
    • 프로세스가 사용했던 데이터를 메모리에서 제거하고 생성된 PCB도 제거한다.

 


 

컨텍스트 스위칭

컨텍스트 스위칭은 프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행 중인 프로세스의 상태를 저장하고 다른 프로세스의 상태 값으로 교체하는 작업을 의미한다.

 

  • 컨텍스트 스위칭이 일어날 때 아래와 같은 PCB의 내용이 변경된다
    • 프로세스 상태
    • 다음 실행할 명령어의 주소를 담고 있는 프로그램 카운터
    • 각종 레지스터 값 

컨텍스트 스위칭은 CPU 점유 시간이 다 되거나 입출력 요청이 있거나 다른 종류의 인터럽트가 있을 때 발생한다.

 


 

프로세스 생성과 종료

 

프로세스 생성과 종료 과정은 운영체제에서 중요한 개념이다. 프로세스는 다음과 같은 방식으로 생성되고 종료된다.

 

  1. 프로세스 생성
  • 사용자가 exe 파일을 실행하면, 운영체제는 해당 프로그램의 코드와 데이터 영역을 메모리에 로드한다.
  • 빈 스택과 힙 영역을 할당하여 프로세스의 실행에 필요한 공간을 확보한다.
  • 이제 운영체제는 프로세스를 관리하기 위한 Process Control Block (PCB)를 생성하고 초기화한다.
    • PCB에는 프로세스의 상태, 메모리 할당 정보, 스케줄링 정보 등이 포함된다.
  • 부팅 시점에서는 0번 프로세스(시스템 초기화를 담당하는 프로세스)가 생성되며, 이 프로세스는 운영체제가 시작될 때 한 번만 실행된다.

   2.  프로세스 복제

  • 새로운 프로세스가 필요할 때, 운영체제는 기존의 0번 프로세스를 복사한다. 이 과정에서 fork() 함수가 사용된다
  • fork() 함수를 호출하면, 부모 프로세스의 PCB와 메모리 영역(CPU의 레지스터 상태 포함)이 자식 프로세스로 복사된다. 이 자식 프로세스는 부모 프로세스의 코드, 데이터, 스택을 모두 그대로 복제하게 된다.

 

    3. 프로세스 실행 변경:

  • 기본적으로 fork()를 통해 생성된 자식 프로세스는 부모 프로세스와 동일한 프로그램 코드를 실행한다.
  • 하지만 자식 프로세스가 독자적인 동작을 수행해야 할 경우, exec() 함수를 호출하여 자신의 메모리 공간에 새로운 프로그램을 덮어쓴다.
  • exec() 함수를 사용하면 자식 프로세스는 부모 프로세스의 코드와 데이터 영역을 새로운 프로그램으로 대체하게 되어, 그 이후부터는 새로운 동작을 수행하게 된다.

   4. 프로세스 종료:

  • 프로세스가 종료되면, 해당 프로세스가 사용하던 자원들은 운영체제에 의해 회수된다.
  • PCB의 정보도 삭제되며, 해당 프로세스는 더 이상 메모리 상에 남지 않는다.

 


 

 

쓰레드

쓰레드는 프로세스 내에서 독립적으로 실행되는 작업 단위이다. 이를 이해하기 위해 프로세스와 쓰레드의 개념과 각각의 장단점을 살펴보겠다.

 

프로세스

  • 프로세스는 운영체제에서 실행 중인 프로그램의 인스턴스이다. 각 프로세스는 독립적인 메모리 공간(코드, 데이터, 스택, 힙)과 PCB(Process Control Block)을 가진다.
  • 프로세스 간 통신을 위해 IPC(Inter-Process Communication) 기법을 사용해야 하며, 이로 인해 오버헤드가 크고 속도가 느릴 수 있다.
  • 각 프로세스는 독립적이기 때문에 안정성이 높고, 하나의 프로세스에 문제가 발생해도 다른 프로세스는 영향을 받지 않는다.

쓰레드

  • 쓰레드는 프로세스 내에서 실행되는 작업 단위이다.
  • 한 프로세스 내에서 코드, 데이터, 힙 영역을 공유하며, 각각의 쓰레드는 독립적인 스택을 가진다.
  • 따라서 쓰레드 간의 통신은 메모리 공간을 공유하므로 비교적 쉽고 빠르게 이루어질 수 있다.
    • 그러나 이로 인해 동시 접근 문제와 같은 문제가 발생할 수 있다.
  • 한 프로세스 내에서 쓰레드 간의 전환은 프로세스 간 전환보다 오버헤드가 작아 성능이 향상될 수 있다.

 

장단점 비교

 

  • 프로세스의 장점: 안정성이 높고, 각각 독립적인 자원을 가지기 때문에 하나의 프로세스에 문제가 생기더라도 다른 프로세스에 영향을 주지 않는다
  • 프로세스의 단점: 프로세스 간 통신에 대한 오버헤드가 크고, 메모리 사용량이 많을 수 있다.
  • 쓰레드의 장점: 프로세스 내에서 자원 공유를 통해 통신이 용이하며, 작업의 생성과 관리에 있어서 프로세스보다 경제적이다.
  • 쓰레드의 단점: 하나의 쓰레드가 문제를 일으키면 전체 프로세스에 영향을 미칠 수 있으며, 동기화와 관련된 복잡성이 증가할 수 있다.
  •  

즉, 쓰레드는 프로세스의 리소스를 효율적으로 활용하면서도 통신의 비용을 줄일 수 있는 중요한 개념이다. 그러나 동시 접근 문제와 같은 부작용을 고려해야 하며, 안정성과 성능 사이의 균형을 잘 유지해야 한다.

 

 

Reference

https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C

 

그림으로 쉽게 배우는 운영체제 | 감자 - 인프런

감자 | 이 강의를 통해 모든 개발자들이 필수로 알아야하는 운영체제의 원리를 알 수 있습니다., 개발자의 필수 지식 운영체제를 배워서뿌리 깊은 나무가 되어 봐요 🌳 강의 주제 📖 [임베딩 영

www.inflearn.com

 

'CS > OS' 카테고리의 다른 글

[webOS] webOS란 무엇인가?  (0) 2024.06.23
시스템 프로그래밍 문자열 배열 new할당 예제  (0) 2023.03.18
시스템프로그래밍 1주차  (0) 2023.03.09
[1week]Linux commands  (0) 2023.02.27
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.