LazarusCompleteGuide:10.0
프로세스와 스레드
현대 모든 운영체제에서는 동시에 다수의 프로그램을 실행하는 것이 가능하다. 멀티프로세서 시스템과 멀티코어 PC에서는 프로그램들이 사실상 동시에 실행된다. 단일 프로세서 시스템의 경우 동시에 실행되는 것처럼 보이는데, 스케줄러의 도움으로 현대 운영체제들은 실행되는 프로세서들 간 CPU 시간의 분배 처리를 받아들인다.
Windows, MacOS X, 현대 Unix 파생제품(derivative)들은 모두 선점형 멀티태스킹을 허용한다. 32비트 운영체제에서는 하나의 프로세스에 할당 가능한 최대 메모리 양이 4GB였다. 이는 32비트 어드레스 버스로 제한되는데, 정확히 232 bytes = 4,294,967,296 bytes = 4,194,304 kbytes = 4,096 Mbytes = 4 Gbytes로 어드레싱될 수 있다. 이 메모리는 필요 시 요청되어야 한다-프로세스로 즉시 이용 가능한 것이 아니다. 이러한 어드레스 공간은 프로그램 자체뿐만 아니라 그 데이터, 리소스, 로딩된 라이브러리를 모두 보관해야 한다.
프로세스 자체는 강제적 내용 변경에 대해 알지 못한다. 각 프로세스는 자신이 CPU에 실행되는 유일한 프로세스라고 생각한다. 즉, 내용 변경이 꽤 수고스러운데, 현재 프로세스 정보가 모두 저장되고, 그 프로세스가 계속 실행되기 전에 다른 모든 프로세스의 정보도 보관되어야 하기 때문이다.
복잡한 프로그램의 경우, 프로세스가 사용자 응답을 기다리는 동안 다른 프로세스는 배경에서 데이터를 저장하는 등 다른 필요한 작업을 실행할 수 있도록 하나 이상의 프로세스를 생성하는 것이 좋겠다. 이러한 이유로, 프로세스는 종종 스레드라고 불리는 작은 독립적 부분으로 나뉜다. 각 프로세스는 최소 하나의 스레드를 가진다. 한 프로세스의 모든 스레드는 공통된 어드레스 공간을 공유한다 (다른 어드레스 공간에서 운영체제에 실행 중인 다른 프로세스와 반대로). 모든 스레드는 함께 공통된 기억 영역을 사용할 수 있다. 물론 이 공통 메모리로 접근할 때 주의를 기울여야 하는데, 동기화(synchronization) 문제가 발생할 수 있기 때문이다. 스레드는 협력적 특성을 가지고 제한 없이 이 공통 메모리에 접근할 수 있는 것으로 가정한다.
각 프로세스는 운영체제에게 어떻게 오류에 반응해야 하는지 알려줄 수 있다. 가능한 오류로는 임계 오류(critical error), 보호된 메모리 접근 위반, 요청 파일 열기 실패가 있다.
하나의 프로세스는 다른 프로세스의 어드레스 공간으로 접근이 허용되지 않는다. 운영체제는 이것을 모니터한다. 하지만 프로세스들이 데이터를 교환해야 하는 경우도 있는데 이런 경우 어떻게 데이터를 공유할까? 이를 목적으로 운영체제는 커널 객체라 불리는 것을 제공한다. 커널이란 운영체제의 최하위 수준으로 작업 스케줄링과 운영체제 연산을 책임진다. 운영체제는 모든 프로세스에 대한 제어권을 가지므로, 프로세스 간 통신과 동기화를 조직하는 위치에 있다.
각 프로세스 또는 스레드는 커널 객체로 나타난다. 각 프로세스는 최소 하나의 스레드를 가지므로, 통신은 항상 관련 프로세스의 스레드들 간에 발생한다. 통신을 가능하게 하려면 커널은 특수 객체, 즉 동기화 객체라 불리는 것을 이용해야 한다. 주요 멀티태스킹 객체로는 다음이 있다:
- 프로세스 객체
- 스레드 객체
- 뮤텍스(Mutex) 객체
- 세마포어(Semaphore) 객체
- 이벤트 객체