[운영체제] 2강 - 프로세스와 쓰레드

2026. 2. 19. 12:18·방송통신대학교/⚙️운영체제

✅ 1. 프로세스

(1) 프로세스의 개요

  • 프로세스란, 실행 중인 프로그램을 의미한다.
  • 자세히는 보조기억장치에 저장되어 있는 프로그램이 CPU에 의해서 메모리에 올라와서 실행이 되고 있는 상태를 의미한다.
  • ** 이 과정에서 운영체제의 내부적인 프로세스 관리자 기능이 CPU나 메모리와 같은 하드웨어를 제어 또는 관리하며 프로세스의 명령을 실행 시켜준다. 또한, 프로세스 생성 및 종료, 상태 관리, 스케줄링 작업을 해줌.**

(2) 프로세스의 구성 - 메모리 구조

  • 메모리 구조는, 프로그램 실행에 직접적으로 필요한 코드와 데이터를 의미함.
  • 코드 영역: 프로그램 자체를 나타내는 코드 영역이며, 메모리상에 위치해야 CPU가 실행을 할 수 있음.
  • 데이터 영역: 프로그램이 동작할 때 필요한 데이터들의 영역이며, 정적 데이터, 힙, 스택 영역 등으로 나눠서 관리함.
  • 스택 영역: 프로세스에게 할당된 메모리 안에서만 동작을하며, 함수 A()가 함수 B() 를 호출하면, 현재 A의 상태(돌아갈 주소, 지역 변수 등)를 스택에 Push 해서 저장을 해두고 B가 끝나면 스택에서 정보를 Pop 하여 다시 A로 돌아가 수행하는 원리이며, 이러한 영역을 스택 영역이라함. 여기서 의미하는 서브프로그램은 함수나 메서드를 의미한다고 보면됨.
  • 핵심: 운영체제가 메모리를 이러한 구조로 논리적으로 나눠서 메모리상에서 프로세스들의 공간을 할당을 해주며 관리함.

(3) 프로세스의 구성 - 프로세스 제어 블록(PCB)

  • PCB는 메모리에 존재하지만, 그 중 커널 모드에서 접근이 가능한 커널 영역 내의 프로세스 테이블 또는 커널 스택에 저장됨.
  • 이러한 PCB 는 프로세스를 관리하기 위해 프로세스의 여러 정보를 가지고 있으며, 정보를 통해 관리가 가능해짐.
  • 핵심: PCB 에는 하나의 프로세스가 동작하기 위한 여러 정보들을 저장하고 있는데, A 프로세스 실행 중간에 B 프로세스가 실행이 되게 되면 A 프로세스가 수행중이던 상태값들이 저장이 되어있어야 하며, B 프로세스가 끝나는 시점에 다시 A 프로세스를 실행 할 때 이러한 상태값들을 복원해서 수행이 되어야 한다. 이때 필요한 것이 상태값 또는 여러 정보를 저장하고 있는 PCB 가 될 수 있음. ( 이 과정은 결국 특정 커널 스택 영역에 저장함으로써 복원하는 개념임 )

(4) 프로세스 상태 관리 - 프로세스 상태

  • 프로세스 상태: 이러한 PCB의 프로세스 상태값들은 CPU 자원을 여러 프로세스에게 효율적으로 나눠주기 위한 기준이 될 수 있음. 즉, 어떤 프로세스를 실행시키고, 어떤 프로세스를 쉬게 할지 결정하는 근거가 바로 PCB의 상태값이 될 수 있음.
  • 생성: 프로세스 생성 과정에서 PCB 를 만들며, 기본적인 PID 등 다양한 프로세스 정보를 만들어서 저장해둔 상태
  • 준비: 실행 준비가 되어 CPU 할당을 기다리는 상태
  • 실행: 프로세스가 실제로 처리가 되는 상태이며, 이 과정은 간단하게 명령어를 처리하는 상태
  • 대기: 프로세스 실행중에 오랜 시간이 걸리는 I/O 작업이 발생해 CPU를 자원을 잠깐 보류한 상태
  • 종료: 프로세스가 종료되어 더 이상 실행되지 않도록 끝난 상태

