2강
프로세스의 이해
프로세스 상세
- CPU는 한 번에 하나의 연산만 수행 가능
- CPU는 여러 개의 프로세스를 동시에 실행하지 않고, 빠르게 번갈아 가며 실행
- 운영체제는 프로세스 컨트롤 블록, PCB(Process Control Block)를 만들어 관리
- 여기에는 프로세스를 식별하기 위해 필요한 정보들이 저장
- 프로세스 ID, 레지스터 데이터, 스케줄링 정보, 프로세스 상태 등
프로세스 상태

생성(New) — 프로세스가 만들어지는 단계
- 프로그램을 실행하면 OS가 다음을 준비함
- 메모리 공간 할당(코드/데이터/스택/힙)
- PCB(Process Control Block: 프로세스 정보) 생성
- 필요한 자원 준비
준비(Ready) — CPU의 실행을 기다리는 단계
- 프로세스가 실행할 준비가 되었지만 아직 CPU를 배정받지 못한 상태
- 메모리도 있고, 실행 가능 상태
- 운영체제가 ‘대기열(Ready Queue)’에 넣어둠
- CPU 스케줄러가 선택할 때까지 기다림
실행(Running) — CPU를 받아 실제로 실행되는 상태
- CPU를 받아서 명령어가 실행되는 단계
- CPU Time Slice(시간조각)를 사용 중
- 연산, 함수 호출, 입출력 요청 등 수행
- 스케줄러가 필요하면 다시 Ready로 보냄(문맥 교환)
대기(Waiting/Blocked) — 입출력(I/O) 때문에 기다리는 상태
- 프로세스가 I/O 요청, 이벤트 대기 등 때문에 멈춰 있는 상태
- CPU를 기다리는 게 아니라, 입출력이 끝나기를 기다리는 것이 핵심
- I/O가 끝나면 다시 Ready로 돌아감
- 파일 읽기/쓰기
- 네트워크 응답 대기
- 사용자의 입력 대기
종료(Terminated/Exit) — 실행이 끝난 상태
- 프로세스가 정상적으로 끝나거나 오류로 종료
- 메모리 및 자원 해제 / PCB 제거 / 더 이상 스케줄러의 대상이 아님
프로세스 계층
- 프로세스가 프로세스를 낳아도 서로간의 독립적인 영역을 가짐

실습

컨텍스트 스위칭
- 멀티 프로세스 운영체제
- 여러 개의 프로세스를 관리해가며, 마치 동시에 실행되는 것처럼 운영할 수 있는 운영체제
- 프로세스를 실행하는 중에 다른 프로세스를 실행하기 위하여 실행중인 프로세스를 저장하고
- 다른 프로세스로 교체하는 작업 → 컨텍스트 스위칭(문맥교환)
- 저장하고 교체하는 과정이기 때문에 부하가 큼

프로세스 생성
- 프로그램 실행 시
- 운영체제는 코드 영역과 데이터 영역을 메인 메모리에 올리고 빈 스택과 빈 힙을 만들어 공간을 확보
- 이는 시스템에게 상당한 부담을 줌
- 새로운 프로세스를 생성하는 것보다, 기존 프로세스를 복사하는 것이 더 빠름
- 따라서 모든 프로세스는 최초의 프로세스로(부모 프로세스)부터 복사된 것
- fork(): 부모프로세스를 복사하는 시스템 함수
- exec(): 코드영역과 데이터영역을 원하는 내용으로 덮어쓰는 작업을 함

실습



