[크래프톤 정글 3기] 11/23(목) TIL

ClassBinu·2023년 11월 23일
0

크래프톤 정글 3기 TIL

목록 보기
41/120

08:18 입실
오늘은 정글 일정이 많다!
코드리뷰, 운영진 면담, 채용 설명회!
운영체제 개론부터 부지런히 공부하기
주말에 C언어로 링크드리스트, 스택, 큐 같은 자료구조 짜봐야겠음.


프로세스

프로세스는 프로그램의 인스턴스다!

리누스 토발즈는 프로세스와 스레드를 명확하게 구분하지 않고 태스크로 통칭.
리누스 왈 "프로세스와 스레드는 그냥 실행의 문맥일 뿐이다."


정의

  • 실행 중인 프로그램의 인스턴스
  • 각 프로세스는 독립적으로 실행
  • 자신만의 메모리 및 자원 공간(비유하면 자원을 담을 수 있는 컨테이너을 가지고 있음
    (자원공간: 메모리, 파일, 프로세서 시간, 네트워크 자원, 시스템 리소스)

프로세스 상태

  • 실행(Running): CPU에서 실행 중인 상태
  • 대기(Waiting, Blocked): 어떤 이벤트를 기다리거나 다른 자원 접근 대기
  • 준비(Ready): CPU를 할당받기를 기다리는 상태
  • 종료(Terminated): 프로세스가 실행을 완료하고 종료된 상태

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

각 프로세스에 대한 정보를 저장하는 자료 구조

  • 프로세스 상태
  • 레지스터 상태
  • 메모리 할당 정보
  • 스케줄링 정보


프로세스 간 통신

프로세스는 원래 격리된 인스턴스다.
하지만 IPC 메커니즘을 통해 프로세스 간 데이터 전송 및 동기화가 가능하다.
IPC 메커니즘은 다음과 같다.

  • 파이프(Pipes)
  • 메시지 큐(Message Queues)
  • 공유 메모리(Shared Memory)
  • 세마포어(Semaphores)
  • 소켓(Sockets) : 네크워크 통신을 위한 IPC 방법

프로세스 스케줄링

여러 프로세스가 동시 실행될 때, CPU 시간을 공정하게 할당
스케줄러가 어떤 프로세스가 CPU를 사용하고, 언제 다음 프로세스로 전환할지 결정


프로세스 생성, 종료

프로세스는 다른 프로세스를 생성할 수 있으며, 이때 부모-자식 간에 상속 관계가 있을 수 있음.
프로세스가 종료되면 자원을 정리하고 시스템에 반환


멀티스레딩

프로세스 안에서 실행되는 여러 스레드가 있을 수 있음.
이를 통해 프로세스의 작업을 병렬로 처리하고 공유 메모리를 사용할 수 있음.


프로세스 동기화

여러 프로세스 또는 스레드가 공유 데이터에 동시 접근할 때 동기화 메커니즘이 필요
대표적인 동기화 매커니즘이 세마포어, 뮤텍스


스레드


정의

프로세스 내에서 실행되는 가장 작은 실행 단위
자체 실행 경로를 가지며, 프로세스의 자원을 공유함.


멀티 스레딩

여러 스레드를 동시에 실행하는 것


동시성(Cuncurrency) & 병렬성(Parallelism)

동시성: 여러 작업이 번갈아 실행되는 것
병렬성: 여러 작업이 실제로 동시에 실행되는 것


스레드 동기화

여러 스레드가 공유 자원에 안전하게 접근할 수 있도록 하는 것
데이터의 일관성과 데드락 방지 중요


스레드 안정성

여러 스레드가 동시에 실행될 때 문제 없이 올바르게 작동하는 것


데드락 vs 라이브락 vs 기아(starvation)

데드락: 두 개 이상의 스레드가 서로의 자원을 기다리면서 영원히 멈춰 있는 상태
라이브락: 스레드가 계속 실행되지만 진행이 없는 상태
기아: 일부 스레드가 필요한 자원은 얻지 못해 실행되지 못한 상태
(우선순위가 낮은 프로세스가 계속 뒤로 밀리는 현상)

기아 현상을 해결하기 위해서 에이징 기법을 쓴다.
일정 시간이 지나면 우선 순위를 올려주는 것.


스레드 풀링

미리 생성된 스레드 집합을 관리하여 필요할 때 사용할 수 있게 하는 기술
스레드 생성 소멸의 오버헤드를 줄임


Context Switcing

CPU가 한 스레드에서 다른 스레드로 전환할 때 발생
이때 스레드의 상태(컨텍스트)가 저장되고 복권


하드웨어 스레드 vs 소프트웨어 스레드

여기서 다루는 스레드는 소프트웨어적인 스레드임.
하드웨어적인 스레드는 물리 수준에서 하나의 코어가 두개 이상의 명령어 스트림(스레드)를 처리할 수 있게 함으로써, 하나의 코어를 마치 여러 개의 코어처럼 작동할 수 있게 하는 것. 대표적으로 하나의 코어에 여러 개의 레지스터 세트를 두면 코어를 병렬로 사용할 수 있음.

프로세스는 하나 이상의 스레드를 갖는다. 이를 메인 스레드 또는 기본 스레드라고 한다. 즉, 문맥 교환은 사실상 스레드의 문맥을 교환하는 것이다!


CPU Scheduling 알고리즘

프로세스 priority에 따라 우선순위가 정해진다.

다만 스케줄링이 무조건 우선순위에 따라 실행되는 건 아님!

프로세스들은 준비큐와 대기큐에서 실행을 기다린다.

https://www.youtube.com/watch?v=CdrozYcVccE


선점형 vs 비선점형

스케줄링은 크게 두 가지 알고리즘이 있다.

  • 선점형 스케줄링: CPU를 선점한 프로세스 작업이 끝나지 않아도 새로운 프로세스가 CPU를 점유할 수 있음.
  • 비선점형 스케줄링: 이미 CPU를 선점한 프로세스는 무조건 작업이 끝나야 함.

선점형은 새치기 가능 알고리즘!


FCFS (First Come First Served)

선입선출(비선점형)
작업이 시스템에 도착하는 순서대로 처리

SJF(Shortest Job First)

최소 작업 우선(비선점형)
가장 짧은 실행 시간을 가진 작업을 먼저 처리

Round Robin(RR)

라운드 로빈(선점형)
각 작업에 동일한 시간 할당량을 부여하고, 순환 방식으로 작업 처리
즉, 프로세스가 모두 완료되면 끝내는게 아니라
일정 시간을 기준(시간 할당량 (Time Quantum))으로 계속해서 문맥교환이 발생하는 방식

  • 시간 할당량이 너무 크면 사실상 선입선출이랑 같음
  • 시간 할당량이 너무 작으면 문맥교환 오버헤드가 큼

SRTF (Shortest Remaining Time First)

최소 잔류 시간 우선 스케줄링(선점형)
남은 실행 시간이 가장 짧은 작업을 우선적으로 처리

Multieval Queue Scheuling

여러 개의 큐를 사용하고, 각 큐마다 다른 스케줄링 알고리즘 적용

우선순위 알고리즘

우선순위가 높은 프로세스부터 처리
우선순위가 같아면 선입선출 방식에 의해 처리

Multi level Queue 스케줄링

우선순위 스케줄링의 발전된 형태
우선순위별로 준비 큐를 여러 개 사용하는 스케줄링 방식
우선순위가 가장 높은 큐에 있는 프로세스를 먼저 처리
우선순위가 가장 높은 큐가 비어 있으면 그 다음 우선순위 큐에 있는 프로세스 처리

큐 간에 프로세스 이동이 불가능

장점: 프로세스 유형별로 우선순위 구분이 쉬워짐. 큐별로 다른 알고리즘 적용 가능 등
단점: 기아 현상이 발생할 수 있음.


Multi Level Feedback Queue(MLFQS)

단단계 피드백 큐 스케줄링

멀티레벨 큐 스케줄링에서 발생할 수 있는 기아 현상을 보완하는 방식
큐 간에 프로세스 이동이 가능한 다단계 큐

  1. 프로세스는 먼저 가장 높은 우선순위 큐에 들어간다.
  2. CPU 처리 후 처리가 완료되면 큐에서 삭제되는 것
  3. CPU 처리 후에 여전히 큐에 남아 있으면 우선순위를 낮춤

우선 순위를 지속적으로 낮추는 이유는?
특정 프로세스가 높은 우선 순위로 CPU를 독점하는 현상을 방지함


4BSD(4th Berkeley Software Distribution)

BSD: Berkeley Software Distribution
버클리 대학 오픈소스 기반 유닉스 운영체제의 한 종류
(AT&T Unix에서 파생)

4BSD는 BSD의 4번째 버전


Nice

프로세스의 기본 우선순위를 조정하는 값
nice 값이 높을 수록 해당 프로세스는 더 낮은 우선 순위를 갖게 됨.
일반적으로 -20 ~ +19의 값을 가지며, 기본 nice값은 0
-20이 가장 높은 우선 순위(먼저 실행), +19가 가장 낮은 우선 순위(나중에 실행)

Nice는 프로세스가 초기에 할당받는 큐의 우선 순위를 결정하는 데 사용
즉, MLFQS에서 프로세스의 시작 우선순위를 결정하는 값임.
개별 프로세스의 우선 순위를 세밀하게 조정할 수 있는 수단
개별 프로세스의 '상대적인' 우선 순위 설정

nice -n 10 ./data_analysis_program
이런 식으로 프로세스 실행 시 nice 값을 정해줄 수 있음.

일반 사용자는 자신의 프로세스 nice 값을 증가시켜 우선 순위 낮출 수 잇지만,
일반적으로 nice 값을 감소시켜 우선 순위 높이는 건 제한되어 있음.(관리자 권한 필요)

nice는 PCB에 기록된다.

nice는 모든 프로세스의 우선순위 값을 결정하는 기본값 같은 개념이 아님!
nice는 우선 순위를 세밀하게 조정하는 값이 아니라 대략적으로 우선순위를 높이거나, 낮이는 역할을 함.

nice인가?
프로세스의 우선순위를 나이스(nicely)하게 조정..?
프로세스끼리 나이스하게 서로의 우선순위를 조정해서 싸우지 않게 하는 것


문맥교환(Context Switcing)

프로세서는 한 번에 하나의 프로세스(정확히는 스레드)를 실행시킨다.
그때 프로세서를 점유하는 프로세스를 교체하는 과정을 문맥교환이라고 함.
즉, context라는 프로세스의 실행 흐름을 교체하는 것.
문맥교환을 통해 여러 프로세스가 동시에 실행되는 것처럼 보이게 한다.


문맥교환 단계

  1. 현재 프로세스 상태 저장: 이 상태를 '문맥'이라고 한다.
  • 프로그램 카운터
  • 레지스터 값
  • 메모리 상태
    등이 프로세스 제어 블록(PCB)에 저장
  1. 다음 프로세스 상태 복원
    다음 프로세스로 전환되기 전에 해당 프로세스의 이전 상태를 복원
    이전에 저장한 PCB를 바탕으로 수행

  2. 실행 전환

문맥 교환에는 오버헤드가 발생한다.

현대 운영체제에서는 문맥 교환이 프로세스가 아닌 스레드 단위로 발생!
프로세스 문맥 교환은 메모리 주소 공간 전체를 바꿔야 하지만, 스레드 간의 문맥 교환은 스택과 CPU 레지스터 상태만 변경한다.
이때는 PCB가 아니라 TCB를 바탕으로 문맥교환이 진행된다.
TCB

  • 스레드 상태
  • 프로그램 카운터
  • 레지스터 세트
  • 스택 포인터

문맥 교환이 실제로는 스레드 간의 전환인데 왜 여전히 교재나 설명할 때는 프로세스 기반 문맥 교환으로 설명할까?
1. 역사적으로 초기에는 프로세스 간 전환이 일어남.
2. 개념적으로 설명하기 단순함.
3. 먼저 프로세스 수준으로 배우고, 나중에 스레드 수준으로 배우면 됨.
4. 추상화해서 설명하기 위해서


경쟁 조건(Race Condition)

공학 분야에서 경쟁 상태란 둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 경쟁이 발생할 수 있는 여러 조건이 충족된 상태.

병렬 프로그래밍에서 발생하는 문제
두 개 이상의 스레드 또는 프로세스가 공유된 자원(데이터, 메모리 등)에 동시에 접근하려고 할 때 발생함.
이러한 상황에서 경쟁 조건이 발생하며, 예측 불가능한 결과 초래.

발생하는 문제
1. 데이터 불일치(다수의 실행흐름이 공유 데이터를 수정하면, 데이터 일관성 유지 안 됨)
2. 데이터 손실(다수의 실행흐름이 공유 데이터를 수정, 삭제하면 일부 데이터 손실)
3. 데드락: 두 개 실행흐름이 서로 상대방의 자원을 기다리며 무한 대기 상태 빠짐

경쟁 조건이라는 말이 헷갈린다
경쟁 상태이라고 이해하면 더 쉬울 것 같음!

공학 분야에서 경쟁 상태란 둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다.


어떤 조건이 경쟁 조건인가?

  1. 멀티스레딩에서 공유 자원 접근
  2. 여러 이벤트 동시 처리
  3. 프로세스 스케줄링
  4. 데이터베이스 트랙잭션
  5. 하드웨어 인터럽트 처리
  6. 데이터 동기화

데드락(Deadlock)

두 개 실행흐름이 서로 상대방의 자원을 기다리며 무한 대기 상태 빠짐

스레드 A가 보유한 락을 스레드 B가 기다리고 있고,
스레드 B가 보유한 락을 스레드 A가 기다리는 상황.
이 경우 어떤 스레드도 상대방의 락을 소유하지 못해서
어떤 스레드도 진행되지 못하는 데드락이 발생함.

라이브 락도 있음. 데드락이 서로의 실행을 기다리는 상황이라면, 라이브락은 서로 다른 실행흐름이 공유 자원에 계속 접근하는데 공유 자원을 얻지 못해서 발생하는 교착상태.

교착상태가 더 큰 개념으로, 교착상태 안에 데드락, 라이브락이 있음.

락이 뭐야?
락을 특정 공유자원에 대한 접근 권한 같은 개념(자물쇠)
즉, 공유자원 A에 접근하기 위해서는 A락이 필요함.
락 획득 시도 -> 락 소유 -> 락 해제의 과정으로 진행됨


뮤텍스(Mutex)

상호 배제를 위한 동기화 기법
한 번에 하나의 스레드만 특정 코드 블록 또는 공유 자원에 접근을 허용하는 기법
다른 스레드는 대기 상태에 존재
락을 통해서 구현할 수 있으며, 뮤텍스는 락의 일종으로 간주
(그래서 '뮤텍스'를 '뮤텍스 락'이라고도 함.)

import threading

# 뮤텍스 생성
mutex = threading.Lock()

def thread1():
    print("Thread 1: Acquiring mutex")
    mutex.acquire()
    try:
        print("Thread 1: Acquired mutex")
        # 이곳에서 뮤텍스를 보유한 상태로 작업을 수행
    finally:
        mutex.release()
        print("Thread 1: Released mutex")

def thread2():
    print("Thread 2: Acquiring mutex")
    mutex.acquire()
    try:
        print("Thread 2: Acquired mutex")
        # 이곳에서 뮤텍스를 보유한 상태로 작업을 수행
    finally:
        mutex.release()
        print("Thread 2: Released mutex")

# 두 개의 스레드 생성
t1 = threading.Thread(target=thread1)
t2 = threading.Thread(target=thread2)

# 스레드 시작
t1.start()
t2.start()

# 스레드 종료 대기
t1.join()
t2.join()

print("Both threads finished")

세마포어(Semaphore)

상호 배제를 위한 동기화 기법
'수기신호'라는 뜻이 있음.

세마포어 값: 공유자원에 접근할 수 있는 횟수
P(wait)와 V(signal) 연산을 사용해서 공유 자원 접근을 조절

P: 세마포어 값이 0이상이면 1 감소(0이하면 스레드는 대기 상태)
V: 세마포어 값을 증가(대기 중인 스레드가 있는 경우 스레드를 깨우고 실행 가능 상태로 전환)

import threading

# 세마포어 생성
semaphore = threading.Semaphore(2)  # 세마포어 카운트를 2로 설정

def worker(thread_id):
    print(f"Thread {thread_id}: Waiting to enter")
    semaphore.acquire()
    print(f"Thread {thread_id}: Entered critical section")
    
    # 세마포어를 보유한 상태로 일부 작업을 수행
    # ...

    print(f"Thread {thread_id}: Exiting critical section")
    semaphore.release()

# 여러 개의 스레드 생성
threads = []
for i in range(4):
    thread = threading.Thread(target=worker, args=(i,))
    threads.append(thread)

# 스레드 시작
for thread in threads:
    thread.start()

# 스레드 종료 대기
for thread in threads:
    thread.join()

print("All threads finished")

acquire()가 P연산(자원에 접근하고 세마포어 값 감소)
release()가 V연산(자원에서 나오면서 세마포어 값 증가)


Pintos

대망의 핀토스 시작!


pintos란?

pintos-kaist는 x86-64 아키텍처를 위한 간단한 운영체제 프레임워크


구현해야 하는 기능

  • kernel threads
  • loading and running user programs
  • file system
  • Virtual Memory

운영진 면담

원장님: 인터넷, 스마트폰, 그 다음은 인공지능이다.
인공지능이 접목될 분야가 무궁무진한다.
(예를 들어 의료)

원장님께서 자주 강조하시는 건, 매력적인 사람이 되어라임.
(개발 능력은 당연한거고) 기업과의 관계에서 내가 갑이 될 수 있어야 함.


주말에 C로 양방향 연결 리스트, 스택, 큐, 구현해 보기!
핀토스 작업하는데 인터넷이 말도 안되게 느려져서 우선 데터링으로 작업..

0개의 댓글