쓰레드와 프로세스에 대해 여러 블로그와 문서들을 참고하면서 정리한 글 입니다. 잘못된 정보가 있다면 지적해주시면 감사하겠습니다!
쓰레드란 무엇일까?
- 쓰레드란 프로세스(프로그램)의 실행 단위로 하나의 프로세스는 여러개의 쓰레드로 구성
 
- 하나의 프로세스내의 쓰레드들은 heap ,static영역을 공유한다.
 
- 각 쓰레드들은 각자의 stack영역과 Register를 가진다.
 
- 한 순간에 하나의 쓰레드만이 실행 가능하다
 
- 프로세스와 같이 실행 준비 대기등의 실행 상태를 가지며 실행 상태가 변할 때 마다 Context Switching을 수행한다.
 
Context Switching
- 멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 PCB에 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)을 교체하는 작업
 
스레드 데이터
- 스레드 기본 데이터
- 실행과 관련된 데이터 필요
- 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택
- 코드, 데이터, 파일등 기타 자원은 프로세스 내의 다른 스레드와 공유 
- 스레드 특정 데이터 TSD(Thread Specific Data)
- 하나의 스레드에만 연관된 데이터로 스레드 라이브러리가 지원하는 기능
- 개별스레드만의 자료공간
- 트랜잭션을 스레드로 처리할경우 각각의 트랜잭션 ID를 기억해야함  
fork || exec 문제
- fork문제 : 프로세스 내의 스레드가 fork를 호출하면 모든 스레드를 가진 프로세스를 생성할 것인지, fork를 요청한 스레드를 가진 프로세스만 생성할 것인지의 문제.
 
- exec 문제 : fork를 통해 스레드를 복제한 후 exec를 수행하면 모든 스레드들이 초기화됨. 그렇다면 교체될 스레드를 복제하는 작업은 필요가 없기에 fork를 요청한 스레드만 복제했어야함. fork를 수행한 후 exec를 수행하지 않는다면 모든 스레드를 복제할 필요가 있는 경우도 있음
 
User-Level Thread vs Kernel Level Thread
사용자 레벨 스레드(User-Level Thread)

- 사용자 스레드는 커널이 내부 스레드를 인식 하지 못한다. 프로세스 내의 Thread library가 쓰레드의 생성 및 스케줄링을 모두 담당한다. 
 
- 동일한 메모리 영역에서 스레드가 생성 및 관리되므로 속도가 빠른 장점이 있는 반면
여러개의 사용자 스레드 중 하나의 스레드가 시스템 호출등으로 중단되면 나머지 모든 스레드 역시 중단되는 단점이 있다. 
커널 레벨 스레드(Kernel-Level Thread)

- 커널이 모든 프로세스와 모든 스레드의 생성 및 스케줄링 관리를 하는 방식이다. 
 
- 모든 프로세스와 스레드들은 커널에 의해 독자적으로 스케줄링 된다. 스레드가 시스템 호출등으로 중단 되더라도, 커널은 프로세스 내의 다른 스레드를 중단시키지 않고 계속 실행 시켜준다. 
 
- 멀티프로세스 환경에서 커널은 여러 개의 스레드를 각각 다른 프로세스에 할당할 수 있다. 하지만 사용자 스레드에 비해 생성 및 관리가 느리다.
 
스케줄링
- 메모리에 적재된 프로그램을 CPU가 실행할 수 있도록 운영체제 O/S로 하여금 프로세스 또는 스레드에 CPU를 할당하는것을 스케줄링 이라 한다.
 
- 스케줄러는 제한된자원을 효율적으로 사용하도록 어떤 프로세스 또는 스레드에게 어떤 순서 또는 어떤 기준으로 CPU를 할당할지 결정한다.
- 프로세스와 스레드의 스케줄링은 할당 대상만 다를뿐 방식은 동일 
- 프로세스를 스케줄링하기 위한 세가지 Queue
- Job Queue : 시스템 안의 모든 프로세스의 집합
- Ready Queue : ready 상태인 메인 메모리 안에 상주하는 모든 프로세스의 집합
- Device Queue : I/O 장치 사용을 대기하는 프로세스들의 집합 
스케줄러의 종류
- 장기 스케줄러(long term scheduler)/ Job scheduler
- 디스크와 메모리 사이의 스케줄링 담당
- 어떤 프로세스에 메모리를 할당하여 ready queue에 보낼지 결정하는 역할 
- 단기 스케줄러(short term scheduler)/ CPU scheduler
- 메모리와 CPU 사이의 스케줄링 담당
- 어떤 프로세스를 running상태로 전환 시킬지 결정 
- 중기 스케줄러(Mid-term scheduler)/ 스와퍼(Swapper)
- 여유공간을 마련하기 위해 프로세스를 통째로 메모리에서 디스크로 쫓아내는 역할(swap in/swap out)  
선점 스케줄링(preemptive)
- 실행중인 스로세스가 강제적으로 실행권을 빼앗기는것
 
