목숨건데이터엔지니어
foot-data-engineering
목숨건데이터엔지니어
전체 방문자
오늘
어제
  • 분류 전체보기 (54)
    • 취업과 기본기 잡기 (11)
      • Python (2)
      • 자료구조 (1)
      • 알고리즘 (1)
      • 운영체제 (2)
      • 네크워크 (1)
      • 데이터베이스 (1)
      • SQL (1)
      • Linux (1)
      • Docker (1)
    • 더 나은 엔지니어가 되기위해 (11)
      • (AWS) api-gateway, kinesis (1)
      • (AWS) MWAA (1)
      • Apache Spark (1)
      • Apache Airflow (1)
      • Apache Kafka (1)
      • Apache Flink (1)
      • Hadoop (1)
      • 알쓸신잡 (4)
    • 데이터와 손잡기 (6)
      • 머신러닝(sklearn) (1)
      • 딥러닝 (3)
      • 오디오 처리 (1)
      • 데이터 시각화 (1)
    • 코딩테스트 잡기 (1)
      • [BOJ] 문제풀이 (0)
      • [프로그래머스] 문제풀이 (0)
      • [HackerRank] SQL (0)
      • 코딩테스트 후기 (1)
    • 토이 프로젝트 (4)
    • 각종 기술 삽질하며 익히기 - onpremise (11)
    • 학습과정 잡동사니 (7)
      • 오답노트 (7)
    • 평소 궁금증 파헤치기 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 아직 한참 부족하고 부끄러운 나의 github 링크

인기 글

태그

  • #데이터 수집 절차
  • django
  • ES
  • 쓰레드와 프로세스
  • spark with elasticsearch
  • Kinesis
  • Elk
  • 서비쿼리
  • 멀티 프로그래밍
  • 파이썬
  • MWAA
  • logstash
  • 네트워크 스위치
  • spark to mysql
  • EMR
  • 도커파일
  • Api-Gateway
  • #데이터수집
  • 프로세스
  • filebeat
  • spark
  • scikit-learn
  • LIVY
  • flink
  • spark on centos7
  • Tableau
  • jupyter
  • CTAS
  • kafka
  • aws builders online series

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
목숨건데이터엔지니어

foot-data-engineering

취업과 기본기 잡기/운영체제

운영체제

2022. 4. 1. 18:02

패러다임

참고 : https://lena-chamna.netlify.app/post/concurrency_programming_thread_and_queue/

비동기는 기본적으로 다른 스레드에 일을 위임하게 된다.

동시 프로그래밍(Concurrent Programming)

여러 쓰레드를 동시에 띄워서 동시에 프로그램들이 수행되는 것처럼 다루는 프로그래밍 방식.

일반적으로 태스크를 큐에 넣은 후 운영체제 레벨에서 이를 분산시켜 처리한다고 함

[참고]

병렬성은 작업들을 물리적으로 동시에 수행하기 때문에 하나의 작업의 응답시간을 줄일 수 있고,

동시성은 단일 작업의 응답시간을 줄일 수는 없지만, 한번에 여러작업을 처리해서 Throughput을 늘리는 데에 의미가 있습니다.

비동기 프로그래밍

하나의 쓰레드로 동시 처리를 하게 됨(실제로 뒤에서 다른 쓰레드들이 일을 함)

보통 WAS에서 CPU에 비해 I/O Bound가 큼. 이때 비동기 프로그래밍은 대기시간을 낭비하지 않고 그 시간에 CPU가 다른 일을 처리할 수 있도록 Non-Blocking하게 동작함.

프로세스

참고 : https://velog.io/@codemcd/운영체제OS-5.-프로세스-관리

  • 프로세스는 메인 메모리에 할당되어 실행되는 상태를 뜻하며 하드디스크에서 저장되어 있음
  • 프로세스의 상태는 크게 아래와 같다Ready : 초기화 같은 작업을 통해 실행 준비 마친 상태Waiting : I/O에 의해 대기 상태로 들어감(실행되려면 다시 Running으로 돌아가야 함)
  • Terminated : 프로세스 종료된 상태
  • Running : CPU가 실행하고 있는 상태 (스케쥴링에게 점유된 시간이 끝나면 Running에서 Waiting이 아닌 Ready로 감. 이를 Interrupt라고 함)
  • New : 프로그램이 메인 메모리에 할당된 상태

스케줄러

프로세스를 스케쥴링하기 위한 Queue가 총 3가지 있다.

