관리 메뉴

공부 기록장 💻

[운영체제/OS] 03장 프로세스 본문

# CS Study/Opearing System

[운영체제/OS] 03장 프로세스

dream_for 2022. 8. 21. 13:32

1. 프로세스의 개념

  • 프로그램: 저장장치에 저장되어 있는 정적인 상태
  • 프로세스(process): 실행을 위해 메모리에 올라온 동적인 상태, 실행중인 프로그램
    • exe 실행 파일(바이너리 파일) → 실행되어 메모리에 적재되면 ‘프로세스’가 됨
    • 비동기적(asynchronous) 행위
    • 운영체제에 들어있는 프로세스 제어블록이 생성됨
    • 프로세서(CPU)에 할당하여 실행할 수 있는 개체 디스패치가 가능한 대상

  • 프로세스를 처리할 때는, 일괄 방식이 아닌 시분할 방식을 사용하여 시간을 배분함으로써 시스템의 효율을 높인다.

 

 

프로세스와 메모리

 


 

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

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

  • OS가 해당 프로세스를 위해 관리하는 자료구조 (Linked List 기반)
    • 프로세스 구분자(PID): 각 프로세스를 구분하는 구분자
    • 메모리 관련 정보: 프로세스의 메모리 위치 정보
    • 각종 중간값: 프로세스가 사용했던 중간값 - 다음 작업해야할 코드의 위치가 담긴 레지스터인 PC 저장

프로세스와 프로그램의 관계

  • OS로부터 프로세스 제어 블록을 얻는다는 뜻 (프로세스 = 프로그램 + 프로세스 제어블록)

 


프로세스의 상태 (4가지)

  1. 생성상태: 프로세스가 메모리에 올라와 실행 준비를 완료한 상태 ****
  2. 준비상태: 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태 (큐 구조)
  3. 실행상태: 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어(디스패치됨) 실제 작업을 수행
    • 디스패치: 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU스케줄러의 작업
    • 타임아웃: 프로세스가 자신에게 주어진 하나의 타임 슬라이스 동안 작업을 끝내지 못하면 다시 준비 상태로 돌아가는 것
  4. 완료상태: 실행 상태의 프로세스가 주어진 시간동안 작업을 마치면 진입하는 상태(PCB가 사라진 상태) → 더이상 PCB가 없고 모두 제거되는 상태

 

 

프로세스의 다섯가지 상태 **

  • 생성상태
    • 프로그램이 메모리에 올라오고 OS로부터 PCB를 할당 받은 상태
    • 생성된 프로세스는 바로 실행되지 않고, 준비 상태에서 자기 순서를 READY QUEUE에서 기다리며, PCB도 같이 준비 상태로 옮겨짐
  • 준비상태
    • 실행 대기 중인 모든 프로세스가 자기 순서를 기다리는 상태
    • PCB는 준비 큐에서 기다리며 CPU 스케줄러에 의해 관리됨
      • (CPU scheduling 알고리즘 → 준비 상태에서 큐를 몇 개 운영할지, 큐에서 어떤 프로세스의 PCB를 실행 상태로 보낼지 결정 → 어떤 알고리즘에서 수행 되는 지에 따라 시스템의 성능이 매우 달라짐)
    • 디스패치(PID) 명령 → 어떤 PCB를 선택하는 작업
      • 해당 프로세스가 준비 상태에서 실행 상태로 변경되어 작업이 수행됨
  • 실행상태
    • 프로세스가 CPU를 할당 받아 실행되는 상태
    • 자신에게 주어진 시간, 타임 슬라이스(time slice, time quantum)동안만 작업
      • 시간 다 사용 시, timeout(PID) 실행 → 준비 상태
      • 작업 완료, exit(PID) 실행 → 정상 종료
      • 입출력 요청 → CPU는 입출력 관리자에게 입출력 요청하고 block(PID) 실행
        • 입출력 완료될 때까지 작업 진행 불가, 대기 상태로 옮기고 CPU 스케줄러는 다른 새로운 프로세스를 실행 상태로 가져옴
  • 대기상태: 프로세스가 입출력을 요청하고 입출력이 완료될 때까지 기다리는 상태 (wait status)
    • 입출력 처리는 CPU가 입출력 관리자에게 요청을 하므로 대기 상태가 발생
    • 대기 상태의 프로세스는 입출력 장치 별로 마련된 큐에서 기다리다가 입출력이 완료되면 인터럽트가 발생하고, 대기 상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾음 → wakeup(PID)
    • wakeup로 해당 프로세스의 PCB가 준비 상태로 이동
  • 완료 상태
    • 코드, 사용했던 데이터를 메모리에서 삭제하고 PCB를 폐기
    • 정상 종료 → exit()으로 처리
    • 오류, 다른 프로세스에 의해 비정상적으로 종료되는 강제 종료 abort → 디버깅하기 위해 강제 종료 직전의 메모리 상태를 저장장치로 옮김 → 코어 덤프(core dump)

 

