Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

엘라의 개발 스케치 Note

[JSCODE 운영체제 스터디 - 2주차] 프로세스와 쓰레드 본문

CS/운영체제

[JSCODE 운영체제 스터디 - 2주차] 프로세스와 쓰레드

엘라랑이 2023. 11. 15. 21:29

# 프로그램

더보기

? 프로그램

- 컴퓨터에게 특정 작업을 수행하도록 지시하는 일련의 명령어로 이루어진 소프트웨어
  - 이 명령어들은 특정 언어로 작성되며, 컴파일러나 인터프리터를 통해 기계어로 변환되어 실행됨

! 프로그램의 특징

    • 다양한 목적을 가질 수 있으며, 데이터를 처리하거나 특정 작업을 자동화하는 데 사용됨
    • 알고리즘과 데이터 구조로 이루어져 있으며, 컴퓨터가 원하는 작업을 수행하기 위한 명령의 집합으로 해석될 수 있음

# 프로세스

더보기

? 프로세스

- 실행 중인 프로그램으로, 메모리에 적재되어 CPU에 의해 실행되고 있는 작업의 인스턴스를 나타냄
- 각 프로세스는 고유한 상태와 자원을 갖으며, 운영체제에 의해 관리됨
- 코드, 데이터, 레지스터, 스택 등의 요소로 이루어져 있음
- 여러 프로세스가 동시에 실행될 수 있으며, 이는 멀티태스킹이나 병렬처리를 가능하게 함
- 프로세스는 시분할 시스템에서는 짧은 시간 동안 여러 프로세스가 번갈아 가면서 실행되고,
  다중 프로세서 시스템에서는 병렬로 실행될 수 있어 전체 시스템 성능을 향상시킴

! 프로세스의 특징

  • 독립성
    • 각 프로세스는 독립적으로 실행됨
    • 하나의 프로세스의 오류가 다른 프로세스에 영향을 미치지 않음
  • 자원 할당
    • 각 프로세스는 운영체제로부터 필요한 자원(메모리, CPU 시간 등)을 할당받아 독립적으로 실행됨
  • 상태
    • 프로세스는 생성, 준비, 실행, 대기, 종료 등의 상태를 가지며, 운영 체제에 의해 관리됨
  • 컨텍스트 스위칭
    • 다양한 프로세스가 동시에 실행되기 때문에, CPU는 각 프로세스 간에 빠르게 전환하는 컨텍스트 스위칭을 수행

# 프로세스의 메모리 공간

더보기

? 프로세스의 메모리 공간

- 프로세스가 실행 중인 동안 사용되는 메모리 영역
- 아래의 구성으로 각 영역이 서로 다른 목적으로 사용되어 프로그램이 효율적으로 실행될 수 있도록 지원

! 프로세스 메모리 공간의 영역

  • 텍스트(Code) 영역
    • 프로그램의 명령어들이 위치하는 영역
    • 실행 가능한 기계어 코드가 저장됨
    • 읽기 전용
    • 프로그램이 실행 중에 수정되지 않음
  • 데이터(Data) 영역
    • 프로세스의 전역 변수 및 정적 변수가 저장되는 공간
    • 초기화된 데이터와 초기화되지 않은 데이터(바이트 초기화 필요)로 나눠짐
    • 이 영역은 프로그램의 실행과 동시에 할당됨
    • 프로세스의 종료 시에 메모리에서 해제됨
  • 스택(Stack) 영역
    • 함수 호출 및 지역 변수의 관리에 사용되는 영역
    • 함수가 호출될 때마다 스택에 새로운 프레임이 생성됨
    • 함수가 종료되면 해당 프레임이 스택에서 제거됨
    • 이는 후입선출(LIFO) 구조를 가지고 있음
  • 힙(Heap) 영역
    • 동적으로 할당된 메모리가 저장되는 영역
    • 프로그램 실행 중에 동적으로 메모리를 할당하거나 해제할 수 있음
    • 힙 영역은 사용자가 직접 메모리를 관리해야 하는 부분
    • 적절한 할당과 해제가 필요

# 쓰레드

더보기

? 쓰레드

