Pintos project 01

M4r()·2021년 12월 30일
0
post-thumbnail

이론정리

Lecture 03

작업(job)이란 실행 할 프로그램과 데이터가 아직 컴퓨터 시스템에 실행 요청 되기 전의 상태를 말한다. 시스템에서 실행되면 비로소 프로세스가 된다. -> 이때 커널 안에 등록되게 된다.
즉 실행 중인 프로그램은 커널에 등록되고 커널의 관리 하에 있는 작업을 말한다. 각종 자원을 할당 받을 수 있고, 프로세스 관리 블록(pcb)을 할당받은 개채이다.
프로세스의 상태
작업이 커널에 등록되면 메모리를 할당 받았느냐 받지 않았느냐에 따라 활성상태(active) 혹은 지연상태(suspended)가 되고, 실행되기 전에 추가자원(ex. I/O)이 필요한가 유무에 따라서 ready상태가 되거나 block상태가 된다.

쓰레드 관리
프로세스는 할당받은 자원을 제어해서 목적을 달성한다. 그런데 이런 제어가 여러 개 있을 수 있다. 그게 쓰레드다.
프로세스 안에는 제어정보(프로그램 카운터, 스택카운터, 상태정보 등)이 저장되고, 스택과 그 안에서 쓰는 지역정보들이 저장된다.
자원에는 프로그램의 코드와 전역데이터, 힙 영역 등이 존재한다.

프로세스 안에 여러 개의 쓰레드를 나눠서 각각의 제어가 하나의 자원을 공유하면서 연산이 가능하다. 제어는 여러개지만 자원을 공유하기 때문에 프로세스보다 가볍게 사용 가능하다(light weight process).
쓰레드는 식별을 위한 id 와 자신이 무엇을 하고 있는지 확인하기 위한 register set(program counter, stack count, etc.) 그리고 각각 연산을 위한 작업영역(stack)을 가진다.

쓰레드의 장점
문맥전환을 위한 커널의 개입이 줄어든다. (프로세스라면 각각이 자원에 접근하기 위해 문맥전환이 필요하다)
일부 처리가 지연되도 다른 쓰레드는 계속 작업이 가능하기 때문에 사용자 응답성이 높아진다.

쓰레드의 구현
사용자 수준 쓰레드(다대일 모델): 사용자가 프로세스를 나눠서 여러 커널이 있는 것처럼 사용 프로세스가 스레드를 관리한다, 쓰레드를 만들기 쉽고 관리도 유연하게 할 수 있다. 같은 라이브러리를 쓰기만 하면 쓰레드를 사용가능하기 때문에 이식도 편하다.(추가로 컴파일이 필요없다)
커널에게는 한 개의 프로세스로 보이기 때문에 쓰레드의 존재를 모른다. -> 한 개의 쓰레드가 블록되면 모든 쓰레드가 멈출수 밖에 없다.
커널수준 쓰레드(일대일모델): 커널이 스레드를 관리한다. 커널의 스레드와 프로세스의 스레드가 1:1 매핑이 된다. 프로세스의 문맥을 전환하는 것에 비하면 적지만 여전히 문맥전환이 일어나서 부하가 크다.

혼합형(다대다 모델): 다대일 모델과 일대일 모델을 섞어서 양쪽의 장점을 융합시킨다

프로세스 스케줄링

왜 필요한가

시스템 안에 프로세스가 여럿 있어서 어디에 자원을 할당할지 생각해야한다.
시간분할관리: 한 번에 하나만 사용 가능한 자원을 분할하기 위해 사용(processor)
공간분할관리: 하나의 자원을 분할해서 사용하는 자원(memory)

목적은 무엇인가

시스템의 목적에 맞게 성능(응답시간, 작업처리량, 자원활용도로 측정)을 향상시키는 것.

어떤 프로세스를 우선할 것인가 결정하는 알고리즘이 다양하게 존재한다.
First-come-first-serve(선착순), round-robin(임의의 기간만큼 돌아가면서), shortest-process-next(가장 금방 끝날 것부터), shortest-remaining-time-next(남은 작업시간이 짧은 것 부터-비현실적), high-response-time-next(기다린 시간과 처리에 필요한 시간을 복합적으로), multi-level-queue(우선순위가 다른 여러 대기줄을 형성-대기줄에서 대기줄로 이동 불가능), multilevel-feedback-queue(대기줄 간에 이동이 가능한 mlq).

