운영체제 operating system
: 컴퓨터 하드웨어와 응용 프로그램 사이에서 하드웨어를 효율적으로 관리하여 사용자의 편리함을 높여줌
- resource allocater (자원 할당자): 특정 프로그램과 사용자의 작업에 필요한 하드웨어 자원을 할당해줌
- control program (통제 프로그램): 사용자 프로그램이나 입출력 장치의 실행을 관리, 즉 통제하여 오류나 부적절한 실행을 방지한다.
computer system의 구성 요소
- 하드웨어: I/O device(입출력 장치), memory(기억 장치), CPU(중앙 처리 장치)
- 운영체제
- 응용 프로그램
- 사용자 user
system program + kernel = 운영체제
-> 이때의 system program은 컴퓨터를 사용하기 위해 필수적인 프로그램들을 의미하며 운영체제를 설치하면 같이 설치됨 (ex. 윈도우 탐색기)
운영체제는 resource manager
= hardware, I/O device, memory 같은 하드웨어 자원을 효율적으로 관리함
이를 수행 하는 방법
- obstraction 추상화: 세분화하지 않고 하나의 큰 개념을 적용 ex) 삼성 헤드폰, LG 헤드폰 말고 그냥 '헤드폰'
- sharing 공유: time multiplexting-> 컴퓨터 하나에 여러 사용자가 동시에 접속해서 사용자는 자신이 컴퓨터를 독점하고 있다고 느끼게 해줌/ space sharing -> 특정 프로세스에서 쓰는 자원을 다른 곳에서도 쓸 수 있도록 함
- protection 보호: 특정한 사용자가 하드웨어에 접근할 수 없도록 막아줌 (security의 개념이 아님)
- fainess: 어떤 프로세스가 CPU를 독점적으로 사용하는 것을 막음
- performance: 성능을 최고수준으로 끌어올려 사용함
=> 결국 하드웨어 자원을 관리해서 소프트웨어의 효율적인 실행 환경을 제공해줌
system software layer
Computer System Architecture: 하드웨어 자원
Operating System ==kernel: 운영체제
Software Development Environment: system programe들
Middleware: 운영체제와 상관없이 프로그램이 돌아가도록 사용자와 운영체제 사이에서 관리한다. 프로그램 개발을 쉽게 해주는 중간 sw
User Application: 사용자 프로그램이다. 하드웨어의 자원을 쓰려면 운영체제의 도움이 필요함
Computer System Architecture, 하드웨어 구조
: cpu는 연산이 빠른것에 비해 I/O장치들은 연산이 느림. 따라서 throughput을 높이기 위해서 각각의 I/O 장치마다 controller를 통해서 처리 효율을 높인다. 따라서 I/o 장치와 cpu가 concurrently하게 연산할 수 있는것임. 각각의 I/O 장치들은 local buffer가 있는데 cpu는 main memory와 local buffer 사이에서 전달하고 I/O 장치들은 local buffer에 데이터를 저장한다.
이때 I/O 장치들은 interrupt를 발생시켜 cpu에게 연산이 끝났음을 알려준다.
kernel이 I/O 작업이 끝났음을 알게되는 방법은
- polling
- HW hardware interrupt
두가지 방식이고 hardware interrupt가 여기서 말하는 interrupt이다.
CPU
register: cpu 안의 저장공간이다.
- pc(program counter): 다음에 실행할 명령어의 주소
- instruction register: 명령어의 해석을 위해 저장
- psw(program status word): 현재 cpu의 상태를 나타냄
- general purpose register: 데이터 기억이나 일반적인 연산을 함
instruction architecture set
- RISC: 명령어의 갯수를 중리고 복잡한 명령어는 sw로 만드는 것이다.
- CISC: 복잡한 명령어의 집합이다.
따라서 당연히 처리속도는 RISC가 더 좋다. 복잡할 수록 시간이 오래 걸리니까
pipelining
- Fetch, Decode, Execute, Write back
instruction-level parallelism (ILP)
- 파이프라인은 처리량을 높이는 것이다. 즉 동시에 실행시키는 것이 아니라 놀고있지 않도록 만드는 것이다. 반면에 instruction-level parallelism은 명령어를 동시에 실행시키는 것이다.
-> superscala(cpu가 동적으로 여러개를 실행) vs VLIW (컴파일러가 어떤 것을 실행할지 미리 결정)
-> SMT
Storage Structure
main memory
- SRAM: static. => cache 메모리로 활용한다.
- DRAM: dynamic. => refresh 즉 항상 새로고침을 해야 내용이 유지된다. 대용량 메모리에 사용된다.
compact flash card internals, SSD
여기서 SSD = solid state drive
플래시 메모리 기반이기 때문에 hard disk 보다 빠르다.
controller + flash memory 로 이루어져있다.
Storage Device Heirarchy
caching
지역성을 활용하여 최근에 읽은 데이터에 대해 빠르게 가져온다.
읽는 것은 그렇다 쳐도 쓸때는 어떻게 해야할까?
cache management policy
- write-back: cache에 썼다가 나중에 한번에 main memory에 write함. 성능은 좋은데 데이터 불일치가 발생한다.
- write-through: main memory와 cache에 동시에 쓴다. 안전하지만 느리다.
I/O structure
ex. 키보드 마우스 스피커 등등 모두가 입출력장치이다.
I/O 장치가 수행되는 동안에는 cpu는 waiting 상태가 되고, 수행이 끝나면 cpu에게 완료를 알려준다.
이때 이벤트를 주고 받는 것을 interrupt라고 한다.
interrupt의 두가지 방식
- polling: 지속적으로 cpu에게 작업이 완료되었는지 물어본다. 당연히 오버헤드가 크다.
- hardware interrupt: 장치에서 interrupt를 건다.
하드웨어 관점에서의 I/O control
1. device interrupt가 발생한다.
2. cpu는 process 작업을 중단하고 cpu에서 쓰던 레지스터 집합을 memory에 저장한다. 그 후 kernel mode로 전환한다.
3. interrupt가 발생한 handler로 가서 작업을 수행한다.
4. 다시 돌아와서 저장했던 레지스터의 내용을 복원하고 user mode로 전환한 후 다시 작업을 계속 진행한다.
소프트웨어 관점에서의 I/O control
- synchronous: interrupt가 발생하면 blocking, 즉 current 작업을 멈춘다.
- Asynchronous: interrupt가 발생해도 non-blocking 한다.
Interrupt vs Exception
Interrupt: I/O 장치가 cpu에게 거는 interrupt
Exception: cpu가 자기 자신에게 거는 Interrupt => trap or fault
예를 들면 5 divide 0 는 수행할 수 없으므로 운영체제에게 도움을 요청하고 cpu가 자기자신에게 interrupt, 즉 exception을 건다. 근데 요새는 그냥 ANR 하고 넘어간다.
또는 참조할 수 없는 메모리를 참조했을 때에도 exception이다. 리눅스 하다보면 많이 보이는 segmentation fault이다.
exception은 다시 trap과 fault로 구분된다.
- trap: expected. 즉 의도적으로 거는 exception이다.
- fault: unexpected. 예상치 못하게 수행하던 일을 마치지 못하면 fault handler가 작동한다.
그렇다면 i/o 들은 데이터를 어떻게 메모리에 로드할까?
I/O가 데이터를 메모리에 올려두는 방법
DMA: 하드디스크에서 직접적으로 메모리에 access해서 데이터를 올리는 방식이다.
즉 I/O에서 바로 main memory로 이어지기 때문에 cpu를 거치지 않고도 접근 가능하여 빠르게 수행 가능하다.
Hardware Protection
: not security. protection
즉 공격을 막는 것이 아니라 접근을 제한하는 것이다.
I/O protection, memory protection, cpu protection 등이 있다.
- I/O protection: 프로그램이 I/O 장치를 고장내거나 독점하는 것을 막는다.
- memory protection: 운영체제에 실행하고 있는 프로세스가 자신에게 할당된 것 외의 메모리 공간을 접근하는 것을 막는다.
- cpu protection: 한개의 프로그램이 cpu를 독점하는 것을 막는다.
I/O protection - Dual-Mode operation
: 예상치 못한 상황에서 system을 보호하기 위함이다.
user mode, kernel mode 두가지이다.
- user mode: 사용자 모드 즉 사용자 프로그램이 실행되는 모드이다.
- kernel mode: system mode, monitor mode, 즉 운영체제가 실행되는 모드이다.
user mode에서 불법적인 명령어를 감지하는 경우 interrupt를 걸고 kernel mode로 전환한다.
user는 user mode에서 프로그래밍을 한다. 이때 kernel mode로 넘어가야 프로그램을 하드웨어를 사용할 수 있는데, kernel mode로 전환은 어떻게 할까?
system call
: 내부의 프로세스가 되는 코드이기 때문에 이는 exception, 그 중에서도 trap에 해당한다.
read() 라는 system call을 사용한다면 현재 프로그램의 데이터를 저장하고 kernel mode로 진입하고, os의 trap handler가 이를 처리한다. 즉 운영체제의 도움을 받아 하드웨어를 사용할 때 sys call을 사용하는 것이다.
memory protection
: 정해진 메모리 영역만 사용하여 다른 프로세스에게 영향이 가지 않도록 보호한다.
base register~limit register 까지만 접근을 허용하고 이를 넘어가는 경우에는 Interrupt를 걸어서 막는다.
대표적인게 segmentation fault
cpu protection
: cpu를 독점하지 못하도록 보호한다.
Timer interrupt
- specific period 가 지나면 주기적으로 interrupt를 걸도록 한다. 이때 running 상태이던 process는 ready queue로 보내진다.
- for time sharing
- load-timer is a priviledged instruction이다. 즉 os만 load가능하다.
'STUDY > 운영체제' 카테고리의 다른 글
synchronization (0) | 2021.12.02 |
---|---|
process scheduling (0) | 2021.12.01 |
multi-thread programming (0) | 2021.11.30 |
process concept (0) | 2021.11.29 |
os system structure (0) | 2021.11.28 |