스레드의 동작 방식
커널이 하드웨어에서 bss를 받아오고 ram 을 할당받음. 그뒤에 메인 스레드를 만들고 메모리를 잘게 쪼갬.(나중에 공부할 부분.) 인터럽트와 타이머 등을 만듬. 최근에 안 사실이지만 타이머가 꼭 중요하다고 함. 매 초마다 전기 신호를 보내서 제어권을 안뺏기게 한다고함. 그 다음 아이들 스레드를 만듬. 만들자 마자 레디 리스트에 재움.
idle 스레드는 아무런 스레드가 없을때 나와서 일해줌.
그 뒤에는 앞에서 받은 명령어를 통해서 프로그램을 실행시킴. 프로그램이 종료되면 power_off로 pintos를 종료함. 명령어를 주지않으면 스레드까지 다 죽게되서 강제로 포트를 죽여야함.
알람 동작 방식 - 인터럽트
이번에 만든 알람은 스레드들이 일정시간이 됬을때 block 상태에서 running 상태로 바꿔줘야함. sleep_list를 만들어서 안에 넣었다가 일정 시간이 되면 꺼내느 방식으로 구현. 처음에는 while문을 돌면서 main은 안자고 계속 busy_waiting 방식으로 혼자 두드리고 있는 형식으로 구현. 나중에 timer_interup의 존재를 알고 main도 재움. idle이 나와서 꺠워주는게 신기했음. 일정시간이 되면 interup에서 idle이 로직을 block 상태의 스레드들을 ready 상태로 만들고 ready_list에 집어 넣음. 동작하고 있는 스레드가 없기 때문에 ready_list에 들어간 스레드가 동작. 메세지를 뱉고 스레드는 종료됨. 반복. 동시성을 위해서 틱 안에 처리를 해야하기 때문에 깨워야하는 스레드가 여러개일 때에는 반복문을 나가지않고 한번에 깨우는게 중요. 1틱 단위로 실패하기도 함.
스레드는 우선순위가 있음. 우선순위가 높은 순으로 동작을 하게됨.우선순위가 낮은 스레드가 lock을 가지고 있으면 우선순위가 높은 애들이 기다리게 됨. 우선순위가 높은 스레드가 먼저 돌게하기위해서, 우선순위가 낮은 스레드에게 donate를 해줌. 우선순위가 낮은 스레드에게 높은 스레드 만큼 우선순위를 주는것. 그럼 우선순위가 낮더라도 빨리 실행되고 lock을 해제하고 우선순위가 높은 스레드가 동작할 수 있음.
세마를 업다운 해주는데, 위치가 중요함
중간에 unbloc을 하고 우선순위를 판단해서 yield 하는 부분이 있는데 세마 업다운 값을 확실히 변경해주고 넘어가는게 중요함
Lock이 다른 스레드에게 선점되어 있는데 요청하면, Lock 안의 sema 구조체 안의 waiter_list에 저장됨. 우선순위순으로 리스트를 넣어줌. 맨 처음 값을 팝하기 때문에 Lock을 기다리는 스레드들도 우선순위로 동작함
한 스레드가 여러 Lock을 가지고 있으면 문제가 좀 복잡해짐. 하나의 Lock을 해제해도 다른 Lock을 위해서 우선순위를 높여줄 필요가 있음. 데드락 조심. 이 문제를 다룬 테스트가 nest와 chain. 해결은 lock을 원하는 스레드들의 리스트를 만들어서, 스레드 안에 넣어줌. 스레드는 키를 해제할때, list를 기반으로 우선순위를 새로 선정함.
도네이트 리스트 안쓰고 해보려다가 큰코 다침. 없이 구현한 재현이 대단해…
conditionvalue는 비슷하지만 좀 다름.
콘솔로그를 찍는 스레드 때문에 게속되는 인터럽트.
처음에 Lock을 가져가면 내가 명시하지 않더라도 Lock을 해제함… 왜그런지 자세히 파고들지는 못했음. 계속되는 Lock 획득과 해제 때문에 조건설정을 잘해야함.
테스트 케이스를 짜면 좋을꺼 같다. 함수 하나를 짜더라도 나중에 터지는 문제가 발생. 당장의 로직에는 문제가 없더라도 다른 케이스에서 터져버림. 찾기가 매우 어려움
깃에 백업이 중요함. 마찬가지로 중간에 터져버리면 답도 없음 기도하면서 ctrl+z 연타밖에 없음
너무 고집피울필요 없는거 같음. 어느정도 타협을 보고 도움? 자료의 도움을 받는게 좋은거 같음
시간이 짧은데 스스로 생각해서 다 하려고 하면 무리가 생김. 어느정도 타협은 필요한거 같음. 물론 안보고 하면 좋겠지만 시간을 잘 조절해서 할것. 시간이 없어서 다 못하는것 보단 나을꺼 같음.
전체적인 흐름을 못본게 너무 아쉽. 첫날에 큰 로직을 보려했는데, 자세히는 못봄. 어셈블리어쪽은 손도 못댔음.
너무 아쉽. 어드벤스는 손도 못댐.