예전에는 컴퓨터가 비싼 놈이었다. 컴퓨터가 일을 하고 사람이 기다려야지, 사람이 일을 하는 동안 컴퓨터가 기다리게 하는 것은 돈을 펑펑 날리는 일이었다. 그래서 사람들은 실행하고 싶은 것을 요청했고, 컴퓨터는 이를 순서대로 하나씩 실행했다. 그래서 당시의 컴퓨팅 시스템은 지금보다 단순했다.
그런데... (지난 포스팅에 쓴 것처럼) 컴퓨터는짱짱
발전했고, 동시에 여러 사람의 여러가지 요청을 수행할 수 있는 시대가 도래했다.
프프, 애펙, 포토샵, 일러가 동시에 실행되고 있다면,
이 프로그램들이 한순간에 실행되고 있는 것인가?
답은 '아니다'. 한 순간에 실행되고 있는 것은 네 가지 중에 하나다. 그 줄을쓰레드
라고 부른다.
병렬성을 어떻게 실행할지는 자원을 어떻게 할당하느냐
의 문제다
각 프로그램은 본인이 CPU시간과 메모리를 독점하고 있다고 가정하고 만들어진다. 그러나 이것은 환상 😙 OS는 자원을 각 프로그램에 나누어 할당한다. 짧은 시간을 두고 A, B, C.. 의 프로세스를 번갈아가며 실행하는 것
명령어 수행 흐름
프로세스
프로세스가 생존하기 위한 최소한의 정보
가 필요한데, 이를 context
라고 부른다.스케쥴링
운영체제는 어떻게 한 프로세스의 CPU를 빼앗아와서 다음 프로세스에게 넘겨줄까?
일정 간격마다 끼어들 수 있으면 된다. 하드웨어 타이머를 설정하면 일정한 간격으로 프로세서에 interrupt를 줄 수 있다. (=timer interrupt)
이것이 발생하면 interrupt handler가 실행되고, 핸들러에서 커널에 스케쥴러를 호출한다. 스케쥴러는 지금 실행하고 있는 놈을 다음 실행할 놈으로 바꾼다. 이 행위를 context switch
라고 한다.
context switch
context
를 PCB에 저장하고, 정해진 정책에 따라 다음으로 실행할 프로세스를 고른다 (=스케쥴링) 그 프로세스의 PCB을 읽어와서 실행한다그렇다면 수행되는 각 쓰레드를 서로 다른 쓰레드로부터 어떻게 보호할 수 있을까?
1. 메모리 경계
프로세스
로 존재한다. 각 프로세스는 4GB내의 영역 내에서 서로 다른 address space를 가진다. 실제 물리적인 메모리에는 서로 섞여있지만 OS가 이를 그룹화하여 관리한다2. 파일 경계
3. CPU 독점 제한
프로세스의 상태
OS마다 다른 이름을 가지고 있지만 대부분은 아래와 같다
1. new
: 프로세스가 처음 만들어진 상태
2. ready
: 시스템에 받아들여진 상태, CPU 자원을 할당하기만 하면 바로 실행될 수 있음. PCB구조로 표현되어 ready queue
에 붙는다. 스케쥴러가 정책에 따라 다음번 실행할 프로세스를 결정할 때 ready queue
에서 고른다. 이를 dispatch
라고 한다
3. running
: 실행되고 있는 상태
4. waiting
: 기다리고 있는 상태, I/O가 완료되기를 기다릴 때. 어떤 이벤트가 발생하길 기다릴 때. child process가 끝나기를 기다릴 때가 이 상태에 해당됨
5. terminated
: running
상태의 프로세스가 종료된 상태, 청소 작업이 일어남