운영체제(8)
-
운영체제, lock에 관해 알아보자 4편 - 데드락
[ 비 데드락 버그 ] 비 데드락 버그에 관해서 다루는 파트가 있다. 그 부분은 Lock과 Condition Valiable을 제대로 사용하지 않아서 일어나는 버그들이다. 예시로는 첫 번째 예시로는 Lock을 제대로 쓰지 않아서 Null예외가 뜨는 경우가 있다. 코드로 나타내면 이런 상황이다. 멀티쓰레드 환경에서 쓰레드 내의 proc_info라는 변수가 있다. 이 때, Thread1이 null이 아님을 확인하고 값을 가져오려고 하는데 조건문을 통과하자마자 컨텍스트 스위치가 된다. 그런데 Thread2가 proc_info을 null로 바꿔버렸다. 다시 컨텍스트 스위칭이 되어 조건문에서 방어용으로 만들어놓은 저 null이 있었지만 fputs(thd->proc_info, ...)으로 thd->proc_info..
2024.03.31 -
운영체제, lock에 관해 알아보자 3편 - 세마포어
[ 세마포어 ] 앞에서 mutex와 condition variable을 이용해서 동시성과 순서 제어를 한 코드를 살펴보았다. 그런데, 분리된 Lock과 Condition Variable를 한번에 구현하는 방법이 없을까? 이 생각을 가지고서 만들어진게 세마포어이다. 세마포어는 Lock일 수도 Condition Variable일 수도 있다. 어떻게 그게 가능한걸까? 세마포어는 딱 세 가지 함수만 알면 된다. sem_init() 세마포어의 상태를 초기화하는 것으로 세마포어의 주소, 프로세스 공유 플래그, 초기값까지 총 3개의 파라미터를 받는다. 다른 건 모르겠지만 초기값은 세마포어 내에서 계속 변하는 값이다. 아래는 예시이다. #include sem_t s; sem_init(&s, 0, 1); sem_wait..
2024.03.30 -
운영체제, lock에 관해 알아보자 2편 - lock의 구현 방식과 Condition Variables
[ Lock의 구현 방식 ] 앞의 글에서는 쓰레드를 사용하는 이유, 멀티 쓰레드 환경에서 공유 자원이 있을 때 생기는 문제점, 공유자원 문제를 해결하기 위해서 Lock을 사용한다는 얘기를 했었다. 여기서 생각해봐야 할 점은 Lock을 도입해서 원자성을 얻었는데 Lock의 구현에 따라 잃는게 있지 않을까에 대한 고민을 해보아야 한다. Lock을 도입하면 공유자원에 관한 보호를 얻지만 Lock 구현 자체로 인해서 CPU 자원 손해를 봐야한다. 이에 관해 알아보자. Spin Lock 구현 방식 정말 단순하게 구현 방법을 생각해보자. 특정한 변수하나를 추가로 두고 그 이름을 flag라고 해보자. 그러면 flag 값이 1이면 lock이고 flag 값이 0이면 unlock이다. 그리고 임계 영역에 접근할 때 만약 ..
2024.03.28 -
운영체제, lock에 관해 알아보자 1편 - lock이 필요한 이유
[ 프로세스의 경량화, 쓰레드 ] 여러 설명이 있지만 프로세스와 쓰레드의 차이는 정보 전송 비용이라고 생각한다. 학교에서 운영체제나 운영체제 실습을 수강해보았다면 c언어를 배우면서 멀티 프로세스 환경에서 서로 데이터를 주고 받는 과제를 해본 적이 있을 것이다. 프로세스끼리는 공유하는 자원이 없기 때문에 서로 데이터를 주고 받기 위해서는 서버와 클라이언트 역할을 하는 프로세스를 따로 두고 소켓을 열어서 데이터를 주고 받아야 한다. 이 과정은 굉장히 복잡하고 신경쓸게 많다. 아무튼 동시 처리를 위해서 여러 프로세스를 사용하고 싶은데 정보 교환에 있어 부가적인 부하가 생기니 공유 자원을 두고 그런 부하없이 언제든지 가지고 올 수 있게 하자는 생각으로 만들었다고 생각한다. 그래서 쓰레드는 개별 스택 영역을 가지..
2024.03.28 -
운영체제 공부 4 - scheduler 3 ( 멀티프로세스 scheduler )
[ 시작하기 전에 ] 사실 이 부분만 정리를 해도 되는데 예전 내용을 복습하는 김에 앞을 설명했었다. 아마도 멀티 프로세스 환경에서의 프로그램 성능에 대한 고민은 이 부분을 이해하면 더 쉽게 할 수 있지 않을까란 막연한 생각에 시작을 했고 이 부분에 대해 설명을 하려고 한다. 약간의 정리를 하자면, 싱글 CPU 상황에서 여러 프로세스를 작업하면 생기는 문제점은 CPU 내에 있는 cache의 이점을 살리기가 어렵다는 점, 프로세스의 생성과정에서 생기는 오버헤드 그리고 프로세스가 context switch가 일어날 때의 오버헤드가 있다. 그렇다면 멀티 CPU 상황에서는 어떻게 Scheduling이 일어나야지 멀티프로세스 작동에서의 장점을 가질까? [ 멀티 CPU 상황 ] 멀티 CPU 상황에서 여러 프로세스가..
2023.12.28 -
운영체제 공부 3 - Scheduler 2(CFS)
[ 시작하기에 전에 ] CFS 알고리즘은 이전 배경지식에서 말했던 대부분의 문제를 해결하고 상당히 합리적인 Scheduling을 가능하게 해준다. 이를 이해하기 위해서는 프로세스의 state에 대해서 이해를 해야하고 이전 priority에 따른 scheduling에 관해서 이해하고 있으면 조금 더 이해가 쉽다. [ CFS 알고리즘 ] CFS는 운영체제 공부 3에서 말한 모든 상태들에 대해서 괜찮은 답을 내준다. CFS에서 알아야 될 개념은 Weight, time slice, vruntime이다. Weight는 priority에 따라 프로세스 자체가 가지는 비중을 의미한다. wieght에 따라서 time slice의 값과 vruntime에서의 값이 결정되게 된다. MLFQ에서의 Priority와 뭐가 다른..
2023.12.21