프로세스 내부 통신: 2개 이상의 스레드가 존재하는 경우를 의미, 스레드끼리 전역 변수나 파일을 이용하여 데이터를 주고받는다.

프로세스 간 데이터 통신: 같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우로 공용 파일이나 파이프를 이용하여 데이터를 주고받는다.

네트워크를 이용한 데이터 통신: 여러 컴퓨터가 네트워크로 연결되어있을 때의 통신을 의미하며 소켓을 이용하여 데이터를 주고받는다.

 

분류 방식 종류
통신 방향에 따른 분류 양방향 통신 일반적 통신, 소켓
통신 방향에 따른 분류 반양반향 통신 무전기
통신 방향에 따른 분류 단방향 통신 전역변수, 파일, 파이프
통신 구현 방식에 따른 분류 대기가 있는 통신(동기화 통신) 파이프, 소켓
통신 구현 방식에 따른 분류 대기가 없는 통신(비동기화 통신) 전역 변수, 파일

 

👀 공유자원

여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 의미

공유 자원을 어떤 프로세스가 먼저 이용하느냐에 따라 결과가 달라지기에 경쟁 조건을 피해야 한다.

 

경쟁 조건이란?

2개 이상의 프로세스가 공유자원을 병행적으로 읽거나 쓰는 상황을 의미

 

👀 임계 구역

공유자원의 실행 순서에 따라 결과가 달라지는 프로그램의 영역 -> 순서를 통제하여야 한다.

 

임계 구역을 해결하기 위한 조건은 무엇일까 ❓

1. 상호 배제: 한 프로세스가 임계 구역에 들어가면 다른 프로세스는 임계 구역에 들어갈 수 없다.

2. 한정 대기: 특정 프로세스가 임계구역에 들어가지 못해 무한 대기하면 안 된다. (=교착 상태)

3. 진행의 융통성: 한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다. 즉 임계 구역을 아무 프로세스가 사용하지 않으면 들어가야 한다.

 

💡 임계구역 해결방법

✨ Spin Lock

Lock의 기본 구현 방식

1️⃣ 상호 배제 조건을 충족하지 않는 경우

1. P2는 lock이 False임으로 lock을 true로 만든 후 임계 구역으로 들어옴

2. 타임 아웃이 끝난 P1이 true로 만든 후 임계 구역으로 들어옴

3. 둘 다 임계 구역에 진입

 

2️⃣ 한정 대기 문제(=교착상태가 발생하는 경우)

공유 변수를 두 개 사용하여 상호 배제 조건을 충족한 경우 -  일단 잠금을 하고 난 후 다른 프로세스가 잠겼는지 확인

상호배제 조건 충족

P1, P2 둘 다 while문에 빠져나오지 못하고 무한 루프에 빠져 P1, P2 둘 다 임계 구역으로 못 들어가고 프로세스가 늘어 갈수록 공유 변수도 증가시켜줘야 해서 확장성의 문제 발생

 

3️⃣ 진행의 융통성 문제

상호 배제와 한정 대기 보장

프로세스의 우선순위와 상관없이 번갈아 가면서 임계 구역에 진입하여 우선순위가 높은 프로세스가 두 번 연속해서 실행하고 싶어도 못 한다. 프로세스 진행이 다른 프로세스로 인해 방해받는 현상을 경직된 동기화라고 한다.

 

Spin Lock의 문제점

Ready 큐에 대기시키다 보니 락을 얻을 수 없는 상황이면 while문을 돌면서 실행하다가 다시 Ready 큐에 들어가 CPU 자원을 소모한다. 

 

✨ Wating 큐

각각의 락 별로 waiting 큐를 운영하여 락이 필요한 프로세스의 경우 락을 waiting 큐에 push 시킨다. 이후 락이 가용 가능한 상태가 되었을 때 큐의 제일 맨 앞에 있는 프로세스를 pop 시켜 ready 큐에 삽입하면 락이 가용 가능해진 시점에 프로세스가 실행되도록 할 수 있다. -> 락을 필요로 하지만 아직 얻지 못한 경우에 해당 프로세스를 Ready 큐에 방치하는 것이 아닌 Waiting 큐에 추가해서 락이 반납되기 전까지 Scheduling되는 것을 막는다. -> CPU 자원이 낭비되지 않는다.

 

그림으로 이해하기

https://foramonth.tistory.com/74?category=902887 

 

Spin Lock은 언제 사용할까 ❓

Waiting 큐 방식은 Waiting 큐에 추가하는 작업이 추가되고 우선순위에 맞게 정렬시켜야하는 것과 다시 프로세스를 깨우고 재움으로써 문맥 교환이 발생하는 오버헤드 발생한다.

