2022. 9. 20. 21:05ㆍ강의 내용 정리/운영체제
Introduction
1. 컴퓨터란?
컴퓨터 하드웨어 위에서 컴퓨터 소프트웨어가 수행하는 장치
컴퓨터 하드웨어는 cpu, 메모리, io 장치로 구성된 장치이다. 메모리는 주기억장치(메인메모리), 보조기억장치(세컨더리 스토리지)로 나눌 수 있다. 일반적으로 컴퓨터를 지칭할 때 pc를 의미하지만 조금 더 넓은 측면에서 바라본다면 Server computer도 있고, Embedded computer 등등도 있다. 컴퓨터의 정의를 기억하고 보면 더 넓은 범위에서 컴퓨터를 구분할 수 있다.
위의 정의 상에서는 옛날 자동차는 컴퓨터가 아니지만 요즘은 컴퓨터가 맞다고 할 수도 있다. 아반떼는 mcu가 연결되어서 연산을 처리한다. 대표적으로 테슬라는 커다란 메인보드가 동작들을 제어한다. TV 또한 브라운관 티비인 경우에는 아날로그이지만 디지털 티비 이후에는 컴퓨터라고 할 수 있다. 임베디드 컴퓨터가 이러한 장치들에 관한 컴퓨터를 처리하는 역할을 한다. 셋탑박스, 게임기 등등 점차 종류가 많아지고 있다.
cf) Firmware
하드웨어는 바꿀 수 없는 집합체, 소프트웨어는 바꿀 수 있는 집합체를 의미한다.
ex) 컴퓨터 소프트웨어의 생애주기
요구사항 분석 - 소프트웨어 설계 - 소프트웨어 개발 - 소프트웨어 테스트 - 유지보수
유지보수는 소프트웨어 생애주기에서 80~90%의 비중을 차지한다. 즉, 소프트웨어는 유지보수과정에서 바뀌기 쉽다.
firmware는 하드웨어에 포함된 소프트웨어로 하드웨어나 소프트웨어 사이의 중간 것을 의미한다. 즉, 소프트웨어이지만 rom에 저장돼서 동작하는 소프트웨어이기에 이를 수정하기가 쉽지 않다. 이를 바꾸기 위해서는 rom을 빼고, 프로그램을 바꾼 rom을 다시 집어넣어야한다. 최근에는 스마트폰에 저장된 os를 비롯한 프로그램도 firmware라고 하기도 한다. 이는 플래시 메모리처럼 지우고 만들 수도 있다.
2. 운영체제란?
컴퓨터 하드웨어 자원을 관리해서 소프트웨어가 잘 돌아갈 수 있도록 돕는 소프트웨어이다. 그 위의 어플리케이션 소프트웨어가 잘 돌아가도록 지원해주는 역할을 한다.
컴퓨터 하드웨어는 cpu, 메모리, io 장치로 구성된 장치이다.
따라서 운영체제는 cpu를 관리하고, 메모리를 관리하고, io 장치를 관리하는 역할을 한다.
cpu 관리
운영체제는 cpu에서 많은 프로그램들이 수행될 때 잘 나눠서 수행할 수 있도록 도와준다. 그래서 프로세스 관리, 쓰레드, 프로세스간 데이터 전달 및 공유 등등에 관한 내용을 배울 것이다.
메모리 관리
운영체제의 가상 메모리 운영기법 덕분에 메모리 제한을 넘어서는 프로그램도 사용가능하다. 이러한 부분에 대해서 관리하는 것을 의미한다.
i/o 관리
운영체제는 hdd, ssd와 같은 스토리지에 존재하는 파일들을 관리하는 역할을 한다. 파일 시스템이 이러한 역할을 한다. 또한 그래픽 장치를 다루는 기능, 마우스나 프린터 등등을 제어하는 것도 운영체제에서 제어한다.
운영체제
PC에서 사용되는 운영체제
window, 맥, 리눅스 등등이 있다. 리눅스를 사용하는 것이 좋다.
서버컴퓨터에서 사용되는 운영체제
유닉스, 리눅스, 윈도우즈 서버 등등이 있다. 과거에는 유닉스가 대부분이었지만 오픈소스 소프트웨어가 확산되며 오픈소스 소프트웨어의 기반인 리눅스가 점차 확산되고 있다. 클라우드 컴퓨팅도 대부분 리눅스를 기반으로 만들어졌다. 하지만 아직도 은행, 관공서, 학교 등등에서 운영하는 서버는 유닉스 기반인 경우도 많다.
임베디드 컴퓨터에서 사용되는 운영체제
안드로이드, 라즈베리파이, 마이크로 소프트 윈도우 등등이 있다. 라즈베리파이는 리눅스 기반이다. 과거에는 윈도우로 많이 사용했다가 요즘에는 안드로이드를 많이 사용한다. 안드로이드 또한 리눅스 기반이다. 상용 운영체제(rt os) 중 가장 많이 팔리는 것은 VXWorks이다. RT OS 시장은 자주 바뀐다.
스마트 티비에서 사용되는 운영체제는 리눅스이다. lg에서 안드로이드 기반의 티비도 만들기는 했지만 대부분은 리눅스를 기반으로 만든다. 리눅스는 무료이기에 이를 사용하는 경우가 많다. 프린터 또한 모두 리눅스이다. 임베디드 시스템도 매우 빠른 속도로 리눅스가 장악하고 있다. 앞으로 이러한 추세는 더욱 심해질 것으로 예상된다. 운영체제의 역사는 유닉스의 역사로 볼 수 있다. 유닉스에서 리눅스가 파생됐지만 이러한 리눅스는 운영체제를 장악하기 시작한다.
cf) 시장(회사) 측면
윈도우즈에 종속된 소프트웨어를 만들더라도 내수시장이 작기 때문에 기업 규모가 커지기 어렵다. 내수시장 기반인 경우에는 성장하기 어렵다. 그러나 게임 시장은 해외쪽으로 수출도 많이 하고 있기에 규모가 적절하게 커질 수 있다. 게임은 대게 server와 personal computer에 분포되어있고, 클라우드나 웹서비스는 server computer에 있다.
cf) language 측면
personal computer는 C++, C# 등을 가지고 만든다. server computer는 node js, java, 파이썬 등등을 가지고 사용한다. embedded computer는 C가 많이 사용된다.
운영체제 입장에서 컴퓨터 하드웨어
오른쪽에 있는 그림은 모두 i/o 장치이다. cpu, 메모리, io장치는 bus를 통해 연결되어있다. 데이터가 장치들 간에 왔다갔다할 때 버스가 한 대만 다녀서 한 장치에서 다른 장치에 데이터를 보내는 경우에는 다른 데이터는 전송할 수 없다.
i/o 장치는 크게 두 개의 부분으로 나눌 수 있다. i/o controller나 adapter로 나눌 수 있다.
컨트롤러는 슬롯에 보드를 연결해서 사용할 수 있다. usb controller는 메인보드에 내장되어있어서 널리 사용될 수 있다. 여기에 실제 i/o controller가 연결되어서 사용할 수 있다.
최근 PC Architecture
버스에 데이터가 매우 빠른 속도로 왔다갔다하는 것은 메모리이다.
AGP(그래픽 카드) 또한 데이터 버스의 속도가 매우 빠르다. RGB인 경우에는 8비트, 즉 각각 1바이트씩 필요하게 되는데, 해상도와 메모리 속도에 따라 데이터 전송량이 더 많이 필요하게 된다. 이는 northbridge 혹은 system contoller, memory controller hub라고 한다. 느린 i/o 장치는 아래에 위치한다.
Computer system components (Abstract view)
컴퓨터 하드웨어와 프로그램 사이에는 운영체제가 있다.
system programs는 컴퓨터를 활용하기 위해서 운영체제 만들어놓은 프로그램이다. 예를 들어 윈도우즈 탐색기 등이 될 수 있다. 이를 다르게 표현하면 운영체제를 설치하면 운영체제와 함께 설치되는 프로그램이다. 하지만 최근에는 편의 상 여러 프로그램을 함께 설치하기에 이를 판단하기 어렵다. 이를테면 웹브라우저는 시스템 프로그램은 아니지만 운영체제를 설치할 때 함께 설치가 된다.
application program은 특정한 목적으로 컴퓨터를 사용하기 위해 실행시키는 프로그램이다.
OS is a resource manager
운영체제는 프로그램들이 컴퓨터 하드웨어가 어떻게 돌아가는지 몰라도 프로그램이 이를 사용할 수 있도록 쉬운 인터페이스를 제공하는 역할을 한다. 이는 시스템 콜(System call)이라고 한다.
ex) hello world를 출력할 때 그래픽카드와 모니터를 제어하지 않아도 출력할 수 있다.
또한 운영체제는 컴퓨터 하드웨어가 놀지 않고 최대한 효율적으로 수행되도록 관리하는 역할도 맡는다.
(1) Abstraction
컴퓨터 하드웨어를 잘 몰라도 쉽게 사용할 수 있도록 추상화하고, 캡슐화한다.
(2) Sharing
- Time multiplexing
- Space multiplexing
(3) Protection
프로그램이 다른 프로그램의 실행을 멈추게 하거나, 다른 프로그램의 개입 등을 막아주는 역할을 한다.
(4) Fainess
각 프로그램이 모두 공정하게 자원을 나눠가질 수 있도록 한다.
(5) Performance
성능이 좋게 자원을 분배한다.
운영체제의 정의
- Resource allocator
- Control program
- Kernel
운영체제는 일반적으로 kernel과 system program들을 합한 것을 의미한다. 리눅스는 kernel이라고 얘기하는 경우가 많다. 리눅스 커널과 이를 이용해 시스템 프로그램을 모아서 pc에 설치할 수 있도록 만든 프로그램의 집합을 리눅스 배포판(distributer)이라고 한다. 예를 들어 우분투는 리눅스 커널에 이에 필요한 시스템 프로그램의 집합을 합쳐서 만든 배포판을 의미한다.
운영체제의 커널은 메모리에 상주해서 항상 실행되는 프로그램을 의미한다.
Computer HW architecture (Abstract view)
cpu, memory, i/o 장치가 버스로 연결되는 것을 컴퓨터 하드웨어라고 한다. cpu는 ALU, CU, MMU로 나눌 수 있다.
- ALU: 수학/논리/데이터전달 등등의 역할을 한다.
- MMU: 메모리 관리의 역할을 한다. 가상 메모리
우측에 있는 것은 cpu 내에 임시로 데이터를 저장하는 레지스터이다. PC는 program counter, IR은 Instruction register이다. PSW는 program status word를 의미하며 프로그램의 상태를 나타낸다. SP는 stack pointer로 함수를 호출할 때 임시로 데이터를 저장하고, 반납하는 역할을 할 때의 스택에 저장하는데, 이 스택의 top을 가리키는 역할을 한다. General purpose registers는 이름 없이 r1, r2 등등으로 표현하기도 하는데 더하거나 곱할 때 임시로 사용하는 레지스터이다.
cpu 동작 과정
세컨더리 스토리지에 있는 데이터를 memory에 로딩(적재)할 때 cpu는 실행시킬 명령어를 메모리에서 읽은 뒤, instruction register에 올린다. IR이 실행될 때 ALU에 관한 명령어를 실행한다. 그 뒤에 cpu는 다음 명령을 불러온다. 이때 PC는 실행시킬 명령어의 메모리 번지를 가리키고 있어서 cpu가 이를 잘 가리킬 수 있도록 한다. pc는 32비트 기준으로 4바이트씩 증가한다.
CPU operation
폰 노이만 아키텍쳐 vs 하버드 아키텍쳐
폰노이만 아키텍쳐는 cpu에서 프로그램을 실행할 때 메모리에서 명령어를 읽어온 뒤 실행시키는 과정을 반복하는 아키텍쳐를 의미한다.
연산자 종류
산술연산, 논리연산, control flow 연산, 데이터 연산 등등이 있다.
i/o 장치를 통해 읽고 쓰는 것은 input, output이라 하고, 메모리장치에서 읽고 쓰는 것은 load, store라고 한다. move는 메모리나 i/o 장치를 구분하지 않고 사용한다. 특히 move는 레지스터간에 이동을 할 때는 많이 사용한다.
컴파일과 링킹과정을 거치면 실행파일을 만들 수 있다.
Bootstrapping in Linux
컴퓨터 전원이 켜졌을 때 CPU는 정해진 특정 번지에서 메모리를 읽어온 뒤, 그 명령어를 실행한다. 해당 명령어는 ram에 저장되면 안되기에 전원이 꺼져도 메모리가 존재있는 rom에 저장한다. 해당 rom 영역을 예전에는 bios라고 불렀고, 최근에는 uefi라고 부른다. 결국 처음에 부팅했을 때 실행하는 코드가 BIOS/UEFI에 존재하게 된다. 이 펌웨어가 실행되는 코드에서는 기본적으로 하드웨어 초기화와 하드웨어 테스트를 실행한다. 메모리가 잘 있는지, i/o가 잘 있는지 등등을 테스트하는 역할을 한다. 이는 POST(Power On Self Test)라고 한다.
이후 Boot Loader를 실행시키는데 초창기 리눅스의 로더는 LILO라고 불렀는데, 리눅스 배포판이 사용되는 로더는 GRUB라고 한다. 이러한 부트 로더는 MBR(in BIOS), ESP(in UEFI)에 있다. BIOS/UEFI에 있는 부트로더를 읽어서 메모리에 올리고 점프하는 역할을 BIOS/UEFI가 수행한다. 부트로더는 운영체제의 커널을 읽어서 그 곳으로 점프하는 역할을 한다. 그 뒤 운영체제가 수행된다.
CPU는 PC에서 명령을 읽어온 뒤 명령을 실행하는 역할을 매우 빠른 속도로 한다.
3. CPU
Instruction Set Architecture (ISA)
CISC vs RISC
초기 프로그램을 기계어/어셈블리어로 동작시키다가 instruction set이 많아지고 복잡해진다. 이에 따라 cpu가 너무 복잡하게 됐다. 이러한 방식은 CISC 방식이라 한다.
하지만 instruction이 많아 너무 복잡해졌기에 이를 줄이기 위해 정말 필요한 instruction만 만들고, 이를 활용해 복잡한 instruction을 구현하는 방식으로 바뀌었다. 이러한 방식을 RISC라고 한다. instruction 개수를 줄이니 cpu 클락을 높이고, 해쉬메모리를 통한 성능개선에 초점을 맞출 수 있어 cpu 성능이 많이 늘고 컴파일러 기술이 발전하게 되었다.
Pipelining
Fetch, Decode(연산 결정), Excute, Wirte back
RISC 방식에서는 위의 네 단계로 cpu의 동작을 진행했다. 여기서 각 단계별로 독립적으로 동작시킬 수 있기에 파이프라인을 만들어서 동작을 빠르게 만들 수 있다. 덕분에 CPU 성능이 매우 급속도로 성장하게 되었다. 이후에는 ILP을 통해 cpu의 성능을 증가시켰다.
Instruction-Level Parallelism(ILP)
Superscalar vs VLIW
Superscalar는 디팬던시가 없어 동시에 실행시켜도 되는 명령어를 한번에 실행시키는 것을 의미한다. VLIW는 하나의 명령어에 여러 명령어를 동시에 실행시켜서 한번에 실행시킨다.
Concurrent vs Parallel(Simultaneous)
코어가 두 개 이상 있어서 프로그램을 각 코어에서 사용하는 경우에는 Parallel이라고 한다. 하나의 코어에서 여러 프로그램을 번갈아가며 수행되는 것은 Concurrent라고 한다.
이와 관련해선 이전에 포스팅을 올렸으니 참고하면 좋을 것 같다.
메모리 집적도가 높아져서 cpu 코어별로 레지스터들을 둘 수 있다.
시스템 아키텍쳐
(1) SMP
cpu를 여러개 두어서 성능을 향상시키는 대용량 컴퓨터는 메인메모리를 cpu들이 공유하는 형태를 Symmetric multiprocessing architecture라고 한다.(SMA, SMP) 우리가 접속하는 웹서버는 CPU가 4개가 들어가있고, 메인메모리를 모두 쉐어하는 형태를 하는 경우가 많다.
(2) NUMA
CPU별로 메모리를 독립적으로 가지고, 서로 데이터를 공유할 일이 있으면 interconnection 하는 형태도 존재한다. 이는 NUMA(Non-Uniform Memory Access) multiprocessing architecture라고 한다. 이러한 아키텍쳐는 cpu가 연산/계산을 많이 사용하는 슈퍼컴퓨터에서 사용해야한다. 예를 들어 일기예보와 같은 것은 해당 아키텍쳐를 사용한다. 연산이 적으면 SMP 아키텍쳐를 사용하는 경우가 많다.
(3) Clustered system architecture
서버 컴퓨터나 데이터 센터에 들어가 있는 것은 메인보드가 존재하고, 이것들이 네트워크로 연결되어서 성능을 개선하는 것이고, 하드디스크 등의 세컨더리 스토리지는 함께 쉐어한다. 이러한 경우를 Clustered system architecture로 구글과 같은 서버에 많이 사용한다.
병렬시스템은 cpu를 하나의 보드에 여러개 넣어서 구현한 시스템 등등 cpu들 간에 서로 빠르게 interconnection을 하는 시스템 의미한다. 분산 시스템은 컴퓨터를 네트워크로 연결한 것을 의미한다. cluster는 내부적으로는 SMP가 되고, 이런 컴퓨터들을 모두 네트워크로 연결한다는 특징이 있다.
4. I/O operation
cpu가 I/O instruction을 통해서 I/O 컨트롤러에게 I/O request한다. 그러면 I/O 컨트롤러는 각 디바이스에게 작업을 수행하는 동작을 한다. I/O 컨트롤러도 작은 컴퓨터처럼 동작해 IR, DR이 존재한다. IR의 명령어에 따라 DR에 저장된 데이터들이 작업하는 식으로 동작한다.
디스크에 관한 I/O 작업을 할 때는 느릴 수 있기 때문에 cpu가 이를 동작시키고 다른 일을 수행하다가 Programmed I/O나 Interrupt 방식을 통해 I/O가 끝난지 확인한다. Programmed I/O는 cpu가 가끔씩 폴링을 통해 다 끝났는지를 확인하는 것을 의미한다. Interrupt는 I/O 동작이 다 끝나거나 이벤트가 발생하면 I/O 컨트롤러가 cpu에게 알려주는 방식을 의미한다.
1) DMA
키보드의 경우에는 어떤 키를 입력했는지 저장하는 데이터의 크기가 2바이트 수준으로 매우 작다. 어떤 키가 눌리게되면 keyboard controller가 interrupt controller를 통해 cpu에게 interrupt를 날린다.
하지만 디스크는 데이터의 크기가 무척이나 크다. 따라서 디스크 컨트롤러가 메모리에 있는 버퍼에 직접 데이터를 써야하는데, 이에 직접 접근해서 쓰지 못한다. DMA 컨트롤러를 통해 CPU가 메모리를 사용하지 않을 때 메모리에 버스를 통해 접근하는 방식을 DMA(Direct Memory Access)라고 한다. DMA는 데이터의 크기가 큰 I/O 장치가 사용하는 방식이다.
2) Interrupt
(1) Interrupt-driven I/O cycle(운영체제 내부에서 I/O 요청할 때)
cpu가 I/O장치에게 해야할 일을 요청한다. interrupt가 발생하면 cpu는 하던 일을 중단하고 하던 일을 저장한 뒤, interrupt를 처리한다. ISR(interrupt service routine)나 interrupt handler를 통해 interrupt를 처리하고, 이후에 운영체제가 동작하고, CPU가 진행하던 동작을 진행한다.
(2) application program 입장에서 I/O가 필요해서 I/O를 요청할 때의 방법
I/O 요청 시 에플리케이션 프로세스가 I/O가 다 끝날 때까지 기다리는 방식은 Synchronous/Blocking이라한다. 만약 I/O 요청 후 어플리케이션은 다른 일을 수행하다가 끝나면 I/O 결과를 처리하는 방식은 Asynchronous/ Non-blocking이라 한다. 어플리케이션은 디폴트로 Synchoronous/Blocking 방법을 사용하는데 운영체제와는 다르게 기다리는 동안 프로그램이 돌기 때문에 cpu의 낭비가 없기 때문이다. 예를 들어서 cin을 통해 데이터 입력을 기다릴 때 키보드 입력이 올 때까지 이를 기다리는데 이러한 방식을 대부분 취한다.
3) Interrupt의 세분화된 단계
(1) Interrupt
하드웨어 디바이스에서 이벤트가 발생해서 전달하는 것으로 하드웨어 interrupt라고 표현하기도 한다. 비동기적으로 동작한다.
(2) Trap
어플리케이션 프로그램에 의해 이벤트가 발생해 전달하는 것이다. 예를 들어 system calls이 있다. 어플리케이션이 운영체제에게 요청할 때 사용하는 인터페이스는 system call이라 한다. 이는 소프트웨어 interrupt라고 하기도 한다. 동기적으로 동작한다.
(3) Fault (Exception)
CPU가 자기자신에게 interrupt가 걸린다. 비정상적인 상황이 발생해 스스로 어떤 문제를 해결할 수 없을 때 interrupt를 건다. 이때 interrupt handler가 수행되는데, 이는 운영체제의 일부이기도 하기에 운영체제가 수행된다. 운영체제는 이러한 문제를 해결해준다. cpu 명령어를 본인이 모르는 경우에는 이를 수행한다. 참조할 수 없는 메모리를 참조하면 자기 자신에게 interrupt를 거는 protection fault이다. 운영체제가 동작할 때는 page fault가 발생한다. 이는 Exception이라고 하기도 한다. 동기적으로 동작한다.
5. Memory(Main memory)
스토리지(Memory) hierachy
1) ROM vs RAM
ROM: Read Only Memory
RAM: Random Access Memory
ROM은 읽기만 가능하고 쓸 수는 없다. RAM은 랜덤한 위치에 읽고 쓰는 것이 가능하다. RAM은 메인 메모리를 의미하고, 이는 전원이 꺼지면 데이터가 날라간다. ROM은 전원이 꺼지더라도 데이터가 계속 저장되는 메모리이다.
2) SRAM vs DRAM
SRAM: Static RAM
DRAM: Dynamic RAM
SRAM은 캐쉬메모리에 사용되고, DRAM은 메인메모리에 사용된다. 전원이 켜지면 데이터를 유지할 때 한번 저장할 때 계속 값을 저장하는 소자는 SRAM이고, 한번 데이터를 저장한 뒤, 시간이 지났을 때 값이 없어지는 것은 DRAM이다. DRAM은 계속 리프레쉬를 해야한다. SRAM의 가격이 DRAM보단 더 비싸고, DRAM은 메모리에서 리프레쉬하는 동안에는 엑세스가 안되기에 느리다. 따라서 이는 상대적으로 저렴하기에 메인메모리에서 사용된다. SRAM은 빠르지만 비싸기에 캐쉬메모리에 사용된다.
3) Storage 종류
레지스터는 CPU 안에 있다. main memory는 cpu와 별도로 존재한다. 캐쉬는 cpu와 메인메모리 사이에 있는 임시 저장장치이다. 아래로 내려갈수록 값이 싸지고, 용량이 커진다. 위로 올라갈수록 성능이 빨라지고 비싸진다.
ssd는 플래시 메모리를 사용해서 사용하는 것이었다. 초기에 ssd가 나왔을 땐 메인메모리보다 비쌌지만 지금은 더 싸다.
백업용도나 dvd, cd를 저장할 때 optical disk를 사용한다.
magnetic tapes은 언론사, 은행 등에서 매우 큰 용량의 내용을 저장할 때 사용한다. 은행은 트랜잭션을 저장할 의무가 있어서 많이 사용한다.
HDD
디스크의 면에 내용이 저장된다. 가운데의 원은 트랙이라 부르고, 트랙을 잘라서 관리하는데 이 단위는 섹터라고 한다. arm에서 헤드가 있는데 이를 옮겨서 원하는 데이터를 읽는 식으로 동작한다. 하드디스크는 빙글빙글 돌면서 이를 처리한다.
여러개의 플래터의 track을 이은 것이 실린더이다. 데이터를 저장할 때는 선형적으로 저장하고, 뒷면을 저장하고, 그 다음장으로 저장하는 방식을 사용한다. 따라서 이러한 데이터의 묶음을 실린더라고 할 수 있다.
SSD
아주 작은 컨트롤러가 있고, 이 컨트롤러가 연결되어있는 플래시메모리가 있다. 컨트롤러에는 arm core가 있고, 작은 규모의 SRAM 등을 가지고 있기에 이는 작은 컴퓨터처럼 볼 수 있다. NAND Flash Memory는 메모리 read가 느리지만 Write를 할 때는 어느정도 성능이 좋다. 반면 NOR Flash Memory는 메모리 read는 빠르지만 Write은 매우 느리다.
FTL을 추가해서 파일시스템 기능을 넣어 성능을 높이는 동작을 하기도 한다.
4) Memory hierachy
메인 메모리에서 데이터를 가져오는 것보다 캐쉬에서 데이터를 가져오는 것이 더 빠르다. 한번 메인 메모리에서 데이터를 가져온다면 이후에는 캐쉬를 통해 가져오는 경우가 많다. locality의 법칙에 따라 프로그램의 20%가 실행 시간의 80%를 담당하기 때문에 20%를 캐쉬에 담아놓으면 성능이 빨라질 수 있다. 캐쉬메모리는 운영체제나 소프트웨어가 관여하지 않고, 하드웨어에서 다루게 된다. 만약 루프를 통해 구현한다면 반복적으로 코드를 동작시키는 것이기에 이를 캐쉬에 올려놓는 경우가 많다.
(1) Write Through vs Write Back
Write Through는 캐시메모리와 메인메모리에 write하는 방식을 의미한다.
Wrtie Back은 캐시메모리에만 write하고 이후에 한번에 메인 메모리에 Write하는 방식을 의미한다.
Write Back이 더 빠르기에 이를 기본적으로 사용한다.
(2) Cache coherency
여러 CPU가 존재할 때 CPU는 캐시 메모리를 각각 가지고 있다. 하지만 메인 메모리는 하나를 가지고 공유한다. 만약 한 cpu에서 메인 메모리의 내용을 변경할 때 다른 cpu가 공유하는 부분이라면 이를 다른 cpu의 캐시메모리의 값도 바꿔야한다. 이를 Cache coherency라고 한다. 이는 운영체제와 소프트웨어의 간섭없이 하드웨어적으로 해결했다.
6. 컴퓨터 시스템 연산
1) Hardware Protection
Protection은 내부의 비정상적인 동작에 대해 정상적으로 동작하게끔하는 매커니즘이다. Secure는 외부의 누군가로부터 비정상적으로 동작하지 않게끔하는 매커니즘이다.
(1) CPU Protection
한 프로그램이 cpu를 독차지하지 못하도록 도와준다. 운영체제가 CPU를 관장하고, 프로그램을 나눠주는 역할을 해서 이를 구현한다. 예를 들어 무한 루프를 도는 프로그램을 만드는 경우에도 다른 프로그램도 돌 수 있어야한다. 이를 해결하기 위해 운영체제가 주기적으로 실행돼서 이를 나눠야한다. 따라서 주기적으로 interrupt를 발생시켜서 운영체제에게 이를 알려서 실행시킨다.
주기적으로 interrupt를 발생시키는 디바이스는 timer라고 한다. 대부분의 운영체제는 10ms마다 interrupt를 건다. 즉, 초당 100번, 100Hz로 동작한다.
(2) Memory Protection
참조할 수 없는 메모리에 접근하는 경우에는 프로그램을 종료시키는 등의 보호를 해야한다. 운영체제가 수행해서 이를 막는다. 하드웨어 디바이스가 발생시키는 interrupt는 interrupt, 소프트웨어는 trap, 자기자신에 대한 interrupt는 exception이다. 따라서 이는 exception이 된다.
(3) I/O Protection
프로그램이 다른 I/O 장치를 접근하지 못하도록 막는다. I/O 작업은 운영체제만 해야한다. 프로그램은 파일시스템에 존재하는 실행파일을 의미한다. 프로그램이 수행될 때 디스크에 데이터를 저장한다면 이는 커널만 할 수 있기에 System call을 통해 운영체제가 동작하도록 시켜야한다. 이는 track에 해당하는 interrupt를 한다.
cf) Dual mode operation in CPU와 Privileged instructions only in kernel mode
I/O 장치에 명령을 내리는 instruction은 cpu의 유저모드에서는 실행할 수 없고, 커널 모드에서만 실행할 수 있도록 내장되어있기 때문에 I/O 장치에 직접 접근하고자하는 프로세스가 있다면 운영체제가 이를 판단하여 해당 프로세스를 멈추는 동작을 한다. 따라서 운영체제만이 특정 명령어를 실행할 수 있고, 이러한 특정한 명령어는 privileged instruction이라 한다.
system call
위의 예시에서 read라는 함수는 운영체제에 있기 때문에 이를 호출하는 것은 Operating System call을 하는 것이다. 따라서 이를 줄여서 system call이라고 이야기한다. 운영체제가 실행되기 위해서는 interrupt가 필요하다. 이는 소프트웨어에 의해 interrupt를 하는 것이기에 trap이되고 이에 따라 운영체제가 동작하면서 해당 함수를 수행한다. Read 함수가 웹서버인 경우에는 패킷을 리드하거나, 파일시스템을 리드하는 등 i/o를 제어하는 작업을 하고, 이후 동작을 하게 된다. 이러한 과정 중에는 어플리케이션 프로세스의 동작은 블락킹되어서 동작한다.
System call을 호출하면 운영체제로부터 서비스를 요청하게 되고, 함수 호출을 하면 운영체제가 요청한대로 하드웨어에 대한 작업을 수행하게 된다.
OS의 역할
종합적으로 보면 컴퓨터는 어플리케이션 프로그램이 수행되다가 운영체제가 수행되고 이는 번갈아가며 수행되는데 OS가 수행되는 것은 크게 세 가지 분류로 구분해볼 수 있다.
1. 부팅될 때 운영체제가 초기화작업을 한다.
2. 어플리케이션이 운영체제에게 서비스를 요청할 때 trap을 걸어 운영체제가 수행된다.
3. 하드웨어 디바이스에서 이벤트가 발생했을 때 cpu에게 interrupt를 걸어 운영체제가 수행된다.
Cf) timer: 가만히 놔둬도 10ms마다 실행된다.
컴퓨터의 역사
초기 컴퓨터는 폰 노이만이 만든 애니악이라는 컴퓨터이다. 이는 운영체제가 없고, 프로그래밍 언어나 어셈블리어가 없었기에 기계어로 코딩을 했다.
이후 트랜지스터가 나왔고, 컴퓨터라는 말 대신 메인프레임이라고 불렸다. 운영체제가 있지만 프로그램은 하나만 실행되고, 마무리되면 운영체제가 다음 프로그램을 실행시키는 순차적으로 실행되었기에 배치 시스템이라고 불렸다. 이 당시에는 운영체제라고 불리지 않았고, 항상 프로그램이 끝났나 안끝났나만 판단했기 때문에 Resident Monitor라고 불렸다.
또한 CPU는 빠르지만 I/O 장치는 매우 느리기 때문에 CPU가 낭비되었다. 이를 해결하기 위해 이후 멀티 프로그램 시스템이 등장했다.
현재의 OS의 기본적인 기능이 이 시대 때 만들어졌다.
IC가 발명되어서 크기가 작아졌다. 이때 컴퓨터 아키텍쳐가 나오고, IBM 컴퓨터가 나오기 시작했다. 3세대부터 운영체제가 필요한 기능이 결정된다. 프로그램을 메모리에 여러 개 올려서 프로그램 하나가 실행되다가 i/o 작업을 하면 다른 프로그램을 실행하는 식으로 CPU 이용성이 증가했다.
또한 작업이 오래걸리는 것들에 대해 병목 현상이 발생하는 것을 줄이기 위해 프로그램을 조금씩 돌아가며 실행하는 방식이 도입되었다. 이는 round-robin 방식이라고 한다. (Time sharing systems) 덕분에 반응 속도가 훨씬 좋아지게 된다.
IC의 집적도가 높아진 덕분에 PC가 등장했다. 이전에는 text command에 기반한 사용에서 이후 그래픽 유저 인터페이스가 나오고, 멀티미디어, 인터넷, Web, 네트워크 등등의 개념이 등장했다.
컴퓨팅 환경
전통적인 컴퓨팅은 메인프레임과 데스크탑 시스템으로 구분할 수 있다.
지금은 모바일 컴퓨팅을 하고 있다.
임베디드 시스템은 사물에 컴퓨터를 내장한 시스템을 의미하고 리얼타임 시스템은 일정 데드라인을 만족시키는 시스템을 의미한다. 하드 리얼타임 시스템은 데드라인을 맞추지 않으면 매우 큰 문제가 발생하는 시스템으로, 원자로 제어 시스템, 미사일 등등이 이에 해당한다. 소프트 리얼타임 시스템은 데드라인을 맞추지 않으면 여태 했던 일이 의미가 없어지는 시스템으로, 비디오 디코딩 등등이 이에 해당한다. 리얼타임 임베디드 시스템을 함께 사용하는 것은 옛날의 임베디드 시스템이 대부분 리얼타임 시스템이었기 때문이다. Ex) 공장, 미사일 등등
클라이언트 서버 컴퓨팅
데이터 센터에 있는 매우 큰 규모의 서버가 사용된다. 이때 사용하는 서버는 클러스터되어있는 서버로, 보드 하나 당 cpu가 여러 개 있고, 이는 메모리를 쉐어하는 SMP 구조로 이뤄져있다. 또한 렉에 연결되어있어서 distributed 형태가 되어있다.
Peer-to-peer computing
클라이언트와 서버로도 동작하는 컴퓨팅을 의미한다. 중앙의 서버가 없이 사용하는 것이 Gnutella, VoIP 등등이 있다.
Cloud computing
서버 팜에서 사용자가 일부를 돈을 내고 서비스를 사용하는 것을 의미한다. 가장 기본적인 기술은 virtual machine로, 필요한 만큼 자원을 사용하는 개념을 의미한다. cloud management services는 os로 부르는 경우가 많다.
IaaS는 infraStructure를 빌리는 것을 의미한다. 한달에 얼만큼 내고, 하드웨어 자원을 사용하는 것으로 그 위에서 운영체제를 설치해서 쓰는 것을 의미한다. 초기에는 많이 사용했지만 요즘은 PaaS를 많이 사용한다.
PaaS는 필요한 환경 설정을 하여 그에 맞게 환경까지 지원하는 것을 빌리는 것을 의미한다. AWS가 이에 해당한다.
SaaS는 Service나 software를 빌려서 사용하는 것으로 예를 들어 Gmail을 빌리는 것 등이 이에 해당한다.
하드웨어의 용량이 커서 운영체제를 하나만 돌리기 아깝기도 하고, 혹은 가상 머신을 만들어서 사용자에게 하나씩 전달하기 위해 이를 사용하는 경우가 있다. 가상머신을 관리하기 위해 VMM을 통해 이를 관리한다. 또한 각각의 가상 머신들이 수행되고, 이는 독립적으로 존재하게 된다.
PC에서도 VM을 많이 사용한다. 윈도우 위에 VMWare를 설치한 뒤 그 위에 Linux를 깔아서 사용할 수 있다. JVM(Java Virtual Machine)도 자바를 실행할 수 있도록 만들어준다.
자바의 키워드는 플랫폼 중립(platform-neutral)이다. 윈도우, 맥에서도 상관없이 돌아가도록 한다. 일반적인 프로그램은 운영체제에 서비스를 요청해야하기에 os에 맞게 설치를 해야한다. 이러한 경우에는 플랫폼 디팬던트하다고 한다. 자바는 cpu와 무관하고 자바에서 정의한 바이트 코드로 실행가능하다. 컴파일 후 실행파일로 만들면 이는 자바 바이트 코드로 나온다. 따라서 자바 바이트 코드는 JVM이 운영체제/cpu에 맞게 변환을 시켜 실행시킨다. 이는 편리하지만 운영체제에 맞게 바꿔야하기에 느리다. 느리다는 점을 해결하기 위해 JIT 컴파일러가 있다. 자바 프로그램을 웹에서 다운 받고, JIT 컴파일러를 통해 자바 프로그램을 운영체제에 맞게 컴파일하고 실행한다. 이러면 실행하는 속도는 빠르지만 컴파일 시간이 조금 오래 소요된다.
cf) 위에서의 플랫폼은 하드웨어와 운영체제를 합쳐서 이야기한다. 최근에는 안드로이드도 플랫폼이라 한다.
빅데이터를 하기 위해선 컴퓨팅 능력이 매우 많이 필요하게 되고, 이를 위해 Distributed computing이 중요해진다. 이를 위해 Hadoop, Spark가 쓰이고, 이러한 시스템은 매우 큰 시스템이 된다. 개발자는 이러한 빅데이터 플랫폼을 만들고 운영하는 데에 초점을 맞춘다.
OS의 역사
최초의 OS는 IBM OS/360이다. 메인 프레임의 이름도 동일하다. 이는 멀티 프로그래밍을 넣어 OS의 기본적인 역할을 하도록 했다. 그 이후에 time-sharing을 지원한 MIT CTSS가 등장했다. 그 이후에는 다양한 곳에서 함께 MULTICS라는 운영체제를 만들고자 했고, 이러다가 Unix가 만들어졌다.
유닉스의 역사
초기 유닉스는 어셈블리어로 만들어졌다. 1973년에 5 edition에서는 bell lab에서 c라는 프로그래밍 랭귀지를 만들고, 이를 활용해 유닉스로 다시 만들었다. 따라서 유닉스 운영체제는 세계 최초로 하이레벨 랭귀지로 만들어진 운영체제가 되었다.
유닉스는 크게 두 가지 계열이 있다. 하나는 System 5 계열이고, 다른 하나는 BSD 계열이다. BSD는 버클리 소프트웨어 디스트리뷰션을 의미한다. Bell Lab에서 지속적으로 개발한 것은 System5, 버클리 대학에서 지속적으로 개발한 것은 BSD이다.
XENIX는 최초로 PC에서 동작하는 유닉스이다. 또한 SunOS는 버클리 대학원생들이 창업한 회사인 썬 마이크로 시스템즈에서 SunOS라고 하는 유닉스를 얹어서 팔기 시작했다. 이후 썬 마이크로 시스템즈에서 자바도 만들었다. SunOS는 Solaris로 발전했다. 클라우드 서버는 리눅스가 대세지만 그 외에서는 유닉스가 대세이다. 그 중 60% 이상 차지하는 것은 Solaris이다.
MACH는 세계 최초의 마이크로 커널 기반 유닉스이다. 이는 CMU라고 하는 대학원에서 만들었다. NeXT Step은 MACH에서 발전해 만든 운영체제이자, 회사의 이름이기도 하다. NeXT Step의 마지막 사장이 스티브잡스이기에 매우 유명했다. 스티브잡스는 NeXT Step의 유닉스를 기반으로 유저인터페이스를 잘 정리해 Mac OS X(Ten)을 만들었다.
SGI Irix는 그래픽에 특화된 운영체제이기에 영화나 애니메이션을 작업할 때 사용하는 운영체제이다. 다양한 운영체제가 나왔지만 이후에는 POSIX라는 유닉스 표준이 등장했다.
Windows & Linux
초기 윈도우는 MS-DOS에서 시작했고, 이후 Windows NT를 만든 뒤, 최근에 쓰는 것도 이 기반으로 사용 중이다. 이전까진 블루스크린이 많이 떴지만 지금은 거의 안뜬다.
리눅스는 세가지 버전을 가지고 있다. 첫번째는 커널버전, 두번째는 메이저 리비전, 세번째는 마이너 리비전이다. 지금은 리눅스 커널 5점대일 것이다. 최근에는 리눅스 커널의 버전 업그레이드가 매우 빠르게 진행 중이다.
리눅스의 역사
리처드 스톨만이 GNU 프로젝트를 오픈 소스 소프트웨어의 컨셉 하에 진행했다. 이후 리눅스 토발즈는 리눅스 커널에 대한 프로젝트를 진행하다 GNU에 있는 도구들을 사용해 리눅스 배포판을 만들었다. 초기에는 잘 사용되지 않았지만 이후 오픈소스 소프트웨어가 등장해 잘 나가기 시작했고, 지금은 클라우드 시스템을 장악했고, 2000년대 이후 임베디드 시스템에도 많이 사용되기 시작했다. TV, 공유기(Personal router), 프린터 등등에서 사용되고, 안드로이드와 같은 모바일 디바이스에서도 리눅스가 쓰인다.
Distibuted System은 연구 목적으로 나왔다가 이젠 많이 사라졌다. Embedded system의 운영체제는 많다. 상용 임베디드 시스템 OS는 RTOS(Real Time Operation System)라고 한다. RT 시장에서 많은 점유율을 가지고 있는 것이 VxWorks이고, FreeRTOS, NuttX 등등도 많이 쓰였다.
Cisco 라우터는 Cisco가 많이 들어갔고, Qualcomm 칩에서도 이에 해당하는 OS가 들어간다.
'강의 내용 정리 > 운영체제' 카테고리의 다른 글
운영체제(6), Synchronization Tools (0) | 2022.12.18 |
---|---|
운영체제(5), CPU Scheduling (0) | 2022.12.18 |
운영체제(4), Threads & Concurrency (1) | 2022.12.18 |
운영체제(3), Processes (1) | 2022.12.18 |
운영체제(2), Operating System Structures (0) | 2022.12.18 |