3. 프로세스와 스레드

2023. 4. 13. 20:03운영체제

728x90

1. 프로세스의 개요

1-1 프로세스의 개념

프로그램

: 저장장치에 저장되어 있는 정적인 상태

 

프로세스

: 실행을 위해 메모리에 올라온 동적인 상태

-> 프로그램 + 프로세스 제어 블록

 

1-2 프로세스의  상태

생성 상태

  • 프로세스가 메모리에 올라와 실행 준비를 완료한 상태

 

 

준비 상태

  • 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태
  • PCB는 준비 큐에서 기다리며 CPU 스케줄러에 의해 관리
  • CPU 스케줄러는 준비 상태에서 큐를 몇 개 운영할지,
    큐에 있는 어떤 프로세스 제어 블록을 실행 상태로 보낼지 결정

 

 

실행 상태

  • 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태
  • 자신에게 주어진 타임 슬라이스 동안만 작업 가능
  • 타임 슬라이스 동안 작업이 완료되면 exit(PID) 가 실행되어 프로세스가 정상 종료
  • 타임 슬라이스를 다 사용하면 timeout(PID) 가 실행되어 준비 상태로 옮김
  • 프로세스가 입출력을 요청하면 CPU 는 입출력 관리자에게 입출력을 요청하고 block(PID)를 실행
    -> 입출력이 완료될 때까지 작업을 진행할 수 없기 때문에 해당 프로세스를 대기 상태로 옮기고 
    CPU 스케줄러는 새로운 프로세스를 실행 상태로 가져옴

 

 

대기 상태

  • 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태
  • 대기 큐에서 기다리다가 완료되면 인터럽트가 발생
    -> wakeup(PID) 로 해당 프로세스의 프로세스 제어 블록이 준비 상태로 이동

 

 

완료 상태

  • 실행 상태의 프로세스가 주어진 시간 동안 작업을 마치면 진입하는 상태
    (프로세스 제어 블록이 사라진 상태)
  • 코드와 사용했던 데이터를 메모리에서 삭제하고 프로세스 제어 블록을 폐기
  • 정상적인 종료는 exit( )로 처리
    -> 부모 프로세스는 자식의 자원 회수
  • 오류나 다른 프로세스에 의해 비정상적으로 종료되는 강제 종료를 만나면 디버깅하기 위
    해 종료 직전의 메모리 상태를 저장장치로 옮기는데 이를 코어 덤프 (core dump)라고 함

 

 

휴식 상태

  • 프로세스가 작업을 일시적으로 쉬고 있는 상태
  • 유닉스에서 ctrl + z키로 프로세스 중단
  • 종료 상태가 아니라 원할 때 다시 시작 가능

 

보류 상태

  • 프로세스가 메모리에서 잠시 쫓겨난 상태
    -> 메모리가 꽉 차서 메모리 밖으로 내보낼 때, 
    프로그램에 오류가 있어서 실행을 미루어야 할 때 등등 

 

* 디스패치: 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러의 작업

* 타임아웃: 프로세스가 자신에게 주어진 타임 슬라이스 동안 작업을 끝내지 못하면

다시 준비 상태로 돌아가는 것


2. 프로세스 제어 블록과 문맥 교환

2-1 프로세스 제어 블록(PCB:Process Control Block)

  • 운영체제가 해당 프로세스를 위해 관리하는 자료 구조
  • 프로세스는 각각 자신만의 제어 블록을 가짐

 

2-2 프로세스 제어 블록의 구성

  • 포인터: 준비 상태나 대기 상태의 큐를 구현할 때 사용
    -> 대기 상태에는 같은 입출력을 요구한 프로세스끼리 연결할 때 포인터 사용
  • 프로세스 상태 : 프로세스가 현재 어떤 상태에 있는지를 나타내는 정보
  • 프로세스 ID: 운영체제 내에 있는 여러 프로세스를 구별하기 위한 구분자
  • 메모리 관리 정보: 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보
  • 부모 프로세스 구분자와 자식 프로세스 구분자 :부모 프로세스를 가리키는 PPID와 
    자식 프로세스를 가리키는 PID 정보
  • 프로세스 우선순위 : 프로세스의 실행 순서를 결정하는 우선순위
  • 계정 번호, CPU 할당 시간, CPU 사용시간 등등.....

 

 

2-3 문맥 교환 (Context Switch)

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

 


3. 프로세스의 연산

