[CS - OS] 프로세스와 스레드 (+ PCB, 컨텍스트 스위칭)

링딩·2023년 12월 5일
0

다시 공부하는 CS

목록 보기
1/4
  • 들어가기 앞서 OS란...

    하드웨어를 관리하고, 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 응용 프로그램과 하드웨어 간의 인터페이스로써 다른 응용 프로그램이 유용한 작업을 할 수 있도록 환경을 제공해준다.
    즉, 운영 체제는 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 시스템 소프트웨어라고 할 수 있다.

0. 운영체제

[ 운영체제의 역할 ]

1. 프로세스 관리

운영체제에서 작동하는 응용 프로그램을 관리하는 기능이다.
프로세서(CPU) 관리하는 것이라고 볼 수도 있다. 현재 CPU를 점유해야 할 프로세스를 결정하고, 실제로 CPU를 프로세스에 할당하며, 이 프로세스 간 공유 자원 접근과 통신 등을 관리

  • 프로세스, 스레드
  • 스케줄링
  • 동기화
  • IPC 통신

2. 저장장치 관리

1차 저장장치에 해당하는 메인 메모리와 2차 저장장치에 해당하는 하드디스크, NAND 등을 관리하는 기능

  • 1차 저장장치(Main Memory)
    • 프로세스에 할당하는 메모리 영역의 할당과 해제
    • 각 메모리 영역 간의 침범 방지
    • 메인 메모리의 효율적 활용을 위한 가상 메모리 기능
  • 2차 저장장치(HDD, NAND Flash Memory 등)
    • 파일 형식의 데이터 저장
    • 이런 파일 데이터 관리를 위한 파일 시스템을 OS에서 관리
    • FAT, NTFS, EXT2, JFS, XFS 등 많은 파일 시스템들이 개발되어 사용 중
  • 메모리 관리
  • 가상 메모리
  • 파일 시스템

3. 네트워킹

TCP/IP 기반의 인터넷에 연결하거나, 응용 프로그램이 네트워크를 사용하려면 운영체제에서 네트워크 프로토콜을 지원해야 한다.
운영체제는 사용자와 컴퓨터 하드웨어 사이에 위치해서, 하드웨어를 운영 및 관리하고 명령어를 제어하여 응용 프로그램 및 하드웨어를 소프트웨어적으로 제어 및 관리

  • TCP/IP
    • 기타 프로토콜

4. 사용자 관리

운영체제는 각 계정을 관리할 수 있는 기능이 필요하다. 사용자 별로 프라이버시와 보안을 위해 개인 파일에 대해선 다른 사용자가 접근할 수 없도록 해야 한다. 이 밖에도 파일이나 시스템 자원에 접근 권한을 지정할 수 있도록 지원하는 것이 사용자 관리 기능

  • 계정 관리
  • 접근권한 관리

5. 디바이스 드라이버

운영체제는 시스템의 자원, 하드웨어를 관리한다. 시스템에는 여러 하드웨어가 붙어있는데, 이들을 운영체제에서 인식하고 관리하게 만들어 응용 프로그램이 하드웨어를 사용할 수 있게 만들어야 한다.

따라서, 운영체제 안에 하드웨어를 추상화 해주는 계층이 필요하다. 이 계층이 바로 디바이스 드라이버라고 불린다. 하드웨어의 종류가 많은 만큼, 운영체제 내부의 디바이스 드라이버도 많이 존재한다.
이러한 수많은 디바이스 드라이버들을 관리하는 기능 또한 운영체제가 맡고 있다.

  • 순차접근 장치
  • 임의접근 장치
  • 네트워크 장치




1. 프로세스와 스레드

단어 정의

  • 프로세스 :
  1. 메모리에 적재되어 실행 중인 프로그램(작업)
  2. 운영체제로부터 주소 공간, 파일, 메모리 등을 할당받으며 이것들을 총칭한다.
  3. 프로세스는 별도의 주소공간을 독립적으로 할당받는다.
  4. 프로세스마다 기본적으로 1개의 스레드가 같이 생성된다. (메인 스레드 포함)

    <구성>

    • code
    • Data : 전역변수, 정적변수, 배열 등
    • Heap : 동적 할당 시 사용
    • Stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)

