1. How OSs work in General
가. OS 사용 목적
•
컴퓨팅 자원(하드웨어, 소프트웨어)의 효율적인 분배 및 할당
•
사용자에게 편리한 사용 환경 제공
•
사용자의 잘못된 사용 감시
나. OS 주요 기능
•
커널: 컴퓨터의 모든 하드웨어 장비에 대해 가장 기초적인 수준에서 제어한다
→ 특정 프로그램이 컴퓨팅 자원을 필요로 할 때, 커널에서 해당 자원에 대한 접근을 제어함
→ 메모리 관리: 다수의 프로그램이 서로의 메모리에 영향을 주지 않도록 관리
→ 파일 시스템: 컴퓨터의 데이터를 안정적으로 관리하고 사용자가 빠르게 접근할 수 있도록 지원
→ 네트워크: 서로 다른 OS를 갖고 있는 컴퓨터 간 컴퓨터 자원을 공유할 수 있도록 도와준다
•
사용자 인터페이스: 사용자가 프로그램 쉽게 사용할 수 있도록 사람 친화적인 방식의 조작법을 제공한다
2. Process and Thread
가. 용어 정리
•
프로그램: disk에 저장되어 있는 정적인 상태의 일련의 코드
•
프로세스: 운영체제에 의해 독립된 메모리 공간을 할당 받아서 실행 중인 프로그램입니다. 프로그램의 실행을 위한 일련의 코드 또는 명령은 CPU에 의해 연산되어 실제로 실행됩니다.
•
스레드: 프로세스에 할당된 컴퓨팅 자원을 공유하여 실제 작업을 수행하는 작업 단위입니다. 과거에는 프로세스가 실행 단위였지만 현대의 컴퓨팅 머신에서는 기본적으로 프로세스는 하나 이상의 쓰레드를 가지고 있고, 해당 쓰레드가 실행의 단위가 됩니다. 참고로 쓰레드마다 프로세스의 메모리 자원을 할당해야 하므로 쓰레드 호출에 제한이 있습니다.
•
스레드는 힙을 포함한 대부분의 메모리를 동일 프로세스 내 스레드와 공유하지만 유일하게 스택은 공유하지 않습니다.
•
단일 프로세스 시스템: 하나의 코어에서 하나의 프로세스가 싱글 코어에서 실행됩니다. 하나의 프로그램이 실행되는 중간에 IO 처리를 위해 CPU가 일하지 않습니다. 이 때문에 CPU의 사용률이 좋지 못합니다. 다른 말로, CPU 대기 시간이 많습니다.
•
멀티프로그래밍: 하나의 코어에서 복수의 프로세스가 동시에 실행됩니다. 하나의 프로세스가 점유하고 있는 시간이 길어지면 다른 프로세스의 대기 시간이 지나치게 길어질 수 있습니다.
•
멀티스레딩: 하나의 큰 작업을 수행하기 위해 필요한 여러 작은 작업에 대해 각각의 쓰레드가 번갈아가면서 수행. 동시 수행처럼 보이지만 쓰레드별로 빠르게 돌아가면서 실행(시분할 방식). 예를 들어, 메신저 서비스를 이용하면서 텍스트를 주고 받고 파일을 전송하는 것.
•
멀티프로세싱: 복수의 CPU 코어를 활용하는 시스템. 예를 들어, 하나의 로컬 머신에서 여러 개의 프로그램을 병렬적으로 실행
•
멀티태스킹: 하나의 코어가 시분할 방식(CPU의 특정 프로세스 점유 시간을 짧게 가져가는 방식)으로 복수의 프로세스가 동시에 실행됩니다. 복수의 프로세스가 컨텍스트 스위칭을 하는 것이 부담이 되므로 보다 적은 부담으로 동시에 작업을 실행할 필요가 있습니다. 또한 프로세스는 독립적인 메모리 공간을 가지고 있으므로 프로세스 간의 데이터를 공유하기 위한 추가적인 작업이 필요합니다.
멀티스레딩의 등장에 따라 개념이 확장되었습니다. 하나의 코어에서 복수의 프로세스와 복수의 쓰레드가 동시에 실행되는 시스템으로 개념으로 넓혀졌습니다. 핵심은 코어를 차지하기 위한 작업 단위의 경합이 발생하는가입니다.
만약 듀얼코어 머신에 싱글스레드의 프로세스가 두 개가 실행되고 있다면 이것은 멀티태스킹이라고 볼 수 없습니다. 병렬성의 개념으로 두 개의 프로세스가 돌아가고 있지만 각각 하나의 코어에서 하나의 작업 단위가 동작하기 때문에 싱글태스킹으로 보는 것이 적합합니다.
같은 맥락에서 듀얼코어 머신에 듀얼 스레드 프로세스가 한 개 동작하고 있는 경우, 듀얼 스레드는 각각의 코어에 할당되어서 동작합니다. 따라서 싱글태스킹의 멀티쓰레딩 또는 멀티프로세싱 방식으로 동작한다고 볼 수 있습니다.
나. 스레드 종류
•
사용자 수준 스레드
•
커널 수준 스레드
image from www.youtube.com/watch?v=YlnvCIZQDkw&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=7
3. Process Management
가. 프로세스 스케줄링
•
스케줄링: OS의 주요 작업 중 하나로, 프로세스에게 컴퓨팅 자원을 효율적으로 할당하는 기법
나. 스케줄링 시점
•
아래와 같은 상태 변화가 있을 스케줄링이 발생
1) Running(실행) → Waiting(일시정지): 실행 중에 suspend, sleep, wait, join, I/O block 등의 이유로 일시정지됨
2) Running(실행) → Runnable(실행대기): 실행 중 주어진 실행시간이 다 되거나 yield 명령을 받으면 실행대기열로 이동
3) Waiting(일시정지)→ Runnable(실행대기): 일시정지 중 time-out, notify, resume, interrupt 등의 이유로 실행대기열로 이동
4) Running(실행) → Terminated(종료): 실행이 완료되거나 stop 명령에 따라 프로세스 종료
•
상태 참고
Runnable(실행대기): 쓰레드가 생성되면 실행대기열에서 기다림, 실행대기열은 큐(FIFO)의 구조로 이루어짐
Running(실행): 실행대기열에서 자신의 순서가 되면 실행됨
Plain Text
복사
다. 비선점형과 선점형
•
비선점형: 특정 프로세스가 컴퓨팅 자원을 할당 받으면 프로세스의 종료된 후에 다른 프로세스가 컴퓨팅 자원을 할당 받아 실행되는 스케줄링 방법
→ 실행시간이 짧은 다수의 프로세스가 무한정 기다릴 수 있으므로 컴퓨팅 자원을 비효율적으로 사용하게 됨
→ 스케줄링 시점 중 1번과 4번의 상황에 적용가능
•
선점형: 특정 프로세스가 먼저 컴퓨팅 자원을 할당 받더라도 특정 조건에 따라 해당 프로세스는 중지되고 다른 프로세스가 컴퓨팅 자원을 받아서 실행되는 스케줄링 방법
→ 여러 조건에 따라 프로세스에 우선순위를 부여하여 효율적이고 효과적으로 컴퓨팅 자원을 배분할 수 있음
→ 스케줄링 시점 중 1번부터 4번까지 모든 상황에 적용 가능
라. 멀티프로세싱 자원공유
프로세스 간 자원공유 방식: Interprocess Communication
•
자원할당 방식: 각각의 프로세스는 독립적인 메모리 영역을 할당 받음
•
자원공유 방식: IPC(Inter Process Communication) 방식으로 프로세스 간 필요한 데이터를 상대 프로스세에게 요청하고 요청을 받은 프로세스가 응답을 보내는 형태(서버-클라이언트 통신)
→ IPC의 통로는 커널로, 사용자 영역의 프로세스가 커널 영역을 거쳐서 자원을 공유한다
마. 멀티프로세싱 장단점
•
장점: CPU Bound 작업에서 성능 상 이점
•
단점: 프로세스 간 통신 비용
3. Thread Management
가. Synchronization
•
쓰레드 동기화(Synchronization): 하나의 쓰레드가 작업 중인 것에 대해 다른 쓰레드가 간섭하지 않도록 막는 것
→ 쓰레드는 프로세스의 자원을 공유하기 때문에 한 쓰레드의 작업에 따라 다른 쓰레드의 작업에 영향을 줄 수 있음
•
임계영역(critical session) or 락(lock): 하나의 쓰레드가 작업을 완료하기 전까지 해당 쓰레드의 자원에 다른 쓰레드가 영향을 주지 않도록 하는 장치
나. 멀티스레딩 자원공유
스레드 간 자원공유 방식: Mutable Objects
•
자원할당 방식: 프로세스 내부의 code, data, heap 영역은 공유하지만 각 스레드 별로 stack을 할당 받는다
→ stack 영역은 함수 호출 시 임시로 생성되는 메모리 영역으로, 호출된 함수의 지역 변수 등이 저장됨. 함수 종료 시 관련 데이터는 stack에서 제거됨
•
자원공유 방식: 프로세스 내 공유하는 메모리 영역(Code, Data, Heap)을 참조
다. 멀티스레딩 장단점
•
장점
→ CPU 사용률 향상, 여러 작업을 거의 실시간으로 수행함에 따라 CPU 파워를 효율적으로 사용할 수 있음
→ 컴퓨팅 자원의 효율적 사용, 현대의 컴퓨팅 자원은 매우 풍부하기에 싱글 쓰레드로 하나의 작업을 맡아서 수행하기에 낭비되는 자원이 많음
→ 사용자에 대한 응답성 향상, 사용자의 동시적인 요청에 대해 여러개의 쓰레드가 마치 동시에 대응하는 것과 같은 효과를 얻음
•
단점
→ 복수의 스레드가 하나의 프로세스의 자원 공유하는 중 문제 발생 가능, 여러 쓰레드는 하나의 프로세스의 자원을 공유함
→ 추가적인 비용 발생(스레드 생성 비용, 스레드 간 소통비용 발생)
라. JVM 멀티스레딩
•
기본 동작: JVM의 멀티쓰레딩은 동시성의 개념으로, 한 시점에 하나의 쓰레드에만 컴퓨팅 자원을 할당하여 동작합니다.
•
병렬성 지원: JVM이 현대의 운영체계와 멀티 코어 머신 위에서 동작할 경우, 멀티코어 환경을 자동으로 감지하여 멀티쓰레딩 환경에서 병렬성의 개념으로 멀티태스킹을 지원합니다.
바. 멀티스레딩 vs 싱글스레딩
4. Interprocess Communication
5. I/O Management
6. POSIX basics
7. 병렬성 vs 동시성
가. 병렬성(parallelism)
•
정의: 물리적으로 한 시점에 여러 작업을 함께 처리하는 것입니다. 멀티 코어의 머신에서 구현이 가능한 개념으로, 여러 개의 독립적인 쓰레드가 멀티 코어에서 함께 실행되어야 물리적으로 한 시점에 여러 작업을 처리할 수 있습니다.
→ 멀티 코어 머신에서 병렬적으로 작업 중에 각각의 프로세스에서 추가적인 스레드를 생성하여 동시성의 개념을 충족하는 작업 진행할 수 있음(ex. 코어가 2개인데 10개의 쓰레드가 필요할 경우, 병렬성의 개념 하에 작업이 진행됨)
•
장점: 싱글쓰레딩 방식과 비교했을 때 context switching 작업이 상대적으로 적기 때문에 컴퓨팅 자원을 최대로 활용할 수 있습니다. 예를 들어, 멀티쓰레
•
단점: 쓰레드 세이프하지 않은 방법으로 작업한 프로그램의 경우, 의도치 않게 이슈가 발생할 수 있습니다.
•
활용: 자바의 경우, 멀티쓰레딩을 지원합니다. 메모리 관리 방식이 swipe & swap 방식을 지원하기 때문에 가능합니다.
나. 동시성(concurrency)
•
정의: 물리적으로 한 시점에 한 작업을 처리하지만, 논리적으로 한 시점에 여러 작업을 함께 처리하는 개념입니다. 하나의 코어에서 복수 스레드가 동시에 실행됩니다. 이는 스레드 간의 switching에 의해 프로세스의 자원을 공유하며 구현됩니다.
•
활용: python의 비동기 방식은 싱글 스레드에서 동시성을 따르는 것입니다. 파이썬은 메모리 관리 방법이 reference counting 방식이기 때문에 thread-safe하지 않습니다. 그렇기 때문에 GIL로 한 시점에 오직 하나의 쓰레드에만 컴퓨팅 자원을 할당하게끔 설계되어 있습니다.
Reference
•
남궁성, 자바의 정석 3rd Edition