프로세서가 한개라면 spin lock은 사라지는 게 맞다. spin lock을 풀 수 있는 다른 프로세서가 없어서 계속 바쁜 대기를 해야 하기 때문이다. 

하지만 멀티 프로세서라면 위의 오버헤드보다 바쁜대기를 하는 것이 훨씬 경제적이다. 다른 프로세서가 임계 구역을 다 처리하는 순간 바쁜 대기를 풀고 바로 들어가면 되기 때문이다.

 

 

✌ 검사와 지정을 사용하여 하드웨어적으로 임계 문제 방법 해결

바쁜 대기 계속 발생

✨ 세마포어

세마포어는 임계 구역이 잠겼는지 직접 확인하지 않아 바쁜 대기도 없고 다른 프로세스에게 동기화 메시지를 보낼 필요도 없다. 

 

Semaphore(n); // RS = n (현재 사용가능한 자원의 수)

P(){ // 잠금을 수행
	if (RS > 0)
		RS = RS - 1;
	else
	{
		block();
        }
};

// 임계구역

V() { // 잠금해제와 동기화를 수행
	RS = RS + 1;
	wake_up();
};

세마포어는 공유 자원이 여러 개일 경우에도 사용 가능하다.

n을 2라고 할 경우,

1. 먼저 도착한 P1이 RS 값을 1 감소시키면서 진입 

2. P2도 RS 값을 1 감소시키면서 진입 

3. P3의 경우 RS가 0 이므로 block 상태로 RS값이 0보다 커질 때까지 세마포어 큐에서 대기(바쁜 대기 없음)

4. P1이 임계 구역을 빠져나와 V() 실행하면서 RS 값은 1이 되고 wake_up 신호가 P3에게 전달

 

✨ 모니터

모니터는 세마포어의 알고리즘을 따르면서 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공 (=운영체제의 시스템 호출과 같은 원리)

 

1. 임계 구역으로 지정된 변수나 자원에 접근하고자 하는 프로세스는 직접 P()나 V()을 사용하지 않고 모니터에 작업 요청

2. 모니터는 작업을 모니터 큐에 저장한 후 순서대로 처리하고 결과를 해당 프로세스에게 알려줌

 

모니터 큐

 

모니터는 임계구역 보호와 동기화를 상태 변수를 사용하여 모니터의 내부에서 처리한다. 사용자는 increase 함수만 호출하면 된다.

 

상태 변수는 wait와 signal 기능이 있다.

wait() - 모니터 큐에서 자신의 차례가 올 때까지 기다린다. 세마포어의 P()에 해당

signal() - 모니터 큐에서 기다리는 다음 프로세스에게 순서를 넘겨준다. 세마포어의 V()에 해당

 

'OS' 카테고리의 다른 글

교착상태 필요조건과 해결방법  (0) 2021.06.03
CPU 스케줄링  (0) 2021.05.24
스레드의 공유자원 관리(동기화)  (0) 2021.05.09
프로세스 스케줄링이 뭘까❓  (0) 2021.01.04
스레드에 대해 알아보자  (0) 2021.01.03

교착상태는 2개 이상의 프로세스가 다른 프로세스의 작업이 끝나기만 기다리며 작업을 더 이상 진행하지 못하는 상태를 말한다.

 

교착상태는 시스템 자원, 공유 변수, 데이터베이스와 같은 응용프로그램에서 발생할 수 있다.

 

자원 할당 그래프는 프로세스가 어떤 자원을 사용 중이고 어떤 자원을 기다리고 있는지를 방향성이 있는 그래프로 표현한 것이다. 

 

💡 교착상태 필요조건

상호 배제, 비선점, 점유와 대기, 원형 대기 이 4가지 모두를 충족해야 교착상태가 발생

 

자원이 어떤 특징을 가지는가 ❓

1️⃣ 상호배제: 배타적인 자원은 임계 구역으로 보호되기 때문에 다른 프로세스가 동시에 사용할 수 없다. 배타적인 자원을 사용하면 교착상태 발생

2️⃣ 비선점: 한 프로세스가 사용 중인 자원은 중간에 다른 프로세스가 빼앗을 수 없다.

 

프로세스가 어떤 행위를 하고 있는가 ❓

3️⃣ 점유와 대기: 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 기다리는 상태여야 한다.

4️⃣ 원형대기: 점유와 대기를 하는 프로세스 간의 관계가 원을 이루어야 한다. 

 

 

👀 교착상태와 아사(기아)현상은 다르다 ❗

교착상태는 아사현상과 달리 정책상 잘못이나 오류가 없어도 자연적으로 발생한다. 그러나 기아 현상은 정책상 잘못이나 오류로 인해 특정 프로세스의 작업이 이루어지지 않는 것이라서 에이징과 같은 방법으로 해결 가능하다.

 

 