과제
- 내파이썬 프로그램의 이름을 알아보자
- psutil을 사용하여 현재 실행중인 파이썬의 프로세스 아이디와 동일한 아이디를 가진 프로세스의 이름을 찾기
스레드(Thread)
- 컨텍스트 스위칭으로 인한 부하를 줄이기 위한 답: 프로세스 줄이기
- 프로세스는 아래에 스레드를 두어 작업을 나누어 처리 가능
- 스레드: 프로세스가 처리하는 작업의 실행 단위
명령이 담긴 코드 영역
전역변수 드잉 담긴 데이터 영역
지역변수 등이 담긴 스택 영역
동적 메모리 할당을 위한 힙 영역
메모리 구조 관점에서 본 스레드 특징
- 스레드는 스레드가 하나 생성될 때마다 스레드를 위한 스택 영역이 추가로 생성될 뿐,
- 그 이외의 영역은 프로세스의 영역을 공유한다.
- 스레드는 프로세스가 처리해야 할 작업을 수행하기 위해 존재하는 것이므로,
- 드 영역을 공유해 명령어에 접근할 수 있어야 한다.
- 명령어 실행 시 전역변수, 정적변수, 지역변수 등의 데이터에 접근해야 하므로
- 어째서 스택영역은 스레드 마다 개별 할당 되는것인가?
- 스택은 함수 호출시 전달되는 인자 되돌아가는 주소값 및 지역변수 등을 저장하기 위해 사용되는 공간
- 이 메모리공간이 독립적으로 할당되지 않으면 추가적인 실행흐름을 만들 수 없음
- 즉, 실행흐름을 추가하기 위한 최소한의 조건임
실습
CPU 스케줄링
3강
스케줄링 알고리즘
Queue
- 운영체제는 준비 상태의 프로세스와 대기 상태의 프로세스를 관리하기위해 큐(Queue) 자료구조를 사용
- 준비 큐 / 대기 큐 가 존재하며 우선순위가 높은 프로세스가 등장하면 세치기를 허용
고려사항
- 부하가 최소화 되어야 한다
- 컴퓨팅 자원을 효율적으로 사용해야 한다
- 균형잡힌 스케줄링을 해야 한다
- 대기 및 응답 시간이 너무 길어서는 안 된다
알고리즘
- 선입선출(First In First Out)
- 준비 큐에 삽입된 순서대로 처리
- 먼저 들어온 프로세스가 종료상태가 되어야 다음 프로세스를 실행
- 최단 작업 우선 (Shortest Job First)
- 실행시간이 짧은 프로세스 먼저 처리
- 프로세스 실행시간을 정확히 예측하는것은 거의 불가능
- 라운드 로빈 (Round Robin)
- 정해진 시간 만큼만 cpu를 점유하고 시간이 다 지나면 컨텍스트 스위칭 함
- 타임슬라이스에 따른 단점 존재
- 우선순위 스케줄링 (Priority Scheduling)
- 앞선 알고리즘들의 기반이 되는 아이디어
- 우선순위만 고려할 경우 우선순위가 낮은 프로세스가 배제되어 버리는 "기아"상태에 빠질 수 있음
프로세스 간 통신
- 프로세스는 독립적으로 실행되지만, 필요 시 다른 프롯스와 데이터를 주고받으며 통신하는 경우도 있음
- 이를 프로세스 간 통신(Inter - Process Communication)
- 통신을 하기 위해서 통신의 각 주체가 만날 수 있는 일종의 창구가 필요
- 메일슬롯 방식
- IPC는 데이터를 받기 위해서 프로세스가 우체통 역할을 하는 객체를 마련하고 이를 통해 주고받음
- 단방향 통신만 가능
- 양방향으로 통신하기 위해서는 서로 우체통 만들어야 함
- 파이프 방식
- 파이프 방식의 IPC는 익명 파이프 또는 네임드 파이프를 이용해 데이터를 주고받음
- 익명 파이프는 서로 관계가 있는 프로세스 간에 통신을 할때 사용하는 단방향 파이프
- 네임드 파이프는 프로세스 간에 양방향 통신을 할때 사용하는 파이프
실습