휴식, 보류 상태

  • 활성 상태: 생성, 준비, 실행, 대기, 완료 상태
  • 휴식 상태(puase status)
    • 프로세스가 작업을 일시적으로 쉬고 있는 상태
    • 유닉스에서 프로그램 실행 도중 Ctrl+Z 키 누른 경우
  • 보류 상태(suspend)
    • 프로세스가 메모리에서 잠시 쫓겨난 상태
    • 메모리가 꽉 찬 경우, 프로그램에 오류가 있는 경우, 바이러스와 같은 악의적인 공격을 하는 프로세스라 판단될 때, 매우 긴 주기로 반복되는 프로세스인 경우, 입출력이 계속 지연될 때

 


2. 프로세스 제어블록 (PCB)

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

  • 프로세스를 실행하는데 필요한 중요한 정보를 보관하는 자료구조
  • 프로세스 - 고유의 PCB를 가짐
  • 프로세스 생성 시 만들어져서, 프로세스 실행 완료 시 폐기

 

PCB의 구성

  • 포인터: 준비 상태, 대기 상태의 큐를 구현할 때 사용
  • 프로세스 상태: 생성/준비/실행/대기/보류준비/보류대기 상태
  • 프로세스 구분자(PID)
  • 프로그램 카운터: 다음 실행할 명령어의 위치를 가리키는 PC의 값 저장
  • 프로세스 우선순위: 대기 큐, 준비 큐에 있는 프로세스 중 실행 상태로 옮겨야 할 프로세스의 우선순위 정보
  • 각종 레지스터 정보: 누산기, 색인 레지스터, 스택 포인터
  • 메모리 관리 정보: 메모리 위치 정보, 경계/한계 레지스터 값
  • 할당된 자원 정보, 계정 정보: 계정 번호, CPU 할당 시간, CPU 사용 시간
  • 부모 프로세스 구분자와 자식 프로세스의 구분자: PPID, CCID

 

포인터의 역할

  • 준비 상태, 대기 상태에 있는 여러 큐 내에서 각각의 PCB를 연결하는 역할

 


문맥 교환(context switching)

  • CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업 (작업 간의 전환 작업)
  • CPU를 사용하던 프로세스가 다른 상태로 옮겨 갔을 때(작업 내용 저장), 다시 CPU가 새로운 프로세스 상태를 가져와 PCB의 내용을 할당 받는 전환의 과정
  • CPU의 레지스터가 새로운 PCB 값으로 채워져 다음 작업을 하게 되는 전환 과정

 

문맥 교환이 일어나는 경우는 언제인가?

  • 한 프로세스가 자신에게 주어진 시간을 다 사용하면 발생 → 인터럽트 발생시
  • 어떤 프로세스가 자신에게 주어진 메모리 공간을 넘어가려 하여 경계 레지스터의 범위를 벗어나는 경우 → 인터럽트 관리 프로세스를 실행 상태로 만드는 경우

 

3. 프로세스의 연산

  • 프로세스가 어떻게 생성되고 복사되는가? → 시스템 프로그래밍

 

프로세스의 구조

코드영역

  • 프로그램의 본문이 기술된 텍스트 영역
  • 프로그래머가 작성한 프로그램

데이터 영역

  • 코드가 실행되며 사용하는 변수나 파일 등의 각종 데이터를 모아 놓은 곳
  • 본문에 사용되며, 변하는 데이터 값들 (읽기, 쓰기)

