운영체제 패캠 정리

강준호·2024년 5월 29일
0

운영체제

목록 보기
14/14
post-thumbnail

운영체제

  • 자원을 관리하고 할당하는 특별한 프로그램
  • cpu, 메모리, 프로세스, 파일 시스템, 메모리 관리

시스템콜

  • 응용프로그램이 자원에 접근하려면(운영체제 서비스를 제공받기 위해) 커널모드로 전환해야 가능! => 커널모드로 전환하는것.

OS 핵심 서비스

프로세스 관리

자원 관리 접근 및 할당

파일 시스템 관리

프로세스

PCB 는 운영체제 영역에서 생성되고, 운영체제는 이 PCB를 관리한다.

문맥: 실행을 재개하기 위해 기억해야할 정보.

  • 컨텍스트 스위치가 발생할때 문맥을 PCB에 저장한다.

프로세스, 사용자영역

코드영역

  • 실행가능한 코드가 저장(기계어)
  • 읽기 전용. 수정되지 않게 보호
  • 다중 스레드나 다중 프로세스에서 공유 가능

데이터영역

  • 전역변수와 정적변수(static)가 저장
  • 초기화된 데이터 저장
  • 초기화되지 않은 데이터(BSS)가 일반적으로 0으로 초기화됨

힙 영역

  • 동적 메모리 할당을 위한 영역
  • 프로그램 크기에 따라 변하며 프로그래머가 메모리관리를 직접함
  • 힙은 일반적으로 낮은 주소에서 높은 주소로 확장된다.

스택영역

  • 함수 호출과 관련된 지역변수, 매개변수, 반환 주소를 저장하는 영역
  • 호출될때마다 스택 프레임이 생성되고, 함수가 종료되면 스택프레임이 해제됨.
  • 스택은 일반적으로 높은 주소에서 낮은 주소로 확장된다.

커널역역

  • OS 가 사용하는 메모리 영역
  • 커널모드에서 실행되는 코드와 데이터가 저장됨

프로세스의 상태

생성 new

  • 설명: 프로세스가 처음 생성되는 상태입니다. 프로그램이 실행되면 운영체제가 해당 프로그램에 필요한 자원을 할당하고, 프로세스를 준비합니다.
  • 주요 활동: 프로세스 제어 블록(PCB)이 생성되고, 초기화 작업이 수행됩니다. 운영체제가 프로세스에 필요한 메모리, I/O 자원 등을 할당합니다.

준비 ready

  • 설명: 프로세스가 실행될 준비가 된 상태로, CPU를 할당받기를 기다리고 있습니다.
  • 주요 활동: 모든 필요한 자원이 할당되었으며, 실행 대기 큐에서 CPU 할당을 기다립니다. CPU 스케줄러가 이 상태의 프로세스를 선택하여 실행 상태로 전환합니다.

실행 running

  • 설명: 프로세스가 CPU를 할당받아 실제로 실행되고 있는 상태입니다.
  • 주요 활동: 프로세스의 명령어가 실행됩니다. 한 번에 하나의 프로세스만 CPU에서 실행될 수 있습니다. 다중 프로세서 시스템에서는 여러 프로세스가 동시에 실행될 수 있습니다.

대기 block

  • 설명: 프로세스가 특정 이벤트(I/O 작업 완료, 자원 사용 가능 등)를 기다리고 있는 상태입니다.
  • 주요 활동: 프로세스는 CPU를 사용하지 않으며, 대신 필요한 이벤트가 발생할 때까지 기다립니다. 대기 상태에 있는 동안, 프로세스는 대기 큐에 들어가 있습니다.

종료 terminated

  • 설명: 프로세스의 실행이 완료되어 더 이상 실행되지 않는 상태입니다.
  • 주요 활동: 프로세스가 종료되면 운영체제는 프로세스가 사용하던 모든 자원을 회수하고, PCB를 삭제합니다. 종료 상태로 전환된 프로세스는 더 이상 실행되지 않습니다.

Fork & exec

exec

  • 현재 프로세스를 새로운 프로그램으로 덮어쓰는 시스템 호출
  • 호출 프로세스의 주소 공간은 새로운 프로그램으로 대체되며, 새로운 코드, 데이터, 스택 영역이 로드됩니다.
  • 기존의 프로세스 ID는 유지되지만, 실행 중인 프로그램은 완전히 변경됩니다

스레드

  • 프로세스를 구성하는 실행 흐름의 단위

각각 가지고 있는것

  • 각기 다른 스레드 ID, 레지스터(명령주소=프로그램 카운터), 스택(함수호출, 지역변수 등)

