안녕하세요! 제이덥입니다~ 저는 학부 때 공부했던 CS 기초 내용을 Wrap-Up 하기 위해 혼공학습단 11기 활동을 진행하고 있는데요. 이번주부터 운영체제에 들어갔네요. 벌써 2주밖에 안남았다니 시간이 짧다는 걸 느끼게 됩니다.
이번 포스팅에서는 Chapter 10으로 프로세스와 스레드가 무엇인가에 대해 다룹니다. 학부 때 매우 열심히 공부했던 기억이 있고, CS 면접에서 자주 출제되는 부분이기도 합니다. 프로세스와 스레드가 무엇인지 그 둘은 어떤 차이가 있는 아래 글을 보며 체크해보면 좋을 것 같아요
해당 도서는 제가 직접 구매하여 글을 작성한 것이며, 혼공단 11기 활동의 일환으로 학습 내용에 대한 공유 글을 작성하게되었음을 알려드립니다. 도서에 대한 자세한 내용과 활동에 대한 내용을 알고 싶은 분들은 아래 Reference에서 확인해주세요~
Chapter 10. 프로세스와 스레드
1️⃣ 프로세스의 게요
프로세스(Process)
- 프로세스의 정의 : '실행중인 프로그램'을 말함. 프로그램이 실행되기 전까지는 데이터 덩어리에 불과하지만, 메모리에 적재되는 순간 해당 프로그램은 프로세스가 됨.
- 프로세스의 종류 :
- 포그라운드 프로세스(foreground process) : 사용자가 보이는 곳에서 실행되는 프로세스
- 백그라운드 프로세스(background process) : 사용자가 보이지 않는 곳에서 실행되는 프로세스
- 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스가 있음
- ⇒ 윈도우 : 서비스라고 부름 / 유닉스 : 데몬 이라고 부름
Process (출처 : https://juveloper.tistory.com/91)
프로세스 직접 확인하기?
- 윈도우에서는 작업관리자, 리눅스에서는 ps로 확인 가능
프로세스 제어블록
- 모든 프로세스가 실행을 위해 CPU를 필요로함, But 자원은 한정적, 여러 프로세스가 동시에 CPU를 사용하는 것은 불가능함 ⇒ 프로세스 제어 블록(PCB: Process Control Block)이라는 자료구조를 이용하여 프로세스의 순서를 관리함
- 프로세스 제어 블록(PCB: Process Control Block) : 프로세스와 관련된 정보를 저장하는 자료구조. 프로세스를 식별하는 정보를 저장
- PCB는 프로세스 생성시 만들어져 끝나면 폐기됨
- PCB 저장 정보 :
- 프로세스 ID : PID라고 부르며, 프로세스를 식별하기 위한 고유한 번호
- 레지스터 값 : 이전까지 사용했던 레지스터의 중간 값.
- 프로세스 상태 : 입출력을 기다리고 있는지, CPU를 이용중인지, 기다리고 있는지 등 상태를 기록함
- CPU 스케줄링 정보 : 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록됨
- 메모리 관리 정보 : 프로세스가 어느 주소에 저장되어 있는지.
- 사용한 파이로가 입출력장치 목록 : 프로세스가 실행과정 중 사용한 입출력장치나 파일
- 모든 프로세스가 실행을 위해 CPU를 필요로함, But 자원은 한정적, 여러 프로세스가 동시에 CPU를 사용하는 것은 불가능함 ⇒ 프로세스 제어 블록(PCB: Process Control Block)이라는 자료구조를 이용하여 프로세스의 순서를 관리함
문맥 교환(Context Switching)
- 프로세스의 문맥이란?
- 하나의 프로세스 수행을 재개하기 위해 기억해야할 정보로 프로그램 카운터를 비롯한 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력 장치 등을 말한다.
- 그리고 이 모든 정보는 PCB에 저장되어 있음.
- 따라서 Context Switching이 일어나면 이전에 실행하던 프로세스의 중간 정보를 PCB에 백업하고 새롭게 실행할 프로세스의 PCB를 이용해 복구하여 프로세스를 실행하는데 이를 문맥교환(Context Switching)이라고 부름
- 문맥 교환이 빠르게 실행되어 동시에 실행되는 것처럼 보이게 함
- 프로세스의 문맥이란?
프로세스의 메모리 영역
- 프로세스 사용자 영역에 코드, 데이터, 힙, 스택 영역으로 나뉘어 저장됨.
- 코드 영역
- 코드 영역(code segment)은 텍스트 영역(text segment)라고 부름.
- 실행될 수 있는 코드, 기계어로 이루어진 코드가 저장되어 있음.
- 쓰기가 금지되어 있고, Read Only 공간
- 프로그램이 실행될 동안 유지되는 정적 할당 구역
- 데이터 영역
- 프로그램 수행시 유지할 데이터가 저자오디는 공간.(ex. 전역변수)
- 프로그램이 실행될 동안 유지되는 정적 할당 구역
- 힙 영역
- 프로그램을 만드는 사용자가 직접할당할 수 있는 공간
- 언젠가 반환해야하는 공간으로 동적활당 공간임
- 메모리 공간을 반환하지 않아 생기는 메모리 누수(memory leak)이 여기서 발생함.
- 낮은 주소에서 높은 주소 순으로 할당
- 스택 영역
- 데이터가 일시적으로 저장하는 공간(동적 할당 공간)
- 잠깐 쓰다가 말 값들이 저장됨
- 높은 주소에서 낮은 주소 순으로 할당
2️⃣ 프로세스 상태와 계층 구조
프로세스 상태
- 프로세스들이 번갈아 감면서 실행되고, 그 과정에서 여러 상태를 거치게 됨. 아래는 대표적인 프로세스 상태를 말함
- 생성 상태(new) :
- 프로세스를 생성 중인 상태
- 메모리에 적재되어 PCB를 할당 받음
- 준비 상태(ready) :
- CPU를 할당받아 실행할 수 있지만, 자신의 상태가 아니라 기다리고 있는 단계
- 실행 상태(running) :
- CPU를 할당받아 실행할 중인 상태로 할당된 시간만 사용
- 대기 상태(blocked) :
- 입출력 장치의 작업을 기다리는 상태
- 일반적으로 입출력 장치의 시간이 CPU보다 길며, 이 단계가 끝나면 준비 상태로 돌아간다.
- 종료 상태(terminated) :
- 프로세스가 종료된 상태
- 프로세스 상태 다이어 그램(Process State diagram)
프로세스 계층 구조
- 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음.
- 부모 프로세스(parent process): 새 프로세스를 생성한 프로세스
- 자식 프로세스(child process): 부모 프로세스에 의해 생성된 프로세스
- 이 두 프로세스는 다른 프로세스이기에 다른 PID를 가짐, 단 자식 프로세스는 부모의 프로세스 아이디 PPID가 기록됨
- 프로세스 계층 구조 : 최초의 프로세스가 자식 프로세스들을 생성하고, 생성된 자식 프로세스들이 새로운 낳는 형식으로 프로세스가 실행되고 이를 도식화한 구조
- 최초의 프로세스 : 리눅스(systemd), 유닉스(init), macOS(launchd)
- 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음.
프로세스 생성 기법
- 프로세스는 fork와 exec을 통해 프로세스를 생성하게 됨
- fork
- 시스템 호출로 부모 프로세스가 fork라는 시스템 호출을 통해 자신의 복사본 프로세스를 생성
- 부모 프로세스의 자원들, 메모리의 내용 과 같은 PCB에 기록된 내용을 똑같이 상속받게 됨
- exec
- exec은 시스템 호출로 이를 통해 새로운 프로그램으로 전환됨
- 자신의 메모리 공간에 새로운 프로그램을 덮어쓰는 호출
- 코드영역과 데이터 영역에 실행할 프로그램이 바뀌고, 초기화
- fork와 exec과정을 반복하며 계속 프로세스를 생성하여 사용함
3️⃣ 스레드
스레드
- 정의 : 실행의 단위로 프로세스를 구성하는 실행의 흐름 단위.
- 하나의 프로세스는 여러가지 스레드를 가지고 있음 ⇒ 스레드를 통해 동시에 프로세스의 여러부분을 실행할 수 있음.
- 많은 운영체제는 CPU에 처리할 작업을 프로세스가 아닌 스레드로 전달
프로세스와 스레드
- 단일 스레드 프로세스 : 실행의 흐름 단위를 하나만 가지고 있는 프로세스
- 스레드라는 개념을 통해 하나의 프로세스가 여러개를 동시에 실행할 수 있게 됨
- How? 여러개의 스레드는 힙,데이터, 코드 영역의 자원을 공유하고 독자적인 프로그램 카운터를 포함한 레지스터, 스택을 가지고 있어 각기 다른 코드를 실행시킬 수 있음.
멀티 프로세스와 멀티 스레드
- 멀티 프로세스(multiprocess)
- 여러 프로세스를 동시에 실행하는 것
- 멀티 프로세스 프로그램을 이용하기 위해서는 fork와 같은 system call이 필요하고 이는 프로세스를 늘리는 결과를 초래함. 즉, 메모리에 동일한 내용들이 중복해서 존재하게 됨 ⇒ 메모리 낭비
- 하나의 프로세스가 잘못되더라도 독립적으로 실행되기 때문에 영향을 미치지 않음 ⇒ 안정적
- 프로세스간 통신을 위해서는 IPC 기법이 필요. 공유 메모리와 같은 것들을 이용
- 멀티 스레드(multithread)
- 여러 스레드로 프로세스를 동시에 실행하는 것을 말함
- 여러개의 스레드를 생성하더라도 데이터, 힙, 코드를 공유함 ⇒ 메모리를 효율적으로 사용가능
- 프로세스 자원을 공유하여 협력과 통신에 유리
- 다만, 하나의 프로세스가 문제가 생기면 모든 스레드에 영향이 감 ⇒ 위험성
- 멀티 프로세스(multiprocess)
Reference :
'혼공 학습단 > 혼자 공부하는 컴퓨터구조+운영체제' 카테고리의 다른 글
혼자 공부하는 컴퓨터 구조 + 운영체제 Chapter 12 (0) | 2024.02.04 |
---|---|
혼공단 11기 미션 4주차 미션 (1) | 2024.01.28 |
혼자 공부하는 컴퓨터 구조 + 운영체제 Chapter 9 (0) | 2024.01.28 |
혼공단 11기 미션 3주차 미션 (0) | 2024.01.21 |
[혼공 학습단 11기 2주차 미션] 혼자 공부하는 컴퓨터구조 + 운영체제 (0) | 2024.01.14 |