스택 영역

  • OS가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아 놓은 곳
  • 함수를 호출하면 함수 수행한 뒤 원래 프로그램으로 되돌아올 위치를 저장

 


프로세스의 생성과 복사

fork() 시스템 호출의 개념

  • 실행 중인 프로세스로부터 새로운 프로세스를 복사하는, 커널에서 제공하는 시스템 호출 함수
  • 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어짐
    • Ctrl+N 키를 누르면 실행 → 실행하던 프로세스가 부모 프로세스, 새로 생긴 프로세스가 자식 프로세스로서 부모-자식 관계가 됨

fork() 시스템 호출의 동작 과정

  • PCB를 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사 되어 똑같은 프로세스가 만들어짐
  • PCB의 내용 중 변경되는 것
    • 프로세스 구분자 (PID)
    • 메모리 관련 정보 (메모리 위치가 다르므로)
    • 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)
      • 자식 프로세스가 없는 경우 CPID의 값이 -1이다.

fork() 시스템 호출의 장점

  • 프로세스의 생성 속도가 빠름
    • 하드디스크로부터 프로그램을 새로 가져오지 않고 기존 메모리에서 복사하기 때문에 자식 프로세스의 생성 속도가 빠르다.
  • 추가 작업 없이 자원 상속 가능
    • 부모 프로세서가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속 가능
  • 효율적인 시스템 관리
    • PCID와 CCID가 연결되어 있어 자식 프로세스를 종료하면 자식이 사용하던 자원을 부모 프로세스가 정리 가능
    • 프로세스 종료 시 프로세스가 사용하던 메모리 영역, 파일, 하드웨어를 잘 정리해야 하는데 이러한 정리를 부모 프로세스에 맡김으로써 시스템이 효율적으로 관리됨

 

교재 p.155 그림3-2

  • main.c → main.exe 실행 파일에서 pid의 값에 따라 parent, child process를 각각 만들게 되는데, 동일한 파일 내라도 조건문에 따라 기존 PID 혹은 new PID인지에 따라 실행되는 위치가 다르다.
  • ex) 웹 서버 - 클라이언트가 서버에 데이터나 페이지를 요청한 동시에 다른 클라이언트가 또 요청을 하게 되면, main 프로세스가 프로세스를 분기하여 프로세스 A와 B에 대해 child 프로세스를 각각 만들어 서버가 여러 요청을 각각 처리할 수 있도록 함. (순서대로 처리하게 되면 효율이 떨어짐) ⇒ 여러 클라이언트가 서버에 붙어 처리할 수 있도록 만들어야 구성 해 야함 → 스레드의 개념

 


프로세스의 전환

exec() 시스템 호출의 개념

  • 기존의 프로세스를 새로운 프로세스로 전환하는 함수
  • 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 변경
  • 데이터 영역이 새로운 변수로 채워지고, 코드 영역은 새로운 코드로, 스택 영역은 리셋됨
  • fork(): 새로운 프로세스를 복사하는 시스템 호출
  • exec(): 각종 프로세스 구분자(PID, PPID, CPID)만 남겨두고 나머지의 내용을 새로 바꾸는 시스템 호출(내부 데이터 영역의 값들이 업데이트 됨)

 

exec()를 사용하는 목적

  • 프로세스의 구조체를 재활용하기 위함
  • 새로운 메모리의 확보가 필요 없으며, GC를 위해 상위 프로세스와 부모-자식 관계를 만들어야 함
  • 이미 만들어진 PCB, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리함

 


프로세스의 계층 구조

유닉스의 프로세스 계층 구조

  • 모든 프로세스는 init 프로세스의 자식이 되어 트리 구조를 이룸
    • 부모 프로세스, 자식(서브) 프로세스

 

