오전부터 오후중반까지 경력기술서를 작성해놓았다.
아무래도 기억력의 한계가 있어서 미리미리 해놔야 다시 까먹지 않을것 같아서다.
내용은 많아보이는 단순 나열식이 되었지만,
저번 멘토링 진행했을때 이렇게 적는게 좋다고 하셨었는데
이방식이 맞는지는 모르겠다.
이력서도 보니까 자기소개서부터 다시 제대로 작성해야할것 같아서 지울것만 지워놓은 상태다.
취업 준비 기간에 서류등이 전부 준비가 되면 따로 멘토링을 진행을 해볼예정.
이후 운영체제 2회독을 읽고, 1회독에서도, 지금도 궁금했던것을 챗지피티와 대화 해보았다.
우선 교착 상태가 발생하는 조건은 아래와 같다.
1. 상호배제 - 하나의 자원에 하나의 프로세스만 사용할 수 있다.
2. 점유대기 - 하나 이상의 자원을 점유하는 중에 다른 프로세스가 이미 점유하고 있는 자원을 점유하기 위해 대기한다.
3. 비선점 - 할당된 자원을 회수 할 수 없다.
4. 순환대기 - 자원의 점유, 대기의 형태가 사이클의 형태를 띄고있다.
이중 하나라도 해결이 되면 교착 상태는 발생하지 않는다.
우선 예방에 대해서이다.
근데 아무리 생각해도 C++에서는 상호배제와, 비선점은 어떻게 할수가 없다고 생각했다.
작업간 값의 원자성을 보장하기 위해서는 하나의 프로세스(스레드)만 사용해야 하기떄문이다.
비선점 결국 값의 일관성을 보장하기위해서 Lock을 사용하는데, 해당 작업이 끝나기전에는 락을 푸는경우는 거의 없기 때문에 (Queue가 아닌이상) 이 경우도 해결할수 없다고 생각했다
결국 락프리 하게, 처음부터 락을 걸지 않고 원자성을 보장하면서
자원을 사용하는 방법밖에 떠오르지 않았다.
점유 대기와 순환 대기는, 점유후 대기만 없어진다면 자연스럽게 순환 대기도 없어질거라 생각했다.
우선 생각한 방안은 두가지 였다.
점유대기 > 만약 2가지의 자원을 사용해야한다면 두가지의 자원을 한번에 획득 하는것.
순환대기 > 순환대기의 위험성은 개발이 계속되다보면 항상 존재하는 위험일것 같았다.
방법으로는 항상 일관된순서로 자원을 획득 하는것이다.
예를들면 항상 플레이어>몬스터의 형태로 락을 건다.
락의 번호를 부여하는 방법, enum과 같이 락객체를 구성할때마다, 락의 번호를 구분하여
락을걸때 추적을 해보는것이다. 어떻게 만들어야할지는 좀더 고민을 해봐야할것같지만.
Stack구조로 락을 걸면서 하나하나 추가를 하기전에 Top의 락순서보다 높은순서를 걸수 없도록 하면 좋지 않을까 생각해봤다.
회피의 경우에는
조심조심히 자원을 배정한다는데, 대표적으로 은행원알고리즘.
작업마다의 락의 순서를 미리 기억하고 있다가 작업간의 그 순서를 바꾸어야 한다고 생각하니
이미 엄청 복잡한 구조라고 생각된다.
그리고 순서를 바꾸게 된다면 게임의 순서보장이 안될것 같아서 이것도 사용하기는 어렵다고 생각했다.
검출후 회복
이것도 마찬가지로 트렌젝션이나, 자원을 몰아주는 선점형식이 있는데,
작업을 얼마나 트렌젝션을 하고 다시 진입하느냐에 따라 결국 작업속도가 늦춰지고 순서보장이 안될것 같아 이부분도 구현이 힘들다고 생각했다.
선점형식은 마찬가지로 갑자기 이쪽 스레드에서 쓰던 락을 뺏어올수가 없다고 생각해서 패스..
결국 점유대기의 방식과 순환대기를 처음 제작시부터 염두해두고 짜야 겠다고 생각했다.
오늘은 가족 모임도있고 해서 저녁시간에 포폴을 하지 못할것 같아서 여기까지 하기로 했다.
조금더 분발해야겠다.
'학습 노트 > 개인학습' 카테고리의 다른 글
250519 월요일 @ 22일차 (0) | 2025.05.20 |
---|---|
250518 일요일 @ 21일차 / 프로토버프 설치 (0) | 2025.05.19 |
250516 금요일 @ 19일차 (0) | 2025.05.17 |
250515 목요일 @ 18일차 (0) | 2025.05.16 |
250514 수요일 @ 17일차 (0) | 2025.05.15 |
댓글