- 프로세스 내에서 실행되는 작업의 단위
- 프로세스의 자원을 공유하면서 독립적으로 실행될 수 있는 경량의 실행 흐름을 나타냄
- 한 프로세스 내에서 여러 개의 스레드가 동시에 실행될 수 있음
- 스레드는 프로세스 내의 코드, 데이터, 그리고 시스템 자원을 공유함
  - 이는, 프로세스에 비해 작업 전환이나 자원 소모 측면에서 효율적
- 멀티 코어 프로세서를 효과적으로 활용하여 병렬성을 높이고, 반응성을 향상시키는 데 사용됨
- 스레드 간의 동기화와 관리는 주의가 필요하며, 안정적인 다중 스레드 프로그래밍을 위해 적절한 설계와 동기화 기법의 사용이 필요

! 쓰레드의 특징

  • 공유 자원
    • 스레드는 부모 프로세스의 자원을 공유하므로, 데이터 및 자원의 공유가 용이
    • 이로 인해 프로세스 간 통신이 필요하지 않고 효율적인 작업이 가능
  • 독립성
    • 각 스레드는 독립적인 실행 흐름을 가짐
    • 다른 스레드에게 영향을 미치지 않고 병렬적으로 수행될 수 있음
  • 경량화
    • 스레드는 프로세스보다 경량이므로 생성, 종료, 전환 등이 빠르게 이루어짐
    • 이는 시스템 자원을 효율적으로 사용할 수 있도록 도와줌
  • 프로그래밍 모델의 복잡성
    • 다중 스레드 프로그래밍은 여러 스레드 간의 동기화 및 데이터 공유에 대한 복잡성을 가지고 있음
    • 이로 인해 적절한 동기화 메커니즘을 사용하여 스레드 간의 상호 작용을 관리해야 함

# 프로세스와 쓰레드의 차이

더보기

? 프로세스와 쓰레드의 차이

- 프로세스와 스레드의 주요 차이는 자원 공유와 독립성에 있음
- 프로세스는 독립적인 실행 환경을 가지며, 각각이 자체 메모리 공간을 갖기 때문에 서로의 데이터에 직접 접근할 수 없음
- 스레드는 같은 프로세스 내에서 실행되므로 프로세스의 자원을 공유할 수 있음
- 프로세스는 독립성이 높아 안정성이 크지만, 자원 소비가 많음
- 스레드는 프로세스의 자원을 공유하므로 경량이며, 자원 효율성이 높지만 동기화와 관리가 필요
- 선택은 프로그램의 목적과 요구에 따라 달라짐

! 프로세스의 쓰레드의 예시

  • 프로세스 예시
    • 웹 브라우저를 열었을 때, 각 탭은 별도의 프로세스로 실행됨
    • 각 탭은 독립된 실행 공간을 갖고 있어 하나의 탭이 문제가 발생해도 다른 탭은 영향을 받지 않음
  • 스레드 예시
    • 워드 프로세서에서 여러 문서를 편집할 때, 각 문서는 동일한 워드 프로세서 프로세스 내에서 별도의 스레도로 실행됨
    • 이렇게 하면 각 문서는 같은 자원을 공유하면서 동시에 작업할 수 있음
  •  

# 쓰레드의 메모리 공간 (스택, 데이터, 코드)

더보기

? 쓰레드의 메모리 공간 (스택, 데이터, 코드)

- 스레드는 프로세스 내에서 실행되며, 프로세스의 메모리 구조를 일부 공유함
- 그러나 각 스레드는 독립적인 실행 흐름을 갖고 있어 스레드 별로 일부 메모리 공간이 구분됨
- 스레드는 코드를 공유하면서도 각각 독립된 스택과 데이터 영역을 가지고 있어, 동시에 여러 작업을 수행하면서도 각 스레드 간의 충돌을 방지할 수 있음