💡 교착상태 해결방법

해결방법 특징
교착상태 예방 교착상태를 유발하는 4가지 조건 무력화
교착상태 회피 교착상태가 발생하지 않는 수준으로 자원을 할당
교착상태 검출 자원할당그래프를 사용하여 교착상태를 발견
교착상태 회복 교착상태를 검출한 후 해결

 

교착상태 예방

상호 배제 예방: 현실적으로 자원을 공유할 수 없는 자원이 생길 수밖에 없어서 불가능

 

비선점 예방: 어떤 기준으로 빼앗을지, 빼앗은 시간 중 얼마나 사용할지 등을 정하는 것이 까다롭고 모든 자원을 빼앗을 수 있으면 아사 현상이 발생 -> 에이징으로 해결할 시 에이징으로 올라가면 다시 비선점 자원이 되어 무력화할 수 없다.

 

점유와 대기 예방: 전부 할당하거나 아예 할당하지 않는 방식을 적용, 시작 초기에 자신이 사용하려는 모든 자원을 한꺼번에 점유하거나 그렇지 못할 시 전부 반납 -> 자원의 활용성이 떨어진다, 많은 자원을 사용하는 프로세스는 불리, 일괄 작업방식으로 동작

 

원형 대기 예방: 모든 자원에 숫자를 부여하고 숫자가 큰 방향으로만 자원을 할당, 숫자가 작은 자원을 잡은 상태에서 큰 숫자를 잡는 것은 허용하지만 숫자가 큰 자원을 잡은 상태에서 작은 숫자를 잡는 것은 허용 불가능하다. -> 프로세스 작업 진행에 유연성 하락, 자원의 번호를 어떻게 부여할지 문제

 

교착상태 회피

프로세스에 자원을 할당할 때 어느 수준 이상의 자원을 나누어주면 교착상태가 발생하는지 파악해서 그 이하로 자원을 나누어주는 방법이다.

자원의 총수와 현재 할당된 자원의 수를 기준으로 시스템을 안정 상태와 불안정 상태로 나눈다.

교착상태는 불안정 상태의 일부분

안정상태를 유지할 수 있는 범위 내에서 자원을 할당함으로써 교착상태를 회피

 

✌ 은행원 알고리즘

교착상태 회피를 구현하는 가장 대표적인 알고리즘

 

변수 설명
전체 자원(Total) 시스템 내 전체 자원의 수
가용 자원(Available) 전체자원 - 모든 프로세스의 할당자원
최대 자원(Max) 각 프로세스가 선언한 최대 자원의 수
할당 자원(Allocation) 각 프로세스에 현재 할당된 자원의 수
기대 자원(Expect) 각 프로세스가 앞으로 사용할 자원의 수(최대자원 - 할당자원)

자원을 할당하는 기준은 무엇일까 ❓

각 프로세스의 기대 자원과 비교하여 가용 자원이 크거나 같은 경우가 한번 이상이면 할당한다. 그 자원을 사용하여 작업을 끝낼 수 있는 프로세스가 있다는 뜻이므로 안정상태

 

🙆‍♀️ 안정상태

안정 상태

교착상태 회피의 문제점

1. 프로세스가 자신이 사용할 모든 자원을 미리 선언해야 한다.

2. 시스템 전체 자원의 수가 고정적이어야 한다.

3. 자원이 낭비된다.

 

교착 상태 검출

교착 상태 해결 방법 중 가장 현실적인 방법으로 운영체제가 프로세스의 작업을 관찰하면서 교착 상태 발생 여부를 계속 주시하는 방법이다. 교착 상태가 발견되면 이를 해결하기 위해 교착상태 회복 단계를 거친다.

 

1️⃣ 타임아웃을 이용한 교착상태 검출(= 가벼운 교착상태 검출)

의미: 일정 시간 동안 작업이 진행되지 않은 프로세스를 교착 상태가 발생한 것으로 간주하여 처리하는 방법

단점: 엉뚱한 프로세스가 강제 종료될 수 있고 모든 시스템에 적용할 수 없다. (ex. 분산 데이터베이스 시스템)

 

2️⃣ 자원 할당 그래프를 이용하여 교착상태 검출(= 무거운 교착상태 검출)

의미: 자원 할당 그래프에 사이클이 발생할 시 교착상태가 발생. (단일 자원일 경우만 해당)

장점: 프로세스의 작업 방식을 제한하지 않으면서 교착 상태 파악 가능

단점: 자원 할당 그래프 유지, 갱신, 사이클 검사하는 추가 작업 발생으로 인해 오버헤드 발생

 

