안정성 vs. 자원 사용
: 시스템의 안정성이 매우 중요한 경우 -> 멀티 프로세스, 리소스가 제한적인 환경 -> 멀티 쓰레드가 더 효율적일 수 있다 구현의 복잡성
: 쓰레드는 공유 메모리로 인해 동기화 문제가 복잡해질 수 있음 -> 동시성 제어에 대한 이해가 중요함응답 시간
: 멀티 쓰레드는 context-switch가 빠름, 더 빠른 응답 시간을 요구하는 경우 유리함플랫폼 및 언어 지원
: 사용 중인 프로그래밍 언어나 플랫폼이 어느 쪽을 더 잘 지원하는지도 중요multiprocess
: 각 프로세스는 독립적인 메모리 공간, 한 프로세스가 다른 프로세스의 실행에 영향 미치지 않음 => 높은 안정성.
but, 프로세스 간의 통신(Inter-Process Communication, IPC) => 추가적인 오버헤드 발생, 큰 자원 사용
multi-thread
: 하나의 프로세스 내에서 여러 개의 공유 메모리를 통해 데이터 공유 -> 쓰레드 간의 통신 비용이 낮고 메모리 효과적으로 사용 가능.
but, 하나의 쓰레드가 다른 쓰레드에 영향 미칠 수 있음.
: 데드락 발생을 원천적으로 차단.
데드락 발생 4가지 조건(상호 배제, 점유 대기, 비선점, 순환 대기) 중 적어도 하나를 제거함으로써 데드락 방지.
-> 어떤 리소스 필요할 때 다른 프로세스에 의해 선점될 수 있다면 데드락 방지 할 수 있음.
: 시스템이 데드락 상태로 진입하는 것을 회피하는 전략.
시스템은 리소스 할당 결정 시 데드락의 가능성을 고려함.
예) Banker's Algorithm
=> 프로세스에 리소스를 할당하기 전에 안전 상태를 유지할 수 있는지 확인함. 만약 할당으로 인해 데드락이 발생할 위험이 있으면 리소스는 할당되지 않음.
: 시스템이 데드락을 탐지하고 이를 해결하기 위한 조치를 취하는 것 포함. 데드락 탐지는 주기적으로 리소스 할당 그래프를 검사하여 순환 대기 조건을 찾는 것으로 이루어질 수 있다. 데드락이 탐지되면 시스템은 프로세스를 중지하거나 리소스 할당을 롤백하여 데드락 해결
: 리소스의 상호 배제 조건 제거
예) 리소스가 복사 가능/공유 가능한 경우, 여러 프로세스가 동시에 해당 리소스를 사용할 수 있다. -> 데드락 발생 가능성을 줄일 수 있다.
동시성 관리하고 데이터 무결성 보장
Mutex(Mutual Exclusion)
: 공유 자원에 대한 접근을 단일 쓰레드에게만 허용.
주로 데이터 무결성을 보호하기 위해 사용.
한 번에 하나의 쓰레드만 공유 자원에 접근 가능.
소유권 개념을 갖고 있음
-> lock을 건 쓰레드만이 lock을 해제할 수 있음
Semaphore
비슷하지만, 한 번에 여러 쓰레드가 공유 자원에 접근 가능.
세마포어 값 -> 동시에 해당 자원에 접근할 수 있는 쓰레드의 최대 수
쓰레드가 자원을 사용할 때마다 감소, 자원을 해제할 때마다 증가
세마포어의 경우 Lock을 건 쓰레드와 lock을 해제하는 쓰레드가 다를 수 있다.
Mutex
-> 보다 엄격한 제어가 필요할 때 - 상호 배제 보장함.
Semaphore
-> 여러 자원에 대한 동시 접근을 허용할 때, 특히 Counting Semaphore
는 자원의 수량이 제한되어 있을 때 유용함.
#include <stdio.h>
int f(int x, int *py, int **ppz) {
int y, z;
**ppz +=1;
z = **ppz;
*py += 2;
y = *py;
x += 3;
return x + y + z;
}
int main() {
int c, *b, **a;
c = 4;
b = &c;
a = &b;
printf("%d\n", f(c, b, a);
return 0;
}
main()
c는 4,
b 는 c의 주소를 가리키는 포인터
, a는 b의 주소를 가리키는 이중 포인터이다.f(c, b, a) 호출
x는 4, py는 c의 주소를 가리키는 포인터,
ppz는 b의 주소를 가리키는 이중 포인터가 된다.
**ppz += 1
=> ppz 는 c의 값인 4를 가리킨다. += 1 => c의 값은 이제 5가 되고,
z= **ppz
=> z는 c의 값을 복사하게 되므로 5
*py += 2
=> py는 c의 주소를 가리킴, *py는 c의 값 5를 가리킴
=> c의 값은 이제 7
=> y는 c의 값을 복사하게 되므로 7이 됨.
x +=3
=> x의 값 4에 3을 더하므로 7임 !!답 => 5 + 7 + 7 = 19가 된다.
틀리게 생각한 부분)
c의 값이 최종적으로 7이 되는데 여기서 x += 3을 해주면 10이 된다고 생각했다.
하지만 x는 함수에 3을 전달되어 c의 값에는 영향을 주지 않는다.
-> py, ppz는 c의 주소를 갖고 있으므로 c의 값을 변경할 수 있다. -> c는 최종적으로 7의 값을 갖게 됨.
대상 문자열에서 패턴을 찾을 때 패턴의 오른쪽 끝에서 시작해서 왼쪽으로 검색을 진행한다.
bad character rule : 불일치가 발생한 문자를 찾아보고, 해당 문자가 패턴 내에 존재하지 않으면 전체 패턴을 불일치가 발생한 문자의 오른쪽으로 이동한다.
만약 불일치가 발생한 문자가 패턴 내에 존재하면 해당 문자를 기준으로 패턴을 이동시켜 불일치가 발생하지 않도록 한다.