- SRTF(Shortest Remaining Time First)
- 선점형 스케줄링방식
- 남은 burst time(CPU점유시간)이 더 짧은 프로세스에 CPU를 할당
- starvation 기아 현상 발생 가능
- 기아현상 : 계속해서 우선순위가 높은 프로세스가 먼저 실행되어 먼저 도착했어도 우선순위가 낮은 프로세스가 계속해서 CPU를 할당받지 못하는 현상 
- 라운드 로빈(RR, Round Robin)
- 선점형 스케줄링 방식, 현대적인 CPU 스케줄링
- 프로세스에 동일한 할당 시간(Time Quantum)만큼 순서대로 계속 CPU를 할당
- 응답시간이 빠르며 모든 프로세스가 공정하게 CPU를 할당 받을 수 있음을 보장
- 단!, CPU 할당시간이 길 경우 FCFS랑 같아지며 반대로 짧은 경우 잦은 Context Switching으로 오버헤드 발생, 적당한 CPU 할당시간을 설정하는것이 중요 
- 우선순위 스케줄링(Priority Scheduling)
- 선점과 비선점 두가지 방식에 모두 적용 
- 우선순위가 높은 프로세스에 CPU를 먼저 할당
 
- 기아 현상고 무기한 봉쇄가 발생할 수 있으며 에이징 기법을 통해 해결
- 무기한 봉쇄(Indefinite blocking) 실행준비는 되어있으나 cpu를 사용 못하는 프로세스를 cpu가 무기한 대기하는 상태
- 에이징 기법(Aging) 먼저 도착한 프로세스가 나이를 계속 먹으며 우선순위가 올라가는 기법 
비선점 스케줄링(non-preemptive)
- 실행중인 프로세스가 자신의 실행권을 자발적으로 내려놓는것
 
- SJF(Shortest Job First)
- 비선점형 스케줄링 방식
- burst time(CPU점유시간)이 짧은 프로세스가 먼저 cpu를 할당
- 기아현상 발생 가능 
- FCFS(First Come First Served)선입선출
- 비선점형 스케줄링 방식
- 먼저 도착한 프로세스가 cpu를 먼저 할당
- 큐를 이용해 쉽게 구현가능
- 콘보이 현상 발생 가능
- burst time이 긴 프로세스가 먼저 도착해 다른 프로세스의 실행시간이 전부 늦춰져 효율을 떨어뜨리는 현상 
프로그램이란 무엇일까?
- 프로그램이란 파일이 저장 장치에 저장 되어 있지만 메모리에는 올라가 있지 않은 정적인 상태
 
- 메모리에 올라가 있지 않다는건 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해 주지 않았다는 뜻
 
- 정적인 상태는 단어 그대로 움직이지 않는 실행되지 않고 있는 상태
 
프로세스란? Process is a Programing execution
- 운영체제로 부터 자원을 할당받은 작업의 단위
 
- 프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고 이 상태를 동적인 상태라 하며 이 상태의 프로그램을 프로세스라고 한다..
 
- 실행되고 있는 컴퓨터 프로그램, 스케줄링 단계에서의 작업과 같은 단어라고 봐도 무방하다.
 
프로세스와 스레드의 차이
- 프로세스는 각각 별도의 주소 공간(code, data, heap, stack)을 할당 받는다.
 
- 프로세스는 자신만의 고유 공간과 자원을 할당받아 사용한다.
 
- 스레드는 다른 스레드와 속한 프로세스 영역의 heap, data, code영역을 공유한다.
 
- 과거에는 프로그램의 시작과 끝을 프로세스 하나만을 사용해서 진행했지만 복잡해지는 프로그램을 처리하는데 한계가 생김
 
- 운영체제는 안정성을 위해 프로세스마다 자신에게 할당된 메모리 내의 정보만 접근할 수 있도록 제약을 두고있어서 프로세스보다 더 작은 실행단위 개념이 필요하게 되었고 이것이 스레드다.
 
- 스레드끼리 메모리를 공유하며 프로세스 실행의 일부가 되는것.
 
- 스레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로
 
프로세스와 스레드의 작동방식
- 운영체제는 프로세스마다 각각 독립된 메모리 영역을 code,data,stack,heap의 형식으로 할당
 
