널널한 개발자의 운영체제 강의 요약

Roeniss Moon·2022년 5월 28일
1

아래 영상부터 시작하는 운영체제 강의 시리즈에 대한 요약

운영체제 강의 예고

생략 (공룡책 목차를 보며 전반적인 강의 계획을 얘기하는데 저작권 문제로 책 바꿈)

컴퓨터가 3층집인건 알고 있죠?

컴퓨터는 3층집 = 피지컬 (H/W) + 로지컬(S/W; 커널+유저 영역)

Logical 을 Virtual 라 생각하면 이해하기 쉽다.

운영체제는 커널 영역에서 유저 레벨을 Support 하며 물리 레벨을 Control(Manage) 한다.

Interrupt: 방해하는 것

컴퓨터는 주변기기와 통신(입출력)하는데, 이때 인터럽트가 발생함.

인터럽트에서 DirectX까지

I/O Interrupt: (1) 데이터 전송을 요구하거나 (2) 전송이 끝났을 때 (다음 동작이 수행되어야 할 때)

예전엔 CPU 가 RAM 을 직접 통제했는데, 이젠 간접적인 방법을 사용: 메모리 매니저 역할 (입출력 관리자; 브릿지 칩셋)의 칩을 통해 간접적으로 통제.

내부 인터럽트: 일명 Trap.잘못된 명령 또는 데이터 사용

인터럽트가 요청됨 -> CPU가 일시중지 (현재 상태를 백업 - PCB, PC, ...) -> ISR (Interrupt Service Routine) 실행

DirectX: 유저 레벨에서 커널 쪽 단계를 스킵하고, 유저 레벨에서 비디오 드라이버에 바로 액세스할 수 있도록 한 기술. 이를 통해 고성능 게임을 구동하는 것

DMA를 알면 고성능 소켓이 보인다!

CPU - RAM - (I/O Manager) - Device

RAM의 일부 영역은 Device 를 위해 예약되어 있음

CPU 안에도 메모리가 있음 (캐시 등) 그러나 임의로 사용이 불가

I/O Manager는 메인보드에 꽂혀있음

기본적인 데이터 전달 플로우: CPU 에서 RAM 의 예약된 영역에 데이터 복사 -> RAM 의 다른 영역에 데이터 복사 -> Device 의 RAM 영역에 그 데이터 복사

DMA (Direct Memory Access): CPU 에서 다이렉트로 Device RAM 영역에 꽂아버리기 - NIC (Network Interface Card) 얘기할 때 많이 나옴. (보통 NIC가 DMA를 지원함)

Process 가 데이터를 송신할 때: File (Socket) 에 send (write) -> 소켓에 딸려있는 I/O Buffer에 차곡차곡 복사됨 -> 커널 영역의 TCP/IP 레이어에 내려오면서 Segmentation 발생 -> 커널의 버퍼들에 데이터가 복사됨 -> 커널의 드라이버를 통해 NIC에 전달 -> 외부로 이동

그런데 커널의 메모리와, 소켓의 메모리와, 프로세스 영역의 메모리는 모두 RAM 의 어딘가다. 그런데 만약 NIC 도 메모리가 있다면? => 윈도우의 IOCP 가 이런걸 활용환 원리: OS 에서 유저 영역 메모리에 락을 걸고, NIC 에서 여기에 바로 데이터를 꽂아줌.

가상환경, 즉 VM 이란: (여기선 전가상화만 얘기함) 기존 유저 영역을 유저/커널 영역으로 간주하고, 커널 영역을 H/W 로 간주하는 Guest OS 를 만드는 것 - 두 VM이 데이터를 주고받을 때 (실제론 커널 영역에 있는) NIC 두 개를 통해서 양쪽 유저 영역이 데이터를 주고 받는게 아니라, "했다 치고" 실제론 메모리 영역에 데이터를 copy 해버림. 이렇게 해서 성능을 끌어올릴 수 있음.

CPU도 당신처럼 '예측'하고 미리 움직인다.

'예측'이라고 하는 것은 캐시 메모리 (L1, L2, L3) 에서 발생한다. L1 은 Instruction/Data 로 나누기도 함.

캐시 히트, 캐시 미스.

