동시성과 병렬성은 차이가 조금 있어요. 오늘은 이 둘의 차이에 대해서 간단하게만 설명하고 넘어가도록 하겠습니다. 코어가 2개, 쓰레드가 2개 있는 cpu를 생각해 봅시다. 즉 HT가 적용이 되지 않은 cpu가 있다고 생각해 봅시다. 여기서 core를 '물건을 생산하는 기계' 정도로 생각합시다. 그것들은 1분에 하나씩 인형을 생산한다고 합시다. 그러면 코어가 1개 있으면 1분에 하나씩만 생산을 할 겁니다. 그런데 2개 있으면 1분에 2개, 3개가 있으면 1분에 3개씩 생산할 거에요. 이는 '인형을 만드는 일'을 기계가 병렬적으로 처리해서 가능한 것입니다. 그러면 경우에 따라서는, 어떠한 특정한 시점에, run 상태가 둘인 경우도 있을 거에요. 그러면 동시성은 무엇일까요? 동시성 하면, 항상 나오는 키워드가..
OS/이론 검색 결과
쓰레드를 이야기 하다 보면 병렬성과, 동시성이라는 용어가 자주 나옵니다. 이 말은 무엇을 의미할까요? 그 전에, 우리는 쓰레드의 상태를 이해할 필요가 있습니다. 오늘은 그에 대해서 간단하게 이야기 해 보도록 하겠습니다. 먼저, w[i] = new worker(); 문을 봅시다. 그러면, Thread를 상속받은 worker 객체가 생성이 됩니다. 그러면 worker-x는 생성이 되고, 아직 start()가 호출이 되지 않았어요. 이를 new 상태라고 이야기 합니다. 그 다음에 우리는 start() 메소드를 호출했습니다. t.start()를 호출하면, Thread를 상속받은 worker 클래스 내부의 run 메소드가 호출이 될 겁니다. 그러면, 실행 대기 상태가 됩니다. 즉, 스케쥴러에 의해서 선택이 될 수..
오늘은 비슷한 것 같지만 완전히 다른 Thread의 sleep 함수랑 Object의 wait 함수를 이야기 해 보도록 하겠습니다. 이 둘은 쓰레드를 자게 하는 거니까, 왠지 같을 것 같은데, 실제로는 차이가 있어요. 예제 프로그램을 봅시다. 먼저 저는 My_object 객체 a와 b를 생성했어요. 그리고, worker를 200개 생성했는데요. 이 클래스의 내부를 봅시다. 이것은, Thread를 extend한 것인데요. 일단 My_object를 참조하는 레퍼런스 타입이 안에 들어있네요. 그리고, run 안에는 a.foo() 라는 친구를 수행하는데요. 그러면 My_object라는 클래스도 봐야 겠네요. 이 안에는 그냥 x가 start 되었다는 것과 끝났다는 것을 출력해 주기만 합니다. 그런데 내부에 wait..
오늘은 Java의 Thread 클래스 안에 있는 join 메서드가 어떤 식으로 동작하는지 간단하게 알아봅시다. 아래 예제 프로그램을 실행시켜 봅시다. 어떻게 실행이 될까요? worker a가 실행이 끝난 후에, Main 쓰레드가 종료됩니다. 그러면, join() 함수는 특정한 스레드가 종료될 때 까지 기다릴 때 쓴다는 건데, 어떤 식으로 동작하는지는 천천히 뜯어보도록 하겠습니다. a.run()을 호출하였습니다. 그 순간, worker a가 run() 메소드를 호출하면서 돌아갑니다. 대충 그림과 같은 상황입니다. 그 다음에, Main 스레드에서는 a.join()을 호출하는데요. 여기서 무슨 일이 일어나는지만 간단하게 봅시다. join을 호출할 때, 매개 변수가 없으면 내부적으로 join(0)을 호출합니다...
오늘은 Java에서 쓰레드를 생성하고 실행하는 방법에 대해서만 알아보도록 하겠습니다. Runnable을 매개값으로 하는 Thread 생성자를 호출하거나, 아니면 worker가 Thread를 상속하는 방법 2가지가 있는데요. 이 둘을 먼저 알아보도록 하겠습니다. 코드를 컴파일 하고 실행을 합니다. static void main(String args[]); 이 친구가 있는데요. 이 친구를 실행하고 종료하는 쓰레드를 메인 쓰레드라고 합니다. 그런데, worker를 하나 더 만들 수 있어요. 즉, Main 실행 흐름만 만드는 것이 아니라, 다른 역할을 하는 스레드 또한 만들 수 있는데요. 예를 들어서, Main에서 게임의 전체적인 알고리즘 같은 것을 수행한다면, Worker에서 배경 음악을 재생한다던지. 그런 ..
최근댓글