멀티 스레딩이란
하나의 프로세스 내에서 여러 개의 스레드를 동시에 실행하는 기술을 말합니다.
메모리 공간과 시스템 자원소모(공유자원으로 인해)가 줄어들어 효율적입니다
교착상태(스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정)를
발생시킬수 있기 때문에 동기화에 신경써야 합니다
멀티프로세스란
하나의 애플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것입니다.
이 때, 자식 프로세스는 부모와 별개의 메모리 영역을 확보하게 됩니다
장점:
하나의 프로세스가 잘못 되어도 프로그램은 동작 /구현이 간단하고, 각 프로세스들이 독립적으로 동작하며 자원의 서로 다르게 할당되어 안정적이다
단점:
멀티 스레드 보다 많은 메모리 공간과 CPU 시간을 차지한다
작업량이 많을수록 오버헤드가 발생하고 Context Switching으로 인한 성능 저하가 우려된다.
프로세스는 각각의 독립된 영역을 할당당았기 때문에, 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다.그렇기 때문에, 프로세스 간 통신을 하기 위해서는 IPC를 통해야 한다.
Context Switching - CPU는 한 번에 하나의 프로세스만 실행 가능.
CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는데 이 과정을 Context-Switching이라고 함.
즉, 동작중인 프로세스가 대기하면서 해당 프로세스 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업
// 프로세스에서 문맥교환임 스레드도 문맥교환이 있다
멀티 프로세스 대신 멀티 스레드를 사용하는 이유
스레드는 같은 프로세스 내에서 메모리를 공유하기 때문에 사용이 효율적이고 스레드 간 문맥 전환이 프로세스 간 문맥 전환보다 더 적은 비용이 듭니다.
또한 스레드는 같은 주소 공간을 공유하므로 데이터 공유가 더 쉬워집니다.
이는 프로세스 간 통신을 위한 IPC보다 단순합니다.
// 스레드간 자원공유는 동기화 문제를 일으킬 수 있기 때문에 무조건적으로 좋은건 아닙니둥
CPU가 여러 개일 경우, 각 CPU가 스레드 하나씩을 담당하므로 여러 스레드가 동시에 처리되어 처리 속도가 향상됩니다.
다만 여러 스레드 중 어떤 것이 먼저 실행될 지 그 순서를 알 수 없습니다
멀티 프로세싱과 멀티 프로그래밍의 차이
멀티 프로세싱은 여러개의 cpu를 가지고 동시에 여러 작업을 병렬실행하는 것이고
멀티 프로그래밍은 하나의 CPU에서 여러 프로그램을 동시에 실행하기 위해 CPU 시간을 분할하여 사용하는 것.
프로그램이 CPU와 I/O 작업을 번갈아 수행하면서 효율성을 높입니다
멀티태스킹이란
Task : OS에서 처리하는 작업 단위
Task가 하나의 프로세서 상에서 운영체제의 스케쥴링 방식에 따라 조금씩 번갈아가면서 수행되는 것
빠른 속도로 조금씩 번갈아 가면서 Task들을 조금씩 처리하다 보면 유저가 느끼기에는 마치 동시에 처리되는 것처럼 보이기 때문에 붙은 이름
프로세스는 한번 CPU를 사용할때 아주 짧은 시간(quantum)만 실행되도록 하여 각 프로그램의 작업을 아주 작은 단위로 번갈아 가며 처리하면서, 작업 응답 시간을 최소화 시키는 멀티 태스킹 원리
사용자가 대화형으로 태스크를 수행(time-sharing)합니다
멀티 태스킹과 멀티 스레딩에 대해 비교
멀티 태스킹: 여러 작업을 동시에 수행하는 운영 체제의 능력.
각 작업은 프로세스 단위로 구분되며, CPU 시간 분할을 통해 여러 프로세스를 동시에 실행합니다.
멀티 스레딩: 하나의 프로세스 내에서 여러 스레드를 동시에 실행하는 기술.
프로세스 내에서 실행 단위를 나누어 작업을 병렬로 처리합니다.
멀티 태스킹은 여러 프로세스를 동시에 다루는 것이고, 멀티 스레딩은 하나의 프로세스 내에서 여러 스레드를 동시에 다루는 것입니다.
멀티 태스킹은 자원 을 공유하기 위해 IPC를 구현해야 하며 멀티스레딩에 비해 운영체제에 부담이 갑니다 하지만 독립된 메모리를 가지고 있어 독립된 수행이 가능합니다
커널이란
커널은 운영체제의 핵심 부분으로, 항상 메모리에 상주하며 하드웨어와 응용프로그램 사이에서 인터페이스 역할을 수행합니다.
컴퓨터 자원을 효율적으로 관리하고, 응용프로그램이 실행에 필요한 다양한 서비스를 제공합니다.
다만 항상 컴퓨터 자원을 바라보고 있기 때문에 사용자와 상호작용은 지원하지 않습니다 사용자와 상호작용을 위한 프로그램으로 쉘이라는 명령어 해석기등이 있습니다
운영체제에서 페이징이란
페이징은 운영체제 메모리 관리 기법중 하나로 프로세스의 가상 메모리를 고정 크기의 페이지로 나누고 물리 메모리도 같은 크기의 페이지 프레임으로 나누어 프로세스의 페이지를 프레임에 적재하는 방식입니다.
이를 통하여 연속된 메모리 공간이 필요없게 되어 메모리 활용도를 높이고 메모리 단편화를 줄일 수 있습니다.
가상메모리
시스템이 실제 가지고 있는 메모리보다 더 많은 메모리를 가지게 하는 하드웨어 기술입니다.
가상 메모리는 페이징이나 세그멘테이션과 같은 기법을 통해 구현되며, 프로그램의 메모리 사용을 최적화하고 시스템의 안정성을 높입니다.
CPU가 프로세스를 처리할 때, 특정 시점에 프로세스의 특정 메모리를 접근(액세스)하는 주소값은 아주 작을 것이다.
그 주소값이 아주 작다는 점을 착안하여 고안된 방법이다.
가상 메모리는 프로세스와 관련된 주소값을 저장하는 메모리 공간을 분리하여 관리함으로써, 내 컴퓨터의 메모리가 실제 메모리보다 많아 보이게하는 기술이다
뮤텍스와 세마포어
임계 영역(Critical Section)
여러 프로세스/스레드가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 블록
즉, 여러 프로세스/스레드가 동일 자원을 동시에 참조하여 값(공유하는 변수명, 파일 등)이 오염될 위험 가능성이 있는 영역
프로그래밍 시, 성능 향상을 위해 임계영역을 최소화하는 설계를 해야 한다.
뮤텍스 : 임계구역을 가진 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행(상호배제) 되도록 하는 기술이며 한 프로세스의 의해 소유될 수 있는 key를 기반으로 한 상호배제 기법
key에 해당하는 객체가 있으며 이객체를 소유한 스레드가 공유자원에 접근가능하다
세마포어: 공유자원의 상태를 나타내는 카운터( 공통으로 관리하는 하나의 값)를 통해 여러 스레드가 자원에 접근 할 수 있도록 제어하여 상호배제를 달성하는 기법
프로세스도 가능 스레드만 이 아니라
프로세스 혹은 스레드의 동기화
프로세스 혹은 스레드의 동기화는 여러 실행 단위가 공유 자원에 접근할 때, 데이터의 일관성과 무결성을 유지하기 위해 실행 순서를 조정하는 것을 의미합니다.
이를 통해 경쟁 조건(race condition)을 방지하고, 올바른 결과를 얻을 수 있습니다.
동기화 도구로는 뮤텍스, 세마포어, 모니터 등이 있습니다.