프로그램 : 실행파일. 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 명령문 집합체
ex) 라면 레시피, 한글과컴퓨터 실행파일
프로세스 : 프로그램이 실행되서 돌아가고 있는 상태, 컴퓨터가 어떤일을 하고 있는 상태.
ex) 라면, 한글과컴퓨터 창
프로그램(.exe)을 실행 시키게 되면
http://www.tcpschool.com/c/c_memory_structure
*PCB : 해당 프로세스에 대한 정보를 담고 있다. [프로세스의 상태정보 저장]
-> ContextSwitching 할 때 필요. 작업을 처리하다 상태 전이가 발생했을경우 작업한 내용을 정리하고 CPU를 반환해야한다. 이때 자신의 차례가 또 언제 올지 모르기때문에 현재 작업 상태를 저장 할 수 있어야 한다
CPU는 한번에 한가지 일만 수행 할 수 있다. 하지만 우리는 브라우저를 통해 웹서핑을 하면서 코딩을 하고
또는 카카오톡을 한다. 이는 CPU 가 마치 여러가지 일을 한번에 처리 하는 것처럼 보여진다.
바로 이 기술이 동시성이다.
CPU 는 웹서핑,코딩,카카오톡 이 3가지 일을 번갈아 가면서 수행한다. 이 번갈아 가는 주기가 굉장히 짧은 시간을 간격으로 바뀌기 때문에 사용자 입장에서는 마치 동시에 일어나는것처럼 보여진다.
더하여 일들이 번갈아 갈때마다 ContextSwitch[기존까지의 작업, 즉 레지스터 값(Context)를 저장한 뒤 다음 프로세스를 CPU가 수행할 수 있도록 프로세스의 상태나 값을 교체하는 작업.(새로 실행되는 프로세스가 아니라면 이전에 실행될 때 레지스터들이 지니고 있던 데이터들을 불러와서 이어서 실행) ] 가 일어난다.
위의 동시성이 논리적인 개념으로 접근 하였다면 병렬성은 물리적으로 여러 코어들이 작업을 동시에 처리 하는 것을 한다.
둘 이상의 코어가 하나 이상의 프로세스(쓰레드)들을 동시에 처리 하는것이다.
그렇기 때문에 싱글코어가 아닌 멀티코어 혹은 그 이상의 스펙을 가져야 병렬성을 갖을 수 있다.
싱글코어 CPU의 한계를 느끼고 이를 더 발전시키기 위해 병렬성이 탄생했다.
메모리 관점에서 프로세스를 보았을때 , 각 프로세스는 독립적인 메모리 (Code, Data, Heap, Stack) 를 가진다.
이는 안정성 측면에서 이점이 있지만 , 프로세스 간의 통신 예를 들어 프로세스 A의 연산결과를 프로세스 B에서 이용하기 위해서는 독립적인 메모리 간의 통신을 가능하게 할 무언가가 필요할 것이다.
이를 IPC (Inter Process Communication)이라고 한다.
요점은 프로세스는 IPC가 없으면 통신을 할 수 없다는 것이다. 더하여 프로세스가 여러개 실행 되기 위해서는 필연적으로 ContextSwitch가 이뤄져야 하는데 ContextSwtich 작업 또한 많은 리소스가 필요하다.
이 문제점을 해결 할 수 있는 녀석이 바로 쓰레드(Thread) 이다.
Thread 에서는 프로세스의 Code, Data, Heap 메모리를 공유한다.
https://www.youtube.com/watch?v=1grtWKqTn50
프로세스의 Code 메모리를 공유하기 때문에 내부의 쓰레드들이 프로세스의 함수들을 호출 할 수 있고 ,
Data, Heap 영역을 공유하기 때문에 메모리 공간을 할당하여 쓰레드 간의 통신을 할 수 있다. => IPC 필요 없다.
하지만 공유된 자원을 잘 관리해야하고,
각각은 긴밀하게 연결 되어있기 때문에 한 탭 (한 쓰레드)에 문제가 생기면 다른 쓰레드에도 영향을 끼칠 수 있다. ex) 인터넷익스플로러 -> 작동이 중지되었습니다
멀티 쓰레드 환경이라고 가정 했을때,
예를 들어 Facebook 좋아요 기능을 살펴보면 지원이가 게시물을 올려서 게시물이 업로드가 되었다.
이 게시물을 지선이와 성은이가 보고 동시에 좋아요를 눌렀다.
지선이와 성은이의 각각의 쓰레드가 공유된 자원 (좋아요의 수)에 동시에 접근을 하여 결과적으로 좋아요수가 2개가 올라가야하지만 1개밖에 올라가지 않았다. 이를 동시성 문제라고도 한다.
이러한 문제를 해결하기 위해서 Java 에서는 synchronized 키워드를 통해 자원에 한 쓰레드만 접근 할 수 있도록 한다.
이 동시성 문제 및 쓰레드의 전반적인 이해를 돕기 위해 라면만들기 프로그램을 만들어봤다.