프로세스 계층 구조의 장점

  • 여러 작업을 동시에 처리할 수 있다.
    • login 프로세스: 유닉스 OS는 여러 사용자를 동시에 처리하기 위해 fork() 시스템 호출로 login 프로세스를 여러 개 만들어 사용자에게 나누어준다. (로그인 된 클라이언트들 각각에 대한 처리 가능)
    • shell 프로세스: login프로세스가 작업을 마치면 해당 프로세스가 종료되고 shell 프로세스가 생성된다. shell에 대한 PCB가 새로 생성되는데, exec() 시스템 호출을 사용해 login 프로세스를 shell 프로세스로 바꾸어 사용자의 명령을 기다린다.
    • 응용 프로그램 프로세스: exec() 시스템 호출
  • 프로세스의 재사용이 용이하다.
    • 자원 회수가 쉽다.계층 구조로 만들면 프로세스 간의 책임 관계가 분명해져 시스템 관리하기가 수월

 


미아 프로세스(orphan/zombie process)

  • 부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때까지 기다려야 하는데, 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안되는 경우 발생 → 프로세스 종료 후에도 비정상적으로 남아있는 미아 프로세스
  • 미아 프로세스가 많아지면 자원이 낭비되어 시스템의 성능이 떨어지게 됨
  • C언어의 exit() 또는 return()문은 자식 프로세스가 작업이 끝났음을 부모 프로세스에게 알리는 것 → 미아 프로세스 발생을 미연에 방지→ 자식 프로세스가 먼저 종료된 후에, 부모 프로세스가 종료될 수 있도록 코드를 구성하지 않았기 때문에 발생하는 문제점
    • ex) Java의 모든 객체가 상위 객체의 모든 특징을 상혹(Object 최상위 클래스)
  • → Garbage Collection같은 경우: 사용하지 않는 변수 등을 자동적으로 처리해줌
  • → 미뤄왔던 자원 정리나 프로세스와의 동기화를 할 수 있다.

 

 


4. 스레드

스레드의 개념

스레드의 정의

  • 스레드(thread): 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위
    • 프로세스의 특성인 자원과 제어에서 제어만 분리한 실행 단위
    • CPU 스케줄러가 CPU에 전달하는 일 하나
    • CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드
      • OS 입장에서의 작업 단위 → 프로세스
      • CPU 입장에서의 작업 단위 → 스레드
    • 프로세스 하나는 스레드 한 개 이상으로 나눌 수 있음
    • 같은 프로세스의 스레드들은 동일한 주소 공간 공유

 

프로세스와 스레드의 차이점

  • 스레드 → 자원을 공유하는 여러 제어 영역 (한 스레드의 영향이 전체 프로세스에 영향을 미침)
    • ex) 하나가 비정상 종료를 하며 리소스 영역까지 다 메모리로부터 해제하게 되면, 다른 스레드에도 영향을 미치게 됨
    • 프로세스의 경우에는 자원/제어 영역이 모두 분리되어 관리되기 때문에 다른 프로세스에 영향을 미치지 않게 됨

 

멀티 태스크와 멀티 스레드

  • 멀티태스크 : 여러 개의 프로세스로 구성된 것
    • 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법(시분할 시스템)
    • 운영체제가 CPU에 스레드 작업을 전달
    • 서로 독립적인 프로세스들이 서로 데이터를 주고 받을 때 프로세스간 통신(IPC, Inter Process Communication)을 이용

  • 멀티스레드: 하나의 프로세스에 여러 개의 스레드로 구성된 것
    • 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법
    • 프로세스 하나 안에서 동일한 자원을 사용(메모리 사용 영역-변수나 파일 등을 공유)하며, 제어권만 분리하여 쓰레드로 분리되어 있음

  • 멀티프로세싱: CPU를 여러 개 사용해서 여러 개의 스레드를 동시에 처리하는 작업 환경
    • 코어가 여러 개인 형태인 컴퓨터에서는, CPU하나로도 여러 스레드를 처리 가능하다.

  • CPU 멀티스레드
    • 한번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법
      • 멀티스레드: OS가 소프트웨어 적으로 프로세스를 작은 단위의 스레드로 분할하여 운영하는 기법
      • CPU 멀티스레드 : 하드웨어 적인 방법으로 하나의 CPU에서 여러 스레드를 동시에 처리하는 병렬 기법

 

 

 

멀티스레드의 구조와 예

