엘라의 개발 스케치 Note
[JSCODE 운영체제 스터디 - 2주차] 프로세스와 쓰레드 본문
# 프로그램
더보기
? 프로그램
- 컴퓨터에게 특정 작업을 수행하도록 지시하는 일련의 명령어로 이루어진 소프트웨어
- 이 명령어들은 특정 언어로 작성되며, 컴파일러나 인터프리터를 통해 기계어로 변환되어 실행됨
! 프로그램의 특징
-
- 다양한 목적을 가질 수 있으며, 데이터를 처리하거나 특정 작업을 자동화하는 데 사용됨
- 알고리즘과 데이터 구조로 이루어져 있으며, 컴퓨터가 원하는 작업을 수행하기 위한 명령의 집합으로 해석될 수 있음
# 프로세스
더보기
? 프로세스
- 실행 중인 프로그램으로, 메모리에 적재되어 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 프로토콜을 이용하여 데이터를 주고받을 수 있음
'CS > 운영체제' 카테고리의 다른 글
[JSCODE 운영체제 스터디 - 1주차] 운영체제 개요 & 컴퓨터 시스템 동작원리 (1) | 2023.11.08 |
---|