내용 출처
KOCW 반효경 교수님 <운영체제> 강의
책 <운영체제와 정보기술의 원리>
반효경 교수님의 <운영체제> 강의 내용을 기반으로 정리했으며,
교수님의 저서 <운영체제와 정보기술의 원리>에서 추가할 만한 내용을 이와 같은 인용문 형식으로 추가함.
프로세스 (process) : 실행 중인 프로그램
프로세스의 문맥 (context) : 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보
하드웨어 문맥 (CPU 수행 상태를 나타냄)
프로세스의 주소 공간
프로세스 관련 커널 자료 구조
현대의 컴퓨터 시스템은 주로 시분할 시스템으로 프로세스들이 번갈아 실행된다. 프로세스 A를 쓰다가 프로세스 B로 넘어갈 때, 프로세스 A의 문맥을 백업해 두어야 나중에 다시 프로세스 A로 돌아왔을 때 기존에 작업하던 위치에서부터 작업을 재개할 수 있다.
프로세스는 상태가 변경되며 수행된다.
Running
Ready
Blocked (wait, sleep)
(중지 상태가 포함된 버전은 아래에서 다룬다.)
[그 외 상태]
다음의 구성 요소를 가진다 (구조체로 유지)
1) OS가 관리상 사용하는 정보
2) CPU 수행 관련 하드웨어 값
3) 메모리 관련
4) 파일 관련
(사진 출처 : <운영체제와 정보기술의 원리> 121쪽)
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
(사진 출처 : <운영체제와 정보기술의 원리> 122쪽)
시스템 콜이나 인터럽트 발생시 반드시 문맥 교환이 일어나는 것은 아니다.
(1) 그림의 윗 부분에서는 사용자 프로세스 A로부터 운영체제에게 CPU가 넘어갔다가, 다시 프로세스 A로 CPU 제어권이 돌아온다. 이것은 문맥 교환이 아니다.
(2) 반면 그림의 아래 부분에서는 프로세스 A에서 프로세스 B로 CPU 제어권이 넘어가므로, 문맥 교환이 발생한다.
(1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 저장해야 한다. 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 크다.
Job queue (작업 큐)
현재 시스템 내에 있는 모든 프로세스의 집합
준비 큐와 장치 큐에 있는 프로세스들은 모두 작업 큐에 속해 있다.
Ready queue (준비 큐)
현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
Device queue (장치 큐)
I/O 장치의 처리를 기다리는 프로세스의 집합
Long-term scheduler (장기 스케줄러) = job scheduler
degree of Multiprogramming을 제어한다 = 메모리에 올라가 있는 프로세스의 수를 제어한다. 메모리에 프로그램이 너무 많이 올라가 있어도, 너무 적게 올라가 있어도 성능이 저하된다.
Short-term scheduler (단기 스케줄러) = CPU scheduler
Medium-term scheduler (중기 스케줄러) = Swapper
장기 스케줄러에서는 시작 프로세스 중 어떤 것들을 준비 큐로 보낼지 결정한다고 했다. 그런데 현재 시스템들은 시작 시 모든 메모리를 준비 큐에 보낸다. 그렇다면 현재는 메모리에 너무 많은 프로그램이 올라가는 문제를 어떻게 해결하는가? 이를 위해 필요한 것이 중기 스케줄러(Swapper)다.
swapper는 메모리에 너무 많은 프로그램이 동시에 올라가 있으면, 메모리에 올라 와 있는 프로세스의 일부를 빼앗아 그 내용을 디스크의 스왑 영역에 저장해둔다. 이를 스왑 아웃(swap out)이라고 하며, 이러한 방식으로 multiprogramming degree를 조절한다.
중기 스케줄러가 일부 프로세스를 메모리에서 디스크로 스왑 아웃시켜야 하는 경우 그 0순위인 프로세스는 blocked 상태에 있는 프로세스들이다. blocked 상태인 프로세스들의 경우 당장 CPU를 획득할 가능성이 없기 때문에 메모리를 보유하고 있는 것 또한 큰 의미가 없기 때문이다.
(사진 출처 : <운영체제와 정보기술의 원리> 130쪽)
Running, Ready, Blocked -> [프로세스의 상태] 도표 참고
Suspended (stopped)
외부적인 이유로 프로세스의 수행이 정지된 상태 (inactive한 상태)
프로세스는 통째로 디스크에 swap out된다.
ex 1) 사용자가 프로그램을 일시 정지시킨 경우 (break key)
ex 2) 메모리에 너무 많은 프로세스가 올라와 있어 중기 스케줄러가 프로세스를 중단시킨 경우
[Blocked vs Suspended]
주의) 위 프로세스 상태도는 모두 사용자 프로그램의 상태를 나타낸 것이다. 운영체제의 상태는 이야기하지 않는다. Running(kernel mode)의 경우, 운영체제 커널이 Running하고 있는 것이 아니라, 사용자 프로그램이 커널 모드에서 Running하고 있다고 이야기한다.
프로세스 하나에 CPU 수행 단위를 여러 개 두는 것
동일한 일을 하는 여러 프로세스마다 별도의 주소공간을 만들면 메모리가 낭비된다. 따라서 같은 일을 하는 프로세스를 여러 개 띄워놓고 싶을 때, 메모리 공간은 하나만 띄워놓고 프로세스마다 다른 부분의 코드를 실행할 수 있게 하면 메모리 낭비를 줄일 수 있다. 이것이 스레드의 개념이다.
(210222 / 이 영상을 보면 이해하는 데 도움이 된다.)
스레드는 프로세스 하나에서 공유할 수 있는 것은 최대한 공유하는 방식이다. 메모리 주소 공간과 프로세스 상태, 각종 자원 등을 공유한다. 다만 프로그램 카운터, 레지스터, 스택과 같은 CPU 수행과 관련된 정보만 스레드별로 별도로 가지고 있게 된다.
[스레드의 구성]
[스레드끼리 공유하는 부분] = task
응답성 (Responsiveness)
ex. 멀티스레드 웹 - 하나의 서버 스레드가 blocked 상태인 동안에도 동일한 테스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.
이미지 파일을 읽어온다고 할 때, 이 프로세스를 I/O가 끝나기 전에 CPU를 얻어서 화면에 html 텍스트를 먼저 display해준다. 그림을 읽어온 결과를 보기 전에 텍스트를 보여주는 것이다. 이는 일종의 비동기식 입출력이라고 할 수 있다.
자원 공유 (Resource Sharing)
n개의 스레드가 code, data, 각종 자원을 공유할 수 있다.
경제성 (Ecomony)
프로세스를 새로 만드는 것보다 프로세스에 스레드를 추가하는 것이 오버헤드가 훨씬 작다. 그리고 프로세스 간에 문맥 교환을 하는 것에 비해 스레드 간에 CPU를 교환하는 것이 오버헤드가 훨씬 작다.
cf) 오버헤드(overhead) : 특정한 목표를 달성하기 위해 간접적 혹은 추가적으로 요구되는 시간, 메모리, 대역폭 혹은 다른 컴퓨터 자원
멀티프로세서 아키텍처의 유용성 (Utilization of MP Architectures)
CPU가 여러 개인 컴퓨터의 경우 병렬성을 높일 수 있다.
(CPU가 여러 개인 경우에만 해당된다.)
ex. 1000X1000 행렬을 구하는 경우 -> 각 행과 열을 구하는 일을 서로 다른 CPU에서 실행한 뒤, 이를 합치면 더욱 빠르게 계산할 수 있다.
커널 스레드 (Kernel Threads)
supported by kernel
스레드가 여러 개라는 사실을 운영체제 커널이 알고 있다.
유저 스레드 (User Threads)
supported by library
스레드가 여러 개라는 사실을 운영체제 커널이 모른다.
사용자 수준에서 직접 스레드를 관리한다.