! 쓰레드의 메모리 공간 구분

  • 코드(Code) 영역
    • 스레드는 프로세스의 코드 영역을 공유. 따라서, 스레드가 시작될 때 해당 코드 부분이 메모리에 로드됨
    • 스레드 간에 코드는 공유되기 때문에 여러 스레드가 동일한 프로시저나 함수를 실행할 수 있음
  • 데이터(Data) 영역
    • 데이터 영역은 스레드에 속한 전역 변수 및 정적 변수를 저장. 이 부분도 스레드 간에 공유됨
    • 스레드는 부모 프로세스의 데이터 영역을 공유하므로, 스레드 간에 데이터를 주고받을 수 있음
  • 스택(Stack) 영역
    • 각 스레드는 독립적인 스택 영역을 가지며, 함수 호출 및 지역 변수 등이 저장됨
    • 스택은 각 스레드가 자체적으로 가지고 있어 스레드 간의 독립성을 유지하며, 스레드 함수 호출 및 반환을 지원함
  •  

# 프로세스 제어블록(PCB)

더보기

? 프로세스 제어 블록(Process Control Block, PCB)

- 운영체제가 각 프로세스를 관리하기 위해 유지하는 중요한 자료 구조
- 각 프로세스마다 하나의 PCB가 할당됨
- 이 PCB에는 해당 프로세스의 상태와 제어 정보가 저장됨
- PCB는 프로세스가 생성될 때 생성되고, 프로세스가 종료되면 해당 PCB도 해제됨
- PCB는 프로세스 간의 전환 및 관리, 다양한 운영체제 기능 수행에 중요한 역할을 함
- 각각의 프로세스는 고유한 PCB를 가지며, 운영체제는 이를 통해 프로세스의 상태를 추적하고 관리함

! PCB에 담긴 정보

  • 프로세스 상태 (Process State)
    • 프로세스가 현재 어떤 상태인지를 나타냄
    • Ex. 실행 중, 준비 중, 대기 중 등
  • 프로그램 카운터 (Program Counter)
    • 현재 실행 중인 명령어의 주소를 저장
  • 레지스터 상태 (Register State)
    • 프로세스의 레지스터 값들을 저장
    • 이는 프로세스를 다시 실행할 때 현재 상태를 복원하는 데 사용됨
  • 스케줄링 정보 (Scheduling Information)
    • 운영체제의 스케줄러가 프로세스를 스케줄링하는 데 필요한 정보가 포함됨
  • 프로세스 식별자 (Process ID)
    • 각 프로세스를 구별하는 고유한 식별자
  • 메모리 관리 정보 (Memory Management Information)
    • 프로세스의 메모리 할당과 사용에 관한 정보가 포함됨
  • 입출력 상태 (I/O Status)
    • 프로세스가 입출력 작업을 수행 중인 경우, 해당 상태 정보를 저장함

# 쓰레드 제어블록(TCB)

더보기

? 쓰레드 제어 블록(Thread Control Block, TCB)

- 각 쓰레드를 관리하기 위한 운영체제의 자료 구조
- 프로세스 제어 블록(PCB)과 유사한 역할을 함
- 각 쓰레드는 해당 쓰레드 제어 블록을 가지며, 쓰레드의 상태와 제어 정보를 저장함
- TCB는 쓰레드의 동작과 상태를 추적하고 관리하는 데 필수적
- 멀티쓰레딩 환경에서 효과적인 쓰레드 스케줄링 및 자원 할당을 지원

! TCB에 담긴 정보

  • 쓰레드 식별자 (Thread ID)
    • 각 쓰레드를 고유하게 식별하는 식별자
  • 쓰레드 상태 (Thread State)
    • 쓰레드가 현재 어떤 상태에 있는지를 나타냄
    • 실행 중, 대기 중, 준비 중 등
  • 프로그램 카운터 (Program Counter)
    • 현재 쓰레드가 실행 중인 명령어의 주소를 저장
  • 레지스터 상태 (Register State)
    • 쓰레드의 레지스터 값들을 저장하며, 쓰레드 간 전환 시 현재 상태를 복원하는 데 사용됨
  • 스케줄링 정보 (Scheduling Information)
    • 스케줄링 알고리즘이 쓰레드를 관리하는 데 필요한 정보를 포함
  • 쓰레드 우선순위 (Thread Priority)
    • 쓰레드가 얼마나 우선적으로 실행되어야 하는지를 결정하는 우선순위 값
  • 쓰레드의 스택 정보 (Thread Stack Information)
    • 쓰레드가 사용하는 스택의 범위와 크기를 관리함

