동시성과 병렬성
동시성(Concurrency)이란
- 여러 가지 일이 동시에 진행되는 것!
- 예를 들어, 라면 먹는 일과 TV보는 일이 있다고 하자.
- 두 가지 일은 개별 사건의 독립적 사건이다.
- 두 가지 일은 동시에 일어날 수 있는가? → 동시성이 있다.
- 두 가지 일이 동시에 일어날 수 없다면 동시성이 없는 것이다.
- 상호 간섭이 없고 동시에 연산하고 실행한다고 문제될 것이 없으면 동시성이 없다.
- “컨커런시가 문제가 없다”, “컨커런트하다”고 표현한다.
병렬성(Parallelism)이란
- 같은 일을 여러 주체가 함께 동시에 진행하는 것!
- 병렬성도 동시성 범주 안에 들어가는 걸로 생각해볼 수 있다.
질문과 답변
💡 동시성과 병렬성의 차이
강의에선 위와 같이 설명했지만, 찾아보니까 동시성은 싱글 코어에서 여러 작업(멀티 쓰레드)를 동작시키는 방식이고 병렬성은 멀티 코어에서 멀티 쓰레드를 동작시키는 방식이라고 한다.
병렬성은 “실제로 동시에” 실행되는 것이고, 동시성은 시간적으로 겹쳐 발생(스케줄링 등)이다.
즉, 위의 설명은 조금 다른 게 아닐까?
출처: https://seamless.tistory.com/42
💡 동시성과 병렬성의 추가 설명
출처: https://www.inflearn.com/questions/897157
출처: https://www.inflearn.com/questions/1023922/동시성과-병렬성의-예시
원자성, 동기화 그리고 교착상태
원자성
- 예를 들어서
- 강력한 자연의 부름을 온 몸으로 느낀다! (시작)
- 화장실로 이동
- 화장실에 들어가기 전에 노크
- 화장실이라는 자원을 누군가 쓰고 있는지(선점했는지) 조사한다.
- 화장실에 진입
- 쓰고 있지 않다면 진입 후 Lock을 걸어 선점한다.
- 볼일
- 손을 씻는다
- 편안한 얼굴로 화장실을 나온다. (끝)
- 이때, Lock을 건 4번부터 6번까지는 원자성이 보장된다.
- 동시라는 것은 여러 일이 동시에 일어날 때고, 그런 게 아니라면 원자성은 늘 보장받는다.
동기화(synchronization)
이런 것들이 외부의 어떤 자원과 결합했을 때 항상 동기화 현상이 일어난다.
- (운영체제나 컴퓨터 구조같은 데에서 동기화는) 신호등과 잠금 장치의 필요성과 유사하다.
- 교차로에서 차가 멈춰야 할 지 가야 할지 신호를 가지고 통제한다. → 동기화한다.
- 동기화를 할 때, 동기화에 필요한 잠금장치에 해당되는 것들은 보통 OS가 제공해준다.
교착상태(Deadlock)
동기화 이야기가 나오면 항상 논리적인 오류에 대해 고민하게 된다.
- 휴지가 없어서 못 나가는 자, 나와야 들어가는 휴지 든 자
- 예를 들어, 철수가 화장실에 Lock을 걸고 들어갔는데 휴지가 없다.
- 그럼 철수는 wait를 하게 된다. (휴지가 공급될 때까지 못나간다)
- 밖에서 기다리는 영수는 휴지를 갖고 Unlock되기를 기다리고 있다.
- 이러한 상태를 교착상태(Deadlock)이라고 한다.
- 전형적인 잘못된 오류현상이다.
정리
여러 연산 주체가 동시에 접근해서 문제가 나는 걸 막기 위해 락도 걸고 동기화도 해서 원자성을 보장받는다.
그런데 잘못된, 특히 외부 자원에 대한 어떤 무언가를 요구하는 것에서 그 무언가를 중심으로 해서 양단 간의 의존성이 존재하는 애들이 동시에 일을 하다 교착상태에 빠질 수도 있다.
이것은 전형적인 논리 오류이다.
컴퓨터의 구성요소와 아바타
컴퓨터와 구성요소
- Computer는 H/W와 S/W로 구성된다.
- S/W는 (User mode) Application과 System S/W로 구분된다.
- 가장 대표적인 System S/W는 OS(Operation System)이다.
프로그램, 프로세스, 스레드
- 프로그램(Program)은 설치하는 것이다.
- 설치된 프로그램을 실행하면 프로세스(Process)가 생성된다.
- 운영체제가 프로그램을 프로세스로 만들어준다.
- 운영체제는 프로세스 단위로 메모리를 이만큼 써 라고 준다.
- 프로세스는 PID를 얻는다.
- 프로세스는 작업관리자에서 실행 중인 프로세스 목록을 확인할 수 있다.
- 즉, 프로세스는 실관리적인 단위, 환경적 의미에서의 단위이다.
- 스레드(Thread)는 프로세스 속에 존재하는 실행단위이다.
- 실행의 단위다. → 실행의 다른 이름은 ‘연산’이다.
- CPU를 사용하는 놈은 쓰레드다.
- 프로세스는 기본적으로 하나의 쓰레드이다.
- 쓰레드 단위로 무언가 실행된다.
- 스레드는 프로세스에게 할당된 자원을 공유한다.
용도에 따른 기억공간의 구분
- 메모리는 용도에 따라 구분된다.
- 메모리는 공간에 따라 여러 형태로 나뉜다.
- 가장 대표적으로 유명한 공간은 Stack과 Heap이다.
- Stack은 Thread가 사용한다.
- Heap은 Process 전체가 사용한다.
- 주거공간으로 비유하자면, 스택은 개인공간(침실)이고 힙은 공용공간(거실)이다.
왜 공간을 구분했을까?
- 동시성 문제와 같은 여러 문제를 해결하기 위해 구분한 것이다.
- 공간은 특수한 목적을 가지고 구분한 것이고, 어떤 말도 안되는 현상이 나지 않도록 만든 것이다.
- 예를 들어, 거실에서 볼일을 보거나 화상실에서 밥을 먹는 현상
정리
- 컴퓨터라는 세상에서 당신의 유전자는 프로그램이고 프로세스라는 모습으로 존재한다.
- 가장 대표적으로 ‘나’로 지칭되는 프로그램은 Shell이다. → 윈도우로 치면 탐색기
- 예를 들어, 게임(세상)이라는 세상 속에 로그인해서 들어가면 캐릭터를 이용해 사냥하고 뛰어다닌다.
- 윈도우라는 컴퓨터에 로그인한다면, 그 속에는 아바타가 프로세스 형태로 존재하고 있다.
국가와 국민으로 이해하는 컴퓨터 세상
비유적인 것으로 먼저 이해하자.
국가와 국민으로 이해하기
국민이 다른 국민의 공간에 침입
- 즉, 주거침입이다.
- 한 프로세스가 다른 프로세스의 메모리 공간에 침투하려고 하면 운영체제가 Access Violation 오류를 일으킨다.
- “프로그램이 죽었다”고 표현하지만, 실제로는 연산을 못하도록 강제로 멈춘 것이다.
- 프로세스가 여러 개 존재하는 것을 멀티 태스킹 환경이라고 한다.
- 각자의 프로세스가 동시성이 있다.
- 운영체제로부터 공간, 행위, 연산에 대해 독립성과 원자성을 보장받는다.
국가 기관이 남의 공간에 침입
- 검찰이나 경찰은 남의 공간에 침입할 수 있다.
- 이렇게 특별한 권한을 가진 프로그램은 ‘디버거’이다.
- OS가 디버거가 남의 메모리를 볼 수 있도록 허용해준다.
커널(Kernel)
- 운영체제의 핵심을 이루고 있는 알맹이를 커널이라고 부른다.
- 커널의 여러 역할 중 ‘접근 통제’가 가장 대표적이다.
User mode와 Kernel mode 그리고 가상화까지!
계층은 ‘모드’라고도 한다.
OS의 핵심 Kernel
- 컴퓨터라는 국가의 법은 Kernel로 구현된다.
- Kernel 영역과 사용자(User) 영역은 완전히 다른 세상이다.
- 소프트웨어가 작동할 때는 User mode Application 계층에서 작동하는 게 일반적이다.
- Kernel mode에서 작동한다고 하면 OS의 일부라고 보면 된다.
- Kernel mode에서 작동하는 애들 중 OS가 아닌 경우는, 키보드 보안 등의 보안 쪽 소프트웨어가 포함되어 있다.
Kerner의 역할
- I/O
- 자원 관리
- 여기서 자원은 전산 자원(CPU와 메모리)이다.
- CPU와 메모리를 어떤 프로세스가, 혹은 어떤 스레드가 얼마나 쓸 것인지를 통제한다.
- 접근 통제
User mode와 Kernel mode
- 하드웨어를 이루고 있는 가장 핵심적인 장치는 CPU이다.
- CPU는 다른 말로 machine이라고 이야기한다.
- 하드웨어 계층을 설명할 때 가장 중요한 어휘는 Physical이다.
- 소프트웨어 계층을 설명할 때는 Logical이다.
- IT쪽에서는 Virtual이라는 단어를 Logical과 유사하게 사용한다.
- 운영체제는 하드웨어에 대해 의존성이 존재한다.
- 운영체제와 하드웨어 수준에서 플랫폼(Platform)이라는 말을 쓴다.
- 플랫폼은 다른 것들이 작동할 수 있게 인프라가 되어주는 것이다.
- 64bit platform이라고 이야기하면 OS도 64bit, CPU도 64bit라는 것을 말한다.
- 하드웨어에 어떤 디바이스(Device)가 있을 때, (어떤 운영체제 건) 해당 장치를 움직이기 위한 전용 소프트웨어가 있다.
- 전용 소프트웨어는 커널에서 작동하는 소프트웨어이다.
- 커널 모드 소프트웨어를 디바이스 드라이버(Driver)라고 부른다.
- 장치가 무엇을 하는 장치냐에 따라 운영체제의 어떤 구성 요소(커널의 어떤 요소, 그림의 요소)같은게 있다.
- 컴퓨터라는 월드에서 나라는 존재는 프로세스 형태로 존재한다.
- 프로세스를 다른 말로 Task라고도 한다.
- 컴퓨터 안에서 프로세스는 여러 개가 동시에 실행된다. 이러한 환경을 다른 말로 멀티 태스킹 환경이라고 한다.
디바이스 파일
- User mode를 인간계, Kernel mode를 신계로 비유할 때
- 인간계에서 신계의 어떤 신에게 메시지를 전달하고 싶다면 신이 정해주는 방법대로 무언가를 해야한다. ex) 기도
- 신에게 메시지를 보내려면 반드시 매개체를 이용해야 한다. ex) 예수
- 이러한 매개체는 Interface 역할을 하며 File의 형태로 존재한다.
- 즉, 커널 모드 영역에 진입하기 위해서 유저 모드 어플리케이션 프로세스가 커널에서 제공하는 어떤 인터페이스를 타고 그 영역에 접근해야 한다.
- 이 인터페이스는 파일의 모습을 하고 있다.
- 이러한 파일은 디바이스 파일(Device File)이라고 부른다.
- 커널의 구성 요소에 대한 추상화된 인터페이스를 유저 모드에 제공해줄 때 파일의 형태를 띄고 있다.
- 파일을 대상체라고 한다면 프로세스는 어떤 행위(입출력)의 주체가 되며, 파일에 대해 접근 권한을 획득해야 한다.
- 접근 권한은 운영체제가 부여한다.
- 즉, OS가 허락해주는 파일에 대해서만 무언가를 할 수 있다. → 접근 통제
Hello world를 출력할 때
- 출력은 모니터 화면에 출력한다. → 모니터 화면을 제어해야 한다.
- 모니터를 제어하는 본체와 연결된 장치(Device)가 있을 것이다.
- 보통은 장치 중 비디오(Video) 카드
- 비디오 카드에서 선이 나가서 HTMI 케이블같은 것과 연결될 것이다.
- 그러면 커널의 구성 요소는 Graphic Engine이 된다.
- 핵심적인 역할을 하는 소프트웨어
- 소프트웨어에 엔진이라는 말을 붙이면 코어 역할을 하는 중요한 프로그램이라는 비유적인 표현이다.
- “Hello world”라는 글자를 Device File을 통해 Write(I/O)하도록 내려보낸다.
파일 시스템
- 하드웨어가 HDD이고, HDD를 움직일 수 있는 디바이스 드라이버가 커널 모드 소프트웨어로 존재한다.
- 이때, 그 위의 커널의 구성 요소는 ‘파일 시스템’이 된다.
- 파일 시스템을 추상화한 인터페이스가 있고, 인터페이스(디바이스 파일)에 접근해서 이 보조기억장치의 정보들을 볼 수 있는 프로세스가 있을 것이다.
실시간 감시 엔진
- 운영체제에서 드라이버와 요소 사이의 공간을 하나 만들어서 둔다.
- 예를 들어, 이 공간이 필터라고 하고 필터는 I/O를 모니터링한다고 하자.
- 그러면 프로세스에서 내려오는 Request를 필터가 감시한다. → 바이러스인지 아닌지 검사 후, 바이러스라면 차단하고 아니라면 넘어간다.
- 이러한 필터를 실시간 감시 엔진이라고 한다.
가상화
- 하드웨어를 소프트웨어로 구현, 즉 소프트웨어화하는 것을 가상화라고 한다.
- 기본적인 원리는 하드웨어를 소프트웨어로 구현해내는 기술이 가상화 기술이다.
가상 메모리 소개
가상 메모리 시스템
Page와 Paging, Non-paging
- 페이징 파일은 운영체제에서 RAM처럼 사용하는 하드 디스크의 영역이다.
- 예를 들어 8GB의 RAM이 있고 프로그램 10개를 실행할 수 있다고 하자.
- 이때, 15개를 실행해야 한다면 HDD 영역의 일부를 끌고 와서 RAM인 것처럼 연결시켜준다.
- 속도는 느려지겠지만 15개가 실행된다.
- Page라고 하는 조각난 단위를 하드디스크와 램 사이를 번갈아 왔다갔다하며 공간 이동을 한다.
page-in/out
-
하나의 프로세스가 실행될 때, 그 프로세스에게 부여하는 메모리 공간이 VMS(Virtual Memory Space)이다.
-
크롬이라는 32bit Application이 있다고 가정하자.
-
OS가 크롬에게 4GB의 메모리를 부여한다.
-
공간을 쓸 때 4KB 가량의 Page라는 조각 단위가 있다.
- 따라가보면 실제로 RAM 영역 공간일 수도 있고 HDD 영역일 수도 있다.
-
MS Word 프로그램을 동시에 실행한다면
- 워드가 RAM을 달라고 요청하는데 공간이 없다면, OS는 공간을 확보하기 위해 RAM을 사용하던 애들을 HDD로 이사시킨다.
-
이렇게 RAM에서 HDD로 Page가 쫓겨나는것을 Page-out 또는 Swap-out이라고 한다.
-
반대로 들어오면 Page-In 또는 Swap-In이라고 한다.
가상 메모리 시스템의 단점
- 프로그램 A와 B가 실행되고 있을 때, 각 프로그램에 부여된 공간을 페이지 단위로 잘라서 실제로 사용되는 영역(페이지 단위로 사용되는 것)만 어떤 메모리인가에 매핑해준다.
- 만약 A가 메모리를 많이 사용하고 있는데 B를 사용하게 된다면, 운영체제는 RAM의 공간을 HDD로 page-out 시켜버린다.
- 컴퓨터가 RAM이 부족하면 다른 프로그램으로 스위칭할 때 하드디스크에 대한 읽기 쓰기가 빈번히 벌어진다.
- 프로그램을 스위칭할 때마다 RAM에서 HDD로 공간을 보내고, 다시 HDD에서 읽어오는 작업을 거친다.
- 운영체제는 page-in/out 시 프로그램을 잠깐 다 멈춘다.
- 정리하자면, 부족한 공간을 하나의 메모리로 논리적으로 추상화해주니까 돌아는 가지만 매우 느리다.
가상 메모리 시스템을 사용하는 이유
- 각 프로세스 공간을 완벽하게 분리하고 통제할 수 있다.
- 프로세스 오류가 운영체제에까지 영향을 주지 못하도록 차단할 수 있다.
- 다른 프로그램에 영향을 주는 것도 막을 수 있다.
- 메모리가 부족해도 여러 프로그램이 작동하는 등 효율적으로 활용할 수 있다.
추가적으로
- 더 깊은 내용은 운영체제를 공부해야 한다.
- C/C++로 프로그램을 만들면 그 안에서 메모리를 직접 관리하는데, 이 메모리는 기본적으로 다 가상 메모리이다.
- 커널 모드 소프트웨어를 개발하는게 아니라면 기본적으로는 모두 가상메모리이다.
Reference
넓고 얕게 외워서 컴공 전공자 되기 | 널널한 개발자 - 인프런