cs면접이나 cs공부를 위해 방법을 찾던중 스터디에 가입하게 되었어요 !
강남역 근처 스터디룸에서 약 2시간가까이 진행했으며 스터디 진행방식이나 , 진도등의 협의가 끝난 후
공부해온것에 대한 발표로 마무리하기로 했습니다 !
취업준비기간을 한달로 잡은만큼 진도를 맞추기로 하였고 , 그날 그날 공부한 내역을
남겨보려고합니다 ! 오늘은 프로세스와 스레드에 대해서 공부했고 싱글스레드와 멀티스레드의
장단점까지 배워서 공유해봅니다 !
프로그램이란?
프로그램이란, 파일이 저장 장치에 저장되어 있지만 메모리가 할당되지 않은 정적인 상태 를 말한다.
**정적인 상태 : 아직 실행되지 않은 상태*
프로세스란?
프로세스는 프로그램 실행 시 , 메모리를 할당받아 작업이 실행된 동적인 상태를 말한다.
*동적인 *상태 : 프로그램이 실행된 상태*
스레드란?
스레드는 프로세스가 할당받은 메모리를 이용하는 실행 흐름의 단위이다
프로그램은 아직 실행되지 않은 파일 → 코드 덩어리
프로그램 실행 시 ,
해당 파일은 컴퓨터 메모리에 올라가게 되고, 동적인 상태가 되며 , 해당 상태를 프로세스 라고 한다.
프로세스에 정의는 실행되고 있는 컴퓨터 프로그램
스케줄링 단계 작업과 같은 의미
스레드의 등장
과거에는 프로그램을 실행 시 시작과 끝까지 프로세스 하나만을 사용해서 진행했다고 한다 → 프로그램이 복잡해짐에 따라 프로세스 하나만을 사용하는 것이 부담이 되었지만 운영체제는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고있기에 그래서 더 작은 실행 단위 개념이 필요하게 되었고, 이때 등장하게 된것이 바로 스레드다
스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것이다.
프로그램이 코드 덩어리라면 , 스레드도 코드에 비유했을 때 스레드는 코드 내에 선언된 함수들이며, function Add(){} 또한 일종의 스레드라 볼 수 있다.
운영체제는 프로세스가 메모리에 올라갈 때, 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해 준다.
각각의 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
이와 다르게 스레드는 같은 프로세스 내의 메모리를 서로 공유할 수 있다.
프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역을 따로 할당받고, 나머지 Code/Data/Head 형식으로 할당된 메모리 영역을 공유한다.
따라서 각각의 스레드는 별도의 스택을 가지고있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.
프로세스와 스레드의 차이
프로세스는 메모리에 올라갈 때 운영체제로부터 독자적인 시스템 자원을 할당 받아 공유가 힘든 반면, 스레드는 프로세스 내부에서 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.
하나의 프로세스에서 하나의 스레드 실행
하나의 레지스터와 스택으로 표현.
자원 접근에 대한 동기화를 신경쓰지 않아도 된다.
여러개의 스레드가 공유된 자원을 사용할 경우, 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근이 통제되어야 하며, 이 작업은 프로그래머에게 많은노력을 요구하고 많은 비용을 발생시킨다. 단일 스레드 모델에서는 이러한 작업이 필요하지 않다.
작업전환 작업을 요구하지 않는다.
작업전환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.
따라서 단순히 CPU만을 사용하는 계산작업이라면, 멀티스레드보다 싱글스레드로 프로그래밍하는 것이 더 효율적이다. 그 이유는 스레드 간의 작업전환(context switching)에 시간이 걸리기 때문이다.
여러 개의 CPU를 활용하지 못한다.
프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나, 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다.
두 개의 작업을 하나의 스레드로 처리하는 경우와, 두 개의 스레드로 처리하는 경우를 가정했을 때, 후자의 경우는 짧은 시간 동안 2개의 스레드가 번갈아가면서 작업을 수행한다. 그래서 동시에 두 작업이 처리되는 것과 같이 느끼게 된다.
프로그램을 다수의 실행 단위로 나누어 실행.
프로세스 내에서 자원을 공유하여 자원 생성과 관리의 중복을 최소화
서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공
각각의 스레드가 고유의 레지스터와 스택으로 표현됨.
새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르다.
프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다.
프로세스의 작업전환보다 스레드의 작업전환이 더 빠르다.
하나의 스레드만 실행중일 때는 실행시간이 오히려 지연될 수 있다.
멀티 스레딩을 위해 운영체제의 지원이 필요하다.
스레드 스케쥴링을 신경써야 한다
이상입니다 !
정말 좋은 정보 감사합니다!