06. [혼공컴운]4주차_ chapter 10. 프로세스와 스레드

hyewoon·2024년 1월 26일
0

4주차 (1/22 ~ 1/28)
chapter. 09 : 운영체제 시작하기
chapter. 10 : 프로세스와 스레드
chapter. 11 : CPU스케줄링

chapter 10. 프로세스와 스레드

➡️ 운영체제의 핵심 서비스 1 : 프로세스 관리


프로세스

프로세스란(process)?

예를 들어 사용자가 '카톡'을 더블클릭하면 보조기억장치에 있던 프로그램이 메모리에 적재되어 실행되는데, 이렇게 메모리에 적재되어 실행되는 순간 프로그램은 프로세스가 된다.

프로세스 실행 과정

1.모든 프로세스는 실행 위해 CPU 필요하다.
2.일반적으로 CPU는 한 번에 하나의 프로세스 실행한다.

📌 그러므로 프로세스들은 일정 시간 동안 번갈아가면서 CPU 사용해야만 한다.

일정 시간 : 정해진 시간만큼만 CPU 이용하고, 시간이 끝났음을 알리는 '타이머 인터럽트' 발생하면 자신의 차례 양보하고 다음 차례가 올때까지 가다린다.

번갈아 가면서 : 이것을 '문맥교환' 이라고 하고, 문맥교환을 하려면 그동안 실행되었던 프로그램의 정보들을 백업해 두어야 하는 데, 이 정보들은 'PCB' 에 저장되어 있다.

📌 문맥교환

  • 문맥(context) : 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥이라고 한다.
  • 문맥교환 : 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스 실행하기 위해 문맥을 PCB로 부터 복구하여 새로운 프로세스를 실행하는 것을 문맥교환이라고 한다.

📌 PCB

  • Process Control Block
  • 프로세스 관련 정보 저장하는 자료구조
  • 커널영역에 만들어짐(프로그램)
  • 프로세스 생성 시 만들어지고 실행이 끝나며 폐기됨
  • PCB 에 들어가는 정보
    • 프로세스 ID
      : 프로세스 구분하는 고유한 식별번호로, 학번, 주민등록번호 같은 것
    • 레지스터 값
    • 프로세스 상태
      : 생성 - 준비 - 실행 - 대기 - 종료 상태
    • CPU 스케줄링 정보
      : 프로세스가 어떤 상태인지 알려주는 정보
    • 메모리 관리 정보
    • 사용한 파일과 입출력장치 목록
문맥교환PCB

프로세스 메모리 영역

📌 메모리의 사용자영역에 프로세스 어떻게 배치되는가?

프로세스가 실행되면 메모리 커널영역에는 PCB가 생성된다.

이미지 출처

📌 프로세스는 각각 독립된 메모리 영역(코드, 데이터, 스택, 힙)을 할당받는다.

📌 코드영역과 데이터 영역은 정적할당 영역으로 크기가 고정되어 있는 반면
스택영역과 힙영역은 크기가 변하는 동적할당 영역이다.

  • 코드영역(code segment)
    : 실행 될 수 있는 코드, 기계어로 이루어진 명령어가 저장
    : 읽기전용 공간(read-only)
  • 데이터영역(data segment)
    : 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
    : 전역변수를 저장
  • 스택영역(stack segment)
    : stack(아래서 위로 하나씩 차곡차곡 쌓다.)
    : 데이터를 일시적으로 저장하는 공간
    : 함수가 실행되면 생성되었다가 함수의 실행이 끝나면 사라지는 지역변수, 매개 변수를 저장
  • 힙영역(heap segment)
    : heap(더미)
    : 프로그래머가 직접 할당할 수 있는 저장 공간
    : 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 함
    : 메모리 누수 발생

🫠 스택은 높은 주소에서 낮은 주소로 할당, 힙은 낮은 주소에서 높은 주소로 할당된다.

✔️ 높은 주소, 낮은 주소를 잘 이해하지 못해서 찾아보았다.

  • 커널이 위치한 곳이 높은 주소이다.
  • 커널을 기준으로, 커널에서 가까운 쪽이 스택의 바닥(bottom, 높은주소)이고 힙영역에 가까울 수록 스택포인터(스택의 마지막 번지, 낮은주소)가 된다.
  • 스택은 운영체제에서 중요한 영역인 커널에 침범하지 않기 위해 스택의 반대방향(높은주소에서 낮은주소)으로 쌓인다.

