이 내용 관련 면접은
운영체제가 시스템의 자원을 어떤 단위(프로세스)로 할당하고, 프로세스와 스레드는 자원을
어떻게 사용 하느냐를 아는지 물어보는거
https://charlezz.medium.com/process%EC%99%80-thread-%EC%9D%B4%EC%95%BC%EA%B8%B0-5b96d0d43e37
프로세스에 대한 정의 -> (컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램)
프로그램은 하드디스크에 올라간 정적인 상태이다
프로세스는 프로그램을 하드디스크 => 메모리로 옮긴거! (그래야 CPU를 통해 실행이 가능해서!)
여기서 프로그램이 직접 H/W부분에 들어갈 수 없어서 O/S가 중간에서 옮겨줘야한다!!
O/S 가 옮겨줄 때 커널이 이따 나올 스케줄링을 위해
프로그램에 PCB(process control block)를 붙여서 독립적인 메모리 공간을 할당 해준다!!
운영체제로부터 프로세서, 필요한 주소공간, 메모리 등을 할당받습니다.
스케줄러의 입장에서 "task(작업)"라고 부르기도 한다.
운영체제에 의해서 코드, 데이터 스택, 힙구조로 되어있는 독립된 메모리 영역을 할당받습니다.
스택 영역은 함수 안에서 선언된 지역변수, 매개변수, 리턴값, 등이 저장되고 함수 호출시 기록하고 종료되면 제거한다. 스택이라는 자료구조 명칭에서도 알 수 있듯이 후위선출(LIFO) 메커니즘을 따른다.
흔히 재귀함수를 통해 너무 많은 함수를 호출하게 되는 경우 스택 영역이 초과하면서
Stack Overflow(스택오버플로우)에러가 발생한다. (여러분이 잘 아는 그 스택오버플로우가 여기서 따온것이다)
프로세스는 각각 독립된 메모리 공간을 할당 받기 때문에 서로 데이터 공유를 원칙적으로는 할 수가 없다
만약 프로세스가 다른 프로세스 자원에 접근하려면 IPC(Inter-Process Commnuication)를 사용해야 한다.
IPC의 종류로는 메일슬롯, 파이프, 소켓, 시그널, 공유메모리 등이 있다.
프로세스내에 실행되는 여러 흐름의 단위
스레드란 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내의 주소 공간이나
자원들을 같은 프로세스 내에 스레드끼리 공유하면서 실행
스택(stack)에 저장되는 정보는 함수 호출과 관련된 내용이다. (Scope)
함수는 기능이다. 하나의 프로세스에서 여러 개의 스레드를 가진다는 것은 여러 개의 기능을 가진다는 것이다.
네트워크, 입출력, 작업 처리 등등 프로세스가 해야 할 일들이 많은데 해당 기능들을 스레드로 처리하게 되는 것이다.
이는 멀티 스레드의 강력한 배경이 되어준다.
해당 글에서는 프로세스와 스레드의 차이점만 살펴보았다. 다음의 글에서 멀티 프로세스와 멀티 스레드를
비교해볼 생각이다.
Context Switching은 사실 프로세스가 가지고 있는 스레드를 처리하는 과정
각각 스택만 따로 할당을 받고 코드 데이터 힙 영역을 프로세스내에 각각의 스레드가 내용을 공유한다!
멀티스레드를 사용시 장점
메모리를 공유하다보니 스레드간 데이터 주고받는게 간단해지고 시스템 자원 소모도 줄게 됩니다
응답시간 또한 단축
Context Switching의 오버헤드 부분을 해결
단점
서로 데이터를 사용하다가 충돌이 일어날 가능성이 있습니다 - 동기화 문제
멀티 프로세스로 할 수 있는 작업을 멀티 스레드로 실행할 경우 ->
프로세스를 생성하여 자원을 할당하는
시스템콜이 줄어들어 자원을 효율적으로 관리 가능, 또한 프로세스간 통신보다
스레드 간의 통신의 비용이 적으므로 통신의 부담이 줄어든다
스케쥴링 알고리즘
멀티 프로세싱의 방식은 CPU에서 여러 프로세스를 로테이션으로 돌면서 처리를 하게 됩니다.
동작중인 프로세스가 대기를 타면서 해당 프로세스의 상태(Context)를 보관하고,
대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던
프로세스의 상태(Context)를 복구하게 됩니다.
이러한 일련의 과정을 Context Switching 이라고 하는데 프로세스는 각각 독립된 메모리 영역이다
보니 캐쉬 메모리 초기화 등 꽤나 무거운 작업이 진행되고 오버헤드가 발생하게 됩니다.
프로세스 상태변화
프로세스는 종료되어서 메모리를 반납할때 까지 준비 실행 대기 를 반복
운영체제는 프로세스 스케줄러를 이용해 프로세스 상태변화를 관리
멀티 스레드(Multi Thread)
결국 계산기와 메모장 처럼 서로 완전히 별개의 프로그램이라면 독립적인 프로세스를 구성해야겠지만
서로 관련된 기능들은 멀티스레드로 구현하는것이 이득이다
스레드 단점
지금까지만 봤을 때는 스레드가 프로세스에 비해 탁월한 기능을 가지고 있어보이지만, 스레드에도 단점이 존재한다. 바로, 동기화(Synchronize)이슈이다. 스레드1이 공유 자원 내의 어떤 데이터를 조작하다가, 스레드2에 제어권을 넘겨준 이후 스레드2가 그 데이터를 변경한다면 스레드1이 다시 제어권을 받아 남은 작업을 계속할 때 원치 않는 결과가 나올 수 있다.
출처: https://preamtree.tistory.com/10 [Preamtree의 행복로그:티스토리]
뮤텍스(Mutex)
세마포어(Semaphore)
Context Switching이란?
Context Switching은 운영체제의 CPU자원을 할당하는 스케줄러(Scheuler)에 의해 발생한다. CPU를 적절하고 효율적으로 사용할 수 있도록 하는 작업을 스케줄링이라 한다..
교착상태(데드락, Deadlock) 란
, 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 일컫습니다.
첫 번째 스레드는 두 번째 스레드가 들고 있는 객체의 락이 풀리기를 기다리고 있고, 두 번째 스레드 역시 첫 번째 스레드가 들고 있는 객체의 락이 풀리기를 기다리는 상황을 일컷는다.
모든 스레드가 락이 풀리기를 기다리고 있기 때문에, 무한 대기 상태에 빠지게 된다. 이런 스레드를 교착상태에 빠졌다고 한다.
교착상태 방지