동기는 요청과 그 결과가 동시에 일어난다는 약속입니다. 요청을 하면 시간이 오래걸리더라도 요청한 자리에서 결과가 주어져야 합니다. 순서에 맞춰 진행된다는 장점이 있지만 여러가지 요청을 동시에 처리할 수 없습니다.
비동기는 요청과 결과가 동시에 일어나지 않을거라는 약속입니다. 하나의 요청에 따른 응답을 즉시 처리하지 않아도, 그 대기 시간동안 또 다른 요청에 대해 처리 가능한 방식입니다. 여러 개의 요청을 동시에 처리할 수 있는 장점이 있지만 동기 방식보다 속도가 떨어질 수 있습니다.
Blocking은 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것을 의미한다. 즉, 호출된 함수가 자신의 할 일을 모두 마칠때까지 제어권을 계속 가지고서 호출한 함수에게 바로 돌려주지 않는 상황을 의미한다.
Non-Blocking은 다른 주체의 작업에 관련없이 자신의 작업을 하는 것을 의미한다.
즉, 호출된 함수가 자신의 할 일을 모두 마치지 않았더라도 바로 제어권을 건네주어 호출한 함수가 다른 일을 진행할 수 있도록 해주는 상황을 의미한다.
init 프로세스는 최상위 프로세스로 부팅 시 가장 먼저 실행되어 시스템에 전반적인 설정을 초기화하는 프로세스입니다. 모든 프로세스의 init 프로세스의 자식 프로세스가 됩니다.
부모 프로세스는 1번 프로세스(init)를 제외한 프로세스가 다른 프로세스를 생성하고 '자식 프로세스'를 가지고 있는 프로세스입니다.
자식 프로세스는 부모 프로세스에 의해 생성된 프로세스로 작업을 완료하면 결과를 부모 프로세스에게 전달하고 종료합니다.
고아 프로세스는 자식 프로세스보다 먼저 부모 프로세스가 사라지거나 종료되었을 때 자식 프로세스가 고아 프로세스가 되어 최상위 계층인 init 프로세스가 관리하게 됩니다.
좀비 프로세스는 자식 프로세스의 종료 신호를 부모 프로세스가 처리하지 못할 경우 자식 프로세스가 좀비 프로세스가 됩니다. 실제로 사용되는 프로세스 공간이 작아지기 때문에 직접 종료해줘야 합니다.
데몬 프로세스는 사용자에게 특정 기능이나 서비스를 제공하는 프로그램입니다.
Race Condition(경쟁조건)은 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황을 말하며 공유 자원 접근 순서에 따라 실행 결과가 달라지는 상황을 말합니다.
Critical Section(임계 구역)이란 둘 이상의 스레드가 동시에 실행될 경우 생길 수 있는 경쟁 조건을 발생시킬 수 있는 코드 블록을 말합니다.
이러한 문제를 해결하기 위해서는 상호 배제(Mutual Exclusion)와 같은 동기화 작업을 사용합니다.
DeadLock(교착상태)은 두 개 이상의 프로세스가 서로의 작업이 끝나기만을 기다리고 있어 두 프로세스 모두 영원히 끝나지 않는 상황을 가리킵니다.
이 교착 상태의 4가지 필요조건은 다음과 같습니다.
1. 상호배제 : 한 리소스는 한 번에 한 프로세스만이 사용할 수 있다.
2. 점유와 대기 : 어떤 프로세스가 하나 이상의 리소스를 점유하고 있으면서 다른 프로세스가 가지고 있는 리소스를 기다리고 있다.
3. 비선점 : 프로세스가 태스크를 마친 후 리소스를 자발적으로 반환할 때까지 기다린다.
4. 환형 대기 : 점유와 대기 관계의 프로세스들이 원형으로 서로를 기다린다.
이 교착 상태를 해결할 수 있는 방법은 다음과 같습니다.
1. 방지 : 교착상태가 발생할 수 있는 요구조건을 만족시키지 않게 함으로써 교착상태를 방지한다.
2. 회피 : 교착상태가 발생할 가능성이 있는 자원 할당을 하지 않는다.
3. 탐지 및 회복 : 교착상태가 발생할 수 있도록 놔두고 교착상태가 발생할 경우 찾아내어 고친다.
"식사하는 철학자 문제"
다섯 명의 철학자가 원탁에 앉아 있고, 각자의 앞에는 스파게티가 있고 양옆에 포크가 하나씩 있습니다. 그리고 각각의 철학자는 다른 철학자에게 말을 할 수 없습니다. 이때 철학자가 스파게티를 먹기 위해서는 양 옆의 포크를 동시에 들어야 합니다. 철학자들은 다음의 과정을 통해 식사를 합니다.
만약 모든 철학자들이 동시에 자신의 왼쪽 포크를 잡는다면, 모든 철학자들이 자기 오른쪽의 포크가 사용 가능해질 때까지 기다려야 합니다. 그런데 모든 철학자들이 그러기에 이 상태에서는 모든 철학자가 영원히 3번 상태에 머물러있어 아무것도 진행할 수가 없게 되는데, 이것이 교착(Deadlock)상태입니다.
1) 5명 모두 자신의 왼쪽 포크를 들고 있으므로 '점유대기'
2) 남이 포크를 뺏어주지 않음 '비선점'
3) 서로 오른쪽 포크를 놓기만을 기다림 '환형대기'
4) 각 포크에 대해 한 사람만 들 수 있음 '상호배제'
해결을 위해서는 카운팅 세마포어를 사용해야 합니다. 방에 대한 입장 정원을 카운팅 세마포어로 설계해, 최대 4명만 들어온다면 방 안의 모든 사람들이 왼쪽 포크를 든다 하더라도 DeadLock이 일어나지 않습니다.
Mutex는 공유 자원에 대한 접근을 동시에 하나의 스레드만 가능하게 제한합니다. 즉, 뮤텍스는 동기화 대상이 하나인게 특징입니다. 한 프로세스에 의해 소유될 수 있는 key 기반으로 한 상호배제 기법이고 key에 해당하는 객체가 있으며 이 객체를 소유한 스레드와 프로세스만이 공유자원에 접근할 수 있습니다.
Semaphore는 사용하고 있는 스레드와 프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성합니자. 공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 스레드가 접근할 수 있으며, 각 프로세스는 세마포어 값을 확인하고 변경할 수 있습니다.
Ready Queue에 있는 프로세스 중, 다음에 CPU를 할당할 프로세스를 선택하는 알고리즘을 CPU Scheduling이라고 합니다.
만약 효율성을 추구할 경우
CPU 사용률과 처리율은 최대화,
반환 시간, 대기 시간, 반응 시간은 최소화하는 것이 바람직.
만약 공평성을 추구할 경우
각 기준에 있어서 최적의 평균값과 이들 간의 편차의 최소화를 함께 고려하여 스케줄러를 선정하여야 함
대화형 시스템의 경우
반응 시간의 편차가 적은 스케줄러를 선정하는 것이 좋음.
https://dev-coco.tistory.com/46
https://velog.io/@maketheworldwise/SyncAsync-BlockingNon-Blocking-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EC%9D%BC%EA%B9%8C
https://m.blog.naver.com/seonjun92/221674556435
https://brightstarit.tistory.com/10
https://velog.io/@ohsol/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81-%EC%A2%85%EB%A5%98%EC%99%80-%EA%B8%B0%EB%B2%95