(5) 프로세스 상태 관리 - 프로세스 상태 변화

  • 1. 프로세스 상태는 생성 상태에선 준비 상태로만 갈 수 있음. 
  • 2. 디스패치: 준비 큐에서 특정 프로세스의 순서가 된다면 실행 상태로 이동을 하게 되는데 이때 CPU를 할당 받는 상태가 된다. 이 과정을 디스패치라고 한다.
  • 3. 할당시간 만료: 실행중이던 프로세스가 끝나지 않았지만, 할당 받은 시간이 끝나게 되면 다시 준비 큐로 돌아가 준비 상태가 된다. 또한, 할당 시간이 끝나지 않았지만, 우선순위가 높은 프로세스가 CPU를 뺏어가는 경우에도 준비 상태가 된다.
  • - 즉, 실행에서 준비로 넘어가는 경우는 타의에 의해서 넘어가는 경우임.
  • 4. 이벤트 대기: 오랜 시간이 걸리는 I/O 등의 작업이 발생할 때에는 이벤트 대기가 되어 대기 상태가 된다.
  • - 이 경우에는 프로세스 자체가 자의에 의해서 CPU를 반납하고 대기하는 경우임.
  • 5. 재개 조건 만족: I/O 작업이 끝나 인터럽트를 받으면 해당 프로세스는 준비 큐로 돌아가 준비 상태가 된다.
  • 6. 이후 프로세스의 명령이 다 끝나게 되면 종료 상태가 되어 종료가 된다.

(6) 부모 프로세스와 자식 프로세스

  • 특정 프로세스 내부에서 시스템 호출을 통해 또 다른 프로세스를 만드는 경우 부모와 자식 관계가 됨.
  • 쉽게말해, 부모 프로세스 내부에서 시스템 호출을 해서 만들어지는 프로세스는 자식 프로세스가 될 수 있음.
  • 이런 부모, 자식 프로세스 관계는 운영체제가 부팅된 직후부터 컴퓨터를 끄는 순간까지 모든 프로세스는 상속의 사슬로 연결되어있음.
  • 즉, 태초의 프로세스인 PID 0번에서 다른 프로세스가 실행이 된다.
  • PID 0번을 통해서 백그라운드에서 돌아가는 각종 서비스(백신, 네트워크 업데이트 등) 관리하는 프로그램, 로그인 비밀번호 등 보안 담당하는 프로그램 등 다양한 프로세스가 실행이 되게 됨.
  • ** 결국 사용자가 프로그램을 실행시키게 되면, 바탕화면을 담당하는 바탕화면 프로세스가 응용 프로그램을 실행시켜서 부모 자식 관계가 되는 원리임. **

(7) 프로세스 생성 - 시스템 호출

  • UNIX, Linux 의 경우는 fork() 함수를 통해서 프로세스 생성 시스템 호출을 할 수 있다.
  • 특정 프로세스 내부에서 fork() 시스템 호출을 하게 되면, 해당 프로세스와 PID만 다른 동일한 프로세스가 복제가 되어서 만들어지게 되는데, 이때 부모 프로세스는 함수의 호출 결과로 자식 프로세스의 PID 번호를 받을 수 있음.
  • 즉, PID 정보를 가지고 있기 때문에 부모 자식 관계가 성립이 되어 부모는 자식 PID 를 통해서 자식 프로세스를 종료를 시킬 수 있음.
  • 반면, 자식 프로세스의 fork() 의 반환 값으로는 0번 PID 를 가지고 되어, 본인이 자식임을 알 수 있음.

  • exec(): 자식 프로세스는 부모 프로세스와는 다른 프로그램을 실행시키는 경우 호출하는 시스템 콜 함수다.
  • fork() 를 호출했을 때, 자식 프로세스의 경우 0을 받기 때문에 pid 가 0인 경우 exec(prg2); 를 수행하게 되면, exec() 함수 매개로 넘긴 prg2 라는 프로그램을 실행시키게 된다. 이렇게 되면, prg2 에 해당하는 프로그램 코드로 바뀌며, 데이터 영역도 바뀌게 된다. 즉, 부모 프로세스와 다른 자식 프로세스를 실행하게 됨.

  • Windows의 경우 CreateProcess() 명령어를 통해서 프로세스를 만들 수 있음.
  • CreateProcess(prg2, ..., &pid); 함수에서 prg2 는 특정 프로그램을 실행시키겠다는 의미이고, pid 는 만들어지는 자식 프로세스의 PID 를 받겠다는 의미이다.
  • ** 리눅스와 다르게 한 번에 복제가 아닌 특정 프로그램을 수행시키며, pid 를 리턴하게 됨. **

(8) 프로세스 종료

  • 1. 부모 자식 관계를 떠나 단순히 프로세스가 모든 처리를 완료하면 정상적으로 종료가 되게 됨.
  • 2. 부모 프로세스에 의해서 자식 프로세스가 강제로 종료가 될 수 있음.
  • 이 과정에선 프로세스 종료 시스템 호출을 할 수 있는데, 이게 가능한 이유는 자식 프로세스를 만들 때 PID를 얻었기 때문임.
  • 3. 부모 프로세스가 종료되는 경우에 부모 프로세스가 자식 프로세스를 종료 시킬 수 없기 때문에 운영체제가 자식 프로세스를 대신 종료 시키게 됨.

