-
프로세스의 개요
프로그램이 실행을 위해 메모리에 올라온 동적인 상태를 프로세스라 한다.
이 때 프로그램은 프로세스 제어 블록(PCB)를 부여받아 운영체제에 의해 관리된다.
프로세스는 5가지의 상태를 가질 수 있다.
- 생성 상태
프로세스가 메모리에 올라와 실행 준비를 마친(PCB를 얻은) 상태 - 준비 상태
생성된 프로세스가 CPU를 얻을 때까지 대기하는 상태 - 실행 상태
CPU를 얻어 실제로 작업을 수행하는 상태 - 대기 상태
입출력 요청이 들어온 프로세스가 입출력이 완료될 때 까지 대기하는 상태 - 완료 상태
작업을 완료하여 PCB가 사라진 상태
dispatch: 준비 > 실행
timeout(interrupt): 실행 > 준비
block: 실행 > 대기
exit: 실행 > 완료
wakeup: 대기 > 준비
메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때
프로그램에 오류가 있어 실행을 미루어야 할 때
위험성이 있는 프로세스라고 판단될 때
매우 긴 주기로 반복되는 프로세스일 때
입출력이 계속 지연되는 프로세스 일 때
보류 상태로 넘기기도 한다.
프로세스 제어 블록과 문맥 교환
- PCB
PCB는 프로세스를 실행하는데 필요한 정보를 담고있는 자료구조로
프로세스는 고유한 PCB를 갖는다.
프로세스 생성시에 생기고 실행완료시 폐기된다.
- Context Switch
CPU가 차지하고 있던 프로세스가 나가고 새로운 프로세스로 교체하는 작업으로
PCB에 지금까지의 작업 내용을 저장하고 PCB에 내용을 토대로 CPU를 세팅하는 작업을 수행한다.
이런 오버헤드가 있어 빈번한 문맥 교환은 성능 저하의 원인이 된다.
프로세스의 연산
- 프로세스의 구조
프로세스는 크게 아래의 세 메모리 구조로 구성된다.
- 코드 영역
프로그램 코드가 기술된 곳으로 읽기 전용이다. - 데이터 영역
코드가 실행되면서 사용하는 변수 등 각종 데이터가 보관된 곳으로 읽고 쓸 수 있다. - 스택 영역
운영체제가 프로세스를 실행하기 위해 필요한 데이터를 모아놓은 곳으로 사용자에게 숨겨져 있다.
- 프로세스의 생성과 복사
fork() 시스템 함수를 이용해서 프로세스를 복사할 수 있는데,
이 과정에서 PCB와 프로세스의 구조(메모리)가 모두 복사된다.
그리고 부모-자식 관계가 형성되는데 자식은 부모와 PCB에서 다음 항목이 달라진다.
프로세스 구분자, 메모리 관리 정보, 부모/자식 프로세스 구분자
fork를 이용하면 프로세스의 생성 속도가 빠르고,
추가 작업 없이 자원을 상속할 수 있다는 장점이 있다.
*fork 사용시 부모 프로세스에겐 자식 프로세스의 pid 반환, 자식 프로세스에겐 0 반환
exec() 시스템 함수는 이미 만들어진 프로세스의 구조를 재활용 하는 함수로
코드 영역의 내용을 새로운 코드로 바꿔버리는 역할을 수행한다.
그에 따라 데이터 영역이 새로운 변수로 채워지고, 스택 영역이 리셋된다.
또한 PCB에선 프로그램 카운터, 각종 레지스터가 리셋된다.
fork를 통해 프로세스는 계층 구조를 이루게 되는데,
여러 작업을 동시에 처리하거나,
프로세스의 재활용이 용이하거나,
자원 회수가 쉽다는 장점이 있다.
스레드
스레드는 CPU 스케줄러가 CPU에 전달하는 일 하나를 의미하며, 즉 CPU의 작업 단위를 말한다.
(운영체제의 작업 단위는 프로세스, CPU의 작업 단위는 스레드)
멀티태스크는 여러개의 프로세스로 구성된 것을 뜻하고
멀티스레드는 하나의 프로세스에 여려개의 스레드로 구성된 것을 뜻한다. (소프트웨어적)
CPU 멀티스레드는 파이프라인 기법을 이용해 물리적으로 여러 쓰레드를 동시에 처리하는 것을 뜻한다. (하드웨어적)
멀티스레드는 멀티태스킹과 달리 코드, 파일 등의 정적자원을 공유하기 때문에 효율적이고 응답성이 향상된다.
뿐만 아니라 다중 CPU를 지원한다는 장점도 있다.
하지만, 모든 스레드가 같은 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다는 단점도 있다.
(실제로 IE는 멀티스레드를, Chrome은 멀티태스킹을 이용한다고 함)
커널이 직접 생성하고 관리하는 스레드를 커널 스레드,
사용자 라이브러리에 의해 구현된 일반적인 스레드를 사용자 스레드라 한다.
- 사용자 레벨 스레드
사용자 프로세스 내에 여러 개의 스레드가 커널의 스레드 하나와 연결 (n to 1)
사용자 라이브러기가 직접 스케줄링 하기 때문에 문맥 교환이 없기에 속도가 빠르다.
하지만, 커널 스레드가 입출력 대기상태가 되면 모든 사용자 스레드가 대기하게 되고,
한 프로세스의 타임 슬라이스를 모든 프로세스가 공유하기에 여러 CPU를 동시에 활용할 수 없다.
- 커널 레벨 스레드
하나의 사용자 스레드가 하나의 커널 스레드와 연결 (1 to 1)
독립적으로 스케줄링 되기 때문에 대기함에 있어 의존성이 없고,
커널 레벨에서 모든 작업을 지원하기에 멀티 CPU를 활용할 수 있고, 보안에 강하며 안정적이다.
다만, 문맥 교환 오버헤드 때문에 느리다.
- 멀티 레벨 스레드
사용자 + 커널 레벨 스레드 (m to n)
빠르게 움직여야 할 스레드는 사용자 레벨 스레드로,
안정적으로 움직여야 할 스레드는 커널 레벨 스레드로 동작한다.
'대학 > 운영체제' 카테고리의 다른 글
교착 상태 (Deadlock) (0) 2023.06.04 프로세스 동기화 (0) 2023.06.04 CPU 스케줄링 (0) 2023.04.16 컴퓨터의 구조와 성능 향상 (0) 2023.04.16 운영체제와 컴퓨터 (0) 2023.04.16 - 생성 상태