CPU도 당신처럼 '예측'하고 미리 움직인다. 두 번째

CPU는 연산을 하고 RAM 은 명령을 포함한 데이터를 가지고 있다. CPU는 1ns로 일하는데, RAM 은 50배 느린 50ns.

패러다임이 바뀌었다: CPU는 코어가 8개, 16개지만 GPU는 코어가 4000개. 그러나 목적은 서로 다르다. AI 분야에선 GPU를 연산에 활용 중.

패러다임이 또 바뀌고 있다: RAM에서 연산을 해, 말어? (ex. 하이닉스 차세대 반도체 PIM; Process-In-Memory) "전처리를 메모리에서 하겠다" - 라면왕 이철호의 감튀 사례

CPU가 예측해서 발생한 심각한 문제

멜트다운, 스펙터 공격: 직접 값을 읽는 대신 CPU (와 캐시 등)의 특성을 이용해 값을 유추해내는 공격들

VM (전가상화)에서도 비슷한 공격이 발생할 수 있다. 왜냐면 각 가상 머신의 CPU 들은 결국 PM 장비에 있는, 공용으로 사용되는 CPU Core 일테니까.

Chapter03 프로세스와 스레드 매우중요

이 챕터는 가장 중요한 챕터 중 하나가 될 것이다.

컴퓨터의 자원이란: CPU, RAM, HDD. 이 중 RAM, HDD 가 합쳐져 Virtual Memory 형태로 사용됨

프로세스 단위로 VM 이라는 자원을 제공 - PCB 로 관리
프로세스에 속한 스레드는 VM에 자유롭게 접근
스레드에게는 CPU 라는 자원을 자공 - TCB 로 관리

프로세스는 몇천개, 코어는 몇십개 - 이 부분의 병목을 해결하는게 OS: CPU Core를 시분할

PCB 에는 어떤 정보가 들어있을까:

  • pid: 모든 프로세스에 할당되어있는 정수값
  • 메모리 관련 정보들: 실행중인 code 영역 (text 영역)의 주소 등

프로그램을 실행한다 = 램 메모리에 적재한다 = 인스턴스화 한다 = 새 프로세스를 생성한다

I/O request: 대기 상태 (blocking)

OS는 ready queue에서 프로세스를 dispatch 해서 자원 할당 및 실행

윈도우는 쓰레드 중심, 리눅스는 프로세스 중심으로 이야기가 진행됨

Chapter03 프로세스 상태(휴식, 보류)와 문맥 교환

프로세스의 상태는 전이한다. 그리고 sleep, suspend 는 아주 특별한 상태.

sleep 은 자발적, suspend 는 외부요인: 발생하면 ready queue 에서 이탈했다가 이후 큐에 재진입. 따라서 sleep(10ms) 해도 실제론 10ms + a 만큼의 시간이 소요된다.

중지되었던 프로세스의 흐름(context)을 다시 이어하고 타 프로세스를 진행할 땐 교체된다 = context switchinig

프로세스의 연산 상태는 모두 Register 에 저장됨. 예를 들면 PC(Program Counter)

Chapter03 프로세스 생성과 복사 fork()와 exec()

OS는 새 프로세스에게 '가상' 메모리를 제공한다는 것 - 새 프로세스를 생성하고, 가상 메모리를 할당하고, 그 영역으로 기존 데이터를 "옮긴다".

각 프로세스는: PCB, VM space 를 가진다.

이 프로세스(parent)가 새 프로세스(child)를 만든다면:

Win32APILinux
CreateProcess()fork(), exec()
ExitProcess()exit()
WaitForSingleObject()wait()

프로그램이 실행된다 = 생성 -> 메모리 복사 (VM) -> 실행 코드 복사 -> PCB 생성

윈도우와 달리 리눅스에선 두개의 콜이 있다: fork가 되면 부모 프로세스 내용을 통째로 자식 프로세스에 복사해버린다. 이후 상태정보같은것만 초기화. 그런데 이렇게만 하면, 부모 프로세스가 종료되어 버리는 문제가 있다. 반면 exec 은 자식이 부모를 그대로 대체해버리는 콜.

tbd

profile
기능이 아니라 버그예요

0개의 댓글