2025/12/04 운영체제 - 2

김기훈·2025년 12월 4일

TIL

목록 보기
74/194

2강

프로세스의 이해

  • 프로세스란 '실행 중인 프로그램'을 뜻함

  • ex.

    • 게임의 실행파일 이름을 volley.exe 라고 하면, 해당 실행파일은 프로그램이다.
    • 게임을 즐기기 위해서 volley.exe를 더블클릭하면,
      • 프로그램의 실행을 위해 운영체제는 필요한 자원을 할당하고 관리하기 시작
      • 그렇게 시작된 게임은, 다름 아닌 프로세스이다.
  • 프로세스 구조

    • 프로그램의 실행을 위해서는 절대적으로 레지스터가 필요
    명령어가 담긴 코드 영역 → 명령어 집합이 저장된 영역
    
    전역변수 등이 담긴 데이터 영역 → 전역변수 / 스태틱 변수 저장 
    
    지역변수 등이 담긴 스택 영역 → 지역변수 / 함수의 매개변수 같은 휘발성 변수 저장
    
    동적 메모리 할당을 위한 힙 영역 → 프로세스가 동적으로 메모리를 할당 할 경우 사용 
  • 실습

    • getpid : 프로세스 아이디 출력 (프로세스 아이디는 랜덤)

    • pip install psutil


프로세스 상세

  • 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 스케줄링

  • 프로세스 별로 요구하는 자원이 상이하기 때문에

    • 운영체제(스케줄러)가 모든 프로세스에 동일한 빈도로 CPU를 할당하는 것은 비합리적
    • 운영체제는 프로세스마다 우선순위를 부여하고 이를 기준으로 프로세스를 실행
  • ps -el | grep python


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)
    • 크고 작은 파일들을 저장하기 위해 사용 / 속도는 느리지만 용량은 큼 / 가격 저렴 / 비휘발성(유일)

메모리 할당 방식

  • 여러 개의 프로세스를 메모리에 올려야 한다면, 선택지는 2가지

    • 가변 분할 방식

      • 프로세스의 크기에 따라 가변적으로 할당
    • 고정 분할 방식

      • 메모리를 고정된 크기만큼 나누어 뒀다가 나누어진 메모리를 프로세스 크기만큼 할당
  • 스와핑

    • 실행 상태의 프로세스는 메인 메모리에 올리고
    • 실행상태가 아닌 프로세스들은 보조 장치에 따로 마련된 스왑 영역에 올림
    • 프로세스의 상태 변화에 따라 두 공간 사이에서 프로세스가 이동하는(교환되는) 것
      • 장점
        • 스와핑을 이용하면 프로세스들이 요구하는 메인 메모리의 총 용량보다
        • 큰 용량의 프로세스들을 동시에 운용 가능
  • 외부 단편화

    • 프로세스를 메모리에 연속 배치하는 작업을 수행하다 보면 메모리가 낭비되는 상황 발생
    • ex. 40바이트의 여유가 있기는 하지만 공간이 분리되어 있어서 추가 불가능

메모리의 이해 예제

  • 가비지 컬렉션 / 레퍼런스 카운트

가상 메모리 관리

profile
안녕하세요.

0개의 댓글