- 스레드는 code, data, heap영역을 다른 스레드와 공유 stack영역은 각각 할당
 
- 스레드는 메모리 영역의 내용을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생하면 프로세스 내의 다른 스레드가 모두 강제 종료됨
 
- 이런방식으로 메모리를 공유하는 이유?
- 스레드는 cpu입장에서 최소 작업 단위가 된다.
- O/S 관점에서는 프로세스가 최소 작업단위가 되기 때문에 관여하지 않는 프로세스 내 스레드끼리는 메모리 공유를 하지 않을수 없음 
멀티태스킹과 멀티스레드
멀티태스킹이란
- 하나의 운영체제에서 여러 프로세스가 실행되는것
 
- 여러 프로세스가 동시에 실행되는 것 처럼 보이지만, 멀티 태스킹은 task를 os의 스케줄링에 의해 번갈아가며 수행하는 것을 의미
 
- 여러개의 task를 자주 번갈아가며 수행하니 동시에 수행되고 있다고 느끼게됨
 
멀티 프로그래밍
- 하나의 프로세서가 하나의 프로세스를 수행하는 동안 다른 프로세스에 접근할 수 있도록 하는 방법
 
- 하나의 프로세스를 처리하는 과정에서 프로세서의 처리 속도와 입출력 속도 간의 차이로 인해 입출력 처리가 완료될 때까지 기다리는 시간을 버리지 말고 다른 프로세스를 처리할 수 있도록 해주는것
 
멀티 프로세싱
- 보통 하나의 프로세서(CPU)가 하나의 작업을 맡지만 fork를 통해 프로세스를 다수로 늘려 여러개의 프로그램들을 병렬로 처리하는것
 
- 장점은 하나의 프로세서가 고장이 나더라도 해당 프로세서가 진행중인 작업은 다른 프로세서에서 수행하고 있기 때문에 작업이 정지되지않는것
 
멀티스레드란
- 하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는것 
 
- 프로세스를 생성하는 비용보다 스레드를 생성하는 비용이 더 저렴하기 때문에 다수의 스레드를 생성하여 병렬처리
 
- 프로세스는 메모리영역을 공유하지 않지만 스레드느 스택영역을 제외한 메모리 영역을 공유하기 때문에 메모리 부분에서 훨씬 효율적
 
멀티 프로그래밍 vs 멀티 태스킹
- 멀티 프로그래밍은 프로세서의 자원 낭비를 막기 위함
 
- 멀티 태스킹은 정해진 시간동안 각각의 task를 번갈아가며 수행하는 것
 
멀티 프로세싱 vs 멀티 스레딩
- 멀티 프로세싱은 여러개의 프로그램들을 병렬로 처리
 
- 멀티 스레딩은 하나의 프로그램 안에서 병렬처리
 
- 멀티스레딩이 훨씬 적은 자원을 소모
 
- 멀티 프로세싱이 더 안정적
 
멀티 태스킹 vs 멀티 스레딩
- 멀티스레딩은 스레드들끼리의 자원공유가 가능하고, 프로그래밍을 통해 구현가능
 
- 멀티태스킹은 os에서 지원하는것으로 독립된 메모리를 가지며 서로간의 자원 공유가 이루어지지 않음
 
- 자원공유를 위해 별도의 IPC(inter process communication)을 구현해야하며 멀티스레딩에 비해 운여에제에 부담을 줄 수 있음
 
- 멀티 태스킹은 독립된 수행이 가능하다는 이점이 있으므로 각각 용도에 따라 적절하게 사용
 
다른 프로세스의 정보에 정말로 접근할 수 없는걸까?
- CPU 레지스터 교체 뿐 아니라 RAM과 CPU 사이의 캐시메모리까지 초기화 되기 떄문에 자원부담이 큼
 
- IPC를 사용한다
 
- LPC를 사용한다.
 
- 별도로 공유 메모리를 만들어 정보를 주고 받도록 설정해 준다.
 
참고)
스레드
https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)
https://goodgid.github.io/What-is-Thread/
https://vicente-blog.com/blog/68/
스케줄링
https://woo-dev.tistory.com/148
https://velog.io/@sangjin98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C
https://zzsza.github.io/development/2018/07/29/cpu-scheduling-and-process/
프로세스와 스레드/ 멀티태스킹과 멀티스레드
https://velog.io/@raejoonee/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://velog.io/@raejoonee/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://sorjfkrh5078.tistory.com/56
https://velog.io/@chy0428/OS-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rhkdals1206&logNo=221572073363
https://www.youtube.com/watch?v=eELCTRdSj7o