Cohe

3장 프로세스와 스레드 본문

운영체제

3장 프로세스와 스레드

코헤0121 2024. 1. 10. 16:01
728x90

프로세스의 개요

프로세스의 개념

  1. 프로그램
    • 저장장치에 저장되어 있는 정적인 상태
  2. 프로세스
    • 실행을 위해 메모리에 올라온 동적인 상태
    • 다양한 정의가 가능하나 가장 일반적인 정의는 “실행 중인 프로그램”
      • 메모리에 적재되어 운영체제의 제어를 받는 상태.
      • 프로세스가 사용하고 있는 메모리 영역
        • (자신의 주소 공간)이 존재함을 의미.
      • 운영체제로부터 프로세스 제어 블록을 얻는다는 뜻.

프로그램에서 프로세스로의 전환

  1. 프로세스 제어 블록Process Control Block, PCB
    • 운영체제가 해당 프로세스를 위해 관리하는 자료 구조
    • 프로세스 제어 블록에 있는 대표적인 세 가지 정보
      • 프로세스 구분자 : 각 프로세스를 구분하는 구분자
      • 메모리 관련 정보 : 프로세스의 메모리 위치 정보
      • 각종 중간값 : 프로세스가 사용했던 중간값
    • 프로그램 종료시 해당 PCB는 폐기됨

프로세스의 상태

  1. 생성 상태(create status): 프로세스가 메모리에 올라와 실행 준비를 완료한 상태. 프로세스 제어 블록 생성
  2. 준비 상태(ready status): 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태
  3. 실행 상태(running status): 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태
  4. 완료 상태(terminate status): 실행 상태의 프로세스가 주어진 시간 동안 작업을 마치면 진입하는 상태. 프로세스 제어 블록 사라짐
    • CPU 스케줄러(CPU scheduler): 준비 상태에 있는 여러 프로세스 중 다음에 실행할 프로세스를 선정
    • 디스패치(dispatch): 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러의 작업
    • 타임아웃(time out): 프로세스가 자신에게 주어진 하나의 타임 슬라이스 동안 작업을 끝내지 못해 다시 준비 상태로 돌아가는 것
  5. 대기 상태(blocking status): 실행 상태의 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태로 작업 효율을 높이기 위해 만들어진 것
  • 준비 상태와 대기 상태에 있는 프로세스들은 각각 준비 리스트(ready list)와 대기 리스트(block list)로 운영 체제에 의해 관리됨
  • 프로세스 전이
    • 디스패치(dispatch) : 준비 상태 → 실행 상태
      • 준비 상태의 프로세스들 중에서 우선순위가 가장 높은 프로세스를 선정하여 CPU를 할당함으로써 실행 상태로 전환
    • 할당 시간 초과(timeout) : 실행 상태 → 준비 상태
      • CPU의 지정된 할당 시간을 모두 사용한 프로세스는 다른 프로세스를 위해 다시 준비 상태로 되돌아 감
    • 대기(block) : 실행 상태 → 대기 상태
      • 실행 중인 프로세스가 입출력 명령을 만나면 대기 상태로 전환
    • 깨움(wake up) : 대기 상태 → 준비 상태
      • 입출력 완료를 기다리다가 입출력 완료신호가 들어오면 대기 중인 프로세스는 준비 상태로 전환
  • 휴식 상태와 보류 상태
    • 휴식 상태(pause status): 프로세스가 작업을 일시적으로 쉬고 있는 상태
    • 보류 상태(suspend status): 프로세스가 메모리에서 잠시 쫓겨난 상태로 ‘일시정지 상태’라고도 불림
      • 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때
      • 프로그램에 오류가 있어서 실행을 미루어야 할 때
      • 바이러스와 같이 악의적인 공격을 하는 프로세스라고 판단될 때
      • 매우 긴 주기로 반복되는 프로세스라 메모리 밖으로 쫓아내도 큰 문제가 없을 때
      • 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때

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

프로세스 제어 블록(PCB)

  • 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조
  • 프로세스는 고유의 프로세스 제어 블록을 가짐
  • 프로세스 생성 시 만들어져서 프로세스가 실행을 완료하면 폐기
  • 프로세스 제어 블록의 구성
    • 포인터 : 준비 상태나 대기 상태의 큐를 구현할 때 사용
    • 프로세스 상태 : 프로세스가 현재 어떤 상태에 있는지를 나타내는 정보
    • 프로세스 구분자 (PID) : 운영체제 내에 있는 여러 프로세스를 구현하기 위한 구분자
    • 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값
    • 프로세스 우선순위 : 프로세스의 실행 순서를 결정하는 우선순위
    • 각종 레지스터 정보 : 프로세스가 실행되는 중에 사용하던 레지스터의 값
    • 메모리 관리 정보 : 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등
    • 할당된 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보
    • 계정 정보 : 계정 번호, CPU 할당 시간, CPU 사용 시간 등
    • 부모 프로세스 구분자와 자식 프로세스 구분자

