목록OS (12)
우리네 장
하드웨어적인 리소스를 모니터링 하는 툴이 아주 다양하지만, 이 수치를 해석하기 위해서는 os 지식이 필수로 필요합니다. ( + 경험치 ) 학부때 os 공부를 하지 않은 것에 후회를 느끼며 당분간은 로우 레벨단 공부를 해보려고 합니다. 첫번째 주제는 bounded process에 대해 얘기하겠습니다. 첫 주제로 선택한 이유는 내용이 가장 단순합니다ㅎ.ㅎ 더보기 burst 무엇인가가 집중적으로 일어나는 것 ( occur ) 을 의미합니다. 이를 파생하여, cpu burst 와 io burst 개념이 나옵니다. cpu burst cpu를 통해 어떤 스레드가 실행되는 간격을 의미합니다. 즉, cpu에서 해당 스래드가 시간되는 구간부터 컨텍스트 스위칭 당하기 전까지의 구간을 의미합니다. I/O burst 어떤 스..
이번에 회사에서 테스트 케이스를 작성하면서, 서버의 테스트 환경을 제한하여 정의할 일이 있었습니다. ( 이렇게 처음부터 작성은 처음이었는데 생각보다 고려할 사항들이 많더라구요..ㅠ ) 테스트 하는 작업이 실제 컴퓨터에 어떻게 처리되는지 알기 위해서는, 기본적으로 서버에서 필수적으로 돌려야 하는 프로세스들의 cpu나 io 작업을 파악할 필요성이 있었고, 테스트하는 작업의 성능만을 측정할 수 있도록 기타 자원 사용률은 최소로 하는 것이 목표였어요. 저는 작업을 테스트 하기 위해, N개의 이벤트를 발생시켜야 했는데, 해당 이벤트가 생성되도록 하는 명령어가 2가지였습니다. 바로 cp와 mv였어요! 결과만 놓고 본다면 두 작업 모두 같은 이벤트를 발생하고 결과도 동일하지만, 테스트하는 작업에 의도하지 않은 부가적..
최근 inotify-tools라는 디렉토리 감지 모듈을 도커를 통해 설치하면서, 같은 리눅스 계열이지만 조금씩 다른 os들을 많이 사용해 보았어요. 쉘 스크립트 파일을 보면 가장 상단에 "#!/bin/bash" 라고 하는 명령어구를 대부분의 쉘에서 모두 작성하는데, 이게 아무런 기능이 없는게 아니었습니다.. 명령어를 수행하는 쉘은 dash / bash / busybox 등의 종류가 있는데, CentOS 들은 bash shell Ubuntu 들은 dash shell을 사용하더라구요. ( busybox는 기본적으로 사용했을 때 sh가 실행이 되지 않았습니다.. ) 그래서 근본적으로는 같은 리눅스 계열이기 때문에 호환 문제가 크지 않지만, 가끔 호환되지 않는 명령어가 있더라구요. 아까 말했던, #!/bin/b..
- 자바에서 모든 인스턴스는 1개의 모니터를 가지고 있으며, 각 모니터는 1개의 ConditionVariable만을 가질 수 있다. - synchronized 키워드를 통해 동기화 메커니즘을 코드적으로 구현할 수 있다. - 인스턴스 lock 뿐만 아니라 클래스 lock 또한 존재한다. - 인스턴스 lock 과 클래스 lock은 별개의 lock으로 공유되지 않는다. - 자바는 기본적으로 signal and continue 방식을 지원한다. 자바에서 모니터 연산 ? 앞서 보았던 모니터 연산에서 메소드 명만 변경이 되었고 역할은 동일하다. wait () : 스레드가 lock을 취득했으나, 코드 실행 조건에 맞지 않아 해당 스레드를 condition variable의 waiting queue를 통해 wait 상..
모니터 또한 동기화 메커니즘 중 하나이다. 모니터의 목적 ? - 상호 배제 구현 - 특정 조건에 부합할 경우에만 임의의 스레드 로직을 실행하는 것. → 조건 별 실행 여부를 제어할 수 있다. 모니터는 뮤텍스 Lock 과 Condition Variable 로 구성되어 있다. - 상호 배제 구현을 위해 뮤텍스 Lock을 사용한다. - Lock을 획득하려 하였으나 취득하지 못한 스레드는 뮤텍스가 가진 entry queue에서 wait 상태로 전환된다. - entry queue는 무조건 FIFO로 구현된 것은 아니다. 내부 요소들에 모두 같은 가중치를 두고 경합을 벌여 우선순위를 결정하는 구현체도 존재한다. - " 조건 별 실행 여부 "를 Condition Variable ( CV ) 로 구현하는데, 모니터 하..
최근 모던 컴퓨팅 환경에서는 우리가 작성한 명령어를 실행할 때, JVM이 최적화를 진행한다. 이 최적화 과정은 동시 메모리 접근이 없음을 기본 전제로 하며, 컴파일러에게 임의의 변수가 공유자원임을 명시해주면 생략되는 과정이기도 하다. 1. cpu 데이터 캐싱 cpu의 처리속도 < RAM 에서 데이터를 로딩하는 속도 는 아주 많은 차이가 난다. 매번 RAM에서 연산에 요구되는 값을 가져와 처리를 하면, 로딩 시간을 기다리느라 cpu가 낭비될 것이다. cpu 캐싱은 l1~l3 같은 cpu 내부 캐시 메모리에 필요한 데이터 블록을 최초 로딩하고, 이후 참조가 있을 경우 캐시 메모리를 참조하여 데이터 접근 속도를 줄여 cpu 낭비를 예방할 수 있다. 캐싱 메모리에서 변경된 데이터는 바로 RAM과 동기화 되지 않..

세마포어는 뮤텍스와 비슷하지만, 몇 가지 차이점이 존재한다. 1. 여러 개의 스레드 혹은 프로세스가 임계 영역에 접근할 수 있다. - 즉, N개의 lock을 가질 수 있다. 2. lock을 획득한 주체가 아닌 다른 스레드 혹은 프로세스가 해제 할 수 있다. public class Semaphore { private volatile int value = 3; private volatile int guard = 0; //value 일종의 여러개의 T/P가 공유하는 공유자원 이므로, 임계영역으로 보호해주기 위해 추가된 변수이다. //guard 사용하게 되면 lock과 unlock이 동시에 발생하는 경우를 막아준다. public void wait() { //acquire lock while ( test_and_..

스핀락에서는 lock 해제를 확인하는 스레드 혹은 프로세스 ( T/P ) 들을 실행하느라 cpu에 낭비가 발생한다고 하였다. 뮤텍스는 이를 보완하여, entry queue를 사용해 lock을 점유하고자 하는 T/P들을 wait 상태로 변경하고, cpu가 다른 T/P를 처리할 수 있도록 하였다. 세마포어를 소개하면서 말하겠지만, 뮤텍스는 lock을 획득한 T/P만 lock을 해제 할 수 있다. public class Mutex { private volatile int lock = 0; private volatile int value = 0; //lock도 일종의 여러개의 T/P가 공유하는 공유자원 이므로, 임계영역으로 보호해주기 위해 추가된 변수이다. //value를 사용하게 되면 lock과 unlock이..