728x90
반응형
운영체제(OS; Operating System): 사용자가 컴퓨터를 쉽게 다루게 해주는 인터페이스
펌웨어(firmware): 운영체제와 유사하지만 소프트웨어를 추가로 설치 X
1. 운영체제의 역할과 구조
역할
- CPU 스케줄링과 프로세스 관리: CPU 소유권을 어떤 프로세스에 할당할지, 프로세스 생성/삭제, 자원 할당/반환 관리
- 메모리 관리: 한정된 메모리를 어떤 프로세스에 얼마큼 할당해야 하는지 관리
- 디스크 파일 관리: 디스크 파일 어떠한 방법으로 보관할지 관리
- I/O 디바이스 관리: I/O 디바이스들인 마우스, 키보드, 컴퓨터 간의 데이터를 주고받는 것 관리
구조
- 시스템콜: 운영체제가 커널에 접근하기 위한 인터페이스
- 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수 호출할 때 사용
- I/O 요청 -> 유저 프로그램) 트랩(trap) 발동 -> 올바른 I/O 요청인지 확인
-> 유저 모드) 시스템콜 ~> 커널 모드로 변환되어 실행- ex. I/O 요청인 `fs.readFile()`이라는 파일 시스템의 파일을 읽는 함수 발동
- 유저 모드에서 파일 읽지 X 커널 모드로 들어가 파일을 읽음
-> 다시 유저 모드로 돌아가 그 뒤에 있는 유저 프로그램의 로직 수행 - => 컴퓨터 자원에 대한 직접 접근 차단, 프로그램을 다른 프로그램으로부터 보호
- 메모리(프로세스/스레드) -> 시스템콜 -> 커널 -> OS
- 하나의 추상화 계층 -> 네트워크 통신 or 데이터베이스와 같은 낮은 단계의 영역 처리에 대한 부분 신경 ↓ 프로그램 구현
- `modebit`: 시스템콜이 작동될 때 참고해서 유저모드/커널모드 구분
- 1/0 값을 가지는 플래그 변수 (1: 유저 모드 / 0: 커널 모드)
- 카메라, 키보드 등 I/O 디바이스는 운영체제 통해서만 작동해야 함
- ex. (유저 모드)카메라 이용 -> 시스템콜 호출
-(`mobit` 1 -> 0)-> (커널 모드)카메라 자원 이용한 로직 수행
-(`mobit` 0 -> 1)-> (유저 모드)이후 로직 실행
2. 컴퓨터의 요소
- CPU(Central Processing Unit): 인터럽트에 단순히 메모리에 존재하는 명령어를 해석해서 실행
- 제어장치(CU; Control Unit): 프로세스 조작 지시
- 입출력장치 간 통신 제어, 명령어 읽고 해석, 데이터 처리를 위한 순서 결정
- 레지스터: CPU 안에 있는 매우 빠른 임시기억장치
- CPU와 직접 연결 -> 연산 속도가 메모리보다 수십 배 ~ 수백 배 빠름
- CPU는 자체적으로 데이터를 저장할 방법 X -> 레지스터를 거쳐 데이터 전달
- 산술논리연산장치(ALU; Arthmetic Logic Unit): 산술 연산(덧셈, 뺄셈), 논리 연산(배타적 논리합, 논리곱)
- 제어장치(CU; Control Unit): 프로세스 조작 지시
- DMA 컨트롤러: I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치
- CPU에만 너무 ↑ 인터럽트 요청 -> CPU 부하 막아줌, 일 부담하는 보조 일꾼
- 하나의 작업을 CPU와 DMA 컨트롤러가 동시에 하는 것을 방지
- 메모리 (memory): 전자회로에서 데이터 or 상태 or 명령어 등 기록하는 장치
- RAM(Random Access Memory)
- CPU - 계산 담당, 일꾼 / 메모리 - 기억 담당, 작업장 (메모리 크기 - 작업장 크기)
- 타이머(timer): 몇 초 안에는 작업이 끝나야 한다는 것을 정하고 특정 프로그램에 시간 제한하는 역할
- 디바이스 컨트롤러(device controller): 컴퓨터와 연결되어 있는 IO 디바이스들의 작은 CPU
<연산 처리>
- 제어장치 -> 메모리: 계산할 값 로드 + 레지스터: 로드
- 제어장치 -> 산술논리연산장치: 레지스터에 있는 값 계산
- 제어장치 -> (레지스터 -> 메모리): 계산한 값 저장
<인터럽트>
어떤 신호가 들어왔을 때 CPU를 잠깐 정지하는 것
- 하드웨어 인터럽트: I/O 디바이스에서 발생하는 인터럽트
- 순차적인 인터럽트 실행 중지, 운영체제에 시스템콜 요청
-> 원하는 디바이스로 향해 디바이스에 있는 작은 로컬 버퍼에 접근해 일 수행
- 순차적인 인터럽트 실행 중지, 운영체제에 시스템콜 요청
- 소프트웨어 인터럽트 = 트랩(trap): 프로세스 오류 등으로 프로세스가 시스템콜 호출할 때 발동
CPU는 메모리에 올라와 있는 프로그램의 명령어들 실행
1. 메모리 계층
- 레지스터: CPU 안에 있는 작은 메모리/ 휘발성, 속도 ↑, 기억 용량 ↓
- 캐시: L1, L2 캐시/ 휘발성, 속도 ↑, 기억 용량 ↓/ L3 캐시
- 주기억장치: RAM/ 휘발성, 속도 보통, 기억 용량 보통
- 보조기억장치: HDD, SSD/ 비휘발성, 속도 ↓, 기억 용량 ↑
2. 메모리 관리
컴퓨터 내의 한정된 메모리를 극한으로 활용
가상 메모리(virtual memory)
- 컴퓨터가 실제로 이용 가능한 메모리 자원 추상화 -> 매우 큰 메모리로 보이게 만드는 것
- 가상 주소(logical address): 가상적으로 주어진 주소
- 메모리관리장치(MMU)에 의해 실제 주소로 변환 -> 사용자 실제 주소 의식 필요 X
- 실제 주소(physical address): 실제 메모리상에 있는 주소
- 페이지 테이블로 관리, 속도 향상 -> TLB 사용
- 페이지 테이블: 프로세스의 주소 정보 들어 있음
- TLB: 메모리와 CPU 사이에 있는 주소 변환을 위한 캐시
/ 페이지 테이블에 있는 리스트 보관, CPU가 페이지 테이블까지 가지 않도록 해 속도를 향상시킬 수 있는 캐시 계층
- 스와핑(swapping)
- IF. 가상 메모리에 존재 O 실제 메모리인 RAM에는 현재 없는 데이터나 코드에 접근 -> 페이지 폴트 발생
- 메모리에서 당장 사용 X 영역 -> 하드디스크/ 하드디스크의 일부분을 마치 메모리처럼 불러와 사용하는 것
- => 페이지 폴트가 일어나지 않은 것처럼 만듦
- 페이지 폴트(page fault): 프로세스의 주소 공간에는 존재, 지금 이 컴퓨터의 RAM에는 없는 데이터에 접근했을 경우 발생
- CPU) 물리 메모리 확인 -> 해당 페이지 X -> 트랩 발생 => 운영체제에 알림
- 운영체제) CPU의 동작을 잠시 멈춤
- 운영체제) 페이지 테이블 확인 -> 가상 메모리에 페이지 존재하는지 확인
- X -> 프로세스 중단, 현재 물리 메모리에 비어 있는 프레임 있는지 찾음
- -> X -> 스와핑 발동
- 비어 있는 프레임에 해당 페이지 로드, 페이지 테이블 최신화
- 중단되었던 CPU 다시 시작
스레싱(thrashing)
- 메모리의 페이지 폴트율이 높은 것
- 컴퓨터의 심각한 성능 저하 초래
- 메모리에 너무 많은 프로세스 동시에 올라감 -> 스와핑 ↑
- (페이지 폴트 발생 -> CPU 이용률 ↓ -> 운영체제) CPU가 한가하다고 생각
-> 가용성 높이기 위해 더 많은 프로세스 메모리에 올림) 반복
<해결할 수 있는 방법>
- 작업 세트(working set)
- 프로세스의 과거 사용 이력인 지역성 ~> 결정된 페이지 집합 만듦 -> 미리 메모리에 로드
- 탐색에 드는 비용 ↓, 스와핑 ↓
- PFF(Page Fault Frequency)
- 페이지 폴트 빈도를 조절하는 방법
- 상한선에 도달 -> 프레임 늘림/ 하한선에 도달 -> 프레임 줄임
메모리 할당
메모리에 프로그램 할당 -> 시작 메모리 위치, 메모리의 할당 크기 기반 => 연속 할당 / 불연속 할당
<연속 할당>
메모리에 연속적으로 공간을 할당하는 것
- 고정 분할 방식(fixed partition allocation): 메모리를 미리 나누어 관리하는 방식
- 융통성 X, 내부 단편화 발생
- 가변 분할 방식(variable partition allocation): 매 시점 프로그램의 크기에 맞게 동적으로 메모리 나눠 사용
- 내부 단편화 발생 X, 외부 단편화 발생
- 최초적합(first fit): 위쪽 or 아래쪽 시작 -> 홀 찾으면 바로 할당
- 최적적합(best fit): 프로세스의 크기 이상인 공간 중 가장 작은 홀부터 할당
- 최악적합(worst fit): 프로세스의 크기와 가장 많이 차이나는 홀에 할당
*내부 단편화(interanl fragmentation): 메모리를 나눈 크기 > 프로그램 -> 들어가지 못하는 공간 ↑ 발생하는 현상
/ 외부 단편화(external fragmentation): 메모리를 나눈 크기 < 프로그램 -> 들어가지 못하는 공간 ↑ 발생하는 현상
/ 홀(hole): 할당할 수 있는 비어 있는 메모리 공간
<불연속 할당>
메모리 연속적으로 할당 X 현대 운영체제가 쓰는 방법
- 페이징(paging) 기법: 동일한 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당
- (+) 홀의 크기 균일 / (-) 주소 변환 복잡해짐
- 세그멘테이션(segmentation): 페이지 단위 X 의미 단위인 세그먼트(segment)로 나누는 방식
- 프로세스: 코드, 데이터, 스택, 힙 등으로 이뤄짐 -> 코드와 데이터 등 이를 기반으로 나눌 수도 있고 함수 단위로도 나눌 수 있음
- (+) 공유, 보완 / (-) 홀 크기 균일 X
- 페이지드 세그멘테이션(paged segmentation): 공유나 보안 -> 의미 단위의 세그먼트로 나누고, 물리적 메모리 -> 페이지로 나눔
페이지 교체 알고리즘
- 오프라인 알고리즘(offline algorithm): 먼 미래에 참조되는 페이지와 현재 할당되는 페이지를 바꾸는 알고리즘
- 미래에 사용되는 프로세스 알 수 X -> 사용할 수 X 알고리즘
- 다른 알고리즘과의 성능 비교에 대한 기준 제공
- FIFO(First In First Out): 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법
- LRU(Least Recentle Used): 참조가 가장 오래된 페이지 교체
- 오래된 것 파악 -> 페이지마다 계수기, 스택 두어야 함
- 2개의 자료구조로 구현(해시 테이블 + 이중 연결 리스트)
- 해시 테이블: 이중 연결 리스트에서 빠르게 찾을 수 있도록 사용
- 이중 연결 리스트: 한정된 메모리 나타냄
- NUR(Not Used Recently): clock 알고리즘
- 0과 1을 가진 비트
- 1: 최근에 참조 / 0: 참조 X
- 시계 방향으로 돌면서 0을 찾고 찾은 순간 해당 프로세스를 교체, 1로 바꿈
- LUR에서 발전
- 0과 1을 가진 비트
- LFU(Least Frequently Used): 가장 참조 횟수가 적은 페이지 교체/ ↑ 사용 X 교체
728x90
반응형