프로세스의 개요
프로세스의 개념
- 현재 실행중인 프로그램
- 프로세스를 실행하면 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램이 프로세스가 됨
프로세스 제어 블록
- 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() 시스템 호출의 장점
- 프로세스의 생성 속도가 빠르다
- 추가 작업 없이 자원을 상속할 수 있다
- 시스템 관리를 효율적으로 할 수 있다
프로세스의 전환
- exec() 시스템 호출은 기존 프로세스를 새로운 프로세스로 전환하는 함수임
정리해보면
- fork(): 새로운 프로세스를 복사하는 시스템 호출
- exec(): 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출,
시스템 호출을 하면 현재의 프로세스가 완전히 다른 프로세스로 전환됨
사용목적
- 프로세스의 구조를 재활용하기 위함
- 새로운 프로세스를 만들려면 프로세스 제어 블록을 만들고 메모리의 자리를 확보하는 과정이 필요함
- 또한 프로세스 종료한 후 사용한 메모리를 청소하기 위해 상위 프로세스와 부모-자식 관계를 만들어야함
- 그러나 exec() 시스템 호출을 사용하면 이미 만들어진 프로세스 제어 블록,메모리 영역, 부모-자식 관계를 그대로 사용할수있어 효율적임
exec() 시스템 호출의 동작 과정

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

정의
- 프로세스를 구성하는 실행의 흐름 단위
- 스레드는 프로세스 내에서 각기 다른 스레드ID, 프로그램카운터
값을 비홋한 레스터스 값, 스택으로 구성
- 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램카운터, 레지스터,스택)만을 유지한 책 프로세스 자원을 고유하며 실행됨
멀티프로세스와 멀티스레드
멀티프로세스
정의
- 여러 프로세스를 동시에 실행하는 것
- 각 프로세스는 독립된 메모리 영역(코드, 데이터, 힙, 스택)을 가집니다.
- 프로세스들은 서로의 메모리에 접근할 수 없으며, IPC(Inter-Process Communication, 프로세스 간 통신) 메커니즘을 사용하여 통신
왜쓰는지:
- 안정성이 중요한 경우 사용합니다.
- 하나의 프로세스에 문제가 생겨도 다른 프로세스에 영향을 미치지 않습니다.
- 독립된 메모리 공간 때문에 서로 다른 작업을 분리하여 운용할 때 사용합니다.
언제쓰는지:
- 다중 처리기 시스템에서 병렬 처리가 필요할 때 주로 사용합니다.
- 각각의 작업이 서로 다른 자원을 사용하거나, 영향을 주지 않아야 할 때 유용합니다.
어떻게쓰는지:
- 운영 체제에서 프로세스 생성 API를 사용하여 여러 프로세스를 생성하고 관리합니다.
- IPC 기술을 활용하여 프로세스 간의 데이터 교환 및 동기화를 합니다.
사용예시:
- 웹 서버에서 각 클라이언트의 요청을 별도의 프로세스로 처리하는 경우
- 데이터베이스 관리 시스템(DBMS)에서 여러 사용자의 쿼리를 동시에 처리하는 경우
멀티스레드
정의와 특징
- 멀티스레드는 하나의 프로세스 내에 여러 스레드가 동시에 작동하는 것을 의미합니다.
- 각 스레드는 프로세스 내의 자원(데이터 세그먼트, 코드 세그먼트, 힙)을 공유하며, 개별적인 스택 영역을 가지고 실행됩니다.
- 스레드 간의 자원 공유로 인해 통신과 데이터 교환 비용이 낮지만, 동기화 문제가 발생할 수 있습니다.
왜쓰는지:
- 자원의 효율적인 사용과 빠른 응답 시간이 필요할 때 사용합니다.
- 프로세스 내의 작업들이 많은 공통 데이터를 접근할 필요가 있을 때 유리합니다.
언제쓰는지:
- 사용자 인터페이스가 반응성을 유지해야 하면서 백그라운드 작업을 동시에 처리해야 할 때.
- 입출력(IO), 대규모 연산 등의 작업을 병렬로 처리해야 할 때 사용합니다.
어떻게쓰는지:
- 프로그래밍 언어나 라이브러리가 제공하는 스레드 생성 API를 통해 사용합니다.
- 스레드 간의 동기화(예: mutex, semaphore)를 고려하여 설계해야 합니다.
사용예시:
- 웹 브라우저에서 한 스레드가 사용자 인터페이스를 처리하고, 다른 스레드가 동시에 데이터를 로딩하는 경우
- 문서 편집기에서 실시간으로 문서 저장 및 철자 검사를 하는 경우
참고
스레드