1.무엇을 하는 과제인가?

: 프로그램을 어떻게 하면 더 효율적으로 사용할 수 있는지에 대해서 공부하는 과제이다. thread와 process를 사용해서 프로그램을 좀 더 빠르고 효율적으로 만들 수 있는 방법에 대해서 고민하는 과제이다.

[Mandatory]
-.위의 그림과 같이 의자에 철학자들이 앉았다고 가정하고, 각 철학자들의 양쪽에는 포크가 있다. (포크의 숫자는 철학자의 수 만큼 있다.)
-.철학자는 일정시간 먹지 않으면 죽게된다는 룰이 있다. 먹으려면 포크가 2개가 필요하다. 모두가 죽지 않게 (혹은 죽어야 한다면 적절히 죽게) 프로그램을 짜는 것이 중요하다.

[Bonus]
이번에는 포크가 철학자 옆에 있지 않고 가운데에 있다. 이번에도 식사하려면 포크가 2개 더 필요하다.

과제를 진행하면서 운영체제에 대한 공부를 좀 해야 어느정도 이해하기가 편하다. 이 과제를 하면서 다 하지 못한 운영체제 공부는 추가적으로 해나가려고 한다.






2.과제를 하면서 참고 했던 곳들

: 과제를 하면서 운영체제 위주로 공부를 하였지만, process나 thread, mutex, sempaphore 등이 무엇인지, 어떻게 활용하는지에 대해서 공부할 수 있었다.

함수 관련되서는 공부하기 위해 여러 곳을 참고하였지만, 아래의 사이트에서 함수를 많이 봤다. 예제를 같이 올려주셔서 차근차근 해볼 수 있었다.
https://42kchoi.tistory.com/301

전반적으로 정리를 잘하신분은 아래링크의 분이셨다. 아직 모르는게 많아서인지 전부 다 이해를 못해서 좀 아쉬웠다.
https://bigpel66.oopy.io/library/42/inner-circle/9

운영체제 공부는 아래의 공개강의에서 보았다. 과제의 내용만 확인하고 싶으면 12강부터 14강까지 확인하면 된다. 14강쯤에 필로소퍼 문제도 나와서 과제를 수행하는데 꽤 도움이 되었다.
http://www.kocw.or.kr/home/cview.do?cid=3646706b4347ef09





3.과제를 하면서 공부했던 것들

1)thread vs process

[thread]
다른 과제를 하면서 쓰레드를 간단히 설명을 하기 위해서 요리사가 가지고 있는 화구의 갯수로 설명을 하였다. 요리사는 물리적인 CPU라고 생각을 한다면 thread는 그 요리사가 쓸 수 있는 불의 갯수이다. 하나가 있다면 한번에 요리를 하나만 할 수 있을거고, 여러개가 있으면 여러개를 할 수 있지만, 요리사의 능력에 따라서 그 또한 많은 변수가 생길 것이다.

[process]
process는 우리가 사용하는 프로그램 하나하나를 생각하면 된다. 그래서 나중에 나올 멀티프로세서를 생각을 한다면 프로그램 안에 여러 프로그램이 들어있는 것이라고 생각을 하면 된다.

[Multi process vs Multi thread]
-.이 과제에서 각각 bonus와 mandatory에 위치해 있는 multi process와 multi thread에 대해서 이해하는 것은 중요하다. 아마 bonus까지 하지 않으셨다고 하더라도, 언젠가 이 둘의 개념에 대해서는 알고 가야한다.

-.대부분의 os들이 multi process도 지원을 하지만 최근에는 multi thread로 이루어진 프로그램들이 다수를 이룬다.

-.아래의 표는 multi process와 multi thread가 메모리를 어떻게 사용하는지에 나타냈다.
: multi process는 말 그대로 process 하나하나가 프로그램을 이루기 때문에 개별적으로 메모리들을 다 가져가게 된다. 반면에 multi thread는 code, data, heap영역의 데이터를 공유를 하게 된다. 이로 인해 data race(해당 데이터를 thread가 서로 먼저 쓰려고 하는 상태)가 발생 될 수도 있다.

-.이러한 data운용의 방식차이로 인하여 Multi process는 Multi thread에 비하여 Context Switching 비용이 비싸다
또한 통신방법이 thread에 비해서 어렵다.(data 접근을 공유하는 것이 어렵기 때문), 하지만 문제가 발생되었을 경우 process는 하나의 process만 에러가 발생될 수 있지만, thread의 경우는 data가 공유되기 때문에 모두에 영향을 줄 수도 있다는 점이 다르다.
(
Context Switching : CPU에서 여러 프로세스를 돌아가면서 처리하는 것, 이때 프로세스의 상태 등을 보관한다.)



2)Mutex vs Semaphore

[mutex]
-.위에서 나온 것처럼 thread는 data를 접근할때 data race의 상황이 발생되게 된다. 그럼 어떻게 하면 각각의 thread들이 겹치지 않게 data를 접근할 수 있을까?

-.mutex의 개념은 열쇠를 주는 개념이다. data를 접근할 때 열쇠를 주면 그 thread만 해당 data에 접근할 수가 있고(Lock), data 접근이 끝나면 열쇠를 반납하게 된다.(Unlock) 이러한 방식으로 data의 접근을 제한하게 되어 data의 오류를 방지하게 된다.

[Semaphore]
-.semaphore는 multi process에서 공통된 자원을 사용할 때 쓰는 방식이다. 위의 철학자 문제에서 포크가 양 옆이 아닌 가운데에 있다고 생각을 해보자. 철학자는 이제 특정된 위치의 것만 가져올 수 있는 것이 아니라 중앙에 있는 포크중에 집을수 있는 포크가 있다면 언제든지 집어오면 된다. 이런 식으로 특정 위치에 대한 mutex를 일일이 lock/unlock을 하는 것이 아니라, 자원을 여러개 만들어 놓고, 필요하면 쓰고, 다 쓰면 자원을 반납하는 개념으로 만들어진 것이 semaphore다.
-.mutex를 쓰다가 semaphore를 쓰면 훨씬 더 간편하게 프로그램을 설계할 수 있다.






4. 회고

1) 추가적인 운영체제의 공부가 필요하다.
: 이번 과제를 위해서 특정 영역만 공부를 하였지만, 이외에도 운영체제에 대해서 알아야 할 것들이 많다는 것을 알게 되었다. 추가적으로 시간을 내어 공부를 하도록 해야겠다.

2) multi thread나 multi process 둘다 만들고 나면 디버깅이 상당히 힘들다. 앞으로도 이런 일이 자주 있을 것 같은데 이때 어떻게 하면 편하게 할 수 있는지에 대한 고민을 해보는 것도 좋을 것 같다.

3) 과제가 처음에는 되게 막막했는데, 과제가 끝나고 나니 이 개념을 꼭 알고 가야겠다는 생각이 확 들었다. 이제까지 내가 만들어 왔던 프로그램들은 전부 single thread 기반이었기 때문에 향후에 빠른 프로그램 구동을 위해서면 multi thread를 많이 고려해야 된다 생각한다. 또한 그로 인한 error를 방지 하기 위해서 설계를 할때부터 잘 고려를 해야겠다는 생각이 많이 들었다.

profile
세상을 이롭게 하는 프로그램 만들기

0개의 댓글