TIL
23.11.27
오잉머신
2023. 12. 5. 17:24
반효경 교수님 [운영체제] 강의 듣기
- 1-2 운영체제란 무엇인가
- 2-2 : 프로그램의 실행
- 3-1 : 프로세스의 개념, 상태
01. 운영체제란 무엇인가
- 커널
- os의 핵심
- 부팅 이후 메모리에 상주
- 운영체제의 목적
- 사용자가 컴퓨터 시스템을 편하게 사용하기 위해
- 하드웨어(cpu, memory, I/O등) 관리
- 운영체제의 구조
- CPU 스케줄링 : 누구한테 cpu를 줄까?
- memory 관리 : 한정된 메모리를 어떻게 쪼개어 쓰지?
- file 관리 : disk에 file을 어떻게 보관하지?
- I/O 관리 : 각기 다른 입출력장치와 컴퓨터 간에 어떻게 정보를 주고 받게 하지?
- process 관리
- process 생성과 삭제
- 자원 할당 및 반환
- process 간 협력
02. Overview
1) 컴퓨터 시스템 구조
- CPU
- memory의 특정 위치에 있는 instruction을 실행한다
- 어떤 위치? cpu속 register 중 하나인 PC가 가르키는 주소
- 다음 instruction을 읽기 전에 Interrupt가 있는지 확인
- 있으면 cpu를 OS에 넘김
- memory의 특정 위치에 있는 instruction을 실행한다
- memory
- cpu의 작업 공간
- cpu는 memory랑만 일한다
- 각 I/O device 별로
- 작은 cpu 가짐 (device controller)
- 작은 memory 가짐 (local buffer)
- 기타
- mode bit : user application 실행 중인지 kernel 실행 중인지
(kernel mode일 때만 모든 명령 실행 권한 가짐) - timer : process에게 할당된 시간 끝나면 interrupt 날림
(특정 프로그램이 cpu 독점하는 것을 막기 위해) - device controller : I/O 작업을 전담하는 작은 cpu (하드웨어임)
- !!! I/O는 실제 device와 local buffer사이에서 일어남 !!!
- I/O가 끝나면 interrupt로 CPU에 그 사실을 알림
- output하고 싶을 때 : 컴퓨터의 memory에 있던 데이터를 I/O device의 local buffer에 옮기고 작업 지시
- input하고 싶을 때 : I/O device로부터 local buffer에 데이터 넣고 그 데이터를 컴퓨터의 memory로 옮김
- DMA (Direct Memory Access)
- CPU 개입없이 메모리 접근하는 기법
(CPU의 개입없이 I/O device와 memory 사이의 데이터 직접 전송) - CPU 대신 local buffer에서 memory에 데이터 옮김 (cpu 할 일 대신 해주는)
- I/O 작업 끝날 때마다 cpu에 interrupt 거는 것은 cpu 입장에서 큰 오버헤드
-> DMA controller가 cpu대신 I/O device의 local buffer에서 데이터 퍼서 memory에 올려주고
-> 좀 쌓이면 그 때 cpu에 interrupt
- CPU 개입없이 메모리 접근하는 기법
- mode bit : user application 실행 중인지 kernel 실행 중인지
2) I/O의 수행
- I/O 요청 : user application이 system call을 통해 OS에 I/O 요청
- I/O 완료 : I/O controller가 interrupt를 통해 I/O 완료 알림
3) interrupt
interrupt 당한 시점의 register와 PC를 save한 후
CPU의 제어를 kernel의 인터럽트 처리 루틴에 넘긴다
- hw interrupt : hw가 발생시킨 interrupt
- timer 완료 : 시간 끝났으니 cpu 뺏어서 다음 process에게 넘김
- I/O 작업 완료
- sw interrupt
- Exception : 프로그램에서 오류 발생
- System call : 프로그램이 kernel 함수 호출
(user application이 os에게 부탁)
4) Sync I/O vs Async I/O
- Sync : 결과가 나와야 다음 할 일 가능 -> 결과 기다림
(결과를 가지고 해야할 때, 제대로 되어야 다음 일을 할 수 있을 때)- 방법 1 : Process A가 Sync I/O 요청하고 cpu들고 기다림 -> cpu 낭비, 매시점 하나의 I/O만
- 방법 2 : Process A가 Sync I/O 요청하고 Process B에게 cpu 넘김 -> cpu 열일, I/O 여러개 동시 실행 가능
(cpu 넘겨받은 Process B가 I/O 작업 요청하면 Process C에게 cpu 넘기고..)
- Async : 결과 상관없이 자기 할 일 -> 결과 안 기다리고 자기 할 일함
(결과 필요 없이 할 수 있을 때, 제대로 되든 말든 다음 일 할 수 있을 때)- Process A가 Async I/O 요청하고 cpu들고 자기 할 일
5) 프로그램의 실행
파일 시스템에 실행 파일 형태로 저장
-> 실행 파일을 실행시키면 memory로 올라가서 process가 됨
자세히 보면..
사실 process마다 만들어지는 독자적인 주소 공간(virtual memory)는 논리적인 공간
-> 실제로 연속적으로 할당되는게 아니라 어떤 부분은 memory에 어떤 부분은 disk에 존재
당장 필요한 부분만 physical memory에
당장 필요하지 않은 부분은 disk(swap area)에
각 프로세스마다 virtual memory는 0번지부터 시작
-> virtual memory에서 1000번지라고 실제 physical memory에서도 1000번지인거 아님 (address translation)
그림에서 hdd 2개
- 오른쪽거는 file system용도 (전원 나가도 살아있음) -> 비휘발성
- 왼쪽거는 swap area용도 (전원 나가면 의미없음) -> 부족한 메모리 보완(메모리의 연장공간)