Scientia Conditorium

[혼공단] 혼자 공부하는 컴퓨터 구조+운영체제 / 혼공단 9기 - 2주차 본문

서평/IT-책

[혼공단] 혼자 공부하는 컴퓨터 구조+운영체제 / 혼공단 9기 - 2주차

크썸 2023. 1. 15. 18:20

[기본 미션] p.125의 확인 문제 2번, p.155의 확인 문제 4번 풀고 인증하기

프로그램 카운터(PC, program Counter) : 메모리에서가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저정. 프로그램 카운터를 명렁어 포인터(IP, Instruction Pointer)라고 부르는 CPU도 있음(인텔의 x86 계열의 CPU)

 

명령어 레지스터(IR, Instruction Register) : 해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터.

제어장치는 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어 신호를 내보냄

 

범용 레지스터(General purpose register) : 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터.

메모리 버퍼 레지스터는 데이터 버스로 주고받을 값만 저장하고, 메모리 주소 레지스터는 주소 버스로 내보낼 주소값만 저장하지만, 범용 레지스터는 데이터와 주소를 모두 저장할 수 있음.

 

플래그 레지스터(Flag register) : 상태 레지스터라고 부르며 연산결과 또는 CPU 상태에대한 부가적인 정보를 저장하는 레지스터


책의 p.309에서 리눅스 운영체제에서 프로세스와 스레드의 차이점을 간략하게 설명해둔게 있다. 리눅스 운영체제에서는 프로세스와 스레드를 아주 명확하게 구분짓지는 않는다. 그러나 어쨌든 구분지어 사용하기는 한다. 스레드란 프로세스를 구성하는 실행의 흐름 단위이다. 예를 들어 어떤 프로그램을 동작하는 과정에서 새로운 스레드를 만들고 종료하는 코드가 있다고 가정하자. 이 스레드를 종료 시켰을 때, 프로세스 전체가 종료되어 버리면 안된다는 것이다. 

대표적인 스레드 종료 함수는 pthread_exit() 가 있다. 유닉스 계열 운영체제 명령어 문서에서 해당 함수를 살펴보면 결국

pthread_join()이라는 함수를 호출한다고 한다. 즉 스레드를 안전하게 종료하고 호출 스레드에 조인할 수 있도록 스레드에 대한 종료 상태를 저장한다.


[선택 미션] Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기

 

코어 : 명령어를 실행할 수 있는 '하드웨어' 부품

스레드 : 운영체제가 CPU 시간을 할당하는 기본 단위, 프로세스가 밧줄이라면 스레드는 밧줄을 이루는 실

멀티 코어 : 명령어를 실행할 수 있는 하드웨어 부품이 CPU 안에 두 개 이상 있는 CPU

멀티 스레드 : 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것

 

멀티 스레드의 장점은 프로세스에 할당된 메모리와 자원을 그대로 사용하므로 응답성을 높일 수 있으며, 자원 공유가 쉽고 경제적이라는 것이다. 반대로 단점은 구현하기 매우 복잡하며 소프트웨어 안정성을 악화시킬 수 있고, 잘못 사용하면 성능이 저하될 수 있다.

여기서 주목해야할 점은 잘못 사용했을 때 성능이 저하될 수 있다는 부분이다. 간단하게 CPU가 더 많은 코어(멀티코어)를 가지고 있고, 멀티 스레드를 지원하니 구현하기 어렵더라도 성능은 더 빨라지는게 아니냐고 오판할 수 있다. 게임을 대표적인 예시로 들어보자. 게임 프로그래밍에서 병렬처리할 요소가 얼마나 있다고 생각하는가.

멀티 스레드 프로그래밍을 하게되면 스레드 간 동기화 문제와 스레드 컨텍스트 스위칭의 비용 문제도 있다.

어떤 작업을 여러 개의 스레드에 분배하여 동시에 작업한다고 했을 때, 어떻게 분배할 것이며 최종적으로 또 합쳐야 한다. 이 때 서로 중복되지 않고 영향을 끼치지 않게 작업하도록 해야한다.

좀 더 간단한 예시로 설명하자면,요리가 있다.

라면 하나를 끓일려고 하는데, 요리사가 1명에서 4명으로 늘어났다고 해서 더 빨리 끓일 수 있는가?!

1명일 때랑 4명일 때랑 차이가 없다는 것이다. 오히려 더 늘어날 수도 있다. 

 

단순히 이론만 놓고 보자면 멀티코어와 멀티스레드를 도입했을 때 성능 향상이 일어나야 하지만, 실제로는 그렇지 않을 수 있다. 물론 멀티코어 시스템을 적용해보려고 하지도 않는 개발사도 있을 것이다.

어쨌든 결론은 멀티 스레드가 만병통치약은 아니라는 점은 알아두었으면 한다.

(괜히 대학원에 병렬처리 연구실이 있는게 아니다...)