시분할은 프로세서 시간을 잘게 썰어 여러 사용자에게 번갈아 나눠 주는 방식이다. 한 선생님이 여러 학생의 질문을 몇 초씩 돌아가며 받아 주면, 학생마다 선생님을 혼자 쓰는 것처럼 느끼는 것과 같다. 배치 방식과 달리 사용자가 터미널 앞에서 명령을 치고 바로 답을 받는다. 대신 자주 바꿔 주느라 드는 시간이 생기고, 여러 사람의 데이터와 파일을 서로 보호해야 한다.
예시로 보기
1960년대에는 컴퓨터가 크고 비싸서 사람마다 한 대씩 줄 수 없었다. 그런데 사용자가 명령을 치고 결과를 보며 다음 명령을 정하는 대화형 작업이 필요했다. 거래 처리처럼 대화형이 꼭 필요한 일도 있었다. 그래서 컴퓨터 한 대에 터미널 여러 대를 붙이고, 운영체제가 사용자 프로그램들을 짧은 시간 조각씩 번갈아 실행했다.
사람이 키보드를 치는 속도는 프로세서에 비하면 아주 느리다. 그래서 프로세서가 수십 명을 돌아가며 처리해도 각자는 기다린다고 느끼지 않는다.
정확히 말하면
시분할은 다중 프로그래밍을 이용해 여러 대화형 작업을 처리한다. 여러 사용자가 터미널로 동시에 시스템에 접속하고, 프로세서 시간을 사용자들이 나눠 쓴다.
배치 다중 프로그래밍과 시분할은 둘 다 다중 프로그래밍을 쓴다. 목표와 지시 방법이 다르다.
| 배치 다중 프로그래밍 | 시분할 | |
|---|---|---|
| 주 목표 | 프로세서 사용을 최대로 | 응답 시간을 최소로 |
| 운영체제에 주는 지시 | 작업에 딸린 작업 제어 언어(JCL) 명령 | 터미널에서 친 명령 |
초기 예: CTSS
MIT의 Project MAC 팀이 만든 CTSS(Compatible Time-Sharing System)가 초기 시분할 운영체제다.
- 주기억장치는 36비트 워드 32,000개였고, 상주 모니터가 그중 5,000을 썼다.
- 사용자 프로그램은 늘 5,000번 워드부터 실었다. 모니터와 메모리 관리를 단순하게 하려는 선택이다.
- 시스템 시계가 약 0.2초마다 인터럽트를 냈다. 인터럽트마다 운영체제가 프로세서를 되찾아 다른 사용자에게 줄 수 있었다. 정해진 간격마다 지금 사용자를 멈추고 다른 사용자를 싣는 이 방법을 시간 할당(time slicing)이라고 부른다.
디스크 입출력을 줄이려고, 들어오는 프로그램이 덮어쓸 부분만 디스크로 내보냈다. 사용자 네 명의 메모리 요구가 JOB1 15,000, JOB2 20,000, JOB3 5,000, JOB4 10,000워드일 때 메모리는 이렇게 바뀐다.
| 단계 | 실행할 작업 | 메모리 (5,000번부터) |
|---|---|---|
| (a) | JOB1 | JOB1이 5,000~20,000 |
| (b) | JOB2 | JOB2가 JOB1보다 커서 JOB1을 모두 내보내고 5,000~25,000 |
| (c) | JOB3 | JOB3이 작아서 5,000~10,000만 덮는다. JOB2의 나머지(10,000~25,000)는 남는다 |
| (d) | JOB1 | 5,000~20,000을 덮는다. JOB2의 20,000~25,000 부분만 남는다 |
| (e) | JOB4 | 5,000~15,000을 덮는다. JOB1의 15,000~20,000과 JOB2의 20,000~25,000은 남는다 |
| (f) | JOB2 | JOB4와 남아 있던 JOB1 조각을 내보내고, JOB2의 빠진 부분(5,000~20,000)만 읽어 들인다. 20,000~25,000은 이미 있으므로 다시 읽지 않는다 |
워드 번호 0 5,000 10,000 15,000 20,000 25,000
| | | | | |
(a) JOB1 실행 |모니터 | JOB1 | JOB1 | JOB1 | |
(b) JOB2 실행 |모니터 | JOB2 | JOB2 | JOB2 | JOB2 |
(c) JOB3 실행 |모니터 | JOB3 | JOB2 | JOB2 | JOB2 |
(d) JOB1 실행 |모니터 | JOB1 | JOB1 | JOB1 | JOB2 |
한 칸은 5,000워드다. 새 작업은 늘 5,000번부터 자기 크기만큼만 덮고, 그 뒤쪽 칸에는 앞 작업의 조각이 그대로 남는다.
새로 생긴 문제
여러 작업이 메모리에 있고 여러 사용자가 접속하면 운영체제가 새로 풀어야 할 문제가 생긴다.
- 작업끼리 서로의 데이터를 바꾸지 못하게 보호해야 한다.
- 파일 시스템을 보호해서 허락받은 사용자만 파일에 접근하게 해야 한다.
- 프린터, 대용량 저장장치 같은 자원을 두고 벌어지는 다툼을 해결해야 한다.
활용
- 지금의 운영체제도 타이머 인터럽트로 정해진 시간마다 실행할 프로그램을 바꾼다. 9장 스케줄링의 라운드 로빈이 이 방식이다. 2장에서도 단기 큐의 프로세스에 차례로 시간을 주는 방법으로 라운드 로빈을 소개한다.
- 여러 사람이 접속하는 서버(학교 리눅스 서버에 SSH로 접속하는 것)가 시분할의 오늘날 모습이다.
연결
확인 문제
C1 은행이 밤사이 그날의 모든 거래를 모아 계좌 잔액을 정리한다. 창구 직원은 손님 앞에서 잔액을 바로 조회한다. 각각 배치 다중 프로그래밍과 시분할 중 어느 쪽 목표에 맞는가?
답: 밤사이 정리: 배치 다중 프로그래밍. 사람이 기다리지 않으므로 프로세서를 최대로 쓰는 것이 중요하다. 창구 조회: 시분할. 손님이 기다리므로 응답 시간이 짧아야 한다.
C2 CTSS가 0.2초마다 시계 인터럽트를 낸 이유는? 인터럽트가 없다면 어떻게 되는가?
답: 운영체제가 정해진 간격마다 프로세서를 되찾아 다른 사용자에게 주기 위해서다. 인터럽트가 없으면 실행 중인 사용자 프로그램이 스스로 내놓기 전까지 운영체제가 실행될 기회가 없다. 한 사용자가 긴 계산을 하면 나머지 사용자는 모두 응답을 받지 못한다.
C3 CTSS 예의 (e) 단계 직후, 5,000번부터 25,000번 워드까지 각 구간에 어느 작업의 내용이 있는가?
답: 5,000~15,000 JOB4, 15,000~20,000 JOB1의 일부, 20,000~25,000 JOB2의 일부.
이유: JOB4는 10,000워드라 5,000~15,000만 덮는다. 그 아래는 (d)에서 남아 있던 JOB1과 JOB2의 조각이다.