OS - 질문 정리 Part 1

marafo·2021년 1월 21일
0

∙ 가상 메모리(Virtual Memory):

유저가 실행하려는 프로그램의 크기가 물리 메모리보다 클 때, 해당 프로그램을 적당한 크기로 분할하여 메모리에 적재하는 것을 Memory Overlay라 정의한다. 이 방식은 가상메모리의 근본적인 원리가 된다.

한정된 물리 메모리보다 더 큰 프로세스를 실행하기 위해 프로세스의 일부분만 가져와서 실행할 수 있다는 점은 곧 메모리를 여러 프로세스에 나누어 동시에 할당할 수 있다는 의미다. 모듈(프로세스의 일부)를 가져올 때 전적으로 CPU 레지스터의 Program Counter가 결정한다.

Memory Overlay에 의해서 물리 메모리 밖으로 내보내진 프로세스는 Secondary Storage라 불리는 보조저장장치 내의 스왑(Swap) 영역으로 나가게 된다. 이를 스왑 아웃(Swap Out), 반대로 프로세스와 데이터를 가져오는 작업은 스왑 인(Swap In)이라고 불린다. 이 스왑영역은 메모리 관리자 MMU가 관리하고 보조저장장치는 스왑영역을 위해 공간만 내주는 것이다.

결론적으로 Memory Overlay에 기초한 가상 메모리 체계는 (물리 메모리 크기 + 스왑 영역의 크기)를 합쳐서 전체 메모리로 인식한다.

∙ 캐시 및 캐시의 지역성:

캐시(Cache)란 메모리와 cpu간의 속도 차이(cpu 내부 버스 속도 >> 메모리와 주변장치를 포함한 시스템 버스 속도)를 좁히기 위해서 cpu가 앞으로 사용할 가능성이 많은 데이터를 미리 가져온다. 미리 가져오기 (prefetch), 버퍼 (buffer, 임시 저장 기능)를 기초로 한다.

cpu는 메모리에 접근하기 전에 먼저 캐시에 방문하여 필요한 데이터가 있는지 확인한다. cpu가 캐시에서 원하는 데이터를 찾으면 Cache Hit, 못 찾으면 Cache miss이다.

캐시의 지역성은 cpu의 Cache Hit를 높이기 위한 방법으로 두 가지가 있다.
1 ) 현재 메모리 위치에 가까운 데이터가 멀리 있는 데이터보다 캐시로써 조회될 가능성이 높다는 공간적 지역성
2 ) 한 번 조회된 메모리의 데이터는 Cache로서 가까운 미래에 다시 조회될 가능성이 더 높아진다는 시간적 지역성으로 나뉜다.

∙ 문맥 교환(Context Switching):

cpu를 사용중이던 프로세스가 실행 상태에서 쫓겨나고 새로운 프로세스가 cpu의 할당을 받고 실행되는 것이다. 쫓겨난 프로세스는 지금까지 진행되던 작업내용을 PCB(Process Control Block)에 저장하고 준비 상태에 들어간다.
반대로 새롭게 cpu의 할당을 받은 프로세스는 준비 상태에서 실행 상태가 된다.

문맥 교환은 크게 두 가지 경우 나타난다.
1 ) 한 프로세스가 자신에게 주어진 타임 슬라이스를 모두 사용할 때
2 ) 인터럽트(입출력 작업 요청이나 프로세스가 자신의 메모리 경계 레지스터 범위를 넘어서는 경우)가 발생할 때 => 경계 레지스터 범위 초과시는 강제 종료 처리

프로세스 작업시간보다 문맥교환으로 소비하는 시간이 많아지면 Overhead라 한다.

스레드는 프로세스에 비해서 캐시메모리나 PCB에 저장해야 하는 내용이 적고,비워야 하는 내용도 적기 때문에 상대적으로 더 빠른 문맥 교환이 일어날 수 있다.

∙ PCB(Process Control Block)의 구성

PCB란 프로세스가 실행 상태에서 준비 상태가 되고 다시 실행 상태로 돌아가기 위해 문맥 교환 이전까지 기록된 프로세스의 중요 정보를 보관하는 자료구조이다. 몇 가지 중요한 구성요소는 다음과 같다.