Job Queue : 하드디스크에서 메모리에 올라가기 전 대기하는 집합

Ready Queue : 현재 메모리에 있으면 CPU 할당을 대기중인 프로세스 집합

Device Queue : Device I/O 작업을 대기하고 있는 프로세스 집합

그리고 이 Queue들에 프로세스를 넣고 빼주는 작업을 하는 스케쥴러도 크게 세가지가 있다.

장기 스케쥴러

  • Job Queue에 있는 프로세스들을 관리하며 Ready Queue에 넣는 역할을 함
  • 디스크 ↔ 메모리 사이의 스케쥴링 담당
  • 프로 ew → Ready 관리

단기 스케쥴러

  • CPU와 메모리 사이 스케쥴링 담당
  • Ready Queue에 올라간 프로세스를 어느 순서로 Running할지 결정
  • 프로세스 상태 Ready → Running → Waiting → Ready

중기 스케쥴러

  • 메모리에 과도한 프로세스들 존재할 때 여유공간 마련을 위해 Disk로 스왑시키는 역할
  • 프로세스 상태 Ready → Suspended

스케줄링

스케쥴링은 운영체제가 프로세스들에게 CPU 자원을 공정하게 분배하는 과정을 의미함. 이를 통해 효율적으로 자원을 관리할 수 있음. 기본적으로 스케쥴링의 대상은 Ready Queue에 있는 프로세스들이다.

스케줄링 방식

스케쥴링 방식은 크게 선점 방식과 비선점 방식이 있다. 선점 방식은 CPU가 우선순위에 따라서 프로세스의 자원을 뻇어 다른 프로세스에게 분배할 수 있음. 반면 비선점은 프로세스의 작업이 끝나거나 IO가 걸렸을 때를 제외하고는 뺏을 수 없음.

[스케쥴링 알고리즘 평가 요소]

프로세스 선점율 : CPU가 부지런하게 process를 선점하고 있는가

처리율(Throughput) : 유닛 타임 당 얼마나 많은 일들을 처리하는가

반환시간 : 한 작업이 얼마나 빨리 끝나는가

대기시간 : 프로세스가 CPU 할당받기 전까지 얼마나 많이 Ready Queue에서 기다리는가

반응 시간 : 첫 응답이 나올 때까지 걸리는 시간

크게 아래와 같은 알고리즘들이 있음

FCFS (First Come First Served)

FIFO와 비슷하게 먼저 들어온애를 먼저 처리하는 방식이다. 대표적인 비선점 방식임. 그러나 컨보이 효과로 늦게 들어온애가 굉장히 짧은 태스크(낮은 Burst Time)더라도 계속 기달려야 함

  • Convoy effect : 큰 놈이 앞에 있으면 뒤에 태스크들이 계속 대기함

SJF(Shortest Job First)

한 프로세스가 동작하는 동안 들어온 친구들 중 태스크 시간(Burst Time)이 짧은 친구들을 매겨서 실시간으로 해당 태스크를 먼저 부여하는 방식. 즉 짧은 애들 먼저 할당시키겠다는 이야기 (Python에서 min_heap을 통해 구현했었음)

  • Starvation 문제 : 큰놈은 작은 놈에게 밀려 계속 처리되지 않음
  • 비선점 스케쥴링 방식임

SRF(Shortest Remaining TIme First)

한 프로세스가 동작하는 동안 Remain Time이 낮은 친구를 할당하는 방식임. SJF의 기아 문제를 해결할 수 있음.

  • 선점 스케쥴링 방식임

RR(Round Robin)

시간에 맞춰 프로세스를 분배함. 공정하게 배분함. RR은 선점 방식임.

우선순위 방식

우선순위 매겨진 프로세스(남은 시간 기준으로도 매김)들 중 높은 애들부터 실행시킴 (기아 문제를 해결할 수 있음)

[참고]

https://zzsza.github.io/development/2018/07/29/cpu-scheduling-and-process/

https://jhnyang.tistory.com/34

https://wonit.tistory.com/104

https://codedrive.tistory.com/129

https://parksb.github.io/article/9.html

CPU 코어

  • 쓰레드와 프로세스는 각기 다른 CPU 코어를 할당받을 수 있음. 한 프로세스 안 복수의 쓰레드도 각각의 CPU를 할당받을 수 있음.

멀티 프로그래밍

하나의 CPU로 복수의 프로세스를 마치 동시에 실행시키는 것처럼 동작하는 방식(동시성)을 뜻한다