교착 상태 회복

1️⃣ 교착 상태를 일으킨 모든 프로세스를 동시에 종료하는 방법 -> 모든 프로세스를 강제 종료한 후 다시 실행할 때는 순차적으로 실행하는 것이 필요함

 

2️⃣ 교착 상태를 일으킨 프로세스 중 하나를 골라 순서대로 종료

어떤 프로세스부터 종료할까 ❓

1. 우선순위가 낮은 프로세스 먼저 종료

2. 우선순위가 같은 경우 작업 시간이 짧은 프로세스 먼저 종료

3. 위 두 조건이 같을 경우 자원을 많이 사용하는 프로세스 먼저 종료

 

회복 상태에서 중요한 점은 프로세스 강제 종료와 더불어 강제 종료된 프로세스가 실행하기 전에 시스템을 복구하는 일이 필요하다. 따라서 체크포인트를 만들어서 가장 최근의 검사 시점으로 돌아간다.

 

💡 다중 자원과 교착 상태 검출

다중 자원이 있는 대기 그래프에서 그래프 감소를 완료한 후에도 사이클이 남아있다면 교착상태 발생으로 판단한다.

대기 그래프: 자원 할당 그래프에서 프로세스와 프로세스 간에 기다리는 관계만 나타낸 그래프

그래프 감소: 끝날 가능성이 있는 프로세스의 화살표와 관련 프로세스의 화살표를 연속적으로 지워나가는 작업

자원 할당 그래프

 

다중 자원일 경우 사이클이 발생했을 시 대기 그래프를 그려봐야 한다 ❗

대기 그래프

 

1. P2가 끝날 수 있는 프로세스이기에 1번 화살표를 지운다.

2. P1이 끝날 수 있는 프로세스이기에 2번을 지운다.

3. P4가 끝날 수 있는 프로세스이기에 3번을 지운다.

4. P3이 끝날 수 있는 프로세스이기에 4번을 지운다.

 

그래프 감소가 가능하므로 교착상태가 발생하지 않는다.

 

'OS' 카테고리의 다른 글

프로세스 간 통신(IPC)  (0) 2021.06.04
CPU 스케줄링  (0) 2021.05.24
스레드의 공유자원 관리(동기화)  (0) 2021.05.09
프로세스 스케줄링이 뭘까❓  (0) 2021.01.04
스레드에 대해 알아보자  (0) 2021.01.03

💡 스케줄링 단계

레벨 1 - 고수준 스케줄링: 시스템에서 전체 프로세스의 수를 결정

레벨 2 - 중간 수준 스케줄링: 프로세스가 활성화 상태일 때 문제가 발생한 경우 이미 활성화된 프로세스의 일부를 보류 상태로 보낸다.

레벨 3 - 저수준 스케줄링: 준비 상태에 있는 프로세스를 실행 상태로 보내거나, 실행 상태를 대기 상태로 보내거나 가장 작은 단위의 스케줄링

 

CPU 스케줄링을 할 때 고려사항들이 무엇이 있을까 ❓

우선순위가 높은 프로세스는 중요도가 높기에 더 자주 많이 사용된다. 

커널 프로세스, 전면 프로세스, 대화형 프로세스, 입출력 프로세스는 우선순위가 높고

일반 프로세스, 후면 프로세스, 일괄처리 프로세스, CPU 집중 프로세스는 우선순위가 낮다.

 

입출력 프로세스가 CPU 집중 프로세스보다 먼저 실행 상태에 들어가야 시스템 자원을 더욱 효율적으로 사용 가능(사이클 훔치기)하다.

입출력 프로세스가 입출력을 처리하는 동안 CPU 집중 프로세스가 CPU를 사용할 수 있기 때문이다. 

 

다중 큐가 왜 필요할까❓

프로세스의 중요도는 PCB에 표시되어 있지만 CPU 스케줄러가 매번 PCB를 검색하는 것은 비효율적

 

👀 준비 상태의 다중 큐

우선순위마다 큐가 존재하며 준비 상태에 들어올때 자신의 우선순위 큐에 가장 마지막 원소 값으로 들어온다.

 

👀 대기 상태의 다중 큐

같은 입출력을 요구한 프로세스끼리 큐를 모아놓는다.

 

준비상태의 다중 큐와 대기상태의 다중 큐의 차이

준비 큐는 한번에 하나의 PCB만 이동, 대기 큐는 동시에 여러 개의 PCB 이동 -> 인터럽트 벡터

 

프로세스 우선순위 배정방법

1️⃣ 고정 우선순위 방식: 운영체제가 프로세스에게 우선순위를 부여하면 프로세스가 끝날 때까지 바뀌지 않는다.

