운영체제
- 자원을 관리하고 할당하는 특별한 프로그램
- 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로 변경
- 접근하려는 페이지에 접근한다.
보호비트(protection bit)
참조비트(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 : 파일시스템 관련