간단한 소개
안녕하세요 쉬운코드입니다
개발을 잘하기 위해서는 운영체제(Operating System)를 잘 알고 있는 것이 중요합니다
왜냐하면 프로그램은 컴퓨터 위에서 동작하는데, 이 컴퓨터 시스템을 관리하고 통제하는 것이 OS이기 때문입니다
즉, 우리가 개발하는 프로그램은 OS를 통해 컴퓨터 시스템을 활용하기 때문에 성능 좋은 프로그램을 개발하려면 OS에 대한 이해는 필수입니다
이 글은 쉬운코드 유튭 채널의 운영체제 영상들을 어떤 맥락에서 어떤 흐름으로 보시면 좋은지를 정리한 글입니다
이 글을 먼저 읽고 나서 운영체제 영상들을 보시면 보다 더 잘 이해하실 수 있지 않을까 싶어요
참고로 많은 예제들이 자바로 되어있습니다
자바를 배우는 분들이 보시면 더 도움이 됩니다
그리고 각 영상에서 pinned 된 댓글들을 꼭 읽어주세요
영상에서 부족했거나 오해 소지가 있는 부분을 보충/보완 설명하기 때문입니다
끝으로 이 글에서 나열된 순서대로 영상을 보시는 것이 좋습니다
내가 짠 프로그램은 어떻게 실행될까?
이 영상은 원래 운영체제 목록에 있었지만 제가 잘못 설명한 부분이 있어서 운영체제 목록에서는 빠져있습니다
물론 잘못 설명한 부분은 일부는 제거를 했고 일부는 pinned 댓글에 설명해 두었으니 참고하시면 영상을 보시기에는 무리가 없습니다
이 영상은 프로그램이 컴퓨터에 어떤 식으로 실행되는지, 즉, 프로그램이 실행될 때 CPU와 메모리는 어떻게 연관이 있는 것인지 간략하게 이해하기 위한 목적의 영상입니다
👉 https://youtu.be/GIsr_r8XztQ
프로세스, 스레드, 멀티태스킹, 멀티스레딩 ..
개발은 프로그램을 만드는 것입니다
그리고 그렇게 만들어진 프로그램이 컴퓨터에서 실행되면, 실행 중인 프로그램을 프로세스라고 부릅니다
그렇다면 스레드는 무엇일까요?
그리고 멀티프로그래밍, 멀티태스킹, 멀티스레딩, 멀티프로세싱은 무엇을 의미할까요?
프로세스와 스레드는 무엇이고 운영체제는 여러 프로그램들을 어떤 방식으로 동시에 실행시키는지
그런 개념들을 배우게 됩니다
👉 https://youtu.be/QmtYKZC0lMU
컨텍스트 스위칭
이전 영상에서 배운 멀티태스킹이 가능하려면 여러 프로세스나 스레드가 번갈아 가면서 CPU에서 실행될 수 있어야 합니다
이때 CPU에서 실행 중이던 프로세스나 스레드가 대기 중이던 다른 프로세스나 스레드로 교체되는 것을 컨텍스트 스위칭(contet swithching)이라고 하는데요,
이번 영상은 이 컨텍스트 스위칭 개념을 살펴보고, 우리가 개발하는 프로그램의 성능에는 어떤 영향을 끼치게 되는지 배우게 됩니다
👉 https://youtu.be/Xh9Nt7y07FE
이쯤에서 보충 설명
아무래도 중요하면서도 헷갈릴 수 있는 내용들이라 티스토리 블로그에 추가로 글을 써두었어요
다음 영상으로 넘어가시기 전에 이 타이밍에 한번 정리하고 넘어가시면 좋을 것 같습니다~
👉 기술 면접에서 흔히 말하는 스레드는 어떤 스레드일까?
👉 멀티태스킹에서 CPU time slice는 고정일까? (이건 영상에는 없던 보충 내용입니다)
👉 CPU 코어에서 컨텍스트 스위칭 되는 건 프로세스일까 스레드일까
CPU bound, I/O bound
내가 작성하는 프로그램이 CPU를 많이 쓰는지 I/O를 많이 쓰는지에 따라 두 부류로 분류할 수 있습니다
이번 영상에서는 CPU bound 프로그램과 I/O bound 프로그램의 개념을 살펴보고
각 프로그램 성격에 따라 (멀티스레딩 개발 환경일 때) 스레드 수를 어떻게 조정하는 것이 좋은 지도 설명합니다
👉 https://youtu.be/qnVKEwjG_gM
동기화란 무엇인가?
앞에서 배운 멀티스레딩 환경에서는 같은 프로세스에 속한 스레드들끼리 메모리를 공유해서 사용하기 때문에
자칫 잘못하면 여러 스레드들이 같은 데이터에 접근하면서 이상한 현상이 발생할 수 있습니다
이번 영상의 전반부에서는 동기화가 없을 때 어떤 이상한 현상이 발생할 수 있는지를 살펴보고
영상 후반부에는 이런 이상한 현상을 방지하기 위한 개념들인
race condition(경쟁 조건),
동기화(synchronization),
critical section(임계 영역)
을 설명합니다
자바처럼 스레딩 모델을 적극적으로 사용하는 프로그래밍 언어의 경우에는 특히나 이 개념을 잘 알고 있는 것이 중요합니다
👉 https://youtu.be/vp0Gckz3z64
스핀락, 뮤텍스, 세마포어
락(lock)은 바로 앞에서 배운 동기화를 보장하는 툴(tool)입니다
그래서 매우 중요한 개념이고 이번 영상에서는 세 가지 종류의 락을 배우게 됩니다
참고로 뮤텍스 락은 그 개념 정의가 상당히 넓고 모호합니다
인터넷을 검색해 봐도 뮤텍스를 정의하는 방식이 천차만별이라 저도 제 다름대로 가장 이해하기 쉬운 방식으로 뮤텍스의 개념을 정리하게 됐습니다
👉 https://youtu.be/gTkvX2Awj6g
자바가 적극 사용하는 모니터
보다 더 사용하기 쉽고 기능도 추가된 락(lock)이 있습니다
바로 모니터(monitor)인데요,
이번 영상에서는 모니터가 어떤 락이고, 어떻게 이루어져 있고, 어떤 식으로 동작하는지를 예제와 함께 자세히 설명합니다
참고로, 자바의 모든 객체는 모니터를 내부적으로 하나씩 가지고 있습니다
그래서 자바의 synchronized 키워드가 이 모니터와 밀접하게 관련이 있습니다
이번 영상의 후반부에는 간단한 예제를 통해 자바에서 모니터가 어떻게 쓰이는지도 설명합니다
👉 https://youtu.be/Dms1oBmRAlo
데드락(deadlock)
락을 써서 동기화를 수행하다 보면 필연적으로 데드락이라는 부작용이 생길 수 있습니다
이번 영상에서는 데드락이 무엇이고, 발생하는 이유와 해결 방법을 배우게 됩니다
개발자가 데드락을 알아야 하는 이유는 데드락에 빠지면 더 이상 프로세스나 스레드가 진행하지 못하기 때문입니다
참고로, 데드락은 OS에서 등장하는 개념이기도 하지만 DB에서도 등장하는 개념이라서 잘 알고 계시는 것이 좋습니다
👉 https://youtu.be/ESXCSNGFVto
프로세스의 상태 변화
바로 직전 영상에서 프로세스나 스레드가 데드락에 빠지면 더 이상 아무것도 하지 못하게 된다는 것을 배웠습니다
이런 문제가 발생하면, 예를 들어 백엔드 서버 애플리케이션이 이렇게 된다면
개발자는 애플리케이션의 상태를 신속히 파악해서 어디가 문제인지 파악할 수 있어야 합니다
그런데 프로세스나 스레드가 어떤 상태를 가질 수 있는지, 그리고 그 상태가 무엇을 의미하는지를 모른다면 제대로 파악조차 할 수가 없겠죠
그래서 이 영상은 바로 이 부분을 다룹니다 (스레드도 별 차이가 없어서 프로세스 기준으로 설명합니다)
영상의 초반 이후부터는 자바를 예로 들어 자바에서는 스레드 상태를 어떻게 정의했는지 살펴봅니다
자바 개발자라면 자바 스레드 상태들의 의미를 잘 알고 있어야 나중에 문제가 생겼을 때도 원인을 잘 분석할 수 있기 때문입니다
참고로, 자바로 설명할 때는 지난 모니터 영상에서 설명했던 자바 예제를 다시 사용합니다
👉 https://youtu.be/_dzRW48NB9M
스케줄러, 디스패처, 그리고 스케줄링
초반 영상 중에 컨텍스트 스위칭 기억나시나요?
이 역할을 담당하는 건 누구일까요?
또는, CPU에서 어떤 프로세스 혹은 스레드가 실행될지 누가 어떻게 결정하는 걸까요?
이번 영상은 이 부분을 다룹니다
👉 https://youtu.be/LgEY4ghpTJI
인터럽트, 시스템콜, 유저모드, 커널모드
프로그램 실행 중에, 만약 컴퓨터 시스템 자체에 문제가 생겼거나 혹은 이전에 시스템에 요청한 작업이 완료가 됐으면 운영체제로 부터 알람을 받습니다
또는, 컴퓨터 시스템에 치명적일 수 있는 동작(operation)들은 프로그램 레벨에서 바로 실행할 수 없고 반드시 OS가 제공하는 인터페이스를 통해 OS에게 대리로 수행해 달라고 요청을 해야 합니다
이번 영상에서는 이렇게 프로그램이 운영 체제를 통해서 컴퓨터 시스템과 어떻게 소통하는지 그 메커니즘을 배우게 됩니다
그리고 이렇게 소통하는 메커니즘이 프로그래밍 언어 레벨의 관점에서는 어떻게 동작하는지도 자바를 예로 들어 설명합니다
👉 https://youtu.be/v30ilCpITnY
스레드 관련 여러 용어들
기술 문서를 읽다 보면 만나게 되는 다양한 스레드 관련 용어들이 있습니다
OS 스레드, 하드웨어 스레드, 그린 스레드, 유저 레벨 스레드, 네이티브 스레드, 커널 스레드 등등등
기존의 알고 있던 스레드와는 무슨 차이인 건지.. 점점 헷갈리게 되죠
이번 영상은 스레드 관련 여러 용어들을 한 번에 정리한 영상입니다
👉 https://youtu.be/vorIqiLM7jc
스레드 풀
멀티스레딩 모델을 지원하는 프로그래밍 언어는 스레드 풀(thread pool)을 자주 사용합니다
특히, 자바의 경우에 톰캣 기반의 thread-per-request 모델로 백엔드 애플리케이션을 구성한다면
이때도 스레드 풀을 사용해서 백엔드 API로 들어오는 요청들을 처리하게 됩니다
이번 영상에서는 스레드 풀이 무엇이고 어떻게 사용할 수 있는지, 주의 사항은 무엇인지 등등을 설명드립니다
👉 https://youtu.be/B4Of4UgLfWc
block I/O, non-block I/O
개발을 하다 보면 네트워크 통신이 필요한 경우가 정말로 많습니다
당장 백엔드 애플리케이션에서 DB 서버를 호출하는 것도 네트워크 통신이죠
그런데 이 네트워크 통신이 I/O 작업의 한 종류입니다
그렇기 때문에 I/O가 무엇인지, 특히 네트워크 I/O가 어떻게 동작하는지 기본적인 지식을 잘 알고 있어야 보다 더 나은 성능의 애플리케이션을 개발을 할 수 있습니다
백엔드에서 최근 몇 년 간의 트렌드는 nonblock I/O를 적극 사용함으로써 애플리케이션의 성능을 극대화하는 패러다임이 주류를 이루고 있습니다
가령 Spring의 webflux을 제대로 쓰려면 webflux 위에 동작하는 기능을 구현할 때 I/O가 nonblock으로 동작하도록 구현해야 합니다
만약 webflux를 쓰는데 block I/O로 통신하는 JDBC를 쓴다면 webflux의 장점을 제대로 발휘하지는 못할 망정 오히려 역효과를 낳게 되죠
그래서 개발을 제대로 알고 하려면, block I/O와 nonblock I/O의 차이를 잘 알고 있는 것이 중요합니다
이번 영상은 그런 목적에서 준비된 영상입니다
👉 https://youtu.be/mb-QHxVfmcs
비동기란 무엇인가?
비동기(asynchronous)라는 용어는 정말로 정말로 넓게 쓰이는 용어입니다
여러 문맥에서 사용될 수 있는 용어고, 각 문맥에 따라 의미가 조금씩 다르게 쓰이기 때문에
이번 영상에서는
비동기 프로그래밍,
비동기 I/O,
비동기 커뮤니케이션
이 세 가지가 무엇을 의미하는지 각각의 문맥에서 비동기의 개념들을 살펴봅니다
비동기 프로그래밍과 비동기 커뮤니케이션 관련 부분은 특히 백엔드 개발에서 중요한 부분이라 관심 있게 봐주시면 좋을 것 같습니다
👉 https://youtu.be/EJNBLD3X2yg
지금까지는 운영체제에서 가상 메모리(virtual memory)를 다루지 않았습니다
이 주제는 현재 백발백중 시리즈에서는 스펙 아웃 됐고요,
시리즈 완강 후에 시간 여유 있을 때 틈틈이 다룰 예정입니다