방학 불태우기 9

김민석·2021년 8월 2일
0

방학

목록 보기
9/16

프로세스와 스레드

프로세스

프로세스란 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 의미한다.

디스크에 있던 프로그램을 실행하기 위해 메모리에 적재하여 사용하는데, 이 상태의 프로그램을 프로세스라 말한다.

프로세스 상태


프로세스는 기본적으로 위의 다섯가지 상태를 지닌다.

프로세스를 관리하기 위해 ready queue와 waiting queue가 존재하며 ready queue의 프로세스들 중 실행되는 프로세스는 running 상태가 되어 실행되게 된다.

기본적으로 running 상태에서 일정 시간을 소모하거나 I/O의 개입이 있다면 다시 ready나 waiting 상태로 돌아가게 된다.

스레드

프로세스 내에서 실행되는 여러 흐름의 단위이다.

프로세스 내에서 stack을 할당받아 사용하며, 힙과 데이터 영역은 공유한다.

스레드 동작 방식

컴퓨터의 효율성을 증가시키기 위해 멀티 스레딩 방식을 사용한다.

예를들어 한 task가 끝날 때 까지 대기한다고 할 때, task가 동작하던 중 I/O의 개입이 있다면 I/O가 끝날때 까지 기다려야 한다.

이런 불필요한 CPU 낭비를 막기 위해 context switching 을 통해 여러 task를 번갈아 시행하며 CPU가 노는 시간을 최대한 줄일 수 있다.

context switching의 동작 과정은 다음과 같다.

context switching이 일어난다면 현재 동작하고 있는 프로세스의 정보들을 PCB에 저장하고, 새로 돌릴 프로세스의 정보를 PCB에서 가져와서 메모리에 적재하여 사용한다.

이 때 스레드를 사용한다면 기존의 힙과 데이터 영역 등 스택을 제외한 메모리 영역은 공유하기 때문에 context switching 과정에서 저장하고 불러오는 오버헤드가 줄어들게 된다.

즉, 스레드를 사용함으로써 컴퓨터의 효율성을 증가시킬 수 있다.

멀티스레드 스케줄링 방식

프로세스 또는 스레드에 CPU를 할당해 줄 때 순서를 정하는 것을 스케줄링 이라고 한다.

스케줄링은 크게 선점과 비선점 방식으로 나눌 수 있다.

  • 선점방식
    선점 방식은 새로운 프로세스가 ready queue에 들어왔을 때 만약 높은 우선순위로 인해 실행이 되어야 한다면 진행중인 프로세스를 중단시키고 새로 들어온 프로세스를 진행시키는 방식이다.

  • 비선점 방식
    비선점 방식은 이미 진행중인 프로세스는 본인이 할당받은 만큼 다 할때 까지 양보하지 않는 방식이다.

FCFS

first come first served 방식으로 먼저 들어온 프로세스를 먼저 처리하는 방식이다.
fifo 방식을 생각하면 이해하기 쉽다.
대표적인 비선점 방식의 알고리즘이다.

RR

round robin 방식으로 일정 시간을 할당받아 주어진 시간이 경과되면 다음 프로세스에게 cpu를 넘겨주는 시분할 방식이다.
주어진 시간이 너무 길면 FCFS와 같은 기능을 수행하고, 너무 짧으면 context switching이 빈번하게 일어나 오버헤드가 많이 발생하므로 적절한 시간 할당이 중요하다.

SJF

shortest job first 방식으로 짧은 프로세스를 먼저 수행시키도록 하는 알고리즘이다.
선점 방식과 비선점 방식 모두 존재한다.

우선순위 큐

프로세스마다 우선순위를 줘서 우선순위가 높은 것부터 실행시키도록 하는 것이다.
SJF와 마찬가지로 선점 방식과 비선점 방식 모두 존재한다.
우선순위 큐를 사용한다면 우선순위가 낮은 프로세스는 평생 대기만 해야하는 starvation이 발생할 수 있는데, 이것을 방지하기 위해 aging 기법을 활용할 수 있다.

이 밖에도 여러 스케줄링 알고리즘이 존재한다.

임계구역과 동기화

스레드는 스택 영역을 제외한 나머지 부분을 공유하기 때문에 동기화에 대한 문제가 발생할 수 밖에 없다.

공유 영역을 여러 스레드가 동시에 접근하여 다룬다면 일관성과 무결성 등이 깨질 수 있기 때문이다.

  • 임계구역
    임계구역이란 여러 스레드나 여러 프로세스가 동시에 접근하면 안되는 공유 자원의 코드 영역을 의미한다.

  • 뮤텍스와 세마포어
    임계구역에서의 동기화를 위해 뮤텍스(mutex)나 세마포어(semaphore)를 활용할 수 있다.
    참고 : https://dduddublog.tistory.com/25

자바스크립트 타이머

자바스크립트 내에서 일정 시간동안 반복되게 하거나, 일정 시간이 지난 후 동작하게 하거나 할 수 있는 방법으로는 setTimeout과 setInterval이 있다.

setTimeout

특정시간 이후 원하는 함수나 코드를 실행시킬 때 사용한다.
setTimeout(function, delay)를 통해 사용할 수 있다.

setTimeout(function(){
	console.log("asdf");
}, 1000);

위의 코드를 수행하면 1초 후 asdf가 출력된다.

동작 과정 참고 : https://prohannah.tistory.com/59

setInterval

특정 시간마다 반복되는 함수를 실행할 때 사용한다.
setInterval(cuntion, delay)를 통해 사용할 수 있다.

var tmp = setInterval(finction(){
	console.log("asdf");
},1000);

위의 코드를 수행하면 1초마다 asdf가 출력된다.
그리고 반복을 끝내기 위해 clearInterval()를 사용하여 반복을 끝낼 수 있다.

참고 : https://ko.javascript.info/settimeout-setinterval

더 알아보기

  • worker thread, web worker
  • promise, async/await
  • 자바스크립트 랜드함수
  • 폰 노이만 구조와 하버드 구조
  • 자바스크립트 동작 원리(싱글 스레드)
profile
김민석의 학습 정리 블로그

0개의 댓글