본문 바로가기

CS 과목(CS科目)/운영체제(OS)

dead lock(교착상태) with JAVA Deadlock(교착상태) 두 개 이상의 프로세스/스레드가 서로가 가진 리소스를 기다리는 상태 자동차는 프로세스/스레드를 나타내며, (1,2,3,4)는 리소스를 의미한다. 각 자동차는 직진을 하기 위해서, 2개의 리소스를 지나야 한다. 근데, 각 자동차가 동시에 직진을 하면, 오른쪽 그림과 같은 상태가 된다. 각 자동차는 1개의 리소스를 보유하고 있으나, 전진을 하기 위해서는 다른 자동차(프로세스/스레드)가 보유하고 있는 리소 스를 획득해야는데, 다른 자동차들도 또 다른 리소스를 획득하기 위하여 서로 대기 중이다. Deadlock이 발생하는 4가지 조건 1. Mutual exclusion : 리소스를 공유해서 사용할 수 없다, 즉 한 번에 1개의 프로세스/스레드만이 리소스를 가질 수가 있 다. 동시에 여.. 더보기
모니터(monitor)(sub: 그 모니터 아닙니다 ㅋㅋ) 모니터 1. mutual exclusion을 보장 2. 조건에 따라 스레드가 대기(waiting) 상태로 전환 가능 모니터는 언제 사용되나? 1. 한번에 하나의 스레드만 실행돼야 할 때(mutual exclusive) 2. 여러 스레드와 협업(cooperation)이 필요할 때! 모니터의 구성 요소 1.mutex 2.condition variable(s) : waiting queue를 가지며, 그 안에 조건이 충족되길 기다리는 스레드들이 대기 상태로 머무는 곳! condition variable에서 주요 동작(operation) 1. wait : thread가 자기 자신을 condition variable의 waiting queue에 넣고 대기 상태로 전환 2. signal : waiting queue에.. 더보기
스핀락(spinlock) 뮤텍스(mutex) 세마포(semaphore) 임계 영역 공유 데이터의 일관성을 유지하기 위해, 하나의 프로세스/스레드만 진입할 수 있는 코드 영역!! Q. 그럼 어떻게 하나의 프로세스/스레드만 진입(mutual exclusive)시킬까? A. Lock을 활용! 참고로, lock은 모든 프로세스/스레드에서 동시 접근이 가능해야 하기에, 전역(global)으로 선언을 해야 한다. while(test_and_set(&lock) == 1) ; -> lock==1인 동안에는 무한 루프를 계속 돌며, critical section에 진입하기 못하게 한 다. (mutual exclusive 해결) ( 위 코드에서 만약 T1이 Critical Section 도중에 context switching이 일어났다고 해도, 다른 프로세스/스레드들은 T1이 다시 재실행되어.. 더보기
동기화(synchronization), 경쟁 조건(race condition), 임계 영역(critical section) 하나의 객체를 두 개의 스레드가 접근할 때 생기는 일 귤박스가 2개 있고, 2개의 스레드에게는 각각 서로 다른 귤 박스를 담당하게 할 것이다. badCounter 객체는 2개의 스레드가 공유한다. 만약, 불량인 상태인 각각의 귤박스에 1개씩 있다고 하자. 그러면 우리가 원하는 state의 값은 2이다. 그러나, 항상 우리가 원하는 값이 높은 확률로 나오지 않는다. 그 이유를 아래에서 살펴보자. 1. LOAD state to R1 : state값을 cpu 레지스터 R1에 로딩. 2. R1 = R1 + 1 : 레지스터 R1에 +1을 한다. 3. STORE R1 to state : 레지스토 R1의 값을 메모리에 반환을 한다. Counter::increament() 메서드의 state++를 어셈블리어로 변환하면.. 더보기
cpu bound vs io bound 버스트(Burst) 어떤 현상이 짧은 시간 안에 집중적으로 일어나는 일. CPU 버스트(Burst) 프로세스가 CPU에서 한번에 연속적으로 실행되는 시간. (즉, time splice 동안 프로세스의 명령어들이 연속적으로 실행된 시간) I/O 버스트(Burst) 프로세스가 I/O 작업을 요청하고 결과를 기다리는 시간. 프로세스의 인생은 CPU Burst와 IO Burst의 연속 프로세스는 위 그림과 같이 CPU Burst 작업과 I/O 작업, 이 2가지 작업만을 번갈아 가면서 실행하게 되고, 실행이 끝이 난다. 대부분의 프로세스는 CPU Burst 8ms 내로 끝이 난다. CPU bound 프로세스 CPU Burst가 많은 프로세스. CPU Bound 프로세스의 예시 1. 동영상 편집 프로그램 -> 동영.. 더보기
Thread Context Switching vs Process Context Switching context switching(문맥 교환) CPU/코어에서 실행 중이던 프로세스/스레드가 다른 프로세스/스레드로 교체되는 것. ( 엄연히 말하면 위 정의는 틀렸다. 오늘날의 CPU는 실행 단위(unit of execution)를 스레드로 한다. 그렇기에 더이상 cpu는 프로세스를 실행한다는 말은 성립이 되지 않기에, 실행 중이던 프로세스가 다른 프로세스로 교체되는 것은 더 이상 성립이 되지 않는다. 만약 누군가가 프로세스에 대해 문맥 교환이 일어났다고 함은, 그건 싱글 스레드로 구성된 프로세스가 있는 데, 그 스레드가 다른 프로세스의 싱글 스레드로 교체가 되었다는 말이다.) Context 프로세스/스레드의 상태(cpu상태, 메모리 상태 등등) Context Switching이 일어나는 시점 1. 주어진.. 더보기
헷갈리는 개념들에 대한 정리(feat 프로세스, 스레드, 멀티태스킹, 멀티스레딩 etc) I/O 작업의 3가지 의미 1. 파일을 읽고 쓰는 것 2. 네트워크의 어딘가와 데이터를 주고 받는 것 3. 입출력 장치(EX.마우스, 키보드)와 데이터를 주고 받는 것 단일 프로세스 시스템(초창기의 OS Architecture) 한 번에 하나의 프로그램만 실행됨. 프로세스들이 순차적으로 실행이 되므로, 하나의 프로세스가 모두 실행이 완료되어야만 그 다음의 프로세스를 실행할 수 가 있다. 단점 : cpu 사용률이 매우 안 좋음. -> 프로세스의 I/O 작업 중 CPU는 유휴 상태에 들어 간다. 이러한 문제를 해결하기 위하여 여러 개의 프로그램을 메모리에 올려 놓고 동시에 실행시키자. 즉, I/O 작업이 발생하면 CPU를 놀게 놔 두는 것이 아니라, 대기 중인 프로세스를 올려 실행을 시킨다. 이것을 멀티 프.. 더보기
Stack Frame( in Java ) with THIS pointer 함수/메서드가 호출이 될때마다 메모리의 stack 영역에는 각 함수의 중간값들을 저장하기 위하여 stack frame이 생성이 된 다. 그리고 해당 함수/메서드가 종료가 되면 Frame Pointer를 사용하여 이전 함수/메서드로 실행의 흐름이 바뀐다. JAVA, C++에서는 메서드가 호출이 될 때, 생성자가 호출이 될때, THIS 포인터가 Stack Frame에 할당이 된다는 사실을 오늘 처음 알았기에 , 블로 그에 정리를 해 본다. 1. 생성자 호출 new Counter() 생성자도 메서드이기에 stack frame이 할당이 되고, this 레퍼런스가 만들어 지고 그 레퍼런스는 객체의 주 소를 가리키게 된다. 생성자의 실행이 종료되면, main 메서드의 stack frame의 c 레퍼런스에 this .. 더보기