✅ 2. 쓰레드

(1) 전통적인 프로세스

  • 앞서 배운 내용은 전통적인 프로세스 방식이며, 하나의 프로그램을 실행시키기 위한 전통적인 방식의 기본 단위로 배움.
  • 즉, 전통적인 프로세스는 하나의 메모리 구조만 가지고 있으며, 하나의 제어흐름으로만 흐르게 됨. 즉, 다중 처리 불가능

(2) 쓰레드(thread)

  • 하나의 프로세스 내에서의 다중처리를 위해서 만들어진 개념임.
  • 전통적인 프로세스에서 실행은 프로세스 하나만을 의미했지만, 쓰레드 개념의 등장으로 실행 단위는 쓰레드로 변경이 됨.
  • 또한, 프로세스가 디스패칭의 단위였지만, 쓰레드 개념의 등장으로 쓰레드가 디스패칭의 단위로 변경이 됨.
  • 대신 자원 소유의 단위 자체는 프로세스가 됨. 즉, 하나의 프로세스 내에 메모리 구조는 하나로 통합이 되어있는 상태임.
  • 프로세스 내에서 메모리 구조와 PCB 는 동일하지만, 스택 영역이 프로세스 직접 관리에서 사라짐.
  • 여러 제어를 위해서 PC 레지스터가 쓰레드당 하나씩 가지게 됨.
  • ** 이러한 구조가 가능한 이유는 하드웨어적으로 CPU 설계 때 코어 당 스레드 수에 영향을 받으며, 스레드수에 맞게 레지스터 세트를 하나씩 가지게 됨. **

(3) 쓰레드와 프로세스

  • 쓰레드 단위가 스택을 하나씩 가지고 있는 구조가 되었음.
  • 즉, 쓰레드 내부에 레지스터, 상태 레지스터, 스택 레지스터.. 등이 여러 세트로 존재하게 됨.
  • 스택에는 서브프로그램들의 호출되는 관계들이 저장이 되어있음. 즉, 쓰레드의 호출전 코드 라인 정보를 가지고 있음.

(4) 다중 쓰레드로 구성된 프로세스

  • 하드웨어적으로 코어수와 쓰레드 수가 다중으로 되어있는 경우 여러 쓰레드가 효율적으로 병렬로 처리가 가능함.
  • 역할을 나눠서 처리속도를 높일 수도 있음.

'방송통신대학교 > ⚙️운영체제' 카테고리의 다른 글

[운영체제] 6강 - 교착상태(1)  (0) 2026.03.20
[운영체제] 5강 - 병행 프로세스(2)  (0) 2026.03.18
[운영체제] 4강 - 병행 프로세스(1)  (0) 2026.03.06
[운영체제] 3강 - 프로세스 스케줄링  (0) 2026.02.27
[운영체제] 1강 - 운영체제 소개  (0) 2026.02.18
'방송통신대학교/⚙️운영체제' 카테고리의 다른 글
  • [운영체제] 5강 - 병행 프로세스(2)
  • [운영체제] 4강 - 병행 프로세스(1)
  • [운영체제] 3강 - 프로세스 스케줄링
  • [운영체제] 1강 - 운영체제 소개
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    오늘
    어제
    • 전체보기 (233)
      • 방송통신대학교 (87)
        • ⚙️컴퓨터의 이해 (11)
        • 💻컴퓨터과학 개론 (15)
        • 🔢자료구조 (14)
        • 🧬알고리즘 (10)
        • ⚙️운영체제 (14)
        • 🕸️이산수학 (11)
        • 🌍유비쿼터스 컴퓨팅 (11)
        • 🖥️컴퓨터과학과 (1)
      • 공부 (72)
        • 📚백엔드 공부 (6)
        • ☕Java (23)
        • 🌳Spring (13)
        • ⚙️C (12)
        • ⚡Python (15)
        • JavaScript (1)
        • 🛢️Database (0)
        • Algorithm Problem Solving (2)
      • 네트워크 (7)
        • 📜HTTP (7)
      • 스파르타코딩클럽 (64)
      • 정보 (2)
      • 정리가 필요한 글 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    컴퓨터과학 개론
    배열
    C언어
    방송대
    자바
    파이썬
    Python
    알고리즘
    방송통신대학교
    Java
    유비쿼터스
    함수
    자료구조
    방통대
    컴퓨터의 이해
    운영체제
    그래프
    spring
    컴퓨터과학과
    이산수학
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
junbin2
[운영체제] 2강 - 프로세스와 쓰레드
상단으로

티스토리툴바