운영체제(이론) - 핀토스-1

연도·2024년 5월 31일
0
post-thumbnail

들어가기 전 워밍업

Process(정의)

운영체제로부터 자원을 할당받은 작업의 단위

프로그램을 실행 시켜 정적 > 동적으로 변하여 프로그램이 돌아가고 있는 상태를 말한다. 즉 컴퓨터에서 작업 중인 프로그램

정적 프로그램

컴퓨터에서 실행할 수 있는 파일. 코드 덩어리

프로그램 vs 프로세스

스레드(정의)

하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위

ex) 크롬 브라우저에서 여러 활동을 동시에 하는 것

즉, 하나의 프로세스 안에서 여러가지 작업들 흐름이 동시에 진행되기 때문에 가능한 것인데, 이러한 일련의 작업 흐름들을 스레드라고 하며 여러개가 있다면 이를 멀티(다중) 스레드


프로세스 & 스레드(메모리)

프로세스 자원구조

스택, 힙 영역은 프로세스가 실행되는 동안 크기가 늘어났다 줄어들었다가 하는 동적 영역

프로그램이 여러개 실행된다면 메모리에 프로세스들이 담길 주소 공간이 생성되게 되고 그 안에 Code, Data, Stack, Heap 공간이 만들어진다.

스레드의 자원 공유

스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업 가능. 프로세스 내에 여러개의 스레드가 들어있는 상태.

스레드는 Stack만 할당받아 복사하고, Code, Data, Heap은 프로세스내의 다른 스레드들과 공유

각각의 스레드는 별도의 stack를 가지고 있다.

스택

함수 호출 시 전달되는 인자, 되돌아가는 주소값, 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간

독립적인 스택을 가졌다는 것은 독립적인 함수 호출이 가능하다. 독립적인 함수 호출이 가능하다는 것은 독립적인 실행 흐름이 추가된다는 것.

but, 프로세스는 기본적으로 프로세스 끼리 다른 프로세스의 메모리에 직접 접근x

프로세스의 자원 공유

  1. IPC 기법들

파이프 : 한 프로세스의 출력을 다른 프로세스의 입력으로 연결. 보통 단방향 통신 사용.

메시지 큐 : 메시지 형태로 데이터 전송. FIFO

세마포어 : 프로세스 간의 동기화. 자원에 대한 접근 제어. 특정 자원이 사용중임을 나타내는 신호

공유 메모리 : 두 개 이상의 프로세스가 동일한 메모리 영역에 접근할 수 있도록

등등

  1. LPC 기법들

메시지 패싱 방식 사용. 한 프로세스가 다른 프로세스로 메시지를 보내면, 운영체제가 해당 메시지를 중계하고 필요한 서비스 제공. 이 과정에서 큐, 공유 메모리 등 다양한 IPC 메커니즘을 내부적 사용

프로세스 자원 공유는 CPU 레지스터 + RAM + 캐시 메모리까지 초기화 > 자원 부담up

다중 작업이 필요한 경우 스레드를 이용하는 것이 효율적이다.


프로세스 & 스레드(동시 실행 원리)

4코어 - 물리적

8스레드 - 논리적

물리적 코어 하나가 스레드 2개 이상을 동시에 실행 가능o

즉, 운영체제가 8개의 작업을 동시에 처리 가능 = 하이퍼스레딩

병렬성

직관적으로 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛인 여러개의 코어에 맞춰 여러개의 프로세스, 스레드를 돌려 병렬로 동시 수행.

동시성

둘 이상의 작업이 동시에 실행.

ex) 1개의 코어에 4개의 작업 . 프로세스들은 계속 번갈아가면서 조금씩 처리함. 이것이 동시에 실행되는 것처럼 보여서 동시성이라고 한다.

아주 잘게 나누어 아주 조금씩만 작업을 수행하고 다음 작업으로 넘어가는 식으로 동작

왜 이렇게 작업해? > 사용자에게 더 빠른 반응성을 제공하기 위해서

A > B >C > D로 번갈아 바꾸는 것을 Context switching

동시성이 필요한 이유

  1. 하드웨어적 한계

많은 수의 프로세스를 돌리기 위해서

  1. 논리적인 효율

최악의 상황에서 정해진 바운더리에서 오래 걸리는 작업이 자리를 다 차지하고 있으면, 짧은 일들은 뒤에서 기다려야 한다. 이러한 상황을 극복하고자 작업을 아주 잘게 나눠 번갈아 처리한다는 동시성 개념 사용. 그래서 병렬성 + 동시성 적절히 섞어서 사용.


