시스템 콜(System Call)은 운영체제가 응용 프로그램에게 제공하는 인터페이스 인터럽트 중 하나이다.
보통 사용자가 시스템 콜을 직접 사용하기보다는, 중간에 시스템 콜 인터페이스(System Call Interface)를 둬서 사용자가 시스템 콜을 통해 커널에 요청을 반환하는데, 이를 API라고 한다.
사용자가 직접 커널에 접근할 수 없기 때문에 시스템 콜을 통해 응용 프로그램에게 어떠한 기능을 수행해 달라고 요청한다.
운영체제는 커널 모드와 사용자 모드로 나뉘어 구동된다. 운영체제에서 프로그램이 구동되는 데 있어 파일을 읽고, 쓰고, 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용한다. 시스템 콜은 이러한 커널 영역의 기능을 사용자 모드가 사용 가능하게 해준다.
프로세스 관련 시스템 콜은
fork()exec()wait()exit()가 있다.
fork() 는 부모 프로세스를 자식 프로세스에 복제시키는 것이다.exec() 는 fork()로 복제된 자식 프로세스에 새로운 프로그램을 덮어 씌우는 것이다. 이것으로 자식 프로세스는 독자적인 작업을 수행할 수 있게 된다.wait() 는 부모 프로세스가 자식 프로세스가 종료되기를 기다리는 것이다.exit() 는 프로그램을 종료시키는 시스템 콜이다.(1) 각 시스템 콜에는 번호가 할당되고
(2) 시스템 콜 인터페이스는 이 번호에 따라 색인되는 테이블을 유지한다.
(3) 시스템 콜 인터페이스는 의도하는 시스템 콜을 부르고
(4) 시스템 콜의 상태와 반환 값을 돌려준다.
CPU 스케줄링은 OS에서 프로세스들이 CPU를 사용하는 순서를 결정하는 것을 말한다.
여러 개의 프로세스가 실행되면 CPU는 하나의 프로세스에 대해 작업을 수행하고 다른 프로세스로 전환한다.
💡 스케줄링은 CPU의 이용률, 응답 시간, 처리량 등에 영향을 미친다. 대기 시간이 짧을수록, 처리 시간과 응답 시간이 빠를 수록 좋은 스케줄링이다.
선점형 스케줄링은 어떤 프로세스가 CPU를 할당받아 실행 중에 다른 프로세스가 강제로 CPU를 점유할 수 있다.
비선점형 스케줄링은 어떤 프로세스가 CPU를 할당 받으면 그 프로세스가 종료할 때까지 기다렸다가 종료되면 CPU를 할당받는다.
고려해야 할 5가지 사항으로는 CPU 이용률, 처리량, 응답 시간, 반환 시간, 대기 시간 이 있다.
FCFS(First Come First Served)는 먼저 들어온 프로세스를 먼저 처리해 주는 스케줄링 방식이다.
비선점형 스케줄링이다.
⚠️ 문제점 : 호위 효과 발생 !
SJF는 선점형/비선점형으로 나뉜다.
✅ 선점형 스케줄링
✅ 비선점형 스케줄링
⚠️ 문제점 : 다음 CPU 버스트 길이를 알 방법이 없다.
우선순위 스케줄링은 각 프로세스에게 우선순위가 주어지고, CPU는 가장 높은 우선순위를 가진 프로세스에게 할당된다.
- 만약 우선순위가 같을 경우 → FIFO로 스케줄한다.
선점과 비선점으로 나뉜다.
⚠️ 문제점 : 기아 상태 발생 !
💡 해결 : 에이징(aging)
RR(Round Robin)은 각 프로세스는 돌아가면서 주어진 시간 할당량만큼 CPU를 할당받을 수 있다.
문맥 교환(Context Switching) 은 컴퓨터 시스템에서 실행 중인 프로세스나 스레드 간에 작업을 전환하는 과정을 말한다.

- 현재 실행 중인 프로세스/스레드의 상태(Context)를 저장한다.
- 스케줄러에 의해 다음 실행될 프로세스/스레드가 선택된다.
- 선택된 프로세스/스레드의 상태를 복원한다.
- 이는 저장된 정보를 다시 레지스터에 적재하고 실행을 계속하는 것을 의미한다.- 선택된 프로세스/스레드가 실행된다.
CPU는 한 번에 하나이 작업만을 실행할 수 있기 때문에 문맥 교환 중에는 다른 작업을 작업을 할 수 없다. 이로 인해 오버헤드가 발생한다.
✅ 오버헤드를 해결하기 위해선 다음과 같은 방법이 있다.
교착 상태(Deadlock)는 두 개 이상의 작업(프로세스/스레드)이 서로가 가진 자원을 점유하고 있으면서, 상태방에게 할당된 자원을 원하게 되면서 결과적으로 무한정 기다리는(wait) 상태를 말한다.
교착상태가 발생하기 위해선 상호배제 / 점유와 대기 / 비선점 / 순환 대기 를 동시에 만족해야 한다.
교착 상태의 중 하나를 제거하거나, 교착 상태가 발생하는 순간을 감지하고 복구하는 알고리즘을 구현한다.
은행원 알고리즘(Banker's Algorithm) 은 교착 상태 회피를 위한 알고리즘 중 하나이다.
은행월 알고리즘은 자원 할당 그래프를 기반으로 안전한 상태에서만 자원을 할당함으로써 교착 상태를 회피한다.
✅ 장점
✅ 단점
페이징 은 프로세스와 메모리의 빈 공간을 작은 크기의 고정된 블록인 페이지로 분할하여 관리하는 방법이다.
페이지 단위로 나누고, 이러한 페이지들을 실제 물리적인 메모리의 프레임에 매핑하는 방식으로 동작한다.💡 외부 단편화를 해결하지만, 내부 단편화가 발생할 수 있다.
세그먼테이션 은 프로그래머가 인지하는 메모리 모습을 실제 메모리 모습으로 변환해주는 메모리 기법을 제공한다.
세그먼트 로 구성한다. 프로세스를 스택 / 힙 / 데이터 / 코드 로 나눈 것 역시 세그먼테이션의 모습이다. 💡 두 사용자 프로세스가 동일한 코드를 공유하기 용이하며, 내부 단편화가 발생하지 않는다.
💡 세그먼트 크기는 가변적이기 때문에 외부 단편화가 발생할 수 있다.
페이징은 고정 크기의 페이지로 분할하고, 세그먼테이션은 가변 크기의 세그먼트로 분할한다.
메모리 단편화를 해결하기 위해서 !
다중 프로그래밍에서 여러 프로세스를 수용하기 위해 주기억장치를 동적 분할하는 메모리 관리 기법이 필요하다.