2️⃣ 변동 우선순위 방식: 프로세스 생성 시 부여받은 우선순위가 프로세스 작업 중간에 변하는 방식

 

반전 우선순위: 프로세스의 낮은 우선순위를 높은 우선순위로 바꾸는 것 

 

💡 스케줄링 알고리즘

구분 종류
비선점형 알고리즘 FCFS 스케줄링, SJF 스케줄링, HRN 스케줄링
선점형 알고리즘 라운드 로빈 스케줄링, SRT 스케줄링, 다단계 큐 스케줄링, 다단계 피드백 큐 스케줄링
둘 다 가능 우선순위 스케줄링

 

✌ 비선점형 스케줄링

FCFS 스케줄링: 준비 큐에 도착한 순서대로 CPU를 할당하는 비선점형 스케줄링, 큐가 하나라 모든 프로세스는 우선순위가 동일, 초기 일괄 작업 시스템에서 사용 -> 콘보이 효과, CPU의 쉬는 시간이 향상

 

SJF 스케줄링: 준비 큐에 있는 프로세스 중에서 실행 시간이 가장 짧은 작업부터 CPU를 할당하는 비선점형 방식, 큐가 하나라 모든 프로세스는 우선순위가 동일 -> 프로세스 종료시간 예측 어려움(대화형 프로세스가 많기에), 아사 현상 발생

 

HRN 스케줄링: SJF 스케줄링의 아사현상을 해결하기 위해 만들어진 비선점형 알고리즘, 큐가 하나라 모든 프로세스는 우선순위가 동일, 대기시간과 CPU 사용시간을 고려하기에 에이징을 구현했다고 볼 수 있음 -> 여전히 공평성 위배 가능성이 높음

 

✌ 선점형 스케줄링

라운드 로빈 스케줄링: 타임 슬라이스 동안 작업을 하다가 타임 아웃이 되면 준비 큐의 맨 뒤로 가서 자기 차례를 기다리는 순환 순서 방식, 큐가 하나라 모든 프로세스는 우선순위가 동일

 

라운드 로빈 스케줄링 방식에서 고려해야 하는 것은 타임 슬라이스 크기와 문맥 교환이다.

 

1. 타임 슬라이스가 너무 큰 경우 : 하나의 작업이 끝난 뒤 다음 작업이 시작되는 것(FCFS 스케줄링처럼 보임)

 

2. 타임 슬라이스가 너무 작은 경우: 문맥 교환이 너무 자주 일어나서 문맥 교환으로 많은 시간을 낭비하여 실제 작업을 못 하게 됨

 

SRT 스케줄링: SJF 스케줄링 + 라운드 로빈 스케줄링, 즉 SJF 스케줄링의 선점형 버전 -> 현재 실행 중인 스케줄링과 큐에 있는 프로세스의 남은 시간을 주기적으로 계산, 문맥 교환 발생

 

✌ 둘 다 가능

우선순위 스케줄링 : 우선순위를 어떻게 정하느냐에 따라 다양하게 구현 ( SJF 스케줄링, HRN 스케줄링, SRT 스케줄링 전부 가능) -> 우선순위를 바꿈으로 인해 오버헤드 발생, 아사 현상

 

 

다단계 큐 스케줄링

고정형 우선순위에 따라 준비 큐를 여러개 사용하는 방식, 우선순위에 따라 다양한 방식 구현 가능, 큐 자체는 라운드 로빈 방식으로 운영, 상단의 큐에 있는 모든 프로세스 작업이 끝나야 다음 우선순위 큐의 작업이 시작된다. -> 우선순위가 낮은 큐에 있는 프로세스인 경우 작업이 연기

 

다단계 피드백 큐 스케줄링

오늘날 운영체제가 일반적으로 사용하는 방식, 변동 우선순위 방식

1. CPU를 사용하고 난 프로세스는 원래의 큐로 돌아가지 않고 우선순위가 하나 낮은 큐의 끝으로 들어간다

2. 우선 순위에 따라 타임 슬라이스의 크기가 다르다.

우선순위가 낮을수록 타임 슬라이스의 크기는 커진다. -> 우선순위가 낮다는 것은 어렵게 CPU를 얻었다는 것이고 따라서 한번 얻은 거 오래 사용하라는 것 -> 우선순위가 가장 낮은 프로세스는 타임 슬라이스가 무한대이므로 비선점형 -> FCFS 스케줄링 방식으로 동작 (유닉스 운영체제에서 타임 슬라이스를 고정하지 않고 10~200 밀리초 사이에서 조정할 수 있도록 한 이유)

 

 

인터럽트가 왜 나왔을까 ❓