# 멀티 프로세스

더보기

? 멀티 프로세스

- 여러 개의 독립적인 프로세스가 동시에 실행되는 컴퓨터 환경
- 각 프로세스는 운영체제로부터 독립적인 메모리 공간을 할당받아 실행되며, 각각이 독립된 프로그램을 수행함
- 이러한 프로세스 간에는 데이터를 공유하기 위해 명시적인 통신이 필요
- 프로세스 간의 독립성은 안정성과 안전성을 제공
- 멀티 프로세스 시스템은 병렬 처리를 통해 성능을 향상시킬 수 있지만, 프로세스 간 통신 비용이 발생하고 복잡성이 증가하는 단점이 있음

! 멀티 프로세스의 특징

  • 독립성
    • 각 프로세스는 독립된 메모리 공간을 가지고 실행되기 때문에 하나의 프로세스의 오류가 다른 프로세스에 영향을 미치지 않음
  • 안전성
    • 하나의 프로세스가 다른 프로세스의 영향을 미치지 않으므로 안전성이 향상됨
    • 하나의 프로세스가 비정상적으로 종료되더라도 시스템 전체에 영향을 미치지 않음
  • 통신이 필요한 경우
    • 프로세스 간에 데이터를 주고받기 위해 명시적인 통신 메커니즘이 필요
    • 이로써 프로세스 간의 상호작용이 가능해짐
  • 메모리 사용 효율
    • 각 프로세스가 독립적인 메모리 공간을 가지기 때문에 메모리를 효율적으로 사용할 수 있음
  • 안정성 향상
    • 독립된 메모리 공간과 프로세스 간의 간접 통신으로 인해 안정성이 향상됨
    • 하나의 프로세스가 비정상적으로 종료되더라도 다른 프로세스는 계속 실행됨

# 멀티 쓰레딩

더보기

? 멀티 쓰레딩

- 하나의 프로세스 내에서 여러 개의 쓰레드가 동시에 실행되는 컴퓨터 환경
- 쓰레드는 프로세스 내의 각 실행 흐름으로, 같은 프로세스 메모리를 공유하면서 독립적으로 실행됨
- 멀티 쓰레딩은 프로세스 간 통신의 복잡성을 감소시키고 자원을 효율적으로 활용하여 성능을 향상시킴
- 멀티 쓰레딩은 병렬 처리를 통해 성능 향상을 제공하면서도 프로세스 간 통신의 복잡성을 줄이고 효율적인 자원 활용을 가능하게 함

! 멀티 쓰레딩의 특징

  • 공유 메모리
    • 쓰레드는 같은 프로세스 내에서 실행되므로 메모리를 공유함
    • 이를 통해 효율적인 데이터 교환과 상호작용이 가능함
  • 작업 분할
    • 여러 쓰레드가 동시에 작업을 수행하면서 병렬성을 활용해 성능을 향상시킬 수 있음
  • 자원 효율성
    • 멀티 쓰레딩은 프로세스 간 전환 비용이 적고, 메모리를 효율적으로 활용하여 빠른 응답 시간을 제공함
  • 컨텍스트 스위칭 감소
    • 프로세스 간 전환이 아닌 쓰레드 간 전환이 발생하므로 컨텍스트 스위칭 비용이 감소함
  • 프로그래밍 편의성
    • 멀티 쓰레딩은 병렬성을 간편하게 구현할 수 있어 복잡한 작업을 분할하고 조율하는 데 용이함

# 프로세스 수행 상태 변화 과정

더보기

? 프로세스 수행 상태 변화

- 아래의 단계 들은 프로세스의 수행 상태를 효과적으로 관리하며, 운영체제는 스케줄링 알고리즘을 사용하여 프로세스를 적절한 상태로 전환시킴
- 이렇게 함으로써 CPU를 효율적으로 활용하고 다양한 프로세스들이 조화롭게 실행될 수 있도록 함