공유하는것

  • 코드영역
  • 데이터영역
  • 힙영역
  • 파일 디스크립터
  • 메모리 매핑된 파일들

동기화와 교착상태

동기화

실행 순서 제어

  • 프로세스를 올바른 순서로 실행

상호 배제

  • 동시에 접근해서는 안되는 자원에 하나만 접근하기

임계구역

  • 동시에 접근하면 문제가 발생할 수 있는 공유 자원에 접근하는 코드

레이스 컨디션

  • 임계구역을 동시에 실행하여 자원의 일관성이 깨지는 현상

    동기화 기법

동기화를 위한 3가지 원칙

  • 상호배제 : 한 프로세스가 임계구역에 진입하였다면 다른 프로세스는 대기해야함

  • 진행 : 어떤 프로세스도 임계구역에 진입하지 않았다면 진입이 가능해야함

  • 유한대기: 한 프로세스가 임계구역 진입을 위해 대기하고 있다면 언젠가 진입이 가능해야함.

    뮤텍스

  • 공유자원이 하나

    세마포어

  • 공유자원이 여러개

  • 실행순서를 위한 동기화

  • wait(), signal()

BusyWaiting 를 효율적으로

  • 대기 큐에 프로세스를 넣고, 임계구역 끝나면 wakeup 으로 다음 사람 깨워.

모니터

  • 조건변수를 이용해 실행 순서 제어
  • 아직 실행조건 안됐으면 -> wait
  • 조건 충족 됐으면 -> signal

교착상태 deadlock

4가지가 모두 충족하면 교착상태가 발생할 '수'도 있음

  • 상호배제
  • 점유와 대기
  • 비선점 : 뺏기 x
  • 원형대기

교착상태 해결방안

  • 예방 : 교착상태 조건 중 하나를 없애버림. -> but 부작용있음.
  • 회피 : 무분별하게 자원을 할당하지않음. 조금씩 할당하자.
  • 검출 후 회복 : 발생하면 선점, 강제종료로 그때그떄 회복.

가상 메모리 관리

페이징과 페이지 테이블 , 가상메모리

연속메모리 할당 -> 외부 단편화 부작용

외부 단편화

  • 프로세스 단편적으로 적재하면 종료하면서 빈공간이 낭비되 메모리 낭비 현상

=> 일정한 단위로 자르면 발생하지 않아! 페이징!!

페이징

  • 메모리를 프레임 단위로 자르고
  • 프로세스를 '페이지'라는 일정 크기로 나눈뒤
  • 페이지를 프레임에 매핑

문제점

1. 내부 단편화

  • 프로세스 내부에서 발생한는 메모리낭비
  • 프로세스 자를때 마지막 부분이 남을 수도 있으니
  • 페이지 크기보다는 작음

2. 페이지 테이블

  • 어디에 페이지가 위치한지 CPU 한테 알려줘야함 -> 페이지 테이블
  • 몇번 페이지가 real 물리메모리 몇번지에 적재되어있다. 라는 전화번호부
  • 프로세스 마다 페이지테이블이 있다

유효비트(valid bit)

  • 접근하려는 페이지가 보조기억장치에 있는지? 메모리에 있는지?
  • 현재 메모리에 없는(보조 기억장치에 있는) 페이지에 접근하려고 한다면?? => 페이지 폴트 발생!!

페이지 폴트 과정 (메모리에 없으니 불러오는)

    1. 작업 내역 백업
    1. 페이지 폴트 루틴 실행- 접근하려는 페이지를 적재한다
    1. 유효 비트 1로 변경
    1. 접근하려는 페이지에 접근한다.

보호비트(protection bit)

  • rwx 권한이 적혀있는.

참조비트(reference bit)

  • 접근한적 있는 페이지인가? 접근한적 있으면 1, 없으면 0

수정비트(dirty bit)

  • 한번이라도 쓰기작업을 한 적 있는 페이지인가?
  • 메모리는 휘발성이 높기때문에 쓰기한 페이지는 체크해놔야해!

계층적 페이징

  • 페이지 테이블 크기 줄이기
  • 페이지 테이블 너무 커서 페이지 테이블을 또 페이징하는...
  • 가장 바깥(시작) 페이지만 메모리에 있으면돼!

페이지 테이블 베이스 레지스터(PTBR)

  • 페이지 테이블이 어디에 있는지 알려주는 레지스터
  • PCB 에 담긴다.

=> 근데 또 얘네를 메모리에 저장하면 낭비가 너무 심해.. -> 캐시메모리를 쓰자

TLB(페이지 테이블의 캐시 메모리)


요구 페이징, 스래싱