CPU가 입출력 장치의 상태를 주기적으로 검사해서 일정 조건이 만족할 때 데이터를 처리했다. 

점점 컴퓨터 주변장치들(마우스, 키보드, 프린터, 하드디스크 등등)이 많아져서 입출력까지 관여하는데 한계가 발생하기에 인터럽트 방식이 나왔다.

 

Polling 방식: CPU가 직접 입출력 장치에서 데이터를 가져오고 내보내는 방식

인터럽트 방식: CPU가 입출력 관리자에게 입출력 명령을 보내고 데이터 전송이 완료되면 완료 신호를 CPU에게 보내는 방식

 

동기적 인터럽트(= 사용자 인터럽트) : 프로세스가 실행 중인 명령어로 인해 발생하는 인터럽트

비동기적 인터럽트 : 실행 중인 명령어와 무관하게 발생하는 인터럽트

 

CPU가 여러개의 입출력 작업을 입출력 관리자에게 동시에 시킬 수 있는데 이때마다 인터럽트를 발생시키면 비효율적

인터럽트 벡터를 통해 여러 인터럽트를 동시에 처리

 

인터럽트 벡터: 인터럽트와 인터럽트 핸들러를 1:1로 연결한 자료구조

 

인터럽트 처리과정

1. 인터럽트 발생 시 현재 실행 중인 프로세스는 일시 정지 상태가 되며, 재시작을 위해 현재 프로세스 정보를 임시로 저장

2. 인터럽트 컨트롤러가 실행되어 인터럽트 처리 순서 결정

3. 해당 인터럽트에 해당하는 인터럽트 핸들러 실행

4. 인터럽트 처리를 마치면 일시 정지된 프로세스가 다시 실행되거나 종료

 

'OS' 카테고리의 다른 글

프로세스 간 통신(IPC)  (0) 2021.06.04
교착상태 필요조건과 해결방법  (0) 2021.06.03
스레드의 공유자원 관리(동기화)  (0) 2021.05.09
프로세스 스케줄링이 뭘까❓  (0) 2021.01.04
스레드에 대해 알아보자  (0) 2021.01.03

운영체제로부터 시스템 자원을 할 장 받는 작업의 단위를 프로세스라고 한다.

 

시스템 자원의 예로는 무엇이 있을까 ❓

1. CPU 시간

2. 운영되기 위해 필요한 주소 공간

3. Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역

 

프로세스는 각각 독립된 메모리 영역을 가지고 있는데 프로세스 내에 실행되는 여러 흐름의 단위인 스레드와 메모리 영역을 공유한다.

 

하나의 프로세스 안에 여러 스레드가 존재(기본적으로 하나의 스레드를 가지고 있음)할 수 있으며 같은 프로세스 내에 있는 스레드들은 각각의 Stack 영역을 가지고 있고 Code, Data, Heap 영역은 공유한다. 

스택 안에는 지역변수, 리턴 주소, 값 파라미터, 리턴 값이 들어가며 이것은 각각의 스레드가 가지고 있다.

힙 안에는 동적으로 할당되는 배열이나 객체가 들어가며 이를 공유하기에 한 스레드가 프로세스 자원을 변경하면(동적이라는 뜻이므로 즉 Heap Area 부분) 다른 이웃 스레드도 변경 사실을 즉시 알 수 있는 것이다. 그 변경사실을 받아와서 스택에서 활동을 하여 반영할 것이다.

 

멀티프로세스 멀티스레드
하나의 응용 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것 하나의 응용프로그램을 여러개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것
여러 개의 자식 프로세스 중 하나에 문제가 발생하면 다른 프로세스로 전파되지 않는다. 통신 부담 적음, 시스템 처리량 증가, 시스템 자원 소모 감소
Context Switching 발생(CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐쉬 메모리에 대한 데이터까지 초기화), 프로세스간 어렵고 복잡한 통신기법 자원 공유의 문제 발생 (동기화 문제 발생), 하나의 스레드에서 문제가 발생하면 전체 프로세스가 영향을 받는다.

 

동기화 문제를 어떻게 해결할까 ❓

병행 제어를 통해 데이터의 불일치를 막아야 한다.

 

💡 임계 영역

하나의 프로세스가 수정 가능한 공유자원을 액세스하고 있을 때, 다른 프로세스는 그 공유 데이터에 접근할 수 없도록 보장

 

💡 임계 구역 상호 배제 기법

 

1. 뮤텍스

일종의 locking 매커니즘으로 lock을 가지고 있을 때만 공유 데이터 접근 가능

키를 가진 사람만이 접근 가능하고 일이 끝나면 키 반납

 

2. 세마포어

동시에 리소스에 접근할 수 있는 허용 가능한 counter의 개수를 의미