Degree of Multiprogramming

현재 메모리에 할당되어 있는 프로세스 개수

CPU Bound vs I/O Bound

프로세스의 동작 흐름을 보면 CPU Burst와 I/O Burst로 나뉜다. CPU Burst는 말 그대로 CPU가 일하는 시간이며 I/O Burst는 입출력장치를 Blocking으로 대기하는 시간임.

여기서 CPU Burst 비중이 높은 걸 CPU Bound Process라고 하며 I/O 비중이 높으면 I/O Bound Process 라고 한다.

CPU 바운드이면 user, system의 CPU 사용율이 높을 것이며, I/O 바운드이면 Iowait(cpu의 노는시간 지표인 idle과 연관)이 높을 것임

[참고] https://injae-kim.github.io/dev/2020/07/09/how-to-check-single-server-load-average.html

컨텍스트 스위칭

https://m.blog.naver.com/PostView.nhn?blogId=rhkdals1206&logNo=221575121342

  • 프로세스가 생성될 때 운영체제는 프로세스의 상태 정보를 담고 있는 고유의 PCB(Process Control Block)를 생성한다.
  • 실행중인 프로세스의 상태는 CPU 안의 레지스터에 저장할 수 있다. 그러나 스케줄러에 의해 Interrupt가 발생하면 새로 실행되는 프로세스의 정보를 레지스터에 교체하게 되며, 기존에 있던 프로세스 정보는 PCB로 가게 된다.
  • 멀티 프로세싱 환경에서 CPU는 다수의 프로세스를 여러 스케쥴링 기법에 따로 왔다갔다 하면서 PCB에 Context를 계속 저장하고 가져오고를 반복한다. 이를 컨텍스트 스위칭(Context Switching)이라고 하며 Context Switching이 많을수록 성능이 느려진다.

쓰레드와 프로세스

[참고] https://eehoeskrap.tistory.com/244

프로세스

  • 최상위 프로세스는 systemd 이며 PID는 1이다. 프로세스는 기본적으로 자식 프로세스를 가질 수 있고 부모 프로세스가 종료되면 자식 프로세스도 종료된다.
  • 데몬 프로세스는 항상 백그라운드로 실행되는 프로세스를 뜻한다. 보통 컴퓨터가 부팅될 때 함께 실행된다. 프로세스 명 끝에 d 가 붙는다고 함.
  • 프로세스끼리 통신하기 위해선 IPC가 필요함
  • 프로세스의 구성 요소로 코드, 데이터, 힙, 스택이 있음. 힙은 동적으로 생기는 데이터를 저장하는 공간으로 대표적으로 객체 생성될 때 저장된느 공간임. 데이터는 정적인 데이터로 전역변수, static 변수 등이 들어감. 마지막으로 stack은 쓰레드마다 할당되며 지역변수 + 함수 실행에 사용됨.

쓰레드

쓰레드는 특정한 시점에 프로그램의 작업을 수행하는 역할을 한다. 프로세스 내부에서 존재하며 하나의 프로세스는 복수의 스레드를 가질 수 있다. 복수의 쓰레드는 서로 독립적인 태스크를 할 수 있다. 이때 쓰레드들은 프로세스의 메모리 공간을 서로 공유하게 된다.

쓰레드의 구성으로 PC Register, Stack이 있다. Stack과 Register는 쓰레드마다 독립적으로 부여받음. PC 레지스터도 따로 받는 이유는 쓰레드가 명령어를 얼마나 실행했는지 위치를 저장해야하기 때문 (스케줄러에 의해 선점당하기에)

  • 쓰레드끼리 통신은 프로세스의 메모리 공간을 공유함으로써 가능함.

멀티 스레드 단점

  • 동기화 이슈
  • 일반적으로 한 자원을 여러 스레드가 공유하다 보면 동기화 문제가 발생할 수 있음. 예를 들어 A 스레드와 B 스레드가 동시에 자원을 가져와서 변경을 했을 때 예상치 못한 결과가 발생할 수 있다. 그래서 한 자원은 하나의 스레드만 가질 수 있도록 동기화해주는 작업이 필요하다.
  • 의존성 이슈
  • 만약 한 쓰레드가 문제가 생겼을 때 다른 쓰레드가 종료될 수도 있음.

동기화

공유하는 자원의 일관성을 유지해주는 작업을 의미함.