문맥 교환

의미

  • 문맥 교환은 CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 것
  • 실행 상태에서 나가는 프로세스 제어 블록에는 지금까지의 작업 내용을 저장하고, 반대로 실행 상태로 들어오는 프로세스 제어 블록의 내용으로 CPU가 다시 세팅
  • 문맥 교환과 타임 슬라이스의 크기
    • 타임 슬라이스는 되도록 작게 설정하되 문맥 교환에 걸리는 시간을 고려하여 적당한 크기로 설정하는 것이 중요

프로세스의 연산

프로세스의 구조

  1. 코드 영역
    • 프로그램의 본문이 기술된 곳
    • 프로그래머가 작성한 코드가 탑재되며 탑재된 코드는 읽기 전용으로 처리됨
  2. 데이터 영역
    • 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳
    • 데이터는 변하는 값이므로 이곳의 내용은 기본적으로 읽기와 쓰기가 가능
  3. 스택 영역
    • 운영체제가 프로세스를 실행하기 위해 필요한 데이터를 모아놓은 곳
    • 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 저장하는 곳
    • 운영체제가 사용자 프로세스를 작동하기 위해 유지하는 영역으로 사용자에게는 보이지 않음
    • Heap region: 프로그램 실행중 동적으로 메모리가 할당되는 데이터 영역.

프로세스의 생성과 복사

  1. fork( ) 시스템 호출의 개념
    • 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
    • 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어짐
  2. fork( ) 시스템 호출의 동작 과정
    • fork( ) 시스템 호출을 하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어짐
    • 단, 프로세스 제어 블록의 내용 중 다음이 변경됨
      • 프로세스 구분자(PID)
      • 메모리 관련 정보
      • 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)
  3. fork( ) 시스템 호출의 장점
    • 프로세스의 생성 속도가 빠름
    • 추가 작업 없이 자원을 상속할 수 있음
    • 시스템 관리를 효율적으로 할 수 있음

프로세스의 전환

  1. exec( ) 시스템 호출의 개념
    • 기존의 프로세스를 새로운 프로세스로 전환 (재사용)하는 함수
      • fork( ): 새로운 프로세스를 복사하는 시스템 호출
      • exec( ): 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출
  2. exec( ) 시스템 호출의 동작 과정
    • exec( ) 시스템 호출을 하면 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버림
    • 데이터 영역이 새로운 변수로 채워지고 스택 영역이 리셋
    • 프로세스 제어 블록의 내용 중 프로세스 구분자, 부모 프로세스 구분자, 자식 프로세스 구분자, 메모리 관련 사항 등은 변하지 않지만 프로그램 카운터 레지스터 값을 비롯한 각종 레지스터와 사용한 파일 정보가 모두 리셋
  3. exec( ) 시스템 호출의 예
    • 부모 프로세스의 fork( ) 문을 실행하여 자식 프로세스를 생성하고, wait( ) 문을 실행하여 자식 프로세스가 끝날 때까지 기다림
    • 새로 생성된 자식 프로세스는 부모 프로세스의 코드와 같음
    • exec( ) 시스템 호출을 사용하여 새로운 프로세스로 전환하더라도 프로세스 제어 블록의 각종 프로세스 구분자(PID, PPID, CPID)가 변경되지 않기 때문에, 프로세스가 종료된 후 부모 프로세스로 돌아올 수 있음
    • 바람직하지 않은 예시)
    •  
      • replace되며 내 프로그램은 흔적도 없이 사라진다.
main(){
printf("begin \n");
exec("bin/ls","ls","-ai", NULL);
print();
}