count 수가 1개면 binary semaphore라고 하며 이는 뮤텍스와 개념적으로 같다.

여러개이면 counting semaphore라고 불린다.

 

3. 모니터

뮤텍스와 condition valuable를 갖고 있는 매커니즘

순차적으로만 사용할 수 있는 공유자원이나 그룹에 할당하며 데이터와 프로시저를 포함하는 병행성 고급 구조체

모니터 내부 변수는 모니터 내부에서만 접근할 수 있고 이는 정보의 은폐 기법

모든 자바 객체는 Monitor를 갖고 있다.

 

뮤텍스와 세마포어의 차이점은 ❓

뮤텍스는 공유자원에 대한 접근권한 즉 lock이라는 키를 한개만 가질 수 있고 세마포어는 여러개 가능

'OS' 카테고리의 다른 글

교착상태 필요조건과 해결방법  (0) 2021.06.03
CPU 스케줄링  (0) 2021.05.24
프로세스 스케줄링이 뭘까❓  (0) 2021.01.04
스레드에 대해 알아보자  (0) 2021.01.03
인터럽트를 알아보자  (0) 2020.12.31

컴퓨터에는 여러 개의 프로세스가 시스템 내에 존재하기에 자원을 할당할 프로세스를 선택해야 한다. 이것을 스케줄링이라 한다. 즉 프로세스 스케줄링은 프로세서 사용시간을 프로세스들에게 분배하는 것이다.

 

스케줄링의 목적은 시스템의 성능을 향상시키는 것이다.

 

시스템 성능의 지표에는 무엇이 있을까 ❓

  1. 응답 시간 : 작업 요청으로부터 응답을 받을 때까지의 시간
  2. 작업 처리량 : 단위 시간 동안 완료된 작업의 수
  3. 자원 활용도 : 주어진 시간 동안 자원이 활용된 시간

이외에도 다양한 지표들이 있지만 지표의 종류보다 중요한것은 목적에 맞게 지표를 선택해 스케줄링 기법을 따르는 것이다. 예를 들어서 응답 시간이 중요한 시스템은 대화형 시스템에서, 작업 처리량은 일괄처리 시스템에서 자원 활용도는 비싼 장비의 시스템일 경우 중요하다.

 

스케줄링 기법이 고려하는 항목들을 알아보자.

  • 프로세스의 특성 : I/O-bounded , compute-bounded
  • 시스템 특성 : Batch system, interactive system
  • 프로세스의 긴급성
  • 프로세의 우선순위
  • 프로세스 총 실행시간

 

 

프로세스는 CPU를 사용하고 I/O를 대기하고 사용하면서 수행된다. CPU burstCPU 사용시간을 이야기하고 I/O burstI/O대기 시간을 이야기한다. Burst time은 스케줄링의 기준의 하나로써 CPU burst > I/O burst 라면 compute-bounded 라고한다. 반면에 CPU burst < I/O burst 라면 I/O-bounded라고 한다.

 

 

스케줄링의 단계

발생하는 빈도 및 할당 자원에 따라 스케줄링을 구분한다.

✌ Long-term Scheduling

Job scheduling이 속하며 Job scheduling이란 어떤 Job을 커널에 등록할 것인지를 말한다. Job scheduling은

프로세스 수를 조절하므로 다중 프로그래밍의 정도를 조절한다. 그래서 I/O-bounded와 compute-bounded 프로세스들을 잘 섞어서 선택해야 한다. 그래야 CPU가 작업을 하지 않거나 I/O 대기가 없어 스테 줄 링이 힘든 경우 등 비효율성이 생기지 않는다.

✌ Mid-term Scheduling

어느 프로세스에게 메모리를 할당할지 결정하는 것으로 Swapping이 속한다.

✌ Short-term Scheduling

Process scheduling이 여기에 속하며 Process scheduling이란 프로세서를 할당할 프로세스를 결정하는 것이다. 가장 빈번하게 발생되기에 매우 빨라야 한다.

 

스케줄링 단계 한눈에 보기

 

스케줄링 정책을 알아보자 ❗

  • 선점 VS 비선점
선점/비선점 스케줄링 의미 장점 단점
비선점 스케줄링 할당 받은 자원을 스스로 반납할 때까지 사용하기에 다른 프로세스들이 빼앗을수 없다. Context switch overhead가 적다. 평균 응답시간 증가, 높은 우선순위를 가진 프로세스들이 밀려난다.
선점 스케줄링 타의에 의해 자원을 빼앗길 수 있다. 응답성이 높아 시분할 시스템 등에 적합하다. Context switch overhead가 크다.

 

  • 우선순위
