무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨운영체제 공룡책 강의
Circular Wait를 예방하는 방법에 대한 질문입니다!
Circular Wait 을 방지하기 위한 방법과 예시에 조금 헷갈리는 부분이 있어서 확인차원에서 질문드립니다. 제가 이해해한 부분이 맞는지 봐주시면 감사하겠습니다. Circular Wait을 예방하기 위한 방법이란 R={R1, R2 ... Rn} 이러한 모든 자원 R에 대하여 '타입'별로 순서를 지정해서 thread_A{ getLock(R1) getLock(R2) } thread_B{ getLock(R2) getLock(R1) } 이렇게 락을 획득하는 순서가 다른 상황이 일어나지 않도록 하는 방법을 말씀하신 건가요? 또 그 방법이 deadlock prevention을 보장하지 않는 이유가 공유자원 타입별로 순서를 정해도 공유자원의 순서가 보장되지 않는 경우가 있기 때문이고요. 그 예로서 transaction을 보여주신거라고 보면 될까요? 제가 이해한 부분이 맞는지 궁금합니다.
- 미해결운영체제 공룡책 강의
Hold and Wait를 발생시키지 않는 방법이 impractical한 이유가 무엇인가요?
예를 들어주신 파일을 여러 개 열면서 해당 파일들에 대한 락을 여러개 얻었는데 한 파일을 획득하지 못한 경우 열었던 파일들을 닫고 모든 락을 반환한다고 했을때 비용이 많이 발생하긴 하지만 데드락을 피할 수 있다면 적절한 give and take가 아닌가요?
- 미해결운영체제 공룡책 강의
안녕하세요 퀴즈 11 2번 문제 질문입니다.
안녕하세요, 좋은 강의를 올려주시고 질문도 이렇게 받아주셔서 먼저 감사합니다. 다름이 아니라 제가 퀴즈 11-2번(10.8)문제를 푸는데 LRU 알고리즘으로 페이지 부재를 계산하는데 이 과정에 있어서 질문 드립니다. 1 2 3 4 5 3 4 1 6 7 8 7 8 9 5 4 5 4 2 <- 이걸 계산하면 1o 2o 3o 4o 5o 3 4 1o 6o 7o 8o 7 8 9o 5o 4o 5 4 2o 이렇게 총 13번의 페이지 부재가 일어나는 것 아닌가요? 제가 뭔갈 착각하고 있는건지 모르겠어서 질문드립니다.
- 미해결운영체제 공룡책 강의
non-preemptive kernel 설명에 대해 질문드립니다.
안녕하세요, 좋은 강의 올려주셔서 감사합니다. 44분 즈음에서 non-preemptive kernel을 설명하시면서 "count++; 를 해서 1을 다 증가시킬 때까지 context switch가 안 일어난다"고 말씀해주셨는데요, 교안에서 non-preemptive kernel에 대해 써져 있는 것은 "a kernel-mode prcoess will run until it exits kernel mode"라고 적혀있잖아요? 저는 kernel-mode process는 O/S(또는 kernel)을 의미하고 user-mode process는 사용자가 작성한 프로그램을 의미한다고 이해하고 있습니다. memory 상에 user address space와 kernel address space가 분리되어 있고, 당연히 user process는 코드, 데이터, 스택, 힙 모두 user address space 상에 존재할 것입니다. 여기서 "count++;"라는 코드는 유저가 작성한 코드이므로 user address space 상에 존재할 것이고, 마찬가지로 "count"라는 전역 변수 역시 user address space 상에 존재할 것이라 생각합니다. (여기부터 질문입니다.) (1) 그런데 교안에 적혀 있는 "a kernel-mode process"라는 것은, 제가 이해한 바에 따르면 O/S를 의미하는데, "count++;"라는 코드가 kernel data에 영향을 끼칠 수 있나요? (2) 또다른 질문을 드리면, 혹시 user process들이 kernel data를 공유하는 경우가 있나요? 예를 들어, "count"가 kernel의 전역 변수여서 user process가 이에 대해 access하면 user-mode에서 kernel-mode로 전환되어 요청을 처리하게 되는 건가요? 만약 그런 경우가 있다면, 반대로 user process가 user data를 공유하는 경우도 존재하는지 궁금합니다.
- 미해결운영체제 공룡책 강의
flag, turn 변수의 원자성이 Peterson's problem의 Mutual exclusion을 충족시키는 이유를 모르겠습니다.
좋은 강의 잘 보고 있습니다. 감사드립니다. 이번 강의의 중요한 부분인듯 한데 제가 이해를 잘 못하는 부분이 있어서 이렇게 질문드립니다. flag 변수와 turn 변수의 원자성이 Peterson's problem의 Mutual exclusion 조건을 충족시키는 이유가 구체적으로 무엇인가요? 제가 조사한 바로는 기계어 레벨에서 flag에 true를 할당하는 부분이 while문의 뒤쪽에서 완료될 수 있기 때문이라고 이해를 했거든요. 그럼 양쪽 스레드 모두 상대방의 true를 확인하지 못하고 Critical Section에 접근하는 경우의 수가 생기더라고요. 정보 출처 : https://www.quora.com/Why-is-Petersons-solution-not-guaranteed-to-work-on-modern-computer-architecture-as-mentioned-in-Operating-System-Concepts-by-Silberschatz 반대로 이론적으로 상대 스레드의 접근성을 확인하는 라인(while 문)보다 flag에 true를 할당하는 부분이 위에 있으면 Mutual exclusion이 해결됨을 확인했습니다. 예를 들면 A스레드가 while문으로 B의 접근을 확인한 직후에, B스레드가 자신의 flag B를 True를 바꾸고 Critical Section에 접근한다고 해도, B는 무조건적으로 A가 True임을 확인할 수 있기 때문입니다. (A의 flag가 true가 되는 부분이 A의 while문 위에 있기 때문에) 그래서 강의 후반에 flag와 turn 부분을 원자성이 보장되도록 바꾸셨는데 결과가 0으로 나오는게 이해가 가지 않더라고요. 저는 Critical Section의 특정 부분(예제에서는 count 변수)을 원자성이 보장되는 변수로 바꿀줄 알았거든요. A 스레드에서 count를 1에서 2로 올리는 와중에 context switching이 일어나서 B 스레드에서 1에서 0로 바꿔버리면, 다시 A 스레드에게 주도권이 왔을 때 count는 2가 될 테니까요. 그래서 flag와 turn 변수의 원자성이 어째서 Mutual exclusion을 보장되게 하는지 구체적인 이유를 알고싶습니다.
- 해결됨운영체제 공룡책 강의
thread에 대한 질문입니다. (40:45지점)
질문1 thread가 kernel thread와 user thread가 나누어져 있다는 부분이 이해가 가지 않습니다. 제가 이해한 바로는 하나의 thread가 있는데 이 thread가 시작할 때는 user 모드였다가 system 자원이 필요할 때 kernel 모드로 바뀌는 것으로 알고있습니다. 그러니까 하나의 thread가 user 모드와 kernel 모드로 바뀌어가며 실행되는 것이 아닌가요? 질문2 운영체제 입장에서는 kernel thread만 스케줄링 하면 된다는 부분이 이해가 가지 않습니다. 두 가지 측면에서 이해가 가지 않는데요. 첫 번째는 질문1에서처럼 제가 thread가 user thread와 kernel thread로 마치 두 몸인 것처럼 쪼갤 수 없기 때문에 user thread는 놔두고 kernel thread만 스케줄링 한다는 개념을 이해할 수 없습니다. 두 번째는 user thread를 thread library가 관리한다는 부분입니다. 예를 들면 java로 프로그래밍 하게 되면 java thread 라이브러리에 해당 thread가 어떠한 우선 순위로 어떠한 알고리즘으로 스케줄링 될 것인지 모두 프로그래밍 되어 있다는 것인지요. 또 라이브러리 명령대로 한다고 가정하더라도 CPU는 어쨌든 운영체제가 관리하고 있는 것인데, 라이브러리의 명령을 받고 CPU를 user thread가 점령하게 되면, 운영체제는 그 user thread를 무시하고 kernel thread를 스케줄링 할 수 없을 텐데요. user thread가 CPU에서 나와야 kernel thread를 넣을 수 있을 테니까요. 이 논리라면 결국 user thread도 운영체제에 의해 스케줄링 되어야 한다는 결론에 이릅니다. 제가 어디를 잘못 이해하고 있는지 궁금합니다.
- 미해결운영체제 공룡책 강의
퀴즈 5번 질문 있습니다
5번의 경우 RR2를 사용하면 0~2초 : P1 2~4초 : P2 4~6초 : P3 6~8초 : P1 8~10초 : P2 10~12초 : P3 (P3 완료) 12~13초 : P1 (P1 완료) 13초~ : P2 이렇게 완료 순서가 P3, P1, P2 가 아닌가요? 답은 P1, P3, P2 라고 나와있는데 이해가 안 갑니다
- 미해결운영체제 공룡책 강의
우분투에서 main 진입 점을 못 찾는 것 같습니다.
강의 23:00에서 처럼 gcc hello.c 를 실행하면 undefined reference to `main' 이라고 뜨는데 어떻게 해결해야 할까요? -해결 했습니다. 그냥 ctrl+s 하고 하니까 적용 되네요 ㅠㅠ
- 미해결운영체제 공룡책 강의
우분투 다운질문입니다
스토어에 ubuntu 와 ubuntu 20.04 LTS 두개가 나오길래 두번째걸 다운받았습니다. 그리고 powershell 에서 wls --set default -version 2를 하고 wls -l -v 를 했는데 버전이 1로 나오면서 이름에는 *Ubuntu 20.04 LTS라고 나옵니다. 그래서 지우고 처음것만 다운받고 다시 해봤는데, powershell에서 에러가 뜨면서 안되네요. 어떻게 해야하나요?
- 미해결운영체제 공룡책 강의
shared memory와 mailbox
shared memory는 두 프로세스가 shared memory를 통해서 data를 read,write하고 mailbox도 두 프로세스가 mailbox를 통해서 data를 read,write하는데 두 개의 차이점이 shared memory는 두 프로세스 모두 read,write가 가능하고 mailbox는 send와 receive가 구분되어진건가요?
- 미해결운영체제 공룡책 강의
message-passing 질문드립니다.
blocking send에서 sender가 2g의 데이터를 용량이1g인 mailbox에 보낼때 1g를 receiver가 다받아야 남은 1g를 또 send 한다는 건가요?
- 미해결운영체제 공룡책 강의
Excercise 3.2 질문드립니다.
fork(); fork(); fork();를 실행했을때 p0이 p1을 만들고 p0이 p2를 p1이 p3를 만들고 이런과정이 반복되서 총 8개의 프로세스가 만들어지는데, 순서는 상관 없는건가요? 예를들어, 순서대로 한다면 p0이 p4를 p1이 p5를 p2가 p6를 p3가 p7을 만드는것처럼요. 꼭 이 순서를 지키지 않아도 되나요?
- 미해결운영체제 공룡책 강의
Queueing Diagram 질문드립니다.
안녕하세요! 운영체제를 공부하고 있는 학생 입니다. Queueing Diagram 설명 하실때 CPU가 I/O request를하면 I/O queue에 들어갔다가 ready queue로 가게되고 fork a child를 하게되면 child executes후 ready queue로 들어가는걸로 설명 하셨는데 어떤게 ready queue로 들어가는 건가요?? 처음 공부하는거라 아직 개념이 확실하게 잡히지 않아서 기본적인거 같지만 질문드립니다.
- 미해결운영체제 공룡책 강의
모니터 질문
안녕하세요 교수님, 모니터 관련 질문 드릴 게 있습니다. 질문 1. 모니터와 세마포어의 정확한 차이를 모르겠습니다. 모니터 방식이 "프로그래머가 정의한 특정 영역에 접근하려면 모니터 락을 얻어야 한다" 라는 방식이라고 설명하셨는데.. 이는 결국 임계영역에 들어가기 위해 sleep(), wakeup() 하는 세마포어와 동일한 것 아닌가요? 정확히 어떤 차이점이 있는지 와닿지가 않습니다. (질문 1 보충 설명)자바 동기화를 생각했을 때는 차이점이 인지가 됩니다. "세마포어는 프로그래머의 실수로 인해 타이밍 오류가 발생할 수 있지만 자바에서 synchronized 키워드를 사용하면 JVM이 모니터 락을 알아서 관리해주니까 세마포어에서 발생하는 실수에 대한 걱정이 없다" 정도로요. 그런데, conditional variables 을 사용하는 경우에서는 모니터와 세마포어의 차이를 모르겠다는 이야기입니다. condition x;x.wait(), x.signal() 이러한 호출도 결국 프로그래머가 직접 해주는 것 아닌가요? 그렇다면 이게 세마포어와 어떤 차이점이 있는 것인지... 요런 질문입니다. 질문 2. 컨디션 변수의 작용 범위? 컨디션 변수를 사용한 모니터 구현 방식에서.. 각 컨디션 변수의 wait, signal은 하나의 공유 자원에 대해 동작하는 건가요? 아니면 모니터 내부에서 미니 모니터(?)같은 느낌으로 또 다시 영역을 나누고 그 영역에 대해서 동작하는 건가요? 질문 3. 컨디션 변수가 하나만 있는 경우? 만약 컨디션 변수가 하나만 있다고 한다면.. 이러한 경우에서는 이 역시 결국 세마포어와 완전히 동일한 것 아닌가 하는 생각이 드는데요. 제가 이해하지 못한 다른 차이점이 있을까요? 지금까지는 강의 내용을 이해하는 것에 큰 무리는 없었는데.. 이번 강의는 뭔가 난이도가 확 올라간 느낌이네요; 답변 부탁드립니다. 감사합니다!!
- 미해결운영체제 공룡책 강의
세마포어 sleep(), wakeup() 질문
안녕하세요 교수님, 세마포어 방식에 대해 질문 드리고 싶은 게 있습니다. busy waiting의 낭비를 막기 위해서 S 값에 따라 프로세스가 스스로 sleep() 하고 다른 프로세스를 wakeup() 시키는 동작에 대해서 설명해주셨는데요. 이 방식은 critical section에 대한 mutex를 보장받을 수는 있지만 프로세스 스케쥴링 자체에도 영향을 미치는 것이잖아요? 그렇다면 이런 방식을 사용할 때는 별 다른 스케쥴링 방식 없이 이것만으로 스케쥴링을 수행하는 건가요? 아니면 기본적으로 스케쥴링 방식은 존재하지만 세마포어가 스케쥴링에도 영향을 미치는 방식으로 혼용되어 사용되는 것인가요? 감사합니다.
- 미해결운영체제 공룡책 강의
싱글 코어에서의 interrupt disable
안녕하세요 교수님, 질문 사항이 있어서 글을 남깁니다. 피터슨 알고리즘이 등장하기 전 interrupt disable 을 통해 mutual exclusion을 보장받는 방식에 대한 설명을 해주셨는데요. 싱글 코어인 상황에서 이와 같이 interrupt disable을 사용하게 된다면.. 이는 결국 non-preemptive 방식과 똑같아지는 것 아닌가? 하는 생각이 듭니다. 제가 맞게 생각한걸까요? 아니면 non-preemptive와는 다른 어떤 차이점이 존재하나요?명절 잘 보내시고 시간 나실 때 답변 주시면 매우 감사하겠습니다!
- 미해결운영체제 공룡책 강의
turn에 접근할 때 인터럽트가 발생한다면?
안녕하세요 교수님, Race Condition 관련하여 질문을 드리고 싶습니다. Peterson2에서 AtomicBoolean을 사용하여 Race Condition을 해결하고 항상 0이라는 결과가 출력되는 것을 확인하였습니다. 그런데.. busy waiting을 위한 조건문에는 turn에 대한 검사도 들어가있지 않습니까? turn은 AtomicBoolean과 다르게 그냥 일반적인 int입니다. 만약 이 turn에 대한 할당 작업이 기계어 레벨에서 수행되는 중에 interrupt가 발생하면 또다시 Race Condition이 발생할 수도 있는 것 아닌가 하는 생각이 듭니다. 하지만 결과는 당연히 강의에서 교수님이 보여주신대로 count는 항상 0을 유지하겠지요. 어째서 int turn이 Race Condition을 발생시키지 않을 수 있는 것인지가 궁금합니다. 감사합니다!
- 미해결운영체제 공룡책 강의
피터슨 알고리즘쪽질문드립니다 .
강의 너무너무 잘 듣고있습니다 감사합니다 저 강의를 듣다가 코드를 보는데 while문에서 조건이있고 {}가 없는데 따로 실행은 없는건가요 무조건 일단 깃발교체만 하고 sum++로 가는건가요 >? =============================================cpp 에서는 thread가 있길래 이렇게 구현했습니다 #include <iostream> #include <thread> #define true 1 #define false 0 using namespace std; int sum; bool flag[2]; int turn; void producer() { int k; for (int i = 0; i < 10000; i++) { //0번이 producer, 1번이 consumer라고 생각 /*endtry section*/ flag[0] = true; turn = 1; while (turn == 1 && flag[1]) ; sum++; /*exit section*/ flag[0] = false; } } void consumer() { int k; for (int i = 0; i < 10000; i++) { //0번이 producer, 1번이 consumer라고 생각 flag[1] = true; turn = 0; while (turn == 1 && flag[1]) ; sum--; /*exit section*/ flag[1] = false; } } int main() { sum = 0; thread t1, t2; t1 = thread(consumer); t2 = thread(producer); cout << "sum : " << sum << endl; t1.join(); t2.join(); return 0; }
- 미해결운영체제 공룡책 강의
RPC 통신 질문
안녕하세요 강의 잘 듣고있습니다. RPC 통신에 대해서 질문드리겠습니다. 질문1. RPC도 결국 네트워크상에서 서버-클라이언트간의 통신이라면, HTTP 프로토콜을 통해 통신하는 것인가요? 헤더와 바디를 담은 요청 메시지를 보내고 응답 메시지를 받고 하는 형식으로 통신하는게 맞나요? 질문 2. 질문1의 답이 YES라면 궁금한 점이 하나 더 있습니다.그렇다면 RPC는 API 호출을 통해 이뤄지는 일반적인 서버-클라이언트 통신과 어떤 부분이 다른건가요? 질문 3. RPC통신에서 바인딩 문제를 해결하는 방안으로 1. 고정 포트 주소 사용2. matchmaker를 통해 포트번호를 알아낸 후 메시지 전송 위 두 가지 방법이 있다는 것을 책을 통해 알았습니다. 이 중 더 자주 사용되는 방법은 무엇인가요? 그리고 2번 방법의 경우, 한 번 포트번호를 알아내면 그 다음부터는 matchmaker를 거칠 필요 없이 계속 그 포트로 보내면 되는 건가요? 감사합니다!
- 미해결운영체제 공룡책 강의
pipe 실습 질문
안녕하세요. 강의 감사히 잘 듣고 있습니다. pipe 실습 부분에서 이해가 안 가는 부분이 있습니다. write에서 fd[1]에 썼고 read에서 fd[0]에서 읽어옵니다. 그런데, fd라는 배열은 내부적으로 정의된 것이 아니라 main 시작부에서 int fd[2]로 선언한 배열입니다. 질문1. fd가 pipe로서 사용되는 것을 따로 명시하지 않았는데 (그냥 main 시작부에서 선언했을 뿐인데) 어떻게 pipe로서 사용되는 것인가요? 혹, write(), read() 내부적으로 첫번째 파라미터를 pipe로 사용한다는 구현이 되어있는 것인가요? 질문2. 쓰는 위치는 fd[1]이라고 write의 첫번째 파라미터로 정해줍니다.read의 첫번째 파라미터는 "어디에서 읽어올지"가 아니라 "읽어온 것을 어디에 저장할지"입니다.어디에서 읽어올지는 따로 명시하지 않아도 되는 것인가요?그냥 단순하게 "fd는 pipe니까 알아서 fd[1]에서 읽어올 것이다."정도로 받아들이고 넘어가도 괜찮은가요? 강의 덕분에 운영체제 공부를 수월하게 이어나가고 있습니다. 좋은 강의 만들어주셔서 감사합니다.