! 프로세스 수행 상태 변화 과정

  • 생성 (Creation)
    • 프로세스가 생성되는 단계
    • 운영체제가 프로세스를 초기화하고 필요한 자원을 할당함
    • 프로세스 생성은 요청에 의해 이루어질 수도 있고, 다른 프로세스의 실행으로부터 파생될 수도 있음
  • 준비 (Ready)
    • 프로세스가 CPU를 할당받을 준비가 된 상태
    • 이 단계에서는 CPU를 기다리며 다른 프로세스들과 함께 대기
  • 실행 (Running)
    • CPU를 할당받아 프로세스가 실제로 실행되는 단계
    • 이 단계에서 프로세스는 명령어를 수행하고, 작업을 진행
  •  대기 (Waiting)
    • 프로세스가 어떤 이벤트가 발생하거나 어떤 조건이 충족되기를 기다리는 단계
    • 이 단계에서는 CPU를 양보하고, 입출력이나 외부 이벤트 발생을 기다림
  • 종료 (Termination)
    • 프로세스의 실행이 완료되거나 종료되는 단계
    • 프로세스가 필요로 하는 자원을 반환하고 운영체제에게 종료를 알리게 됨

# 문맥교환

더보기

? 문맥교환(Context Switch)

- 문맥교환(Context Switch)은 현재 실행 중인 프로세스나 쓰레드의 상태를 저장하고, 다음으로 실행할 프로세스나 쓰레드의 상태를 복원하는 과정
- 이는 CPU에서 여러 프로세스나 쓰레드를 번갈아가며 실행하기 위한 필수적인 작업
- 문맥교환은 성능 손실을 동반하지만, 다양한 프로세스나 쓰레드 간에 공정하게 CPU를 분배하고 병렬성을 활용할 수 있게 함
- 특히 멀티태스킹 환경에서는 문맥교환은 중요한 개념으로, 효율적으로 수행되어야 함
- 문맥 교환은 자원을 효율적으로 활용하기 위해 필요한 작업이지만, 빈번하게 발생하면 오버헤드를 초래할 수 있어 효율적인 스케줄링 알고리즘이 필요함

! 문맥교환 발생 상황

  • 타이머 인터럽트
    • 정해진 시간이 지나면 타이머 인터럽트가 발생
    • 이 때, 현재 실행 중인 프로세스의 상태를 저장하고 스케줄러에 의해 선택된 다음 프로세스의 상태로 전환됨
  • I/O 요청
    • 프로세스가 어떤 입출력 작업을 요청하면 해당 작업이 완료될 때까지 프로세스는 대기 상태로 들어감
    • 이 때 문맥교환이 발생하여 다음 프로세스가 실행됨
  • 다른 프로세스에 의한 강제 문맥교환
    • 스케줄러가 다른 프로세스를 실행시키기로 결정할 때 강제로 문맥교환이 발생함
  • 멀티태스킹 환경에서 다른 프로세스의 우선순위 변경
    • 높은 우선순위의 프로세스가 실행되어야 하는 경우
    • 현재 실행 중인 프로세스의 문맥이 저장되고 높은 우선순위의 프로세스가 실행됨

! 문맥교환 발생 상황

  • 현재 프로세스의 상태 저장
    • 현재 실행중인 프로세스의 레지스터 상태, 프로그램 카운터, 스택 포인터 등의 중요한 정보를 해당 프로세스의 PCB나 TCB와 같은 자료 구조에 저장함
    • 현재 프로세스의 상태를 메모리에 보존함으로써 이전 상태를 나중에 복원할 수 있음
  • 다음 프로세스의 상태 복원
    • 스케줄러에 의해 선택된 다음 프로세스의 PCB나 TCB에서 저장된 이전 상태를 읽어와 CPU 레지스터에 복원함
    • 해당 프로세스의 코드 실행이 진행될 위치, 레지스터 값, 스택 상태 등이 이전에 저장된 값으로 설정됨
  • 프로세스 간 제어권 이전
    • CPU의 제어권이 이전에 저장된 다음 프로세스로 전환됨
    • 다음 프로세스는 실행 상태로 전환되어 명령어를 실행하게 됨

# fork() 명령어

더보기

? 'fork()'