여러 개의 프로세서가 동시에 독립적으로 동작하기 때문에 공유하는 자원에서 문제가 생기지 않도록 정보를 공유하게 하는 것

상호 배제
둘 이상의 프로세서가 동시에 임계영역(공유 데이터에 접근하는 코드 영역)에 진입하지 않도록 막는 것. 막아두지 않으면 race가 일어나게 된다.
(Race condition: 명령의 실행 순서에 따라 결과가 달라지는 상황)
따라서 상호 배제가 일어나지 않도록 진입전 검사와 이탈 후 알림을 보내게 한다.

다익스트라 알고리즘(소프트웨어 솔루션)
flag와 turn을 이용. flag에 idle(입장할 의사 없음), wait-in(임계지역에 입장 시도), in-cs(임계지역 입장 시도 2회차 및 입장)
1차 플래그를 확인하고 in-cs로 들어와서 자기가 유일하게 in-cs인가 확인. 아니면 다시 처음으로 돌아가서 1차 플래그부터 다시 시작.
문제점: 구현이 어렵다. 속도가 느리다. Busy-waiting 발생

TAS(test and set)(하드웨어 솔루션)
test와 set을 한 번에 수행 하는 기계어. 실행 중에 interrupt를 받지 않는다.(선점되지 않음)
타겟 값을 반환 하면서 target은 true로 만들어준다.
들어가기 전에 들어갈 수 있는가 확인 나오면서 들어갈 수 있다고 알려주고 나감으로서 쉽게 해결. 대신 3이상이 기다리면 영원히 기다리는 프로세스가 나올 수 있다. Busy waiting도 여전하다.

세마포어
임의의 변수에 ready queue를 할당하여 문을 열고 들어갈 수 있는 열쇠가 반납 될 때까지 열쇠가 있나 확인하는 것(busy waiting)이 아니라 대기열에 이름을 올린다.
연산을 끝낸 뒤에는 열쇠를 반납하면서 대기열에 있는 프로세스를 하나 깨운다.
깨우는 순서가 없어서 starvation문제가 발생할 수 있다.
Event counter/sequencer로 들어온 순서를 확인하여 해결

모니터
언어 수준에서 상호 배제할 수 있도록 준비된 방식 수도코드대로 짜면 된다. 대신 이 기능을 지원하는 언어여야 하고 컴파일러도 os의 특성을 알고 있어야 한다

Deadlock 프로세스가 일어날 가능성이 없는 이벤트를 기다리는 상황

Starvation과 deadlock의 차이
deadlock: asleep 상태에서 다음 자원을 기다리지만 절대 오지 않는 상태
Starvation: ready 상태에서 우선순위에 밀리거나 우연히 차례가 오랫동안 오지 않는 상황

deadlock이 발생하는 이유 4가지
자원의 특성: 자원을 독점적으로 사용해야 할 경우, 자원의 선점을 허용하지 않는 경우
프로세스의 특성: 자원을 일부만 할당받은 경우(자원을 들고 다음 자원을 기다리는 경우), hold and wait상황이 순환해서 발생하는 경우

위의 네 가지 조건 중에서 한 가지만 없애도 deadlock발생을 막을 수는 있지만 예방에는 너무 많은 비효율이 생겨서 비현실적이다.
Deadlock 회피: deadlock이 발생할 가능성이 보일 경우 자원 할당을 보류. 모든 프로세스를 감시해서 safe state(정상적으로 종료 가능한 상태)가 되도록 한다. (Unsafe sequence가 꼭 deadlock발생으로 이어지는 것은 아니지만 가능성이 있는 상태라는 뜻이다)
프로세스와 자원이 고정되어 있는 상태, 프로세스가 필요로 하는 자원과 최대 수량을 알고 있다고 가정하고 문제를 해결한다 (실용적이지 않음)

탐지 및 복구
Deadlock 방지 작업을 하지 않고 주기적으로 deadlock이 발생 했는가 확인

profile
달리려고 해야 걸을 수 있다.

0개의 댓글