프로세스 & 스레드 생명주기

프로세스에 관련하여서(스케쥴링, 프로세스 상태, 상태 전이, 컨텍스트 스위칭)

프로세스 스케쥴링

CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업.

우선순위, 작업량 등을 고려하여 효율적으로 배치하여, 이를 통해 운영체제는 CPU를 효율적으로 사용하며 시스템의 전반적인 성능향상

스케쥴링 알고리즘

FCFS(First-Come, First-Served), SJF(Shortest-Job-First), Priority, RR(Round-Robin), Multilevel Queue

프로세스 상태

  • 생성 : 프로레스가 생성되고 아직 준비 x
  • 준비 : CPU를 할당받을 수 있는 상태, 언제든지 준비완료
  • 실행 : CPU를 할당받아 실행되는 상태
  • 대기 : 특정 이벤트(입출력 요청)가 발생하여 대기하는 상태
  • 종료 : 실행 완료하고 종료

프로세스 상태 전이 :

  • Admitted(new > ready) : 프로세스 생성 승인 받음
  • Dispatch(ready > running) : 준비 상태에 있는 여러 프로세스들 중 하나가 스케줄러에 의해 실행
  • Interrupt(running > ready) : Timeout, 예기치 않은 이벤트가 발생하여 현재 실행중인 프로세스를 준비 상태로 전환 + 해당 작업 먼저 처리
  • I/O or event wait(running > wainting) : 실행 중인 프로세스가 입출력 or 이벤트를 처리해야 하는 경우, 입출력 이벤트가 끝날 때까지 대기 상태로 전환

프로세스 컨텍스트 스위칭

CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정

CPU는 한 번에 하나의 프로세스만 실행 가능. 여러 개의 프로세스를 번갈아가면서 실행하여 CPU 활용률을 높이기 위해 컨텍스트 스위칭 필요.

동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업. 이러한 컨텍스트 스위칭이 일어날 때 다음번 프로세스는 스케줄러가 결정하게 된다.

PCB

운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조

프로세스 스케줄링을 위해 모든 정보를 저장하는 임시 저장소.

Context Switching 과정

  1. CPU는 Process P1을 실행
  2. 일정 시간이 지나 Interrupt or system call 발생
  3. 현재 실행중인 Process P1의 상태를 PCB1에 저장
  4. 다음으로 실행할 Process P2를 선택
  5. Process P2의 상태를 PCB2에서 불러온다.
  6. CPU는 Process P2를 실행
  7. 일정 시간이 지나 Interrupt or system call이 발생
  8. 현재 실행 중인 Process P2의 상태를 PCB2에 저장
  9. 다시 Process P1을 실행할 차례가 된다.
  10. Process P1의 상태를 PCB1에서 불러온다.
  11. CPU는 Process P1을 중간시점 부터 실행

Context Switching overhead

프로세스 변경 과정에서 프로세스의 상태, 레지스터의 값 등이 저장되고 불러오는 작업이 수행하기 때문에 많은 부담.

P1이 Execute에서 idleF이 될 때 P2가 바로 Excute가 되지 않고 idle을 상태에 조금 있다가 Execute가 되는 걸 볼 수 있다. 이 간극이 컨텍스트 스위칭 오버헤드

  1. PCB 저장 및 복원 비용
  2. CPU 캐시 메모리 무효화에 따른 비용
  3. 프로세스 스케줄링 비용

스레드 스케쥴링

운영체제에서 다중 스레드를 관리하며, CPU를 사용할 수 있는 스레드를 선택하고, CPU를 할당하는 작업

RR, Priority-based scheduling, Multi-level Queue scheduling

하나의 프로세스 내에서 다수의 스레드가 동작하는 형태

스레드 간의 상호작용 + 동기화 문제 고려

스레드 상태

  • NEW : 스레드가 생성되고 호출x
  • RUNNABLE : 실행 대기
  • BLOCKED : 특정 이벤트(입출력 요청)가 발생하여 대기
  • TERMINATED : 실행 완료 후 종료

스레드 상태 전이

스레드 컨텍스트 스위칭

멀티 스레딩 환경에서 스레드 간의 실행을 전환하는 기술

하나의 프로세스 내에서 스레드들을 교환

TCB

