프로세스, 스레드, 교착상태, 메모리 계층

1. 프로세스와 스레드 차이

프로세스는 프로그램이 OS로부터 메모리를 할당받은 동적인 상태의 프로그램 (OS 입장에서 최소 작업단위)

스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위 (CPU 입장에서 최소 작업단위)

프로세스 별로 최소 1개의 스레드를 보유하며, PCB라는 별도의 독립적인 주소 공간을 할당 받는다

프로세스 내의 스레드는 stack 영역을 독립적으로 갖으며, 나머지 영역은 서로 공유하게 됩니다.

1-1. PCB 영역에 대한 설명

PCB : stack, heap, data, code

  • OS가 프로세스를 제어하기 위해 프로세스의 상태 정보를 저장하는 곳
  • PID, state, 포인터, 레지스터 관련 정보, priority, account(CPU 관련), 입출력 상태 정보
  • 프로세스 생성 시 만들어지며 주 기억장치에 저장된다.
  • interrupt시 context switching 에 사용

1-2. Data 영역에는 무엇이 저장되는가

  • 전역 변수(정적 변수, 배열, 구조체 등), 프로그램 종료 시 시스템에 반환한다.
  • 초기화된 변수를 저장하는 data와, 초기화 되지 않은 변수를 저장하는 bss로 나뉜다.

1-3. 프로세스 안의 4가지 영역 중 메모리가 끝날때까지 남는 영역

  • 코드와 데이터 영역
  • 코드 : 실행할 프로그램 코드가 저장되는 영역, 프로그램이 시작되고 끝날 때까지 메모리에 유지된다.
  • 데이터 : 전역 변수와 스태틱 변수가 저장되며 프로그램 시작때 할당되고 종료될 때 해제된다.

1-4. 스레드가 생겨난 배경

  • 프로그램이 복잡해지면서 단일 프로세스를 이용하여 프로그램을 실행해지기 힘들어짐
  • 안정성때문에 여러 프로세스를 사용하지않고 더 작은 실행 단위 개념인 스레드를 만들었다.

2. 멀티 프로세스로 처리 가능한 것을 멀티 스레드로 처리하는 이유

프로세스는 생성할 때마다 자원을 할당하는 system call을 호출하게 되고, IPC를 통해 interrupt를 발생시키며 통신하게 됩니다.

멀티 스레드로 처리할 시 system call이 감소하고, IPC보다 스레드간의 통신비용이 더 적기 때문에 자원의 효율성을 위해 멀티스레드로 처리합니다.

하지만 스레드들은 PCB 중 stack 영역을 제외한 자원을 공유하기 때문에, 이를 해결하기 위해 동기화에 신경써야합니다.

2-1. 스택을 스레드마다 독립적으로 할당하는 이유

스택은 함수 호출시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언하는 변수 등을 저장하기 위해 사용하는 메모리 공간이다.

스택이 독립적이라는 것은 독립적인 함수의 호출이 가능하고, 독립적인 실행 흐름이 추가되는 것이다.

따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당하는 것이다.

2-2. PC(Program Counter) Register를 스레드마다 독립적으로 할당하는 이유

PC는 명령어의 어디까지 수행하였는가를 가리킨다.

Interrupt가 발생하면서 명령어는 연속적으로 수행되지 못하기 때문에, 어느 부분까지 수행했는지를 기억하고 있어야한다.

그러므로 PC 레지스터가 독립적으로 할당될 필요가 있다.

2-3. 프로세스를 생성할 때 어떤 system call을 필요로 하는가

  • fork() : 부모와 완전히 독립된, 새로운 pid를 갖는 자식 프로세스 생성
  • exec() : 프로세스의 메모리 영역을 덮어씌워 다른 프로세스로 변환 -> 프로세스 유지를 위해 fork를 하여 자식에서 주로 사용된다.

3. 교착 상태 (Dead Lock)

교착 상태는 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생하며, 프로세스가 자원을 얻지 못해 작업을 수행하지 못하는 상태입니다.

3-1. 교착 상태의 4가지 조건

조건에는 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구하는 상호배제,

프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다리는 점유대기,

자원의 사용이 끝날 때까지 자원을 가져올 수 없는 비선점,

순환적으로 다음 프로세스가 요구하는 자원을 갖는 순환대기가 있습니다.

해결 방법으로는 예방, 회피, 무시, 발견이 있습니다.


4. 메모리 계층

피라미드 구조로 위에서부터 레지스터 - 캐시 - 메모리 - 하드디스크의 구조를 가지고있습니다.
이 구조는 CS 관점과, 경제성 관점에서 확립될 수 있습니다.

레지스터와 캐시는 CPU 내부에 존재하여 빠르게 접근이 가능하고, 메모리는 CPU 외부에 존재하여 비교적 느리게 접근합니다.

하드 디스크에는 CPU가 직접적으로 접근할 수 없습니다.

접근하기 위해서는 하드 디스크의 데이터를 메모리로 이동시켜서 접근가능한데 속도가 느립니다.

4-1. 메모리 계층왜 이렇게 구조화되어 있는가?

  • 컴퓨터 과학계에서 증명된 ‘참조의 지역성’의 관점에서 자주 쓰일 거 같은 데이터를 하드디스크에서 메모리로, 메모리에서 캐시로 읽어 오는데, 이 크기는 점진적으로 작아진다.
  • 비용적인 측면에서도 비싼 레지스터, 캐시는 필요한만큼의 크기만 사용하고, 저렴한 하드디스크는 넉넉하게 사용하여 피라미드 형태로 나타난다.

4-2. 캐시가 존재하는 이유

메인메모리와 프로세서 간의 시간적, 공간적 차이가 나기 때문에,

캐시를 사용하여 자주 쓰고 인접한 데이터를 빠르게 처리한다.

프로세스, 스레드, 교착상태, 메모리 계층

http://inwoo.github.io/10/14/0-interview-os/

Author

Inwoo Jeong

Posted on

2021-10-14

Updated on

2021-10-28

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

댓글