<aside> 💡
</aside>
실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 소프트웨어
<aside>
자원(resource) : 컴퓨팅 시스템 내에서 사용할 수 있는 요소, 프로그램 실행에 필요한 요소
예시 ) CPU, 메모리, 보조기억장치, 입출력 장치 등과 같은 컴퓨터 부품
</aside>
운영체제도 프로그램의 한 종류로 메모리에 적재되어야 함.
→ 메모리의 커널 영역에 적재되어 사용자 영역에 적재된 프로그램에 자원을 할당하고 올바르게 실행되도록 도움.
<aside>

출처 : https://code-piggy.tistory.com/entry/운영체제
커널 영역(kernel space) : 항상 컴퓨터가 부팅될 때 메모리 내에 따로 적재되어 실행되는 공간이다. 커널은 운영체제의 핵심 부분으로 시스템의 핵심 기능과 자원을 관리한다.
(운영체제를 실행하기 위해 필요한 메모리 공간)
사용자 영역(user space) : 커널 영역을 제외한 나머지 영역으로 사용자가 이용하는 응용 프로그램이 적재되는 영역을 사용자 영역이라고 한다.
(사용자가 이용하는 응용 프로그램이 적재되는 영역)
응용 프로그램 : 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램
</aside>
CPU가 명령어를 실행하는 모드 : 사용자 모드, 커널 모드 (슈퍼바이저 플래그)
<aside>
사용자 모드 : 운영체제 서비스를 제공받을 수 없는 실행 모드
(운영체제를 실행하기 위해 필요한 메모리 공간)
커널 모드 : 운영체제 서비스를 제공 받을 수 있는 실행 모드
(사용자가 이용하는 응용 프로그램이 적재되는 영역)

출처 : https://hongong.hanbit.co.kr/운영체제란-커널의-개념-응용-프로그램-실행을-위한/
시스템 호출(system call) : 운영체제 서비스를 제공받기 위해서 운영체제에게 요청하는 것
사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공 받을 수 있다.
프로세스 관리, 파일 관리, 디렉터리 관리, 파일 시스템 관리
</aside>
<aside> 💡
</aside>
프로세스 관리
<aside>
프로세스(process) : 실행 중인 프로그램
→ 여러 프로그램을 동시에 원활하게 사용할 수 있도록 프로세스를 조금씩 번갈아가며 실행함.
</aside>
자원 접근 및 할당
<aside>
프로세스가 공정하게 CPU를 사용할 수 있도록 CPU 사용 방법을 결정 (스케줄링)
프로세스를 메모리에 적재할 위치를 결정
입출력 장치가 발생시키는 하드웨어 인터럽트 처리
</aside>
파일 시스템 관리
<aside>
</aside>
<aside> 💡
</aside>
스레드(Thread)
프로세스 하나만을 사용해서 프로그램을 실행하기에는 메모리의 낭비가 발생한다.
스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
즉, 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다.
하나의 프로세스는 하나 이상의 스레드를 가지고 있다.
프로세스 제어 블록 (PCB)
프로세스와 관련된 정보를 저장하는 자료 구조
해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장됨
메모리의 커널영역에 생성됨
문맥교환 (Context Switching)
CPU의 자원은 한정되어 있음 → 프로세스들은 모두 CPU를 원하고 있음 → CPU를 돌아가면서 사용하게 됨
하나의 프로세스가 실행되고 있다가 다른 프로세스로 실행 순서가 넘어가면 기존에 실행되던 프로세스는 지금까지 실행된 중간 정보를 백업(프로그램 카운터, 레지스터 값, 메모리 정보 등)
→ 이러한 중간 정보를 **문맥(context)**이라함.
문맥(context) : 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
문맥교환 (Context Switching) : 기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
프로세스의 메모리 영역
하나의 프로세스는 메모리의 사용자 영역에 스택 영역, 힙 영역, 데이터 영역, 코드 영역 등으로 나뉘어 저장됨.
메모리
<aside>
커널 영역
스택 영역
데이터를 일시적으로 저장하는 공간임 (ex. 매개변수, 지역변수)
일시적으로 저장할 데이터는 스택영역에 PUSH
더 이상 필요하지 않은 데이터는 POP
힙 영역
프로그래머가 직접 할당할 수 있는 저장 공간임
메모리 공간을 반환하는 과정이 필요함
(반환하지 않을 경우 메모리 누수(낭비) 발생)
데이터 영역
코드 영역 (텍스트 영역)
기계어로 이루어진 명령어가 저장함
CPU가 실행할 명령어가 담겨있기 때문에 읽기 전용 공간임
힙 영역과 스택 영역은 실시간으로 크기가 변할 수 있기 때문에 → 동적 할당 영역
힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당
스택 영역은 높은 주소에서 낮은 주소로 할당
</aside>
<aside> 💡
</aside>