OS에 대해 오랜만에 다시 공부하면서 정리하려고 한다.
1. 운영체제란 무엇인가
운영체제는 시스템의 자원과 동작을 관리하는 소프트웨어이고, OS가 관리하는 대상은 크게 4가지이다.
여기서 중요한 포인트는, 이 자원들이 전부 Limit이 있다는 것이다. CPU도, 메모리도, 디스크도 무한하지 않다.
그래서 이 한정된 자원을 여러 프로그램(프로세스)에게 효율적으로 배분해주는 역할이 필요한데, 그게 바로 운영체제다.
2. 한번 짚고 가는 각 자원의 역할
CPU (중앙 처리 장치)
- 프로그램의 연산과 처리를 담당하는 핵심 부품
- 운영체제는 이 CPU를 각 프로세스에게 어떤 순서로, 얼마나 할당할지 스케줄링한다
- 목적은 CPU의 낭비 시간을 최소화하는 것
메모리
- CPU가 처리할 프로그램의 코드/데이터가 임시로 저장되는 공간
- 휘발성 → 컴퓨터가 꺼지면 날아감
- 공간이 한정되어 있어서, 운영체제가 효율적으로 관리해야 여러 프로세스를 원활하게 돌릴 수 있음
디스크
- 메모리와 마찬가지로 프로그램 정보를 저장하지만, 비휘발성이라 꺼져도 데이터가 남음
- 대신 접근 속도가 메모리보다 훨씬 느려서, 운영체제는 디스크 접근을 최소화하는 알고리즘을 씀 (Random I/O 관련)
입출력 장치
- 디스크, 키보드, 모니터 등
- 입출력 연산은 CPU가 직접 처리하지 않는다. 입출력 모듈이라는 별도 장치가 있고, 이 모듈이 CPU에게 명령을 받으면 그때 입출력을 실행한다
3. CPU 연산 vs I/O 연산 — 속도 차이가 핵심
| 구분 |
역할 |
속도 |
| CPU 연산 |
데이터 처리/계산 |
초당 수십억 번 |
| I/O 연산 |
데이터 입출력 (파일 저장, 화면 출력 등) |
CPU보다 수천 배 느릴 수 있음 |
이 속도 차이 때문에 운영체제가 CPU를 쉬게 하지않고 다른 작업에 쓰도록 스케줄링하는 게 중요해진다.
아래에서 나오는 동기식/비동기식 I/O 개념이 여기서 이어진다.
4. 인터럽트(Interrupt)
말 그대로 "방해하다"라는 뜻처럼, CPU가 현재 하던 작업을 잠깐 멈추고 더 중요한 이벤트를 처리한 뒤, 원래 하던 작업으로 복귀하는 것.
- 인터럽트 라인: CPU와 주변 장치가 신호를 주고받는 경로. 주변 장치가 이 라인을 통해 CPU에게 인터럽트 신호를 보낸다.
5. 사용자 모드 vs 커널 모드
이 부분이 오늘 정리하면서 가장 헷갈렸다.
사용자 모드
- 일반 프로그램(웹 브라우저, 게임 등)이 실행되는 모드
- 제한된 권한만 있어서 시스템 자원에 직접 접근하지 못함
- 여기서 오류가 나도 운영체제 전체엔 영향 없음
커널 모드
- 운영체제가 실행되는 모드
- 모든 시스템 자원에 접근 가능한 높은 권한
- 메모리 관리, 장치 제어 같은 중요한 작업 수행
- 커널 = 운영체제의 핵심 부분
즉 운영체제도 결국 하나의 "프로그램"처럼 메모리에 올라가 있는데(웹 브라우저, 게임처럼 프로그램 A/B와 나란히), 다만 실행 모드(권한)가 다르다는 게 포인트다.
시스템 콜(System Call)
- 커널 모드에서만 실행 가능한 보안이 필요한 명령을 특권 명령이라 부른다
- 일반 프로그램이 이 특권 명령을 실행하려면, 운영체제에게 "대신 해줘"라고 요청해야 하는데 이게 시스템 콜
- 즉, 프로그램이 자기 주소 공간의 함수가 아니라 커널의 함수를 호출하는 것
6. CPU 제어권 & 동기식/비동기식 I/O
CPU 제어권이란 CPU가 지금 뭘 실행할지 결정하고 처리하는 권한.
운영체제와 여러 프로그램이 동시에 도는 환경에서, 누가 CPU를 쓸지 정하는 핵심 개념이다.
- 동기식 입출력: 입출력 결과를 기다리는 동안 다음 명령을 수행하지 않고 그냥 기다림 → CPU 낭비를 막기 위해 이 시간 동안 CPU 제어권을 다른 프로세스에게 넘긴다
- 비동기식 입출력: 입출력 명령과 상관없이 바로 다음 명령을 수행 → 시스템 콜로 OS에게 입출력을 부탁만 하고, 곧바로 CPU 제어권을 다시 얻어 다음 명령 수행 (예: 자바의 join 없는 메인 스레드)
7. 프로그램 실행 전체 흐름 정리
프로그램 A, B가 동시에 도는 상황을 순서대로 따라가 보면:
- 프로그램 A 실행
- 디스크에 있던 프로그램 A 파일이 메모리로 복사됨 (Disk → RAM)
- CPU는 메모리에 올라온 프로그램 A에 접근해서 명령을 수행
- 프로그램 A가 입출력 명령을 지시
- 프로세스는 입출력 장치에 직접 명령(특권 명령)을 내릴 수 없다
- 그래서 시스템 콜을 통해 운영체제에게 부탁함
- 운영체제가 입출력 명령을 수행
- CPU가 이걸 인지하고 하던 작업을 멈춘 뒤 커널 모드로 전환
- CPU 제어권을 운영체제로 넘김
- 운영체제가 입출력 컨트롤러에게 명령을 내림
- 입출력은 오래 걸리는 작업이라, CPU는 마냥 기다리지 않고 제어권을 프로그램 B에게 넘겨줌
- 입출력 작업 완료 후
- 입출력 컨트롤러가 CPU에게 인터럽트 발생
- CPU는 프로그램 B를 잠깐 멈추고 인터럽트를 처리
- 컨트롤러가 가진 데이터를 프로그램 A에게 전달, CPU 제어권은 다시 B에게 돌아감
- 이후 차례가 되면 제어권은 A에게 돌아가서 마저 수행됨
이렇게 여러 프로세스 사이에서 CPU를 멈췄다가 다른 작업으로 넘기고, 나중에 다시 이전 상태로 복귀시키는 과정을 Context Switching이라고 부른다.
[OS] 스레드(Thread), 스케줄링(Scheduling), 컨텍스트 스위칭 (Context Switching)
이전 포스팅을 요약해서 복습해보자면, 프로세스란 실행 환경과 자원을 제공하는 컨테이너 역할을 하고, 실제 CPU를 사용하여 코드를 한줄씩 처리하는 것은 스레드이다.CPU 코어가 1개이고 , 프로
bdisappointed.tistory.com
정리
CPU는 "성실한 일꾼"이다. 쉬지 않고 여러 프로그램과 운영체제로부터 명령을 받아 수행하고, 그 와중에 인터럽트까지 처리한다. 운영체제는 이 성실한 일꾼이 절대 놀지 않도록 스케줄링하고 제어권을 배분해주는 관리자 역할.