우선순위 스케줄링 의미 장점 단점
정적 우선순위 프로세스 생성시 결정된 우선순위가 계속 유지됨 구현이 쉽고 overhead가 적다. 시스템 환경 변화에 대한 대응이 어렵다.
동적 우선순위 프로세스의 상태 변화에 따라생성시 결정된 우선순위 변경 구현이 복잡하고 overhead가 크다. 시스템 환경 변화에 대해 유연한 대응이 가능하다.

'OS' 카테고리의 다른 글

CPU 스케줄링  (0) 2021.05.24
스레드의 공유자원 관리(동기화)  (0) 2021.05.09
스레드에 대해 알아보자  (0) 2021.01.03
인터럽트를 알아보자  (0) 2020.12.31
운영체제가 프로세스를 어떻게 관리할까❓  (0) 2020.12.31

자원을 할당받으면 프로세스가 그 자원을 제어하는 것이 운영체제의 기본이다. 여기서 스레드란 프로세스가 제어하는 부분을 이야기하는 것으로 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.

 

스레드란 ❓

하나의 프로세스 안에서 다른 스레드들과 자원은 공유하면서 여러 개의 제어를 가능하게 하는 것이 스레드이다. 스레드는 Thread ID, 제어정보, 지역 데이터, 지역 데이터를 저장하는 스택이 하나의 스레드 구성요소가 되며 자원을 공유하기 때문에 Light Weight Process(LWP)라고 불린다. 스레드가 여러 개면 CPU를 병렬적으로 사용할 수 있어 프로세서 활용의 기본단위이다.

 

한 프로세스 내에서의 메모리 공간

같은 프로세스의 스레드들은 동일한 주소 공간을 공유하고 있어서 힙, 데이터, 코드의 자원을 공유하며 각각의 Stack pointer와 Program Counter을 갖는다. 이를 통해 CPU의 병렬 처리가 가능하고 여러 제어가 동시에 가능하다.

 

✌ 스레드의 장점

  • 사용자 응답성 향샹 : 다중 스레드일 경우 일부 스레드가 지연되어도 다른 스레드는 작업을 계속 처리할 수 있다.
  • 자원 공유 : 동일한 프로세스 메모리 안에 여러 개의 스레드가 있으면 커널의 개입을 피할 수 있다.
  • 경제성 : context siwtch 비용이나 프로세스 생성 비용이 없다.
  • 멀티 프로세서 활용 : 멀티 스레드를 사용하면 멀티 프로세서가 가능하고 이는 성능을 향상한다.

✌ 스레드의 구현

1️⃣ 사용자 수준 스레드

스레드 라이브러리가 스레드의 생성과 스케줄링을 담당하며 대표적인 라이브러리로는 POSIX threds, Win32 threads, Java threads 등이 있다. 

한 개의 프로세 스니깐 하나의 커널 수준 스레드가 생기며 스레드 라이브러리가 스레드를 생성하고 관리하기에 스레드 라이브러리 안에 스레드 제어 블록(TCB)이 있다. 따라서 스레드 라이브러리에 의해서 사용자 수준 스레드는 여러 개이고 커널 수준 스레드는 하나인 n:1 매핑이다. 커널은 스레드의 존재를 모르기에 커널의 오버헤드를 낮출 수 있으며 유연한 관리가 가능하다. 하지만 커널은 프로세스 단위로 자원을 할당하기에 만약 다른 스레드가 block이 되고 나머지 스레드들은 계속 동작할 수 있을지라도 커널은 그 사실을 모르기에 모든 스레드가 전부 대기하게 된다.

 

 

2️⃣ 커널 수준 스레드

OS(커널)이 직접 관리하며 커널 영역에서 스레드를 생성하고 관리하기에 Context switching 등 오버헤드가 크다.

사용자 영역의 스레드의 개수만큼 커널 수준 스레드가 생기기에 1:1 매핑이고 커널 수준에서 관리하기에 TCB도 커널에 생긴다. 커널이 각 스레드를 개별적으로 관리하기에 스레드들은 다른 스레드가 block이 되는 것과 관계없이 다른 스레드는 수행이 가능하며 병행 수행이 가능하다. 

 

사용자 수준 스레드와 커널 수준 스레드를 혼합하여 사용할 수는 없을까 ❓

혼합형 스레드(n:m)

n개의 사용자 수준 스레드와 m개의 커널 수준 스레드를 같이 사용하는 것으로 사용자는 원하는 수만큼의 스레드를 생성 가능하다. 각각의 장점을 합쳤기에 효율적이면서도 유연하다.

 

 

 

참고자료

www.youtube.com/watch?v=YlnvCIZQDkw&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=7

 

+ Recent posts