참고할 만한 사이트
스택이 높은 주소에서 낮은 주소로 쌓이는 이유
메모리구조에 대한 좀 더 자세한 설명


프로세스 상태와 계층구조

프로세스 상태

  • 생성 상태(new)
    : 이제 막 메모리에 적재되어 PCB를 할당받은 상태
  • 준비 상태(ready)
    : CPU할당 받기를 기다리고 있는 상태
  • 실행 상태(running)
    : CPU를 할당받아 실행 중인 상태
  • 대기 상태(blocked)
    : 입출력장치의 작업을 기다리는 상태
  • 종료 상태(terminated)
    : 프로세스가 종료된 상태

프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음.
운영체제는 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스 관리한다.

이때 새 프로세스를 생성하는 프로세스를 부모 프로세스, 부모프로세스에 의해 생성된 프로세스를 자식 프로세스라고 한다.

프로세스 생성 기법

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음.

📌 프로세스는 복제(fork)시스템 호출옷갈아입기(exec) 시스템 호출 반복하여 프로세스 계층구조 이룬다.

복제(fork)시스템 호출

  • 부모프로세스는 복제(fork) 통해 자신의 복사본을 자식프로세스로 만든다.
  • 생성된 자식프로세스는 부모프로세스의 복사본이기 때문에 부모프로세스의 자원(메모리 내용, 열린파일 목록 등)이 상속된다.

옷갈아입기(exec) 시스템 호출

  • 만들어진 자식프로세스는 exec 통해 자신의 메모리 공간을 새로운 프로그램으로 전환하여 실행한다.
  • 코드영역(명령어)과 데이터 영역(전역변수) 내용이 실행할 프로그램 내용으로 바뀌고, 나머지 영역(스택, 힙)은 초기화된다.

스레드(thread)

✅ 하드웨어 스레드
: 하나의 코어가 동시에(한번에) 실행 할 수 있는 명령어의 단위
✅ 소프트웨어 스레드
: 하나의 프로그램에서 독립적으로 실행되는 작업 단위 또는 프로세스를 구성하는 실행의 흐름 단위

여기서 다루는 것은 소프트웨어 스레드

프로세스와 스레드
단일 스레드 프로세스 : 한번에 하나의 작업을 처리하는 프로세스
멀티 스레드 프로세스 : 한번에 여러 작업을 (동시에) 처리하는 프로세스

스레드의 구성

스레드는 실행에 필요한 최소한의 정보만 유지한 채 프로세스 자원 공유하며 실행됨.

  • 최소한의 정보
    : 각기 다른 스레드 ID, 레지스터값(프로그램카운터), 스택
  • 프로세스 자원 공유
    : 데이터, 코드, 힙 영역

멀티프로세스와 멀티스레드

참고자료

  • 멀티프로세스 : 여러 프로세스 동시에 실행하는 것
  • 멀티스레드 : 하나의 프로세스 내에서 여러 스레드 실행하는 것

✔️ "hello,os"를 화면에 3번 출력하는 작업

멀티프로세스로 실행 시

: fork 하며 프로세스 복제
: 모든 자원이 복제되어 메모리에 적재됨
: 메모리에 동일한 내용이 중복해서 존재하게 됨-> 메모리 낭비문제 발생

멀티스레드로 실행 시

: 각기 다른 스레드ID, 레지스터값, 스택 가짐
: 나머지 메모리 영역(코드, 데이터, 힙)영역 자원 공유함
: 멀티프로세스에 비해 메모리 효율적 사용
: 자원공유하기 때문에 하나의 스레드 문제 생기면 다른 스레드도 문제 생길 가능성 있음

🏅 기본미션

p. 304의 확인 문제 1번 풀고 인증하기

1. 생성 상태( new )
: 메모리에 방금 적재되어 PCB할당받은 상태
2. 준비 상태( ready )
: CPU할당 받기를 기다리는 상태
3. 실행 상태( running )
: CPU할당 받아 실행되는 상태
4. 종료 상태( terminated )
: 프로세스가 종료된 상태로
5. 대기 상태( blocked )
: 입출력장치의 작업을 기다리는 상태

profile
곰곰

0개의 댓글