동기화
- 프로세스는 서로 독립적이지만, 프로세스 간 통신을 하거나 같은 대상에 대한 작업을 함으로써 협력 가능
- 하지만, 동시다발적으로 작업을 처리하면 문제 발생 가능
- 프로세스 간 통신에서는 공동으로 이용하는 변수가 파일, 입출력 기기 등이 존재
- 이를 가리켜 → '공유자원'
- 공유자원은 각 프로세스의 접근 순서에 따라 결과가 달라질 수 있음
- 프로세스가 동시에 실행할 경우 문제가 발생할 수 있는 영역을 가리켜 → '임계영역'
- 동기화 기법은 임계구역에서 발생할 수 있는 문제를 해결하기 위한 기법
- 동기화 기법 구현 시 → '상호배제' 라는 조건을 만족시켜야 함
- 상호배제 → 하나의 프로세스가 임계구역에 들어갔다면 다른 프로세스는 임계구역에 들어갈수 없다는 조건
동기화 기법
-
1. 뮤텍스 락
- 프로세스에서 잠겨있는 문의 역할(공유자원이 1개임을 가정)
- 동시에 접근해서는 안되는 프로세스를 동시에 접근하지 못하게 막음
- acquire() → 문 잠금 / release() → 문 열림
-
뮤텍스 락 실습

-
스레드를 이용한 뮤텍스 락 → 결과는 동일
- 여기서도 lock를 안걸면 → 동기가 맞지 않음 (동일)

-
2. 세마포어
- 공유자원에 접근 가능한 열쇠를 주는 역할(공유자원이 여러개 존재 할 경우에도 사용 가능)
- wait(): 프로세스가 임계구역에 들어갈 수 있는지 기다려야하는지 알려줌
- signal(): 임계구역 앞에서 기다리는 다른 프로세스에게 이제 들어가도 된다고 전달 해줌
데드락
- 프로세스 실행과정에서 발생 가능한 정체상황 → 교착상태
- 원인: 공유자원 → 공유자원이 없을경우 데드락은 발생하지 않음
발생 조건
- 상호배제(Mutual exclusion)
- 비선점(No preemption)
- 점유 및 대기(Hold and wait)
- 원형 대기(Circular waite)
- 4가지 조건중 하나라도 충족하지 않으면 발생X / 4가지 전부 충족해도 발생하지 않을 수 있음
과제
- 데드락, 즉 교착상태에 대해서 비유적으로 설명할 때 주로 사용되는 예시: '식사하는 철학자 문제'
- 여기에 대해 조사하고 정리하여 글을 써 보자.
식사하는 철학자 문제
정의
- 다익스트라(Dijkstra)가 만든 동시성(concurrency) 제어 문제
- 여러 스레드가 공유 자원을 사용할 때 교착상태(deadlock), 기아(starvation),
- 경쟁 상태(race condition)를 어떻게 해결할지에 대한 모델
문제
- 원탁에 철학자 5명 | 각 철학자 왼쪽과 오른쪽에 포크(젓가락) 하나씩 놓여 있음
- 철학자가 식사하려면 두 포크를 모두 들어야 함(생각 → 배고픔 → 식사의 반복 루프)
문제 포인트
- 공유자원: 포크 5개 / 스레드: 철학자 5명
- 상호배제: 한개의 포크는 동시에 두명 사용 X
- 교착상태: 모두 왼쪽/오른쪽 둘중 하나로 통일해서 포크 들고 반대쪽 기다리면 발생
- 기아: 특정 철학자가 영원히 먹지 못할 수 있음
- 경쟁 조건: 포크 흭득 순서에 따라 결과가 달라짐
4강
메모리의 이해
메모리 계층

- 레지스터
- cpu안에서 연산을 위한 저장소를 제공 속도 빠름 / 용량 작음
- 캐시(L1/L2)
- cpu와 ram사이에서 중간 저장소 / 레지스터와 ram사이에 데이터 이동이 있을경우 속도 보완
- 이미 사용된 데이터를 임시로 저장 / RAM에서 데이터를 가져오는 것 보다 더 빠르게 가져올 수 있음
- 메인 메모리(RAM)
- 메인 메모리 / 데이터를 저장하기 보다는 실행중인 프로그램을 올리기 위해 사용
- 보조기억장치(HDD/SSD)
- 크고 작은 파일들을 저장하기 위해 사용 / 속도는 느리지만 용량은 큼 / 가격 저렴 / 비휘발성(유일)
메모리 할당 방식
메모리의 이해 예제
- 가비지 컬렉션 / 레퍼런스 카운트

가상 메모리 관리