- Unix 및 Unix 계열 운영 체제에서 사용되는 시스템 호출 중 하나
- 현재 실행 중인 프로세스를 복제하여 새로운 프로세스를 생성함
- 이 호출은 부모 프로세스와 자식 프로세스를 생성하는 데 사용됨
- 부모와 자식 프로세스는 동일한 코드를 공유하지만 각자 별도의 데이터 및 실행 상태를 유지함
- 이를 통해 부모 프로세스와 자식 프로세스가 동시에 실행되는 멀티프로세스 환경을 구성할 수 있음

! 'fork()' 관련 프로세스 및 특징

  • 부모 프로세스 (Parent Process)
    • 호출 이전의 프로세스를 말함
  • 자식 프로세스 (Child Process)
    • 호출 이후에 생성된 새로운 프로세스를 말함
  • 새로운 자식 프로세스는 부모 프로세스의 모든 코드, 데이터, 스택, 힙 등을 복사받게 됨
  • 그러나 부모와 자식은 각각의 프로세스로 독립적으로 실행되며, 서로의 메모리에 영향을 주지 않음
  • 일반적으로 'fork()'의 반환 값은 호출 후에 두 번 반환됨
    • 부모 프로세스에는 자식 프로세스의 ID(PID)가, 자식 프로세스에는 0이 반환됨
    • 부모 프로세스는 양수의 PID를 받게 되어 자식 프로세스를 식별할 수 있음

! 'fork()' C언어 예제 코드

#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork(); // fork 호출

    if (pid == 0) {
        // 자식 프로세스에서 실행할 코드
        printf("자식 프로세스\n");
    } else if (pid > 0) {
        // 부모 프로세스에서 실행할 코드
        printf("부모 프로세스\n");
    } else {
        // fork 실패 시 실행할 코드
        fprintf(stderr, "fork 실패\n");
        return 1;
    }

    // 부모와 자식 프로세스가 공통으로 실행하는 코드
    printf("공통 코드\n");

    return 0;
}
  • 위의 예제에서 'fork()' 호출 이후에 부모 프로세스와 자식 프로세스는 각자 다른 메시지를 출력하고, 그 후에는 공통으로 코드를 실행함
  • 이러한 구조는 프로세스 간 통신 및 병렬 처리 등에 활용됨

# 프로세스 간 협력 방법

더보기

? 프로세스 간 협력

- 프로세스 간 협력은 다양한 메커니즘을 활용하여 이루어질 수 있음
- 프로세스 간 협력 방법들은 각각의 장단점이 있으며, 상황에 따라 적절한 방법을 선택해야 함
- 특히 동기화와 데이터 무결성에 대한 고려가 필요하며, 선택한 방법이 애플리케이션의 요구 사항과 성능 목표에 부합하는지 확인해야 함

! 프로세스 간 협력 방법

  • 파일 공유
    • 파일을 통한 데이터 교환은 가장 기본적이면서도 효과적인 방법 중 하나
    • 여러 프로세스가 동일한 파일을 읽고 쓰면서 데이터를 공유할 수 있음
    • 간단하고 일반적인 방법이지만, 동시성과 데이터 무결성 문제에 유의해야 함
  • 파이프 (Pipe)
    • 파이프는 두 프로세스 간의 양방향 통신을 제공하는 IPC(Inter-Process Communication) 메커니즘 중 하나
    • 부모 프로세스와 자식 프로세스 사이에서 데이터를 전송할 때 유용하게 사용됨
  • 메시지 큐 (Message Queue)
    • 메시지 큐는 프로세스 간에 데이터를 비동기적으로 교환하는 데 사용됨
    • 메시지 큐를 통해 하나의 프로세스가 다른 프로세스에게 메시지를 보내고, 받은 프로세스가 해당 메시지를 읽을 수 있음
  • 공유 메모리 (Shared Memory)
    • 여러 프로세스가 동일한 물리적인 메모리 영역을 공유하여 데이터를 교환하는 방법
    • 공유 메모리는 높은 성능을 제공하지만, 동기화와 데이터 무결성에 주의해야 함
  • 소켓 (Socket)
    • 소켓은 네트워크 통신에 사용되는 것뿐만 아니라 로컬에서도 프로세스 간 통신에 활용됨
    • TCP/IP나 UDP 프로토콜을 이용하여 데이터를 주고받을 수 있음
Comments