각 스레드마다 운영체제에서 유지하는 스레드에 대한 정보를 담고 있는 자료구조

Mutex : 임계 구역에 1개의 스레드만 들어갈 수있는 동기화 기법

Semaphore : 임계 구역에 여러 스레드가 들어갈 수 있고, counter를 두어서 허용 가능한 스레드 제한


프로세스 컨텍스트 스위칭 vs 스레드 컨텍스트 스위칭

  1. TCB가 PCB보다 가볍다

스레드 컨텍스트 스위칭이 프로세스 컨텍스트 스위칭보다 빠르다

프로세스 내의 스레드들은 text, data, heap 영역 메모리를 공유 하기 때문에 TCB에는 stack 및 간단한 register 포인터 정보만을 저장하기 때문에 PCB보다 TCB가 가벼워 더 빨리 읽힌다.

  1. 캐시 메모리 초과 여부

CPU 캐쉬 메모리는 CPU와 메인 메모리 사이에 위치하여 CPU에서 한번 이상 읽어들인 메모리의 데이터를 저장하고 있다. CPU가 다시 그 메모리에 저장된 데이터를 요구할 때, 메인 메모리를 통하지 않고 곧바로 데이터를 전달해주는 용도이다.

그런데 프로세스 컨텍스트 스위칭이 일어날 경우, 다른 프로세스의 실행으로 인해 CPU가 새로운 명령어와 데이터를 로드 해야 하기 때문에 CPU 캐시 메모리를 초기화 하여야 한다. 이것이 컨텍스트 스위칭에 부담이 되는 요소이다.

  1. 자원 동기화 문제

스레드 컨텍스트 스위칭이 발생해 다른 스레드가 heap 영역의 공유 데이터에 접근할 때, 이전 스레드가 이미 공유 자원을 사용하고 있는 경우 동기화 문제가 발생할 수 있다.

예를 들어, 두 개의 스레드가 동시에 하나의 변수를 수정하려고 할 때, 스레드 컨텍스트 스위칭이 발생하면 변수의 값을 잘못된 값으로 업데이트 할 수 있다.

프로세스는 기본적으로 독립된 공간이지만, IPC와 같은 공유 자원을 사용하는 경우에 똑같이 경쟁 조건이 발생할 수 있다. ex) 여러 개의 프로세스가 동시에 파일 시스템에 접근하여 파일을 수정하려고 할 때, 컨텍스트 스위칭이 발생할 때 다른 프로세스가 그 파일에 접근할 수 있기 때문에 파일 내용이 손상될 수 있다.

Multi Process and Multi Thread

프로세스와 스레드가 단일이 아닌 다중으로 돌아감으로써 성능 향상 등 여러가지 얻을 수 있게 된다.

but, 이로 인해 발생되는 부가적인 문제점도 발생하게 된다.

상호배제

여러 프로세스 또는 스레드가 동시에 공유 자원에 접근하는 것을 방지하기 위해. 이를 통해 데이터 무결성 보장 + 경쟁 상태(race condition)를 방지할 수 있다.

Mutex : 한 번에 하나의 스레드만이 특정 섹션에 접근. 소유가 가능한 락, 락을 소유한 스레드만 해제

Spinlocks : 흭득시까지 스레드가 계속해서 락의 상태 확인하며 대기. 컨텍슽브 비용x, cpu 자원 소모

  1. 세마포어 : 카운터를 기반으로 하는 더 일반적인 동기화 메커니즘
  2. 모니터 : 상호 배제를 제공하는 동기화. 하나의 프로세스/스레드만이 동시에 모니터 내의 코드 실행 가능. 조건 변수를 사용하여 스레드 간의 조건 동기화 지원
  3. 메시지 패싱 :공유 메모리가 없는 환경에서 프로세스 간 통신 및 동기화를 위해 사용

프로세스는 메시지를 보내고 받음으로써 동기화되며, 이 과정에서 자동적으로 상호 배제 구현o

Mutex vs Semaphore

동시성 프로그램의 가장 큰 숙제는 ‘공유자원 관리’일 것이다. 공유자원을 안전하게 관리하기 위해서는 상호배제를 달성하는 기법 중요.

Mutex

한 쓰레드, 프로세스에 의해 소유될 수 있는 Key를 기반

화장실을 이용하는 사람은 프로세스 or 쓰레드. 화장실은 공유자원. 화장실 키는 공유자원에 접근하기 위해 필요한 어떤 오브젝트.