1 ) 포인터 : PCB를 연결하여 준비 상태나 대기 상태의 큐를 구현
2 ) 프로세스 상태 : 현재 어떤 상태인지 나타낸다 ex) 생성, 준비, 대기, 실행
3 ) 프로세스 ID : 운영체제 내의 프로세스 구분자
4 ) 프로세스 우선순위 : 커널 프로세스 >> 사용자 프로세스(이중에도 우선순위 상이)
5) 레지스터 정보 : 자신이 사용하던 레지스터의 중간값. 다시 cpu 할당을 받아 작업을 재개하기 위해 필요한 정보.
6 ) 메모리 관리 정보 : 메모리 내 프로세스의 위치 + 경계 레지스터, 한계 레지스터
7) 부모-자식 프로세스 ID : 부모 프로세스와 자식 프로세스를 구분하는 식별자 정보.

∙ 프로세스(Process)와 스레드(Thread)의 비교 및 차이

프로세스 : 저장장치에 정적으로 저장되어 있던 프로그램이 실행을 위해 메모리에 올라온 동적 상태이다.

스레드 : cpu scheduler에 의해서 실행상태가 된 프로세스를 cpu가 처리할 때 전달 받는 작업의 단위를 의미한다. 즉 운영체제의 작업 단위는 프로세스, cpu의 작업 단위는 스레드가 된다.

프로세스와 스레드의 차이가 발생하는 경우는 여러 작업을 할 때로 생각할 수 있다. 다중 작업을 위해 여러 개의 프로세스가 실행이 되면 코드, PCB, 공유 변수 등이 메모리에서 중복되어 낭비가 발생한다. 반면 (멀티)스레드는 낭비를 막기 위해 한 프로세스를 분할하여 코드, 파일, 데이터, 힙 등의 자원을 공유하고 각 스레드는 스택, 레지스터를 갖는다.

멀티 프로세스는 서로가 독립적으로 실행되기 때문에 한 프로세스의 에러가 다른 프로세스에게 영향을 끼치지 않지만, 멀티 스레드는 자원을 공유함으로써 한 스레드에서 문제가 발생하면 다른 스레드에도 영향을 미칠 수 있다.

문맥 교환 속도(스레드 >> 프로세스)를 요구하고 자원 할당의 과정, 스레드간 통신비용 간소화의 이점이 더 클 때는 프로세스보다 스레드를 사용하는 것이 유리하다. 단 특정 스레드로 인해 다른 스레드가 에러, 악영향을 받거나 보안을 요구하는 경우엔 메모리와 자원을 공유하지 않는 프로세스가 유리하다.

∙ 프로세스 동기화(Synchronization) ***

전역 변수를 이용한 통신 방식은 수신측에서 송신측이 언제 데이터를 보낼지 모른다는 단점이 있다. 수신측에선 데이터 도착을 알기 위해 반복문은 끊임없이 돌리며 기다려야 하는데 이 경우를 바쁜 대기(busy waiting)이라 정의한다. 이 때 동기화(대기가 있는 통신)를 통해 바쁜 대기를 해결할 수 있다.

∙ Thread-Safe

멀티스레드 프로그래밍에서 특정 함수, 변수, 객체에 여러 스레드가 동시에 접근해도 의도한 실행에 문제가 없는 상태를 말한다. 이 상태를 유지하기 위해 다음 4가지 조건이 있다.

1 ) Re Entrancy : 서로 다른 스레드가 같은 함수를 호출해서 실행할 때, 독립적으로 각 스레드에 맞는 결과가 나와야 한다.

2 ) Thread-local storage : 공유 자원의 사용을 최대한 줄여서 각 스레드만이 접근할 수 있는 고유의 저장소를 사용하며 이를 통해 동시 접근을 막는다. 전역 변수의 수를 최소화하는 것과 일맥상통한다.

3 ) Mutual Extension : 공유 자원을 사용할 때, 해당 자원에 대한 접근 권한을 세마포어나 상호배제의 lock으로 통제할 수 있다.

