농담곰담곰이의곰담농

[OS] 프로세스와 스레드

by 브이담곰
📘그림으로 배우는 구조와 원리 운영체제 (개정 3판)을 공부한 후 정리한 글입니다.

 

프로세스의 개념

     •  실행 중인 프로그램

     •  비동기적 행위를 일으키는 주체

     •  프로시저가 활동 중인 것

     •  실행 가능한 PCB(프로세스 제어 블록)가 있는 프로그램

     •  프로세서가 할당하는 개체로 디스패치가 가능한 단위

 

프로그램과 프로세스 : 프로그램이 메모리로 적재되면 프로세스가 됨
프로세스의 일반적인 메모리 구조( 사용자 관점의 프로세스 )

스택( stack )

   -  데이터를 일시적으로 저장하는 영역

   -  지역변수에 사용 → 변수가 범위 밖으로 이동하면 공간을 해제

   -  호출한 함수의 반환 주소, 반환 값, 매개변수 등에 사용.

   -  힙과 인접한 방향으로 커져 스택 포인터와 힙 포인터를 만나면 메모리가 소진 되었다는 의미.

 

힙( heap )

   - 코드 영역과는 별도로 유지되는 자유 영역.

   - 동적으로 메모리를 할당하려고 프로그램 실행 중 시스템 호출을 사용했자가 해제 하는 방법으로 사용.

   - 동적 메모리 할당이 발생 시 보통 위쪽으로 커짐.

 

데이터( data )

    - 프로그램의 가상 주소 공간.

    - 전역변수나 정적변수를 저장하거나 할당 & 실행하기 전에 초기화

    - 초기화 하지 않은 데이터는 데이터 영역의 끝에서 시작.

 

코드( code )

    - 실행 명령을 포함하는 메모리 또는 목적 파일에 있는 프로그램 영역.

    - 프로그램을 시작할 때 프로세서가 디스크에서 읽어 실행하는 컴파일 프로그램을 저장.

    - 프로세스로 변경 ❌

 

사용자 프로세스와 시스템 프로세스 비교

사용자 프로세스 사용자 코드를 수행하는 프로세스
시스템 프로세스 - 모든 메모리와 프로세서의 명령에 액세스 할 수 있는 프로세스.
- 프로세스 실행 순서를 제어, 다른 사용자 및 커널(운영체제) 영역을 침범하지 못하게 감시.
- 사용자 프로세스를 생성

시스템 관점에서 바라본 프로세스


프로세스의 상태변화

💙 활성 상태( Active Status)

상태 변화 표기 방법 설명
준비 → 실행 dispatch(프로세스 이름) 준비 큐 맨 앞에 있던 프로세스가 프로세서를 점유
CPU 스케줄러가 다음에 실행할 프로세스 선정
실행 → 준비 timeout(프로세스 이름) 실행 중인 프로세스의 프로세서 독점을 막기 위해 인터럽트 클록(Interrupt clock)을 두어 특정 프로세스가 할당된 시간 동안만 프로세서를 점유.
실행 → 대기(보류) block(프로세스 이름) 할당된 시간(time slice) 이전에 실행 상태의 프로세스에 입출력 신호나 이벤트 발생시 스스로 프로세서를 양도
대기(보류) → 준비 wakeup(프로세스 이름) 입출력 작업이 끝나면 깨움(wake-up)으로 대기에서 준비상태가 됨.

프로세스의 상태변화

❗ 프로세스 스스로 하는 것은 대기뿐이고, 나머지는 외부 조건으로 발생한다.

대기 상태가 있는 프로세스의 상태 ( 쉽게 배우는 운영체제 p.107 ) - 활성 상태

 

 

💙 휴식 상태 ( pause status )

    - 프로세스가 작업을 일시적으로 쉬고 있는 상태.

    - 데이터가 메모리에 존재 & 프로세스 제어 블록 유지 멈춘 지점에서 재시작 ⭕

 

