일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 메카님
- Double free
- 유스케이스
- sampling theory
- pdlc
- dtft
- dirty cow
- 게임개발
- Race condition
- TSet
- linear difference equation
- frequency-domain spectrum analysis
- 배경 그림
- 언리얼엔진
- 유니티
- stride
- Rr
- CTF
- Security
- STCF
- Unity #Indie Game
- RBAC
- MLFQ
- 운영체제
- MAC
- ret2libc
- 게임 개발
- AINCAA
- DP
- DSP
- Today
- Total
목록운영체제 (30)
다양한 기록
컨커런시 버그 (타이밍 버그)발생할 수도 있고 아닐 수도 있음 종류논 데드락 버그원자성 위배- 스레드들이 동시에 동작할 경우 문제가 됨- 락으로 해결 오더링 문제- 특정 스레드 이후에 실행되는게 보장되어야 문제가 없는 경우- 조건변수나 세마포 사용데드락 (교착 상태)2개 이상의 스레드가 발생하지 않을 사건을 기다리게 되는 사건 4가지 조건을 모두 만족해야 발생1. Mutual exclusion2. Hold-and-Wait3. No preemption for resource4. Circular wait 데드락의 대처1. 데드락 예방2. 데드락 회피3. 데드락 발견 및 회복 데드락 예방1. Hold-and-Wait 없애기모든 락을 한번에, 원자적으로 잡아야 함-> 큰 락을 잡고 락1, 락2.. 를 잡을 수 ..
락을 위해서도 조건변수를 위해서도 사용 가능 sem_init(semaphore, p_shared, initial_value) semaphre : 사용할 세마포 p_shared : 프로세스 간 쉐어, 안하면 0으로 설정하면 됨 initial_value : 이걸 어떻게 사용할 건지에 따라 바이너리 세마포, 카운팅 세마포. 사용법이 다름 int sem_wait(sem_t *s) // 세마포의 값을 1 내리고 음수면 웨이트 int sem_post(sem_t *s) // 세마포의 값을 1 올리고 대기 중인 스레드 하나 꺠우기 두 함수를 사용해서 세마포 사용 sem_t m; sem_init(&m, 0, 1); sem_wait(&m); // critical section sem_post(&m); 락으로 사용하는 경우..
락은 상호배제를 위해서 조건변수는 동기화를 위해서 void *child(void *arg) { printf("child\n"); return NULL; } int main(int argc, char *argv[]) { printf("parent: begin\n"); pthread_t c; pthread_create(&c, NULL, child, NULL); printf("parent: end\n"); return 0; } 부모 스레드와 자식 스레드 중 무엇이 먼저 끝날지 알 수 없음. volatile int done = 0; void *child(void *arg) { printf("child\n"); done = 1; return NULL; } int main(int argc, char *argv[])..
Cuncurrent Counters typedef struct __counter_t { int value; } counter_t; void init(counter_t *c) { c->value = 0; } void increment(counter_t *c) { c->value++; } void decrement(counter_t *c) { c->value--; } int get(counter_t *c) { return c->value; } Traditional 방식 락을 사용하지 않는 카운터: 레이스 컨디션에서 부정확함 typedef sturct __counter_t { int value; pthread_mutex_t lock; } counter_t; void init(counter_t *c) { c->..
락: 상호배제를 위한 API 이걸 어떻게 구현할 것이냐?.. 실제로는 하드웨어와 OS의 협업 1. 인터럽트로 2. 소프트웨어만 only approach 3. 소프트웨어가 하드웨어와 협업 락의 평가 방법 1. 정확성 : 상호 배제가 보장되는가 2. 공정성 : 기아 상태에 빠지는 스레드가 없는가 3. 성능 : 락, 언락에 의한 오버헤드나 낭비가 없는가 락 사이즈 이슈. 여러 공유 자원이 있을 때 Coarse-grained lock : 하나의 락으로 보호 - 장점: 심플 - 단점: 병행성이 별로 Fine-grained lock : 각각을 보호하는 락 - 장점: 병행성 굿 - 단점: 복잡 실제 락의 구현 1) Disable Interrupt void lock() { DisableInterrupts(); } vo..
스레드: 제어의 흐름 프로세스: 제어의 흐름 + 수행을 하기 위한 자원 멀티 스레드 프로세스: 제어의 흐름들 + 수행을 하기 위한 자원 -> 자원의 공유가 발생, 경쟁. 컨커런시 제어 필요 컴퓨터 자원 - CPU(레지스터) - 어드레스 스페이스 (코드 데이터 스탭 힙) - 파일 어떻게 이런 자원을 관리하느냐 프로세스 모델 - 배타적으로 자원을 사용 - fork는 모든 자원을 다 새로 만듦 스레드 모델 - 필요한 자원들 중 몇몇만 공유, CPU나 스택은 따로 가짐 - 공유: 코드, 데이터, 힙, 파일 당연히 스레드가 더 빠르고, 공유하는 측면에서도 스레드가 좋음 -> 속도가 유리 프로세스는 한 프로세스가 죽어도 다른 프로세스에 영향을 안끼치지만, 스레드는 같은 프로세스 내 한 스레드가 죽으면 다 죽음 ->..
멀티 프로세스 멀티 코어 프로세서: 칩, 소켓 멀티 코어: 한 프로세서에 여러 개의 코어 멀티 프로세서: 여러 개의 프로세서 모던 컴퓨터는 멀티코어.. 이제 많아서 매니 코어라고도 하는데, 하이퍼스레딩까지 문제. 패럴랠 프로드램, 병렬 처리.. 어떻게 스케줄링 할 것인가(로드 밸런싱) 캐시: 작고 빠른 메모리. L1, L2, LLC.. 지역성(로컬리티) : 특정한 데이터가 많이 사용된다 시간적 지역성: 최근에 사용한 데이터를 많이 사용함 (반복문, 스택) 공간적 지역성: 어떤 데이터를 쓰면 그 주변 데이터도 많이 씀 (배열) -> 프로그램이 가지는 내재적 특성, 이걸 스케줄링 시 활용 CPU는 가능하면 메모리로 안내려가고 캐시에서 데이터를 가져오는게 좋음(캐시 히트) 그래서 라이트할 때도 지연 쓰기를 할..
비례 지분 자기 몫이 있고 몫에 맞도록 스케줄링하는 방법 CPU 타임 중 어느 비율만큼 가지는지 관심을 가집니다. 클라우드 시스템 같은 분야에서 관심이 있는 분야입니다. - 로터리 스케줄링 (Lottery Scheduling) - 각각의 잡이 티켓을 가지고, 그만큼 스케줄링 찬스가 많습니다. 난수를 생성하고 범위에 해당하는 티켓을 가진 잡이 스케줄링 됩니다. 예를 들어 잡 A가 75, B가 25만큼 가지고 있을 때 난수가 81이 생성되면 B가 실행될 것입니다. 초반에는 목표 지분과 다를 수 있으나 결국 원하는 비율이 맞춰집니다. 티켓 커런시 각 유저에게 자기 잡에게 로컬 커런시 할당은 자유롭게 할 수 있도록 하되, 각각의 글로벌 밸류는 비율에 맞게 존재한다 예를 들어 유저 A는 티켓 100장을 가지고 잡..