안녕하세요. chogahui05입니다. 생산자 소비자 문제를 구현할 때, 한 가지 의문이 들었습니다. 분명히 맞게 구현한 거 같은데 왜 제대로 동작을 하지 않을까? 이는 제가 쓰레드를 시작할 때, start 메서드를 불러야 하는데, run 메서드를 불렀었기 때문입니다. 그렇기 때문에 LOCK을 풀어야 하는데 풀리지도 않고. 계속 wait 상태에만 걸렸었습니다. notify가 들어가지도 않고. 3시간을 날린 것은 덤이였고요. 그런 걸 보면, 전 면접에도, 서류도 통과할 자격이 없는 건 분명해 보입니다. 이 둘이 어떤 차이가 있길래 그럴까요? Thread 클래스의 내부를 간단하게 보겠습니다. 여러 가지 쓰레드에 대한 정보들이 있는데요. 이 중, group이라는 것도 볼 필요가 있습니다. 713번째 줄에, T..
OS 검색 결과
스레드 동기화 문제 중에, 생산자 소비자 문제가 있습니다. 문제는 매우 간단합니다. 생산자는 물건을 생산합니다. 소비자는 원하는 상품이 있으면 가져갑니다. 그렇지 않으면 기다립니다. productor는, 생산된 물품이 없으면 만듭니다. 이런 문제를 어떻게 해결하면 좋을까요? 일단, 물품이 있는지 없는지 관리하는 변수는 state입니다. 이 값이 1이면 있다는 것이고, 0이면 없다는 것입니다. 이것은 두 쓰레드가 동시에 접근해서 read, write를 하면 안 되는 변수라고 할 수 있어요. 즉, 물건이 있을 때, 꺼내 가려고 할 때, lock을 걸어야 하고, buffer에 집어넣으려고 할 때에도 lock을 걸어야 합니다. 그러면, 소비자 Thread는 다음과 같이 설계할 수 있습니다. 생산자 Thread는..
오랫만에 스레드 포스팅을 올립니다. Java에는, synchronized 키워드가 있는데요. 이것은 특정한 대상에 lock을 걸어서, lock이 풀릴 때 까지 다른 쓰레드가 실행을 하지 못하게 합니다. static 메소드에 붙일 때와, 일반 메소드에 붙일 때, 어디에 락을 거는지가 다른데요. 그에 대해서 간단하게 짚고 넘어가 보도록 하겠습니다. 먼저, 일반 메소드에 synchronized를 붙였습니다. 그러면 어떻게 락을 걸까요? 간단하게 프로그램을 만들어서 실험해 봅시다. 예제 1번입니다. 먼저 코드부터 보여드리겠습니다. 먼저 foo와 bar는, static 메서드가 아니지만, synchronized가 붙어있습니다. 이들을 동기화 메소드라고 이야기 합시다. 그리고 Thread를 상속받은 worker와 ..
fork 함수로 자식 프로세스를 생성할 수 있다고 하였습니다. 그러면, 부모 프로세스가 자식 프로세스가 종료가 될 때 까지 대기를 하게 할 수 없을까요? 그럴 때 wait 함수를 쓰시면 됩니다. pid_t wait(int *stat); 성공 시에, 종료된 자식의 pid를, 실패하면 -1을 반환합니다. 물론 stat에 NULL값을 넣어도 되는데요. 이 때에는, 전달된 매개변수에 상태값을 저장하지 않습니다. man ps를 쳐 봅시다. 스크롤을 쭉 내리시면 아래와 같은 설명이 나오는데요. 이는, 상태값에 따른 프로세스의 상태를 의미해요. 여기서 보아야 할 것은 R, 그러니까 run queue에 있는 상태. 이것과 S인데요. S는 interruptible sleep을 의미합니다. 인터럽트를 받을 수 있는 sle..
동시성과 병렬성은 차이가 조금 있어요. 오늘은 이 둘의 차이에 대해서 간단하게만 설명하고 넘어가도록 하겠습니다. 코어가 2개, 쓰레드가 2개 있는 cpu를 생각해 봅시다. 즉 HT가 적용이 되지 않은 cpu가 있다고 생각해 봅시다. 여기서 core를 '물건을 생산하는 기계' 정도로 생각합시다. 그것들은 1분에 하나씩 인형을 생산한다고 합시다. 그러면 코어가 1개 있으면 1분에 하나씩만 생산을 할 겁니다. 그런데 2개 있으면 1분에 2개, 3개가 있으면 1분에 3개씩 생산할 거에요. 이는 '인형을 만드는 일'을 기계가 병렬적으로 처리해서 가능한 것입니다. 그러면 경우에 따라서는, 어떠한 특정한 시점에, run 상태가 둘인 경우도 있을 거에요. 그러면 동시성은 무엇일까요? 동시성 하면, 항상 나오는 키워드가..
최근댓글