💙 보류 상태 ( suspend status )  '일시 정지 상태'

    - 프로세스가 메모리에서 잠시 쫓겨난 상태.

    - 보류상태에 들어간 프로세스는 메모리 밖으로 쫓겨나 스왑 영역에 보관됨.

    - 재시작시 원래의 활성 상태로 들어감.

메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보내야 하는경우
-  프로그램에 오류가 있어서 실행을 미루어야 할 경우
바이러스와 같이 악의적인 공격을 하는 프로세스라고 판단될 때
-  매우 긴 주기로 반복되는 프로세스여서 메모리 밖으로 쫓아내도 큰 문제가 없을 때
-  입출력을 기다리는 프로세스의 입출력이 계속 지연될 때

 

보류 상태를 포함한 프로세스의 상태( 쉽게 배우는 운영체제 p.145 )

 


프로세스 제어 블록(PCB, Process Control Block)

→ 운영체제가 프로세스를 제어할 때 필요한 프로세스 상태 정보는 프로세스 제어 블록에 저장됨.

프로세스 생성 : 메모리에 PCB 생성 , 프로세스 종료 : PCB 삭제

 

📍 PCB 

프로세스 식별자 각 프로세스의 고유 식별자
프로세스 상태 생성, 준비, 실행, 대기, 중단 등 상태 표시
프로그램 카운터 프로세스를 실행하는 다음 명령의 주소 표시
레지스터 저장 영역 누산기, 인덱스 레지스터, 스택 포인터 , 범용 레지스터, 조건 코드 등 정보. (컴퓨터 구조에 따라 달라질 수 있음)
인터럽트 발생시 프로그램 카운터와 함께 저장하여 재실행할 때 원래대로 복귀할 수 있게 함
프로세서 스케줄링 정보 프로세스 우선순위, 스케줄링 큐의 포인터, 기타 스케줄 매개변수
계정 정보 프로세서 사용 시간, 실제 사용 시간, 사용 상한 시간, 계정 번호, 작업이나 프로세스 번호 등
입출력 상태정보
메모리 관리 정보
.
.
.
- 특별한 입출력 요구 프로세스에 할당된 입출력 장치, 열린 파일 리스트 등
- 운영체제가 사용하는 메모리 시스템에 따른 상한, 하한 레지스터(경계 레지스터), 페이지 테이블이나 세그먼트 테이블 값 등.

💡 프로세스 제어 블록은 운영체제가 해당 프로세스를 실행하기 위해 관리하는 데이터 구조이므로 운영체제 영역에 만들어짐.

프로세스와 프로그램의 관계
프로세스 = 프로그램 + PCB
프로그램 = 프로세스 - PCB

문맥 교환 ( Context Switching )

   - 특정 프로세서의 작업을 중단하여 CPU를 다른 프로세스에 넘겨줄 때, 이전 프로세서의 레지스터들은 저장하고, 실행될 프로세스의 레지스터를 시스템에 적재하는 작업.

   - CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업.

   - 두 프로세스의 프로세스 제어 블록을 교환하는 작업.

문맥 교환 과정( 쉽게 배우는 운영체제 p.149 )

문맥교환과 타임 슬라이스의 크기
타임 슬라이스가 너무 클 경우 → 한 프로세스의 작업이 끝난 뒤 다른 프로세스의 작업이 이루어 질 때까지 긴시간이 걸려서 작업이 끊겨 보임.
타임 슬라이스가 너무 작을 경우 → 여러 프로그램이 동시에 실행되는 것 처럼 보임 ( 시스템 성능 저하 우려 )
타임 슬라이스를 되도록 작게 하되, 문맥 교환에 걸리는 시간을 고려하여 적당한 크기로 설정하는 것이 중요

타임 슬라이스 크기와 문맥 교환( 쉽게 배우는 운영체제 p.150 )


스레드

프로세스 안에서의 작업 단위로, 시스템의 여러 자원을 할당받아 실행하는 프로그램의 단위

- 프로세스의 직접 실행 정보를 제외한 나머지 프로세스 관리 정보를 공유함.