Q. 왜 스택과 데이터를 구성에서 나누는 것인가?

Stack은 LIFO의 특성을 가졌다. 전역변수나, 스택 구조의 특성 등의 활용성을 생각했다. 그렇기에 공통 으로 사용되는 '전역변수'를 따로 데이터에 지정해주면 메모리를 아낄 수 있따.


1-2. 프로세스와 스레드 차이점

프로레스는 자신만의 고유 공간과, 자원 할당을 받아 사용
스레드는 다른 스레드와 공간, 자원을 공유하여 사용
=> 그래서 스레드는 좀 더 효율적으로 통신할 수 있음


  • 스레드 :
  1. 프로세스 안에서 실행되는 하나 하나의 흐름들의 단위
  2. 스레드는 Stack만 따로 할당받으며 다른 운영체제 자원들은 서로 공유하여 이용

Q. 스레드마다 Stack을 독립적으로 할당하는 까닭

  • '스택'은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다.
    (결론) 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것.
    즉, 하나의 스레드에서 호출한 함수의 지역 변수와 매개 변수 등의 정보가 다른 스레드에서 호출한 함수와 관련된 정보와 혼동되어서는 안되기 때문이다.




1-2. 💡 멀티 프로세스

( 정의 )

하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행

  • 장점
    안전성 (메모리 침범을 OS 내에서 해결)
  • 단점
    독립적인 메모리 영역을 가져, 작업량이 많아질 수록 '오버헤드' 발생, '컨텍스트 스위칭'으로 성능저하




1-3. 💡 멀티 스레딩(멀티 스레드)

(정의) : 하나의 응용 프로그램에서 여러 스레드를 구성하여 각 스레드가 하나의 작업을 처리하는 것

  • 여러 개의 스레드들이 '공유 메모리'를 통해 다수의 작업들을 동시에 처리하게 해줌
  • 각각의 스레드는 독립적인 작업을 위하여 '스택'과 'PC 레지스터 값'을 각각 가지고 있음

    PC 값은 스레드가 어디까지 수행했는지를 기억해주는 것
    => 스레드는 CPU에 할당받았다 스케줄러에 의해 다시 선점되기 때문


💪(장점)

  1. 메모리 공간과 시스템 자원 소모가 줆

  2. 프로세스 간 통신 방법에 비해 간단
    -> 별도의 자원을 이용하지 않고, 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용하여 데이터를 주고 받음(스레드 간 통신)

  3. '스레드의 컨텍스트 스위치'는 '프로세스 컨텍스트 스위치'와 달리 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다

=> 그래서 여러 프로세스를 통해 작업하지 않고 '하나의 프로세스에서 스레드를 여러개로 나눠 수행'


😢(단점)

  • 공유 메모리로 인해 '동시 접근'으로 인한 문제

    멀티 프로세스의 프로세스 사이엔 공유자원을 동시에 접근하는 일이 없었다.
    그러나 멀테 스레드에서는...

    • 하나의 스레드가 공유 데이터 값을 변경하는 시점에 다른 스레드가 그 값을 읽으려고 접근할 경우 발생하는 문제
      -> '동기화 작업(synchronization)' 필요

📕 (해결법) 동기화 작업의 여러가지 방법

  • 뮤텍스
  • 세마포어
    뒤의 블로그에서 더 구체적으로 다룰 예정

1-4. 멀티 스레드 vs 멀티 프로세스

(차이점)

  • 멀티 스레드는 보다 ¹적은 메모리 공간을 차지하고 ²문맥 전환이 빠르다는 장점이 있지만,
    < 문제점>
    1. 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점
    2. 동기화 문제

  • 멀티 프로세스는 나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있다
    < 문제점 >
    1. 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다

(공통점) : 둘 다 동시에 여러 작업을 수행한다는 점

즉 적용하는 시스템에 따라 동작방식을 선택하자.