멀티태스킹의 낭비 요소

  • fork() 시스템 호출로 프로세스를 복사 → 코드, 데이터 영역의 일부가 메모리에 중복되어 존재하므로 부모-자식 관계이지만 서로 독립적인 프로세스이므로 낭비 요소를 제거할 수 없음
  • 따라서 스레드는, 비슷한 일을 하는 2ㅐ의 프로세스를 만드는 대신 코드, 데이터 등을 공유하며 여러 개의 일을 하나의 프로세스 내에서 함

멀티태스킹과 멀티스레드의 차이

  • fork() 시스템 호출로 여러 개의 프로세스를 만들면 필요 없는 정적 영역이 여러 개가 됨
  • 멀티스레드는 코드, 파일 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성을 향상 가능

스레드의 주소 공간

 

 


멀티스레드의 장단점

장점

  • 응답성 향상
  • 자원 공유
  • 효율성 향상
  • 다중 CPU지원

→ ex) 채팅 프로그램에서 채팅을 보내는 것과 파일을 공유하는 것을 동시에 수행 할 수 있음 (파일 전송 중인 경우에 채팅 전송 스레드는 대기 시간이 발생하지 않고 계속 실행 가능)

 

단점

  • 모든 스레드가 자원을 공유하기 때문에, 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미침
  • 인터넷 익스플로러에 여러 개의 화면을 동에 띄웠는데 그중 하나에 문제가 생기면 모든 익스플로러 전체가 종료되는 경우 / 문서에 문제가 생긴 경우 해당 워드 프로세스 자체가 종료됨
  • 크롬의 경우, 멀티스레드 대신 멀티태스킹을 이용

멀티스레드 모델

- 멀티스레드: 프로그램 하나를 여러 실행 단위로 쪼개어 실행

  • 커널 스레드 : 커널이 직접 생성하고 관리하는 스레드
    • OS가 멀티스레드를 지원하지 않을 때 사용하는 방법으로, 사용자 프로세스 내에 여러 개의 스레드가 커널의 스레드 하나와 연결 (1 to N 모델)\
  • 사용자 스레드(user thread) : 라이브러리에 의해 구현된 일반적인 스레드

 

사용자 레벨 스레드 

 

  • 라이브러리가 직접 스케줄링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요 없음(커널이 하는 일을 라이브러리가 대신 처리하여, 여러 개의 스레드를 작동함)
    • ex) 워드프로세서와 뮤직 플레이어는 사용하는 레지스터, 주변장치가 다르기 떄문에 문맥교환이 필요하지만 같은 워드프로세서에서 서로 다른 문서를 편집하는 사용자 레벨 스레드에서는 문맥 교환이 필요 X
    • 커널 입장에서는 하나의 스레드이다. 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하므로, 커널 스레드의 대기 상태가 모든 스레드에 영향을 줌
  • 커널 스레드가 입출력 작업을 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기하게 됨
  • 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러 개의 CPU를 동시에 사용할 수 없음

 

 

커널 레벨 스레드

  • 커널이 직접 생성하고 관리하는 스레드
  • 커널이 멀티스레드를 지원하는 경우 사용하는 방법
  • 하나의 사용자 스레드가 하나의 커널 스레드와 연결 (1 to 1 모델)

  • 독립적으로 스케줄링이 되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있음
  • 커널 레벨에서 모든 작업을 지원하기 때문에 멀티 CPU를 사용 가능
  • 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있음
  • 커널의 기능을 사용하므로 보안에 강하고 안정적으로 작동
  • 문맥 교환할 때 오버헤드 때문에 느리게 작동

  • 사용자 레벨 스레드 & 커널 레벨 스레드를 혼합한 방식 (M to N 모델)
  • 커널 스레드가 대기 상태로 들어가면 다른 커널 스레드가 대신 작업을 하여 사용자 레벨 스레드보다 유연하게 작업 처리 가능

 

 

멀티레벨 스레드(하이브리드 스레드)

  • 사용자 레벨 스레드 & 커널 레벨 스레드를 혼합한 방식 (M to N 모델)
  • 커널 스레드가 대기 상태로 들어가면 다른 커널 스레드가 대신 작업을 하여 사용자 레벨 스레드보다 유연하게 작업 처리 가능

728x90
반응형
Comments