- 프로그램 카운터가 독립적 → 같은 프로세스의 스레드들이 동시에 코드의 동일한 부분이나 다른 부분 실행 ⭕

스레드의 구조(HPC Lab. KOREATECH)

 

처리(job) > 프로세스(task) > 스레드(operation)

•  사용자 응답성 증가 : 병렬 프로그래밍으로 프로그램을 계속 실행 가능.
•  프로세스의 자원과 메모리 공유 가능 
•  경제성이 좋음 : 스레드를 생성하여 문맥교환을 하면 오버헤드가 줄어듦.
•  다중처리(멀티 프로세싱)로 성능과 효율 향상 : 각 스레드를 여러 프로세서에서 병렬로 실행하여 성능가 효율성을 높일 수 있음.

 

스레드 제어 블록 

- 스레드 간에 보호는 하지 않는다.

   • 실행 상태 : PR, PC, SP

   • 스케줄링 정보 : 상태(실행,준비, 대기), 우선순위, 프로세서 시간

   • 계정 정보    

    스케줄링 큐용 다양한 포인터

    프로세스 제어 블록을 포함하는 포인터

  

프로세스와 스레드의 차이

스레드 - 할당받은 자원을 이용하는 실행단위 

프로세스 - 운영체제로부터 자원을 할당받는 작업 단위

프로세스는 약하게 연결 되어있는 반면 스레드는 강하게 연결되어 있음.

스레드는 하나의 프로세스 안에서 병향성을 증대시키는 메커니즘.

 


사용자 스레드( 1 to N 모델 )

  -  초기 스레드 시스템에서 적용

  -  사용자 레벨에서 라이브러리 사용 → 스레드 구현

[라이브러리] 커널이 지원하는 기능을 대신 구현( 스케줄링, 동기화 )

커널이 하는 일을 라이브러리가 직접 처리  →  여러개의 스레드로 작동

1:N 모델 ( 사용자 스레드 )

   • 장점 : 같은 프로세스 내에서의 작업이고, Library가 직접 스케줄링하여 정보를 처리하기 때문에 문맥교환 ❌속도↑

   • 단점

       (1) 하나의 커널 스레드에 여러개의 스레드가 연결되어 있기 때문에, 커널 스레드가 "입출력" 작업을 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기함.

       (2) 작업을 나눌 수 없음 1개의 프로세스이기 때문에 CPU에 나누어 작업 ❌

       (3) 보안에 취약  

            ⭐ 커널 레벨에서는 공유변수를 보호하는 장치가 있음.

 

커널 스레드( 1 to 1 모델 )

✔ 사용자 스레드와 장점이 반대

  -  커널이 멀티 스레드를 지원하는 방식.

  -  하나의 사용자 스레드가 하나의 커널 스레드와 연결됨.

 

   • 장점

      (1) 특정 스레드가 "대기" 상태여도 다른 스레드는 작업 진행 가능

      (2) 멀티 CPU 사용 가능

      (3) 커널 기능 사용 가능 ( 보안 )

   • 단점 : 문맥교환으로 인한 오버헤드  속도↓

1:1 모델 ( 커널 스레드 )

 

멀티 레벨 스레드 ( M to N 모델 )

  - 사용자 스레드와 커널 스레드를 혼합한 형식.

커널 스레드 개수 ≤ 사용자 스레드 개수

   • 장점

      하나의 커널 스레드가 대기 상태에 들어가면 다른 스레드가 대신 작업 → 유연한 작업 처리

   • 단점

      문맥 교환 시 오버헤드 ⭕ ( 사용자 만큼 빠르지 ❌ )

M : N ( 멀티 레벨 스레드 )

'Computer Science > 운영체제' 카테고리의 다른 글

[OS] 운영체제의 소개  (0) 2023.04.30
[OS] 컴퓨터 하드웨어의 구성  (0) 2023.03.09

블로그의 정보

농담곰담곰이의곰담농

브이담곰

활동하기