[공부 노트] #8
프로세스와 스레드의 차이는 무엇인가요?
프로세스는 컴퓨터가 실행중인 프로그램으로, 운영체제로부터 자원을 할당받는 실행 단위이고, 쓰레드는 프로세스의 실행 단위이다. 프로세스는 각각 독립된 메모리 영역을 할당받지만, 쓰레드는 같은 프로세스 내에서 자원을 공유할 수 있다. 자원을 공유하므로 효율적으로 동작할 수 있지만, 공유 자원의 일관성을 지켜주기 위해 동기화 작업을 수행해야한다.
교착상태란 무엇이며, 교착상태가 발생하기 위해서는 어떤 조건이 있어야 하나요?
둘 이상의 프로세스/쓰레드가 서로 자원을 요구하며 무한정 기다리는 상태로, 다음 네가지 조건이 모두 만족되어야 발생한다.
- 상호배제 : 하나의 자원은 하나의 프로세스만 사용이 가능하다.
- 비선점 : 다른 프로세스가 사용중인 자원을 뺏을 수 없다.
- 환형대기 : 대기하는 프로세스가 원형을 이룬다.(P0 -> P1 -> … -> Pn -> P0)
- 점유와 대기 : 자원을 점유하고 있으면서 다른 자원을 요구하며 대기하는 프로세스가 있어야한다.
교착상태의 해결법은 무엇인가요?
교착상태 예방, 회피, 탐지 및 회복의 방법이 있다.
예방
교착상태의 발생 조건 4가지 중 하나라도 발생할 수 없게 만드는 것이다.
- 상호배제 방지 : 하나의 자원을 여러 프로세스가 사용 가능하도록 한다.
- 비선점 방지 : 다른 프로세스가 이용중인 자원을 뺏을 수 있도록 한다.
- 환형대기 방지 : 일정한 방향으로만 자원을 요구할 수 있도록 한다.
- 점유와 대기 방지 : 프로세스에 필요한 자원을 모두 한번에 요구하고 허용할 때 까지 작업을 보류하여, 점유하면서 대기중인 상황을 방지한다.
회피
프로세스들이 요구하는 모든 자원을 교착상태의 발생 가능성 없이 할당해줄 수 있는 경우 안전 상태(safe state)에 있다고 하고, 특정 순서로 자원을 할당할 때 교착상태가 발생하지 않는 순서를 안전 순서(safe sequence)라고 한다. 회피 방법은 자원을 할당한 이후에도 계속해서 안전 상태를 유지할 수 있는 경우에만 자원을 할당해주는 방법이다.
탐지 및 회복
현재 시스템에 교착상태가 발생했는지 여부를 주기적으로 탐색하고, 탐지했다면 회복을 위해서 프로세스를 1개 이상 중단시키거나, 프로세스에 할당된 자원을 뺏어서 교착상태를 해결할 때 까지 다른 프로세스에 할당해준다.
뮤텍스와 세마포어에 대해서 설명해 보시오.
프로세스 동기화(synchronizing)란 하나의 자원을 특정 순간에 하나의 프로세스만 점유하도록 제어하는 것이다. 이를 통해 데이터의 일관성을 유지한다.
Mutex
뮤텍스는 동기화를 위해 임계구역(critical section)을 설정한다. 하나의 스레드만이 해당 임계구역에서 실행될 수 있다. 임계구역에 진입할 때 뮤텍스 락을 건다. 이후 진입을 시도하는 스레드들은 대기 상태에 들어가며, 임계구역에서 동작하던 스레드가 모든 할일을 마치고 임계구역을 나오면서 unlock을 한 이후 진입한다.
Semaphore
뮤텍스와 마찬가지로 임계구역을 설정한다. 하지만 공유자원에 접근할 수 있는 스레드의 수를 세마포어라는 변수로 지정해놓고, 임계구역에 스레드가 진입하면 하나 감소시키고, 임계구역에서 탈출하면 하나 증가시킨다. 진입하려는 스레드는 세마포어가 0일경우 1이상이 될 때까지 대기한다.
컨텍스트 스위칭이란 무엇인가요?
컨텍스트 스위칭이란 CPU가 어떤 프로세스를 실행하고 있는 상태에서 인터럽트에 의해 다음 우선순위의 프로세스가 실행되어야 할 때, 기존 프로세스의 정보를 PCB에 저장한 뒤 다음 프로세스의 PCB에서 정보를 가져와 교체하는 작업을 말한다. 물리적인 관점에서 보자면, CPU의 레지스터들이 가지고 있는 현재 실행중인 프로세스에 관한 데이터들을 저장해두고, 다음에 실행할 프로세스의 정보를 레지스터에 넣는 것이다. 이 때, 쓰레드는 자원을 공유하는 만큼 TCB(Thread Control Block)에는 PCB보다 더 간단한 정보만 담기므로 프로세스의 컨텍스트 스위칭보다 더 빠르다.
경쟁 상태란 무엇인가요?
경쟁 상태(race condition)이란 공유 자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다.
프로세스 혹은 스레드의 동기화란 무엇인가요?
프로세스/스레드 동기화(synchronizing)란 하나의 자원을 특정 순간에 하나의 프로세스/스레드만 점유하도록 제어하는 것이다. 이를 통해 데이터의 일관성을 유지한다.
사용자 수준의 스레드와 커널 수준의 스레드의 차이는 무엇인가요?
커널
운영체제 중 항상 메모리에 상주하는 부분을 커널이라고 한다.
커널 스레드는 커널 레벨에서 생성되는 스레드로 커널이 직접 관리하고, 사용자 스레드는 라이브러리를 통해 사용자가 만들고 관리하는 스레드이다.
- 사용자 수준 스레드 모델(N:1)
- 프로세스 1개(사용자 스레드 N개)에 커널 스레드 1개가 할당
- 프로세스 내의 스레드 라이브러리로 커널 도움 없이 스케쥴링 가능
- 커널은 사용자 스레드의 존재 모름
- 스레드 context switch시 오버헤드 적음
- 동작중인 스레드가 커널에 진입하면, 즉 시스템 콜을 하면 해당 프로세스 내의 모든 스레드가 멈춘다.
- 커널 수준 스레드 모델(1:1)
- 프로세스 내의 사용자 스레드 1개에 커널 스레드 1개가 할당
- 커널 스레드를 스케쥴하여 매핑된 사용자 스레드를 실행
- 커널이 TCB와 PCB를 관리한다.
- context switch시 시스템 콜이 필요해서 큰 오버헤드
- 동작중인 스레드가 커널에 진입해도 해당 프로세스 내의 다른 스레드가 동작할 수 있다.
- multi-level(user/kernel hybrid) 스레드 모델(N:M)
커널 수준 스레드 혹은 혼합 방식을 이용하면 멀티프로세서를 활용할 수 있다. 사용자 수준 스레드는 프로세스 단위로 CPU가 할당되므로 프로세스 내에서 여러 스레드를 실행시킬 수 없다.
CPU 스케줄링이란 무엇이고, 어떤 종류가 있나요?
CPU스케쥴링이란 여러 프로세스가 번갈아가며 사용하는 자원을 어떤 시점에 어떤 프로세스에게 할당할 지 결정하는 것이다.
- FCFS : 먼저 온 순서대로 처리해줌. 실행 시간이 긴 프로세스가 먼저 도착하면 전체 성능이 저하되는 문제.
- SJF : 실행시간이 짧은 프로세스부터. 실행시간이 긴 프로세스는 계속해서 cpu를 할당받지 못하는 문제
- SRT : 선점형. 프로세스의 남은 시간이 짧으면 자원을 뺏는다.
- Priority Scheduling : 우선순위가 높은 프로세스에게 할당. 우선순위가 낮은 프로세스는 계속해서 cpu를 할당받지 못할 수 있는데, aging기법을 이용해 기다린 시간에 비례해서 우선순위를 높여주어 해결 가능
- 라운드 로빈 : 정해진 시간만큼 cpu자원을 사용하고나면 반납한 뒤 다시 대기 큐의 맨 뒤로 돌아가는 것. 공정한 스케쥴링 방식으로 볼 수 있지만, 단위시간을 너무 짧게할 경우 잦은 context switching으로 인한 성능저하가 발생할 수 있고, 너무 길게할 경우 FCFS와 같은 동작을 하게 된다.
동기와 비동기, 블로킹과 논블로킹의 차이는 무엇인가요?
작업을 수행하는 두 개 이상의 주체가 서로 동시에 수행되거나, 동시에 끝나거나, 끝나는 동시에 시작되는 경우 동기 작업이라고 부르며, 서로 관계 없이 별도로 시작/종료될 때를 비동기라 한다. 즉, 호출한 함수가 호출된 함수의 작업여부를 신경쓰느냐의 차이이다.
블로킹과 논블로킹은 다른 작업을 수행하는 주체를 어떻게 상대하는지에 따라 나뉜다. 다른 주체가 하는 작업을 기다렸다가 다시 자신의 작업을 한다면 블로킹이고, 관계 없이 자신의 작업을 그대로 한다면 논블로킹이다. 즉, 호출된 함수가 호출한 함수를 다른 일을 할 수 있게 해주느냐 아니면 대기하게 만드느냐의 차이이다.
- 동기 + 블로킹 : jdbc를 이용해 db에 쿼리를 날린다, 메서드에서 다른 메서드를 호출하여 결과값을 받아올 때.
- 비동기 + 블로킹 : 결국 다른 작업이 끝날 때 까지 기다려야하므로 동기+블로킹과 비슷함. 비동기+논블로킹 작업을 호출하고 자신의 작업을 하던 중 호출한 작업의 결과를 조회하려고 했을 때.
- 동기 + 논블로킹 : 논블로킹으로 자신의 작업을 계속 하고 있지만, 다른 작업과의 동기를 위해 계속해서 조회하는 경우. polling
- 비동기 + 논블로킹 : 다른 주체에게 작업을 맡겨놓고 자신이 하던 일을 계속하는 것으로, 작업이 대규모이고 동기가 필요하지 않은 경우 효율적.
참고문헌
www.crocus.co.kr
dailyheumsi.tistory.com
https://stackoverflow.com/questions/15601155/does-linux-schedule-a-process-or-a-thread
Leave a comment