즉, 뮤텍스는 Key에 해당하는 어떤 오브젝트가 있으며 이 오브젝트를 소유한(쓰레드, 프로세스) 만이 공유자원에 접근할 수 있다.

Semaphore

Signaling mechanism. 현재 공유자원에 접근할 수 있는 쓰레드, 프로세스의 를 나타내는 값을 두어

만약 당신이 화장실에 가고 싶다면 입구에서 빈 칸의 개수를 확인하고 빈 칸이 1개 이상이라면 빈칸의 개수를 하나 뺀 다음에 화장실로 입장해야 한다. 그리고 나올 때 빈 칸의 개수를 하나 더 해준다.

모든 칸에 사람이 들어갔을 경우 빈 칸의 개수는 0이되며 이때 화장실로 들어가고자 하는 사람이 있다면 빈 칸의 개수가 1로 바뀔 때까지 기다려야 한다.

두 기법 모두 완벽한 기법x

이 기법들을 사용하더라도 데이터 무결성을 보장x, 데드락이 발생할 수 있다. 하지만 상호배제를 위한 기본적인 방법

Race Condition

두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라짐

경쟁하는 상태, 즉 두 개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황을 말한다.

  1. 상호배제

  2. Deadlock

이 상황에서는 어떤 프로세스도 자신의 작업을 진행할 수 없게 되며, 시스템의 일부가 멈추는 것처럼 보이게 된다. 데드락은 특히 복잡한 자원 공유가 필요한 멀티태스킹 환경에서 주로 발생

발생 조건

  1. 상호배제 : 자원은 한 번에 하나의 프로세스만이 사용o

  2. 점유 대기 : 자원을 가지고 있는 프로세스가 추가 자원을 요구하며, 기존 자원을 보유채로 대기

  3. 비선점 : 자원은 그 자원을 보유하고 있는 프로세스가 자발적으로만 놓아 줄 수 있어야 한다.

  4. 환형 대기 : 대기 중인 프로세스들 간에 환형 구조가 형성o. 각 프로세스는 다음 프로세스가 요구하는 자원을 보유하고 있어야 한다.

  5. 기아(Starvation)

기아상태. 다중 프로그래밍 환경에서 특정 프로세스나 스레드가 필요한 자원을 무한정 기다리는 현상을 말합니다. 이 현상은 다른 프로세스나 스레드가 지속적으로 자원을 점유하거나 우선순위가 더 높은 작업에 자원이 계속 할당되어, 특정 작업이 실행될 기회를 얻지 못할 때 발생합니다.

동기화

프로세스나 스레드 간의 활동을 조정하여 데이터의 일관성과 무결성을 유지하고, 작업의 순서를 정확하게 제어하는 과정.

다중 스레드 또는 다중 프로세스 환경에서는 여러 작업이 동시에 수행o. 이러한 환경에서 발생할 수 있는 문제들. ex) 경쟁 상태, 데드락, 기아 등을 방지하는데 필요

동기화 기법

  1. 뮤텍스(Mutex): 상호 배제를 보장하는 동기화 메커니즘으로, 한 번에 하나의 스레드만이 특정 자원 또는 코드 영역(크리티컬 섹션)에 접근할 수 있게 합니다.
  2. 세마포어(Semaphore): 카운터를 사용하여 동시에 여러 스레드가 접근할 수 있는 자원의 제한합니다. 세마포어는 상호 배제 외에도 복잡한 동기화 패턴을 지원합니다.
  3. 모니터(Monitor): 객체지향 언어에서 지원하는 동기화 방식으로, 모니터 내의 모든 메소드는 자동으로 상호 배제를 갖습니다. 조건 변수와 함께 사용하여 스레드의 실행을 보다 세밀하게 제어할 수 있습니다.
  4. 조건 변수(Condition Variables): 스레드가 특정 조건이 충족될 때까지 대기하도록 하며, 조건이 충족되면 스레드를 깨워 작업을 계속하도록 합니다.
  5. 배리어(Barriers): 모든 스레드가 특정 지점(배리어)에 도달할 때까지 기다리게 하고, 모두 도착하면 다음 단계로 진행합니다. 이는 특히 병렬 계산에서 유용합니다.

다수의 프로세스나 스레드가 서로가 보유하고 있는 자원을 요구하면서 무한히 대기하는 현상

출처 : https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4, https://worthpreading.tistory.com/90

0개의 댓글