프로세스
- 프로그램: 프로그램이란 어떤 데이터를 사용하여 어떤 작업을 할지 그 절차를 적어 놓은 것이다.
- 프로세스: 프로세스란 실행 중에 있는 프로그램을 의미한다.
프로세스 상태 (Process Status)
- 생성상태(Create Status) : 프로세스가 메모리에 올라와 실행 준비를 완료한 상태
- 프로세스를 관리하는 데 필요한 프로세스 제어블록이 생성
- 준비상태(Ready Status) : 생성된 프로세스가 CPU를 얻을 때 까지 기다리는 상태
- 컴퓨터에서는 한 번에 하나의 프로세스가 실행 가능
- 실행상태(Running Status) : 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행 상태로 변경 (Execute Status 라고도 한다.)
- 일정 시간 동안만 CPU를 사용
- 시간이 지난 후 완료가 되지 않으면 다시 준비 상태로 되돌아 간다.
- 완료상태(Terminate Status) : 작업 완료 상태
- 프로세스 제어블록(PCB)는 사라진다
- 준비 상태에 있는 여러 프로세스중 다음에 실행할 프로세스를 선정하는 일을 CPU 스케줄러가 담당한다.
- 실행상태로 바꾸는 작업을
디스패치
라고한다.
- 실행 상태에서 작업이 끝내지 못해 다시 준비 상태로 돌아가는 것을
타임아웃
이라고 한다.
- 코어덤프(Core Dump) : 오류나 다른 프로세스에 의해 비정상 적으로 종료되는 강제 종료를 만나면 디버깅 하기 위해 강제 종료 직전의 메모리 상태를 저장 장치로 옮긴다.
- 대기상태(Blocking Status) : 입출력을 요구한 프로세스가 입출력이 완료될 때 까지 기다리는 상태
- 휴식상태(Pause Status) : 프로세스가 작업을 일시적으로 쉬고 있는 상태
- 사용하던 데이터는 메모리에 그대로 존재 (PCB도 존재한다.)
- 보류상태(Suspend Status) : 프로세스가 메모리에서 쫓겨난 상태
- 보류 상태로 돌아간 프로세스가 스왑 영역(Swap Area)에 보관된다.
- 메모리가 꽉차서 일부 프로세스를 메모리 밖으로 내보낼 때
- 프로그램에 오류가 있어서 실행을 미루어야 할 때
- 매우 긴 주기로 반복되는 프로세스라 메모리 밖으로 쫓아내도 큰 문제가 없을 때
- 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때
프로세스 제어 블록과 문맥 교환
제어블록(PCB: Process Control Block)은 작업 지시서와 같다.(지시서에는 각종 정보가 들어있다.) 제어블록이 없으면 프로그램에서 프로세스로 전환이 불가능하다.
제어블록 구조
- 포인터 : 프로세스가 제어블록을 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 사용
- 프로세스 상태 : 생성, 준비, 실행, 완료, 대기, 보류 준비, 보류 대기
- 프로세스 구분자 : PID(식별자)
- 프로그램 카운터 : 다음에 실행될 명려어의 위치를 가리키는 가운터 값을 저장
- 프로세스 우선순위
- 각종 레지스터 정보
- 메모리 관리 정보 : 프로세스의 메모리 위치 정보, 메모리 보호를 위한 경계 레지스터 및 한계 레지스터
- 할당된 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보
- 계정 정보 : 계정 정보, CPU 할당 시간, CPU 사용 시간
- 부모 프로세스와 자식 프로세스 구분자 : PPID (Parent PID), CPID(Child PID)
문맥 교환
문맥교환이란 CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 의미한다. 실행 상태에서 프로세스 제어블록에는 지금 까지의 작업 내용을 저장하고, 반대로 실행 상태로 돌아오는 프로세스 제어블록의 내용으로 CPU가 다시 세팅된다.
프로세스 연산
프로세스는 다음과 같은 구조로 되어 있다.
- 코드 영역 : 프로그래머가 작성한 프로그램 코드 엉역 (읽기 전용 처리)
- 데이터 영역 : 변수나 파일등의 각종 데이터를 모아 놓은 곳 ( 읽기 쓰기 가능, 만약 상수일 경우 읽기만 가능하다.)
- 데이터 영역과 코드 영역은 프로세스가 실행되기 직전에 위치와 크기가 결정되고 실행되는 동안 변하지 않으므로 정적 할당 영역이라고 부른다.
- 스택 영역 : 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역, 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸된다. (사용자는 볼 수 없다.)
- 스택은 스레드가 작동하는 동안 추가되거나 삭제되는 동적 할당 영역이다.
- 힙 영역 : 사용자가 직접 관리할 수 있는 ‘그리고 해야만 하는’ 메모리 영역, 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
- 스택 영역과 힙 영역은 프로세스가 실행되는 동안 만들어지는 영역으로, 그 크기가 늘기도 하고 줄어들기도 하는 동적 할당 영역이다.
프로세스 생성과 복사
fork() 시스템 호출
- 실행 중인 프로세스로 부터 새로운 프로세스를 복사하는 함수, 커널에서 제공한다.
- 실행하던 프로세스 -> 부모 프로세스
- 새로 생긴 프로세스 -> 자식 프로세스
fork() 시스템 호출의 장점
- 프로세스의 생성 속도가 빠르다.
- 추가 작업 없이 자원을 상속 할 수 있다.
- 시스템 관리를 효율적으로 할 수 있다.
exec() 시스템 호출
- exec() : 기존 프로세스를 새로운 프로세스로 전환하는 함수 (프로세스 재활용 목적)
- 각종 프로세스 구분자(PID, PPID, CPID)만 남겨두고 프로세스의 나머지 내용을 새로운 것으로 바꾼다.
- 또한 데이터 내용이 새로운 데이터로 채워지고 스택 영역이 리셋된다.
exit()와 wait() 시스템 호출
exit() 혹은 return() 문을 사용하는 이유는 자식 프로세스가 끝났음을 부모 프로세스에 알려주기 위함이다.
- exit() : 작업의 종료를 알려주는 함수 (인자가 0이면 정상 종료, -1이면 비정상 종료)
- wait() : 자식 프로세스가 끝날 때 까지 기다리는 함수
고아 프로세스 : 자식 프로세스가 종료되기 전에 부모 프로세스가 먼저 종료되면 자식 프로세스는 고아 프로세스(Orphan Process)가 된다.
좀비 프로세스 : 자식 프로세스가 종료 되었는데도 부모 프로세스가 뒤처리를 하지 않았을 때 발생
스레드
스레드란 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위이다.
- 멀티 스레드 : 프로세스 내에 작업을 여러 개의 스레드로 분할 함으로써 작업의 부담을 줄이는 프로세스 운영 기법
- 멀티 태스킹 : 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법 (이렇게 시간을 잘게 나눈어 주는 시스템을 시분할 시스템이라고 한다.)
- 멀티 프로세싱 : CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 사용하는 기법(컴퓨터 하나의 CPU 여러 개 설치)
- CPU 멀티 스레드 : 한 번에 하나씩 처리해야 하는 스레드를 잘게 쪼개어 동시에 처리하는 명령어 병렬 처리 기법
멀티 스레드의 장점
- 자원의 중복 사용을 피함으로써 낭비를 막을 수 있다.
- 하나의 프로세스에서 여러 스레드를 사용하면 작업의 효율을 높일 수 있다.
- 응답성 향상 : 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업을 원할하게 빨리 응답할 수 있다.
- 효율성 향상 : 여러 개의 프로세스를 생성할 필요 없이 불 필요한 자원의 중복을 막음으로써 시스템의 효율이 향상된다.
- 다중 CPU 지원 : 2개 이상의 CPU를 가진 컴퓨터에서, 멀티 스레드를 사용하면 다중 CPU가 멀티 스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축된다.
멀티 스레드의 단점
- 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다. (자원을 공유하기 때문)
- 프로세스는 자원을 공유하지 않고 독립적이기 때문에 여러 프로세스 중 한 프로세스에 문제가 생겨도 다른 프로세스에는 영향을 미치지 않는다.
멀티 스레드 모델
사용자 스레드(1 to N 모델)
- 커널이 멀티 스레드를 지원하지 않을 때 사용자 레벨에서 라이브러리를 사용하여 스레드를 구현(커널에 입장에서는 하나의 프로세스로 간주, 하나의 프로세스에서 일어나기 때문에 문맥교환이 되지 않는다.)
사용자 스레드 단점 :
- 여러 개의 스레드가 하나의 커널 스레드와 연결되기 때문에 커널이 대기 상태에 빠지면 모든 사용자 스레드가 대기 상태가 된다.
- 여러 개의 CPU를 동시에 사용할 수 없다.
- 보안이 취약하다.
커널 스레드 (1 to 1 모델)
- 커널 스레드는 커널이 멀티 스레드를 지원하는 방식으로, 하나의 사용자 스레드가 하나의 커널 스레드와 연결되기 때문에 1 to 1 모델이라고 한다.
- 커널 스레드는 독립적으로 스케줄링 된다.
- 대기 상태여도 작업이 가능하다.
- 커널이 제공하는 보호 기능 사용이 가능하다.
- 멀티 CPU 사용이 가능하다.
커널 스레드 단점
- 문맥교환을 할 때 오버헤드 때문에 느리게 작동한다.
멀티레벨 스레드 (M to N 모델)
- 사용자 스레드 + 커널 스레드
- 커럴 스레드의 개수가 사용자 스레드 보다 작거나 같다.
- 멀티레벨 스레드는 사용자 스레드와 커널 스레드의 장단점을 모두 가지고 있다.