1. 운영체제
운영체제
- 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램
- 컴퓨터가 부팅될 때 메모리 내 커널 영역에 따로 적재되어 실행
메모리는 커널 영역과 사용자 영역으로 나눠짐
커널
- 운영체제의 핵심 기능을 담당
- 운영체제가 설치된 모든 기기에는 커널이 있음
- 어떤 커널을 사용하는지에 따라 하드웨어를 이용하는 양상이 달라지고 컴퓨터 전체 성능도 달라질 수 있음
사용자 인터페이스
- 운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스
- 그래픽 유저 인터페이스(GUI) : 윈도우 바탕화면이나 스마트폰의 화면처럼 그래픽 기반으로 컴퓨터와 상호작용하는 인터페이스
- 커맨드 라인 인터페이스(CLI) : 명령어를 기반으로 상호작용하는 인터페이스
이중모드
- CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식
1) 사용자 모드
- 운영체제 서비스를 제공받을 수 없는 실행 모드. 즉 커널 영역의 코드를 실행할 수 없는 모드
- 일반적인 응용 프로그램은 기본적으로 사용자 모드로 실행
2) 커널 모드
- 운영체제 서비스를 제공받을 수 있는 실행 모드
시스템 호출
- 운영체제 서비스를 제공받기 위해 커널 모드로 전환하는 방법
운영체제의 핵심 서비스
- 프로세스 관리
- 자원 접근 및 할당
- 파일 시스템 관리
2. 프로세스와 스레드
2.1 프로세스 개요
프로세스
: 실행중이 프로그램
포그라운드 프로세스
- 사용자가 보는 앞에서 실행되는 프로세스
백그라운드 프로세스
- 사용자가 보지 못하는 뒤에서 실행되는 프로세스
- 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스를 유닉스 체제에서는 데몬, 윈도우 체제에서는 서비스라고 함
프로세스 제어 블록(PCB)
- 프로세스와 관련된 정보를 저장하는 자료 구조
- 커널 영역에 생성
- 프로세스 생성 시 만들어지고 실행이 끝나면 폐기
PCB에 담기는 정보
- 프로세스ID (PID) : 특정 프로세스를 식별하기 위해 부여하는 고유번호
- 레지스터 값 : 프로세스는 자신의 차례가 돌아오면 이전까지 진행했던 작업들을 그대로 이어 실행하기 위해, 이전까지 사용했던 레지스터의 중간값들을 모두 복원함
- 프로세스 상태 : CPU 사용중인지, 기다리는 중인지, 입출력장치 사용 상태 등
- CPU 스케줄링 정보 : 언제 어떤 순서로 CPU를 할당받을지
- 메모리 관리 정보 : 프로세스가 어느 주소에 저장되어 있는지에 대한 정보, 레지스터 값, 페이지 테이블 정보
- 사용한 파일과 입출력장치 목록
문맥
- 중간 정보, 즉 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
- 해당 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있음
문맥 교환
- 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
프로세스의 메모리 영역
프로세스가 생성되면 커널 영역에 PCB가 생성됨
사용자 영역에는 코드 영역/ 데이터 영역/ 힙 영역/ 스택 영역 으로 나뉘어 저장 됨
- 코드, 데이터 영역 > 정적 할당 영역
- 힙, 스택 영역 > 동적 할당 영역
<메모리>
| 커널 영역 |
| 스택 영역 |
| 힙 영역 |
| 데이터 영역 |
| 코드 영역 |
| ... |
1) 코드 영역
- 텍스트 영역이라고도 함
- 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장
- 데이터가 아닌 명령어가 담겨있기 때문에 쓰기 금지, 읽기 전용 공간(Read-Only)
2) 데이터 영역
- 실행되는 동안 유지할 데이터가 저장되는 공간 > 전역 변수
3) 힙 영역
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 힙 영역 메모리 공간 할당한 경우 언젠가는 해당 공간 반환해야하며 반환하지 않으면 메모리 누수 발생 할 수 있음
4) 스택 영역
- 데이터를 일시적으로 저장하는 공간 > 매개 변수, 지역 변수
2.2 프로세스 상태와 계층 구조
프로세스 상태
1) 생성 상태
- 프로세스를 생성중인 상태
- 이제 막 메모리에 적재되어 PCB 할당 받은 상태
2) 준비 상태
- 당장 CPU를 할당받아 실행할 수 있지만, 자신의 차례가 아니기에 기다리고 있는 상태
- 준비 상태 프로세스는 차례가 되면 CPU를 할당받아 실행 상태가 됨
- 디스패치 : 준비 상태인 프로세스가 실행 상태로 전환되는 것
3) 실행 상태
- CPU를 할당받아 실행 중인 상태
- 프로세스가 할당된 시간을 모두 사용하면(타이머 인터럽트가 발생하면) 다시 준비 상태가 됨
4) 대기 상태
- 입출력장치의 작업을 기다리는 상태
5) 종료 상태
- 프로세스가 종료된 상태
- 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리함
프로세스 계층 구조
프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음
- 부모 프로세스 : 새 프로세스를 생성한 프로세스
- 자식 프로세스 : 부모 프로세스에 의해 생성된 프로세스
- 부모, 자식 프로세스는 다른 프로세스이기에 다른 PID를 가짐
- 일부 운영체제에서는 자식프로세스의 PCB에 부무PID인 PPID가 기록되기도 함
- 데몬, 서비스 또한 최초 프로세스의 자식 프로세스임
최초 프로세스
- 유닉스 - init, 리눅스 - systemd, macOS - launched
- PID는 항상 1이며 모든 프로세스의 최상단에 있는 부모 프로세스
프로세스 생성 기법
- fork : 자기 자신 프로세스의 복사본을 자식 프로세스로 생성하는 시스템 호출
- exec : 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
2.3 스레드
스레드
- 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러 개의 스레드를 가짐 -> 하나의 프로세스에서 여러 부분 동시에 실행 가능
단일 스레드 프로세스
- 모든 프로세스가 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스
* 리눅스 운영체제에서는 프로세스와 스레드를 구분 짓지 않고 모두 실행의 문맥이라는 점에서 동일하다고 보고
'테스크'라는 이름으로 명명함
멀티프로세스
- 여러 프로세스를 동시에 실행하는 것
멀티스레드
- 여러 스레드로 프로세스를 동시에 실행하는 것
프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 프로세스 내 자원을 공유함
* 프로레스 간 통신 (IPC) : 프로세스 간 자원을 공유하고 데이터를 주고 받는 것