2. 인터럽트

◽ (정의)

프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고, 발생된 상황에 대한 '우선 처리'가 필요함을 'CPU'에게 알리는 것

(종류)

  • 외부 인터럽트
    입출력 장치, 타이밍 장치, 전원 등 외부적인 요인으로 발생
    ex) 전원 이상, 기계 착오, 외부 신호, 입출력

  • 내부 인터럽트
    잘못된 명령이나 데이터를 사용할 때 발생
    ex) 오버플로우, Exception

  • 소프트웨어 인터럽트


2-1. 인터럽트 발생 처리 과정

인터럽트가 없었다면 '폴링'을 썼어야 하는데
특정 어떤 일을 할 시기에 대해 알 수 없어서 계속 체크를 해야 하는 방식을 말한다.
=> 원래 하던 일에 집중할 수 없다.


2-1-2. 컨트롤러가 우선순위를 판별하는 방법

  • 폴링 방식
    사용자가 명령어를 사용해 입력 핀의 값을 계속 읽어 변화를 알아내는 방식
    => 텍스트 (하드웨어에 비해 속도 느림)

  • 인터럽트 방식
    MCU 자체가 하드웨적으로 변화를 체크하여 변화 시에만 일정한 동작을 하는 방식

즉, '인터럽트'발생 시기를 예측하기 힘든 경우에 컨트롤러가 가장 빠르게 대응할 수 있는 방법
=> 실시간 대응이 필요할 때는 필수적인 기능이다




3. 컨텍스트 스위칭 & PCB


3-1. 컨텍스트 스위칭(Context Switching)

◽ (정의) 부제: cpu는 쉴 수 없다...

프로세스들의 상태 전이를 통해 현재 실행 중인 프로세스(또는 스레드)를 중지하고, 다음에 실행할 프로세스를 선택해서 'CPU의 제어권'을 넘겨주는 과정

=> 즉, 수행 중인 프로세스를 변경할 때, CPU의 레지스터 정보가 변경되는 것

그래서 실시간으로 동시에 돌아가는 듯 보이지만 빠르게 교체해가면 cpu 상에서 돌아가고 있어서 그렇게 보이는 것이다.


◽ ( 문제점 )
독립된 메모리 영역을 할당받아 사용되므로, 캐시 메모리 초기화와 같은 무거운 작업이 진행되었을 때 오버헤드가 발생할 문제가 존재

  • 📕 해결법 :
    여러가지 스케줄링 알고리즘이 존재

💡) '스레드의 컨텍스트 스위치'는 프로세스의 컨텍스트 스위칭과 다르게 '캐시메모리'를 비울 필요가 없어서 빠르다



3-2. PCB란? (Process Context Block)

A. 컨텍스트 스위칭 때 이전 작업에 대한 내용을 기억하기 위해서 무언가 필요하지 않을까...?🤷‍♂️🤷‍♂️💦

업로드중..

(정의)

  • 운영체제가 컨텍스트 스위칭을 하기 위해서 프로세스의 정보를 저장해 놓는 곳
  • 앞으로 다시 수행할 대기 중인 프로세스에 관한 저장 값을 PCB에 저장해두는 것
    즉, 프로세스의 상태정보(메타 데이터)를 PCB에 저장하는 구조체이다.
  • 'Linked List' 방식으로 관리
  • PCB에 저장되는 정보 (메타데이터)
    • 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
    • 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
      프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
    • CPU 레지스터
    • CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
    • 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
    • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
    • 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등



3-3. 컨텍스트 스위칭 순서

컨텍스트 스위칭은 크게 다음과 같은 두 동작으로 구분할 수 있다.

  1. 실행 중지할 프로세스 정보를 해당 프로세스의 PCB에 업데이트하여 메인 메모리에 저장
  2. 컨텍스트 스위칭
  3. 다음 실행할 프로세스 정보를 메인 메모리에 있는 해당 PCB 정보를 CPU에 넣고 실행
profile
초짜 백엔드 개린이

0개의 댓글