프로세스의 계층 구조

  1. 유닉스의 프로세스 계층 구조
    • 유닉스의 모든 프로세스는 init 프로세스의 자식이 되어 트리 구조를 이룸
  2. 프로세스 계층 구조의 장점
    • 여러 작업을 동시에 처리할 수 있다.
    • 프로세스의 재사용이 용이하다.
    • 자원 회수가 쉽다.
      • 운영체제가 직접 자원을 회수하는 일이 적어져 효율적인 시스템 운영이 가능
  3. 고아 프로세스와 좀비 프로세스
    • 고아 프로세스(orphan process)는 부모 프로세스가 먼저 종료되어 돌아갈 곳이 없는 프로세스
    • 좀비 프로세스(zombie process)는 자식 프로세스가 종료되었는데도 부모 프로세스가 뒤처리를 하지 않아 발생하는 프로세스
    • C 언어에서는 exit() 또는 return() 문을 사용해 자식 프로세스의 작업이 끝났음을 부모 프로세스에 알림

스레드

스레드의 개념

  1. 스레드의 정의
    • 프로세스에서 실행 제어만 분리한 실행 단위.
    • 경량 프로세스(LWP, Light Weight Process)라고도 부름.
    • 프로세서를 사용하는 기본 단위이며, 독립적으로 실행할 수 있는 하나의 제어 흐름
    • CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드
      • 운영체제 입장에서의 작업 단위는 프로세스
      • CPU 입장에서의 작업 단위는 스레드
  2. 멀티태스크와 멀티스레드의 차이
    • 멀티태스크 : 여러 개의 프로세스로 구성된 것
      • 멀티태스킹 : 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법
    • 멀티스레드 : 하나의 프로세스에 여러 개의 스레드로 구성된 것
      • 프로세스 내 작업을 여러 개의 스레드로 분할해 작업 부담을 줄이는 프로세스 운영 기법
      • CPU 멀티스레드 : 한 번에 하나씩 처리해야 하는 스레드를 잘게 쪼개어 동시에 처리하는 명령어 병렬 처리 기법
    • 멀티 프로세싱: 여러 개 CPU로 여러 개 스레드를 동시에 처리하는 작업 환경

멀티 스레드의 구조와 예

멀티 스레드의 장단점

  1. 멀티스레드의 장점
    1. 응답성 향상
    2. 자원 공유
    3. 효율성 향상
    4. 다중 CPU 지원
  2. 멀티스레드의 단점
    • 모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미침
    • 인터넷 익스플로러에서 여러 개의 화면을 동시에 띄웠는데 그중 하나에 문제가 생기면 인터넷 익스플로러 전체가 종료
    • cf) 크롬은 각 화면이 독립적인 프로세스이므로 다른 화면에 미치는 영향이 작음

멀티스레드 모델

  1. 커널 스레드와 사용자 스레드
    • 커널 스레드 : 커널이 직접 생성하고 관리하는 스레드
    • 사용자 스레드 : 라이브러리에 의해 구현된 일반적인 스레드
    • 커널 스레드와 사용자 스레드의 대응 방식에 따른 3가지 분류방법
      1. 사용자 레벨 스레드 (1 to N 모델)
        • 사용자 프로세스 내에 여러 개의 스레드가 커널의 스레드 하나와 연결(1 to N 모델)
        • 라이브러리가 직접 스케줄링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요 없음
        • 커널 스레드가 입출력 작업을 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기하게 됨
        • 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러 개의 CPU를 동시에 사용할수 없음
      2. 커널 레벨 스레드(1 to 1 모델)
        • 하나의 사용자 스레드가 하나의 커널 스레드와 연결(1 to 1 모델)
        • 독립적으로 스케줄링이 되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있음
        • 커널 레벨에서 모든 작업을 지원하기 때문에 멀티 CPU를 사용할 수 있음
        • 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있음
        • 커널의 기능을 사용하므로 보안에 강하고 안정적으로 작동
        • 문맥 교환할 때 오버헤드 때문에 느리게 작동
      3. 멀티 레벨 스레드(M to N 모델)
        • 사용자 스레드와 커널 스레드를 혼합한 방식(M to N 모델)
        • 커널 스레드가 대기 상태에 들어가면 다른 커널 스레드가 대신 작업을 하여 사용자 스레드보다 유연하게 작업을 처리할 수 있음
        • 커널 스레드를 같이 사용하기 때문에 여전히 문맥 교환 시 오버헤드가 있어 사용자 스레드만큼 빠르지 않음
        • 빠르게 움직여야 하는 스레드는 사용자 스레드로 작동하고, 안정적으로 움직여야 하는 스레드는 커널 스레드로 작동

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

5장 프로세스 동기화  (1) 2024.01.10
4장 CPU 스케줄링  (1) 2024.01.10
2장 컴퓨터의 구조와 성능 향상  (1) 2024.01.10
1장 운영체제의 개요  (1) 2024.01.10
12장 네트워크와 분산 시스템  (1) 2023.06.07