[OS] 프로세스와 스레드
by 브이담곰📘그림으로 배우는 구조와 원리 운영체제 (개정 3판)을 공부한 후 정리한 글입니다.
프로세스의 개념
• 실행 중인 프로그램
• 비동기적 행위를 일으키는 주체
• 프로시저가 활동 중인 것
• 실행 가능한 PCB(프로세스 제어 블록)가 있는 프로그램
• 프로세서가 할당하는 개체로 디스패치가 가능한 단위
■ 스택( stack )
- 데이터를 일시적으로 저장하는 영역
- 지역변수에 사용 → 변수가 범위 밖으로 이동하면 공간을 해제
- 호출한 함수의 반환 주소, 반환 값, 매개변수 등에 사용.
- 힙과 인접한 방향으로 커져 스택 포인터와 힙 포인터를 만나면 메모리가 소진 되었다는 의미.
■ 힙( heap )
- 코드 영역과는 별도로 유지되는 자유 영역.
- 동적으로 메모리를 할당하려고 프로그램 실행 중 시스템 호출을 사용했자가 해제 하는 방법으로 사용.
- 동적 메모리 할당이 발생 시 보통 위쪽으로 커짐.
■ 데이터( data )
- 프로그램의 가상 주소 공간.
- 전역변수나 정적변수를 저장하거나 할당 & 실행하기 전에 초기화
- 초기화 하지 않은 데이터는 데이터 영역의 끝에서 시작.
■ 코드( code )
- 실행 명령을 포함하는 메모리 또는 목적 파일에 있는 프로그램 영역.
- 프로그램을 시작할 때 프로세서가 디스크에서 읽어 실행하는 컴파일 프로그램을 저장.
- 프로세스로 변경 ❌
사용자 프로세스와 시스템 프로세스 비교
사용자 프로세스 | 사용자 코드를 수행하는 프로세스 |
시스템 프로세스 | - 모든 메모리와 프로세서의 명령에 액세스 할 수 있는 프로세스. - 프로세스 실행 순서를 제어, 다른 사용자 및 커널(운영체제) 영역을 침범하지 못하게 감시. - 사용자 프로세스를 생성 |
프로세스의 상태변화
💙 활성 상태( Active Status)
상태 변화 | 표기 방법 | 설명 |
준비 → 실행 | dispatch(프로세스 이름) | 준비 큐 맨 앞에 있던 프로세스가 프로세서를 점유 ⭐CPU 스케줄러가 다음에 실행할 프로세스 선정 |
실행 → 준비 | timeout(프로세스 이름) | 실행 중인 프로세스의 프로세서 독점을 막기 위해 인터럽트 클록(Interrupt clock)을 두어 특정 프로세스가 할당된 시간 동안만 프로세서를 점유. |
실행 → 대기(보류) | block(프로세스 이름) | 할당된 시간(time slice) 이전에 실행 상태의 프로세스에 입출력 신호나 이벤트 발생시 스스로 프로세서를 양도 |
대기(보류) → 준비 | wakeup(프로세스 이름) | 입출력 작업이 끝나면 깨움(wake-up)으로 대기에서 준비상태가 됨. |
❗ 프로세스 스스로 하는 것은 대기뿐이고, 나머지는 외부 조건으로 발생한다.
💙 휴식 상태 ( pause status )
- 프로세스가 작업을 일시적으로 쉬고 있는 상태.
- 데이터가 메모리에 존재 & 프로세스 제어 블록 유지 → 멈춘 지점에서 재시작 ⭕
💙 보류 상태 ( suspend status ) → '일시 정지 상태'
- 프로세스가 메모리에서 잠시 쫓겨난 상태.
- 보류상태에 들어간 프로세스는 메모리 밖으로 쫓겨나 스왑 영역에 보관됨.
- 재시작시 원래의 활성 상태로 들어감.
- 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보내야 하는경우
- 프로그램에 오류가 있어서 실행을 미루어야 할 경우
- 바이러스와 같이 악의적인 공격을 하는 프로세스라고 판단될 때
- 매우 긴 주기로 반복되는 프로세스여서 메모리 밖으로 쫓아내도 큰 문제가 없을 때
- 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때
프로세스 제어 블록(PCB, Process Control Block)
→ 운영체제가 프로세스를 제어할 때 필요한 프로세스 상태 정보는 프로세스 제어 블록에 저장됨.
✔ 프로세스 생성 : 메모리에 PCB 생성 , 프로세스 종료 : PCB 삭제
📍 PCB
프로세스 식별자 | 각 프로세스의 고유 식별자 |
프로세스 상태 | 생성, 준비, 실행, 대기, 중단 등 상태 표시 |
프로그램 카운터 | 프로세스를 실행하는 다음 명령의 주소 표시 |
레지스터 저장 영역 | 누산기, 인덱스 레지스터, 스택 포인터 , 범용 레지스터, 조건 코드 등 정보. (컴퓨터 구조에 따라 달라질 수 있음) 인터럽트 발생시 프로그램 카운터와 함께 저장하여 재실행할 때 원래대로 복귀할 수 있게 함 |
프로세서 스케줄링 정보 | 프로세스 우선순위, 스케줄링 큐의 포인터, 기타 스케줄 매개변수 |
계정 정보 | 프로세서 사용 시간, 실제 사용 시간, 사용 상한 시간, 계정 번호, 작업이나 프로세스 번호 등 |
입출력 상태정보 메모리 관리 정보 . . . |
- 특별한 입출력 요구 프로세스에 할당된 입출력 장치, 열린 파일 리스트 등 - 운영체제가 사용하는 메모리 시스템에 따른 상한, 하한 레지스터(경계 레지스터), 페이지 테이블이나 세그먼트 테이블 값 등. |
💡 프로세스 제어 블록은 운영체제가 해당 프로세스를 실행하기 위해 관리하는 데이터 구조이므로 운영체제 영역에 만들어짐.
✔ 프로세스와 프로그램의 관계
프로세스 = 프로그램 + PCB
프로그램 = 프로세스 - PCB
문맥 교환 ( Context Switching )
- 특정 프로세서의 작업을 중단하여 CPU를 다른 프로세스에 넘겨줄 때, 이전 프로세서의 레지스터들은 저장하고, 실행될 프로세스의 레지스터를 시스템에 적재하는 작업.
- CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업.
- 두 프로세스의 프로세스 제어 블록을 교환하는 작업.
✔ 문맥교환과 타임 슬라이스의 크기
타임 슬라이스가 너무 클 경우 → 한 프로세스의 작업이 끝난 뒤 다른 프로세스의 작업이 이루어 질 때까지 긴시간이 걸려서 작업이 끊겨 보임.
타임 슬라이스가 너무 작을 경우 → 여러 프로그램이 동시에 실행되는 것 처럼 보임 ( 시스템 성능 저하 우려 )
⭐ 타임 슬라이스를 되도록 작게 하되, 문맥 교환에 걸리는 시간을 고려하여 적당한 크기로 설정하는 것이 중요
스레드
프로세스 안에서의 작업 단위로, 시스템의 여러 자원을 할당받아 실행하는 프로그램의 단위
- 프로세스의 직접 실행 정보를 제외한 나머지 프로세스 관리 정보를 공유함.
- 프로그램 카운터가 독립적 → 같은 프로세스의 스레드들이 동시에 코드의 동일한 부분이나 다른 부분 실행 ⭕
처리(job) > 프로세스(task) > 스레드(operation)
• 사용자 응답성 증가 : 병렬 프로그래밍으로 프로그램을 계속 실행 가능.
• 프로세스의 자원과 메모리 공유 가능
• 경제성이 좋음 : 스레드를 생성하여 문맥교환을 하면 오버헤드가 줄어듦.
• 다중처리(멀티 프로세싱)로 성능과 효율 향상 : 각 스레드를 여러 프로세서에서 병렬로 실행하여 성능가 효율성을 높일 수 있음.
스레드 제어 블록
- 스레드 간에 보호는 하지 않는다.
• 실행 상태 : PR, PC, SP
• 스케줄링 정보 : 상태(실행,준비, 대기), 우선순위, 프로세서 시간
• 계정 정보
• 스케줄링 큐용 다양한 포인터
• 프로세스 제어 블록을 포함하는 포인터
프로세스와 스레드의 차이
스레드 - 할당받은 자원을 이용하는 실행단위
프로세스 - 운영체제로부터 자원을 할당받는 작업 단위
프로세스는 약하게 연결 되어있는 반면 스레드는 강하게 연결되어 있음.
스레드는 하나의 프로세스 안에서 병향성을 증대시키는 메커니즘.
사용자 스레드( 1 to N 모델 )
- 초기 스레드 시스템에서 적용
- 사용자 레벨에서 라이브러리 사용 → 스레드 구현
[라이브러리] 커널이 지원하는 기능을 대신 구현( 스케줄링, 동기화 )
커널이 하는 일을 라이브러리가 직접 처리 → 여러개의 스레드로 작동
• 장점 : 같은 프로세스 내에서의 작업이고, Library가 직접 스케줄링하여 정보를 처리하기 때문에 문맥교환 ❌ → 속도↑
• 단점
(1) 하나의 커널 스레드에 여러개의 스레드가 연결되어 있기 때문에, 커널 스레드가 "입출력" 작업을 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기함.
(2) 작업을 나눌 수 없음 → 1개의 프로세스이기 때문에 CPU에 나누어 작업 ❌
(3) 보안에 취약
⭐ 커널 레벨에서는 공유변수를 보호하는 장치가 있음.
커널 스레드( 1 to 1 모델 )
✔ 사용자 스레드와 장점이 반대
- 커널이 멀티 스레드를 지원하는 방식.
- 하나의 사용자 스레드가 하나의 커널 스레드와 연결됨.
• 장점
(1) 특정 스레드가 "대기" 상태여도 다른 스레드는 작업 진행 가능
(2) 멀티 CPU 사용 가능
(3) 커널 기능 사용 가능 ( 보안 ↑)
• 단점 : 문맥교환으로 인한 오버헤드 → 속도↓
멀티 레벨 스레드 ( M to N 모델 )
- 사용자 스레드와 커널 스레드를 혼합한 형식.
커널 스레드 개수 ≤ 사용자 스레드 개수
• 장점
하나의 커널 스레드가 대기 상태에 들어가면 다른 스레드가 대신 작업 → 유연한 작업 처리
• 단점
문맥 교환 시 오버헤드 ⭕ ( 사용자 만큼 빠르지 ❌ )
'Computer Science > 운영체제' 카테고리의 다른 글
[OS] 운영체제의 소개 (0) | 2023.04.30 |
---|---|
[OS] 컴퓨터 하드웨어의 구성 (0) | 2023.03.09 |
블로그의 정보
농담곰담곰이의곰담농
브이담곰