(순수) 요구페이징(mbti P)

  • 페이지 폴트가 발생하면 그때 그때 페이지를 적재한다
  • 순수페이징: 페이지 적재 0으로 시작

페이지 폴트는 적게 발생할 수록 좋다. 왜?

  • 페이지 폴트 발생하면, 1. 기존작업 백업 2. 보조기억장치로부터 페이지 받아오고 등등

프레임이 무한이 많다면(물리 메모리 크면) -> 수많은 페이지 적재가능 -> 근데 현실적 불가능ㅜ

스레싱 (문제 발생!)

  • 프로세스 실행 시간보다 페이징에 더 많은 시간이 소요되는 문제ㅜ

  • 너무 많은 프로세스를 적재한 이후에는 이용률이 떨어짐.. -> 스레싱 발생

  • 동시 실행되는 프로세스 수를 늘린다고 해서 반드시 CPU 이용률이 높아지는것은 아님!!

페이지 교체 알고리즘(진짜 쓸 페이지만 교체하면됨)

  • 메모리에 적재된 페이지 중 페이지-아웃 시킬 페이지를 선정하는 방법

페이지 폴트를 적게 일으킨다는 건 어떻게 알지?

  • 페이지 참조열: CPU 가 참조한 페이지 중 연속된 페이지를 생략한 페이지열

1. FIFO 페이지 교체 알고리즘

  • 가장 먼저 페이지에 적재된 페이지부터 페이지-아웃

1-2. 2차 기회 FIFO 페이지 교체 알고리즘(참조비트로 목숨 2개)

  • 기본적으로 FIFO + 참조비트 고려해, 1일경우 이를 0으로 변경후 한번더 기회 부여

2. 최적 페이지 교체 알고리즘(미래 예측 분석으로 가장 이상적)

  • 뒤에 일을 보고 앞으로 쓸일이 잘 없는 페이지를 내보내는것
  • 하지만 앞으로 CPU가 어떤 페이지를 얼마나 참조할지 예측하는건 어려움ㅜㅜㅜ

3. LRU 페이지 교체 알고리즘(과거 예측 분석)

  • 가장 적게 참조할 페이지는 예측하기 어려워도 가장 적게 참조한 페이지는 계산 쉽다!

copy-on-write(쓰기식 복사)

기존 fork

  • fork 를 하면 동일한 프로세스가 메모리에 복제됨. 근데 동일 메모리에 두배 적재된다는 단점..
    -> 불필요한 메모리 낭비 + 시간 낭비

쓰기식 복사

  • 프로세스끼리 자원을 공유하지않으면서 별도의 메모리에 적재하는 방법!
  • 처음 fork 하면 동일한 페이지를 가르키고 있음. 이를 이용하는것

쓰기 작업을 한것만 메모리에 적재해! 안한건 걍 부모꺼 같이쓰자~

  • 중복 저장하지않아 메모리 효율적 사용. + 프로세스 생성 시간 절약

파일 시스템

파일과 디렉터리

파일

  • 응용프로그램은 파일은 직접 조작할 수 없어. -> 시스템 콜 써야해.

  • OS 가 파일에 접근할때는 쓰는 단위는 '블록'단위!

  • 근데 연속적으로 접근하면, 외부단편화 발생해서

디렉터리

  • 파일을 계층적으로 관리함

  • 대부분의 운영체제는 디렉터리를 '파일'과 동일하게 간주한다.

  • 파일이름, 위치를 유추할 수 있는 정보 등으로 구성됨.

파일 시스템이 만들어지기까지

파일 시스템

  • 파일과 디렉터리를 관리하는 커널
  • 여러 파일시스템을 동시에 사용할 수 있음 -> 이럴려면 보조기억장치에 파티셔닝을 해놔야해!

파티션: 보조기억장치에서 구획된 영역

  • 사용하는 이유?
    => 보조 기억장치가 용량이 너무 커서 그래. 커다란 서랍에 다 때려 넣으면 어지럽자나~

포매팅: 파일 시스템을 만드는 방법

  • 파일시스템을 사용하려면 초기화를 해줘야해! 파일시스템을 만들겠다고 선언하는것.

마운트

  • 파일 시스템에 접근할 경로 결정. 어떠한 경로로 접근할지를 결정하는것!
  • 파일 시스템을 다른 파일 시스템에 편입
  • 예를들면, USB를 삽입했을때 어떤 경로를 통해서 USB에 접근할 수 있는지를 알려줘야해

명령어

top : 전체 시스템 관련

free -h

vmstat : 

stat : 파일 속성보기
fdisk : 파일시스템 관련

0개의 댓글