3-1 프로세스의 구조

  • 코드 영역: 프로그램의 본문
    -> 탑재된 코드는 읽기 전용으로 처리됨
  • 데이터 영역: 변수나 파일 등의 각종 데이터를 모아놓은 곳
    -> 읽기와 쓰기가 가능
  • 스택 영역: 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 이 영역에 저장
    -> 사용자에게는 보이지 않음

 

3-2 프로세스의 생성과 복사

fork() 

  • 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어짐
  • 실행하던 프로세스는 부모 프로세스, 새로 생긴 프로세스는 자식 프로세스
  • PCB를 포함한 부모 프로세스의 대부분이 자식 프로세스에 복사
    -> 단 프로세스 제어 블록의 내용 중 다음이 변경됨
    • 프로세스 구분자
    • 메모리 관련 정보
    • 부모 프로세스 구분자와 자식 프로세스 구분자
  • 장점: 프로세스의 생성 속도가 빠름
    -> 추가 작업 없이 자원 상속 가능
  • 부모 프로세스에 0 보다 큰 값을 반환하고 자식 프로세스에 0을 반환
    0보다 작으면 에러

 

exec()

  • 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출
    -> 기존의 프로세스를 새로운 프로세스로 전환 재사용하는 함수
  • 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 
  • 데이터 영역이 새로운 변수로 채워지고 스택 영역이 리셋
  • 프로그램 카운터 레지스터 값을 비롯한 각종 레지스터와 사용한 파일 정보가 모두 리셋
    -> 프로세스 구분자가 변경되지 않기 때문에, 프로세스가 종료된 후에 부모 프로세스로 돌아올 수 있음.

3-3 프로세스의 계층 구조

장점

  • 여러 작업 동시 처리 가능
  • 프로세스 재사용 용이
  • 자원 회수 용이

* 프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스가 없도록

exit() 또는 return() 문으로 자식 프로세스가 작업이 끝났음을 부모 프로세스에 알림.


4. 스레드

프로세스의 코드에 정의된 절차에 따라 CPU에게 작업 요청을 하는 실행 단위

  • 운영체제 입장에서의 작업 단위는 프로세스
  • CPU 입장에서의 작업 단위는 스레드

 

 

4-1 멀티태스크와 멀티스레드의 차이

  • 멀티태스크: 여러 개의 프로세스로 구성(시분할 기법으로 처리)
     fork()로 프로세스를 복사하면 코드 영역과 데이터 영역의 일부가 중복 존재
  • 멀티스레드: 하나의 프로세스에 여러 개의 스레드로 구성
    -> 소프트웨어적인 방법
    멀티스레드는 자원을 공유함으로써 자원의 낭비를 막는다.
  • 멀티프로세싱: CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리
  • CPU 멀티스레드: 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법
    -> 하드웨어적인 방법

 

 

4-2 멀티스레드의 장단점

  • 장점: 자원 공유, 효율성 향상, 다중 CPU 지원, 응답성 향상
  • 단점: 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미침

 

4-3 멀티스레드 모델

  • 커널 스레드: 커널이 직접 생성하고 관리하는 스레드
  • 사용자 스레드: 라이브러리에 의해 구현된 일반 스레드

 

사용자 레벨 스레드

  • 사용자 프로세스 내에 여러 개의 스레드가 커널의 스레드 하나와 연결(1 to N 모델)
    -> 커널 스레드가 입출력 작업을 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기
  • 라이브러리가 직접 스케줄링 
    -> 문맥 교환 필요 없음
  • 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 멀티 CPU 사용할 수 없음

 

커널 레벨 스레드

  • 하나의 사용자 스레드가 하나의 커널 스레드와 연결 (1 to 1 모델)
  • 독립적으로 스케줄링
    -> 커널 스레드 하나가 대기상태에 들어가도 다른 사용자 스레드들은 영향받지 않음
  • 커널 레벨에서의 작업이므로 멀티 CPU 사용 가능
  • 커널이 관리하므로 문맥 교환할 때 오버헤드 때문에 느리게 작동
  • 커널의 기능을 사용하므로 보안에 강하고 안정적 

 

멀티 레벨 스레드

  • 사용자 레벨 스레드 + 커널 레벨 스레드 (M to N 모델)
  • 사용자 레벨 스레드보다 유연하게 작업 가능
  • 문맥 교환이 있으므로 사용자 레벨 스레드만큼 빠르진 않음

 

 

728x90

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

교착상태 (deadlock)  (1) 2023.05.29
5. 프로세스 동기화  (0) 2023.04.14
4. CPU 스케줄링  (0) 2023.04.14
2. 컴퓨터 구조와 성능 향상  (2) 2023.04.13
1. 운영체제 개요  (1) 2023.04.13