공유 자원의 문제로 가장 대표적인 예가 은행 계좌 문제가 있음. 자원을 공유하면서 한쪽이 자원을 변경하면, 예상치 못하게 변경된 자원을 가져다가 작업을 하게 되는 문제가 발생함. 일반적으로 이런 공유 자원 문제를 해결하기 위해서, 공통 변수에 접근하는 쓰레드는 단 하나로 제한해야 함. (참고 : https://velog.io/@codemcd/운영체제OS-8.-프로세스-동기화-1)

Critical Section

일반적으로 공통으로 사용되는 변수 구역을 Critical Section임. Critical Section을 잘 동기화시켜주기 위해선 아래 조건이 만족되어야 한다.

  1. Mutual Exclusion(상호 배제) : 오직 한 쓰레드만이 자원에 접근할 수 있도록 하는 것
  2. Progress(진행) : Critical Section에 접근하는 쓰레드를 결정하는 건 유한 시간 이내에 이루어져야 함
  3. Bounded Waiting(유한 대기) : 자원을 기다리는 쓰레드는 유한 시간 내에 접근할 수 있어야 함(점유하는 쓰레드가 빨리 나갸아 함을 의미)

그래서 동기화를 위한 대표적인 방법으로 Lock과 세마포가 있다.

  • Lock은 하드웨어 레벨에서 Critical Section에 동시 접근이 안되도록 막는 역할을 함. 그러나 Multi Processing 환경에서 시간적인 효율성 측면을 적용할 수 없다.
  • Semaphore(세마포 는 동기화를 위해 만들어진 소프트웨어임. 세마포도 Lock과 마찬가지로 Mutual Exclusion(한 자원 한 쓰레드만)을 적용하기 위해 사용된다

데드락

Critical Section을 동기화하는 과정에서, 둘 이상의 프로세스(쓰레드)가 자원을 점유 & 대기하는 게 순환형으로 꼬여서 교착상태에 걸리는 것을 의미한다.

데드락이 발생하는 조건으로

  1. 상호 배제 조건 : 하나의 자원은 하나만 선점 가능하다.
  2. 점유 대기 조건 : 한 자원을 점유하면서 다른 자원을 대기할 수 있다.
  3. 비선점 조건 : 자원을 점유한 프로세스가 일 끝날 때까지 다른 프로세스가 점유 못함
  4. 순환형 : 상대방이 가진 자원을 순환적으로 대기할 수 있음.

그러면 이를 어떻게 극복할 수 있을까?

교착상태 무시 : 거의 발생 안할거라고 생각하고 사용자에게 맡김. 대표적으로 윈도우, 유닉스가 그럼

교착상태 예방 : 아예 발생 조건 중 한가지를 풀어서 예방하는 것. 그러나 그렇게 되면 자원을 효율적으로 사용하기가 어려워져서 비추

교착상태 회피 : 자원을 점유,대기할 때마다 교착상태인지 확인하는 회피 알고리즘을 돌림. 오버헤드 커서 비추

교착상태 탐지 및 복구 : 보통 탐지 & 복구 전략 사용함. 특정 시점(주기적, cpu 임계치, 자원 할당되는 시간 등)마다 교착상태를 탐지하고(그래프 그려서 확인) 만약 탐지되면 프로세스를 우선순위에 맞춰 죽이면서 상태를 복구시킴. 대표적으로 mysql도 transaction timeout이 나면 영향력이 작은(변경 row가 적은) 트랜잭션부터 종료시킴

컴퓨터가 전원을 켰을 때 부터 벌어지는 일들

https://leetcode.com/discuss/interview-question/operating-system/124638/what-happens-in-the-background-from-the-time-you-press-the-Power-button-until-the-Linux-login-prompt-appears

 

*직렬화(Serialization)란

데이터 시리얼라이제이션이란, 어떤 환경의 데이터 구조를 다른 환경에 전송 및 저장하기 위해 나중에 재구성할 수 있는 바이트의 포맷으로 변환하는 과정을 말함. 반대로, 일련의 바이트로 부터 데이터 구조를 추출하는 일은 역직렬화(Deserialization)라고 함.

'취업과 기본기 잡기 > 운영체제' 카테고리의 다른 글

프로세스와 스레드 그리고 멀티스레드 그리고 코어란?  (0) 2022.02.10
    '취업과 기본기 잡기/운영체제' 카테고리의 다른 글
    • 프로세스와 스레드 그리고 멀티스레드 그리고 코어란?
    목숨건데이터엔지니어
    목숨건데이터엔지니어

    티스토리툴바