4 ) Atomic operations : 임계구역의 공유 자원에 접근할 때, 다른 요인에 의해 방해 받지 않고 하나의 연산만 하는 원자 연산을 사용해 상호 배제를 만족한다.

∙ 가상 머신(Virtual Machine)

기존 C 언어는 유닉스와 다른 종류의 커널을 가진 OS와는 호환성이 떨어진다. 즉 운영체제가 달라질때마다 그것에 맞게 C 언어 코드를 수정해야 하는데, 이 불편함을 해소하기 위해 자바(Java)를 사용한다. 자바의 원리는 운영체제 위에 JVM(Java Virtual Machine)을 통해 User Application을 실행하게 된다. (OS << 가상 머신 << User Application)

자바에서는 프로세스가 아닌 스레드 단위로 작업을 처리하며, JVM은 이 스레드 스케줄링을 담당한다. 또한 추가로 관리하는 스레드 관련 정보는 다음과 같다.

1) 스레드의 갯수
2) 스레드의 메모리 위치(경계, 한계 레지스터)
3) 스레드의 상태
4) 스레드 우선순위

∙ 동기 및 비동기(sync, Async) ***

동기: 코드(메소드)를 실행시키면서 반환 값이 기대되는 로직을 동기적이라 정의한다. 이것을 흔히 blocking 된다고 말한다. System Call 같은 특정 작업이 끝날 때까지 Wait Queue에서 기다렸다가 완료되면 그 때 결과를 반환한다. 로직의 순차적 실행 결과를 기대할 수 있다.

비동기: 코드(메소드)가 실행되면서 로직이 non-blocking 상태가 된다. System Call이 마저 다 완료되지 않아도 그 다음 코드를 실행해서 나오는 결과를 반환한다. 즉 동기적 순서와 다르게 기대되는 값이 바로 나오지 않는다.

∙ 스풀링(Spooling)

cpu와 입출력장치가 독립적으로 실행될 수 있도록 설계된 소프트웨어 버퍼를 말한다. 특히 프린터 출력기에서 많이 볼 수 있는 개념이다.

워드 파일을 통해서 인쇄 작업을 시작하면 인쇄할 내용들을 Secondary Storage의 스풀러 공간에 따로 저장해서 프린터 작업을 맡기고 워드 작업을 지속할 수 있다. 이 원리를 통해 워드와 프린터가 독립적으로 실행된다.

스풀링이 버퍼의 일종이지만 조금 다른 점이 있다면 다른 버퍼들은 프로그램간에 공유가 가능하지만 스풀링은 배타적이므로 다른 작업이 끼어들지 못한다.

∙ 기아 현상(Starvation)

특정 프로세스의 우선순위가 낮아서 cpu할당이 계속 늦어지거나 받지 못하는 상태.
Aging 기법을 통해 cpu 할당을 받은 프로세스가 실행상태에서 벗어날 때 우선순위를 낮추어 기아 현상을 완화할 수 있다.

∙ 콘보이 효과(Convoy Effect)

FCFS cpu 스케줄링에 의해서 처리 시간이 긴 프로세스가 cpu의 할당을 받아서 다른 프로세스들의 작업 실행이 계속 적체되고 효율성이 떨어지는 문제를 말한다.


참고)

cache
https://wh00300.tistory.com/79

가상 머신
∙ 쉽게 배우는 운영체제 58p
https://gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-os.html

동기 및 비동기
https://hyonee.tistory.com/95
https://nesoy.github.io/articles/2017-01/Synchronized

스풀링
∙ 쉽게 배우는 운영체제 100p

콘보이 효과
∙ 쉽게 배우는 운영체제 216p

프로세스 - 스레드
https://gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-os.html
https://3dmpengines.tistory.com/2003

Thread-Safe
https://gompangs.tistory.com/entry/OS-Thread-Safe란
https://medium.com/spoontech/원자적-atomic-연산과-순서-ordering-제약-ed25e39c4646

profile
프론트 개발자 준비

1개의 댓글

comment-user-thumbnail
2021년 4월 13일

잦붕이 씨밸러마 흑형면상 달고있냐

답글 달기