컴퓨터가 프로세스 여러개를 한번에 돌리는 멀티태스킹이 가능해지기 전까지 옛날 컴퓨터는 브라우저로 웹서핑을 하다가 원하는 파일을 다운받을 때 키보드 및 마우스가 눌리지 않아 아무것도 하지 못했다.
실행할 수 있는 파일, window의 경우 .exe가 뒤에 붙어 있는 파일을 프로그램이라고 한다. 이러한 프로그램을 실행시켜 돌아가고 있는 상태를 프로세스라고 한다. 위에 예시와 달리 오늘날 처럼 쾌적하게 컴퓨터를 사용할 수 있는건 운영체제가 여러 개의 프로세스를 함께 돌리고 있기 때문이다.
window의 경우 작업관리자(Ctrl + Alt + Del)를 확인해보면 많은 프로세스가 실행되고 있는지 확인할 수 있다.
여러개의 프로세스를 한번에 돌리는 작업은 동시적, 병렬적 혹은 둘다 혼합하여 이루어진다.
동시성은 프로그램 하나가 조금씩 여러 가지의 일을 하는 것을 말한다.
조금씩 작업을 하면서 다른 작업으로 이동하는(작업을 바꾸는) 과정을 Context Switching이라고한다.
병렬성은 프로세서 하나에 코어 여러개가 달려서 각각 동시에 작업들을 수행하는 것을 말한다.
컴퓨터는 이러한 방식으로 여러 개의 프로세스를 한 번에 돌릴 수 있게 되었다. 그러나 우리는 현재 브라우저에서 파일을 다운받는 동시에 웹 브라우저를 돌아다닐 수 있고, 유튜브 영상을 시청하면서 웹 서핑이 가능하다. 이렇게 한 프로세스 안에서도 여러 갈래의 작업들이 동시에 진행될 필요가 있는데 이 갈래를 Thread(스레드)라고 부른다.
프로세서를 요리사라 하고 대량주문이 오는 식당에서 끊임없이 만들어 내는 메뉴 하나하나를 프로세스라고 하자 컴퓨터는 프로세스마다 자원을 분할해서 할당한다.
경쟁상태(Race Condition)
- 여러 스레드 또는 프로세스가 동시에 공유 자원에 접근할 때, 접근의 순서에 따라 실행 결과가 달라지는 상황
- 이를 방지하기 위해 임계영역에 대한 접근은 언제나 상호 배제(Mutual Exclusion) 원칙에 따라 이루어져야 한다.
하지만 이 공유되는 자원들로 인해 동시성 제어와 자원의 동기화에 주의해야 한다. 예를 들어, 하나의 스레드가 공유 데이터를 변경하고 있을 때 다른 스레드가 동시에 같은 데이터에 접근하려고 하면 예상하지 못한 결과가 발생할 수 있다. 이를 방지하기 위해 뮤텍스(mutexes), 세마포어(semaphores), 모니터(monitors)와 같은 동기화 기술들이 사용된다.
물리적 스레드, 논리적스레드 ? 추상화
한줄 한줄 실행되지 않아 헷갈리는 비동기 코드를 쓰는 이유는 무엇인가?
-> 순서대로 하면 일을 하는 동안 기다려야 하는데 기다리는 시간동안 다른 일을 하기 위해서
Synchonized -> 순서대로 , 차례가 있는 부분 동기화 한다. -> 코드를 순서대로 작동하게 한다.
Deadlock(데드락) - 교착상태
여러 프로세스나 스레드가 서로 상대방이 가진 자원을 기다리며 무한히 대기하는 상태를 말한다.
- 교착 상태라고도 한다.
- 이 상태에서는 어떤 프로세스도 자신의 작업을 계속 진행할 수 없으며, 시스템의 일부분이 멈춰버리는 현상이 발생한다.
교착 상태는 한 시스템 내에서 네 가지 조건이 동시에 성립 할 때 발생한다.
데드락이 발생했을 때 이를 탐지하고, 해결하는 방법
데드락을 탐지한 후에는 프로세스를 종료하거나 할당된 자원을 강제로 회수하여 다른 프로세스에 할당하고 해당 프로세스를 일시 정지 시키는 등의 조치를 취할 수 있다.
대부분의 시스템은 교착 상태가 잘 발생하지 않으며, 교착 상태 예방, 회피, 탐지, 복구하는 것은 비용이 많이 든다
은행원 알고리즘(Banker's Algorithm)
E,J,Dijkstra가 제안한 방법으로 데드락 회피(Deadlock Avoidance)를 위한 알고리즘 중 하나디. 운영체제가 프로세스에 자원을 안전하게 할당할 수 있는지 결정하는 데 사용한다.
안전 상태(Safe State)
- 시스템이 현재의 자원 할당 상태에서 모든 프로세스가 최대로 요구할 수 있는 자원을 순서대로 할당해 줄 수 있는 상태
- 안전 상태는 시스템이 데드락 없이 모든 프로세스가 완료될 수 있음을 의미한다.
불안전 상태(Unsafe State)
- 안전 상태가 아닌 모든 상태
- 불안전 상태가 반드시 데드락을 의미하는 것은 아니지만, 데드락으로 이어질 가능성이 있다.
작동원리
안정 상태에 있으면 자원을 할당하고, 그렇지 않으면 다른 프로세스들이 자원을 해지할 때까지 대기한다. 교착 상태가 되지 않도록 보장하기 위하여 교착 상태를 예방하거나 회피하는 프로토콜을 이용하는 방법
은행원 알고리즘의 장점과 단점
결론
은행원 알고리즘은 이론적으로 데드락 회피에 매우 유용하지만, 실제 시스템에서는 자원 요구량의 불확실성, 알고리즘의 복잡성 등으로 인해 직접 적용되기보다는 다른 자원 관리 및 데드락 회피 기법과 함께 사용될 때 더 효과적일 수 있다.
뮤텍스(Mutex), 모니터(Monitor), 세마포어(Semaphore)
- 동시성 프로그래밍에서 사용되는 동기화 기법
- 여러 스레드나 프로세스가 공유자원에 동시에 접근할 때 발생할 수 있는 문제를 방지하기 위해 사용된다.
- 데드락 같은 문제를 방지하기 위해 필수적이다.
부동소수점과 그 오차
0.1 + 0.2 != 0.3 인 이유
0.1과 0.2 가 진짜 0.1과 0.2가 아니기 때문에 값이 다르게 나온다. 십진수의 0.1을 이진수로 나타내는 경우 -> 0.0001100110011.....(2)
0.1에 가까워질 뿐 맞아 떨어지지 않는다.
-> 2진법에서는 1/10이 무한소수가 된다.
고정소수점, 부동소수점
고정소수점은 가수와 지수 부분을 반으로 자른다?
그러면 소수가 긴 경우 제대로 표현할 수 없다.
부동소수점은 그 방식을 해결할 수 있다.
IEEE 754 방식
int와 integer 차이점
`int`와 `integer`는 프로그래밍 언어와 컨텍스트에 따라 다양한 의미를 가질 수 있지만, 일반적으로 두 용어는 정수형 데이터 타입을 지칭하는 데 사용됩니다. 그러나 `int`는 주로 원시 데이터 타입(primitive data type)을, `integer`는 래퍼 클래스(wrapper class)나 추상화된 정수 타입을 의미하는 경우가 많습니다. 여기서 구체적인 차이점을 몇 가지 예를 들어 설명하겠습니다.
### Java에서의 `int`와 `Integer`
- **`int`**: Java에서 `int`는 원시 데이터 타입으로, 32비트 정수 값을 저장하는 데 사용됩니다. `int`는 스택 메모리에 저장되며, 객체가 아니기 때문에 `int` 변수에는 정수 값만 저장할 수 있습니다. 또한, `int`는 null 값을 가질 수 없습니다.
- **`Integer`**: `Integer`는 `int`의 래퍼 클래스로, Java의 java.lang 패키지에 속해 있습니다. `Integer`는 객체이므로 힙 메모리에 저장되며, 이를 통해 `int` 값을 객체로 사용할 수 있습니다. `Integer`는 null 값을 가질 수 있으며, 클래스이기 때문에 메서드와 속성을 가질 수 있습니다. 예를 들어, `Integer` 클래스는 정수를 문자열로 변환하는 등의 유용한 메서드를 제공합니다.
### C와 C++에서의 `int`
- **`int`**: C와 C++에서 `int`는 원시 정수형 데이터 타입으로 사용됩니다. 이 언어들에서는 `int`에 대한 래퍼 클래스나 `integer`라는 명시적인 타입은 제공하지 않습니다.
### SQL에서의 `INTEGER`
- **`INTEGER`**: SQL에서 `INTEGER`는 정수형 컬럼을 정의하는 데 사용되는 데이터 타입입니다. 특정 데이터베이스 시스템에서는 `INT`와 `INTEGER`를 동의어로 사용하기도 합니다.
### Python에서의 정수
- **정수형**: Python에서는 `int`를 정수형 데이터 타입으로 사용합니다. Python 3 이상에서는 `int`와 `long`이 통합되어, 모든 정수는 단순히 `int`로 표현됩니다. Python에서는 `integer`라는 용어는 사용되지 않으며, 모든 정수는 `int` 타입입니다.
### 결론
`int`와 `integer`의 차이는 주로 사용되는 프로그래밍 언어와 컨텍스트에 따라 달라집니다. 일반적으로 `int`는 원시 데이터 타입을 의미하는 반면, `integer`는 객체 지향 언어에서 원시 `int` 타입의 값을 객체로 취급할 수 있는 래퍼 클래스나 추상화된 타입을 의미하는 경우가 많습니다.