목록Fundamentals/OS (13)
다양한 범주의 병행성 문제 해결을 위해서는 락과 조건 변수가 모두 필요하다. Edsger Dijkstra는 세마포어 라는 다양한 동기화 관련 문제를 해결하는 기법을 탄생하였다. 세마포어는 락과 컨디션 변수로 모두 사용할 수 있다.세마포어 사용법세마포어는 정수 값을 갖는 객체로서 두 개의 루틴으로 조작할 수 있다.sem_wait() / sem_post() 이다.세마포어는 초기값에 의해 동작이 결정되기 때문에 값을 초기화 해야한다.#include 세마포어 s를 선언 후, 3번째 인자로 1을 전달하여 세마포어의 값을 1로 초기화sem_init()의 두번 째 인자는 0이다. → 같은 프로세스 내의 쓰레드 간에 세마포어를 공유한다는 뜻두번 째 인자에 다른 값을 넣어서 다른 프로세스 간에 동기화또한 제공 가능초기화..
쓰레드가 계속 진행하기 전에 어떤 조건이 참인지를 검사해야 하는 경우가 많이 있다. 예를 들어 부모 쓰레드가 작을 시작하기 전에 자식 쓰레드가 작업을 끝냈는지를 검사하기를 원할 수 있다(이 과정을 보통 join()이라 부른다). 그런 대기문은 어떻게 구현해야 할까?volatile int done = 0;void *child(void *arg) { printf("child\\n"); done = 1; return NULL;}int main(int argc, char *argv[]) { printf("parent: begin\\n"); pthread_t c; Pthread_create(&c, NULL, child, NULL); // 자식 생성 while (done == 0 ); // Spin printf("..
락(Lock)이란 무엇인가?락은 하나의 변수다. 사용 가능(available) 또는 사용 중(acquired)을 나타냄.소스 코드의 임계 영역을 락으로 둘러서 그 임계 영역이 마치 하나의 원자 단위 명령어인 것처럼 실행되도록 한다.사용 가능: 어느 스레드도 락을 보유하지 않은 상태사용 중: 단 하나의 스레드가 임계 영역에 들어가기 위해 락을 보유한 상태lock()/unlock()의 동작lock() 호출락이 비어 있으면 즉시 획득 → 해당 스레드는 임계 영역 진입 (진입 한 쓰레드를 락 owner라고 부름)이미 사용 중이면 임계 영역 안으로 진입하지 않고 대기(블록 혹은 스핀)unlock() 호출락을 해제 → 대기 중인 쓰레드가 있으면 그 중 하나가 락 획득프로그래머에 대한 이점쓰레드 스케줄링의 최소한 제..
쓰레드 vs 프로세스쓰레드는 어디서 명령어들을 불러 들일지 추적하는 프로그램 카운터(PC) 와 연산을 위한 레지스터들을 가지고있다.두 개의 쓰레드가 하나의 프로세서에서 실행 중이라면 실행하고자 하는 쓰레드 (T2) 는 반드시 문맥 교환(context switch)을 통해서 실행 중인 쓰레드 (T1) 와 교체되어야 한다.쓰레드 간의 문맥 교환은 T1이 사용하던 레지스터들을 저장하고 T2가 사용하던 레지스터의 내용으로 복원한다프로세스가 문맥 교환할 때 프로세스의 상태를 프로세스 제어 블럭 (PCB)에 저장하듯이, 쓰레드들의 상태를 저장하는 TCB가 필요하다.쓰레드는 프로세스와 달리 쓰레드 간의 문맥 교환에서는 주소 공간을 그대로 사용한다. 사용하고있던 페이지 테이블을 그대로 사용한다.쓰레드와 프로세스의 큰 ..
개요지금까지 가상 주소 공간이 비현실적으로 작아서 모두 물리 메모리에 탑재가 가능한 것으로 가정하였다. 사실 실행 중인 프로세스의 전체 주소 공간이 메모리에 탑재된 것으로 가정하고 있었다. 이 가정을 이제 완화한다. 다수 프로세스들이 동시에 각자 큰 주소 공간을 사용하고 있는 상황을 가정한다.메모리 계층에 레이어의 추가가 필요하다. 지금까지는 모든 페이지들이 물리 메모리에 존재하는 것을 가정하였다. 하지만 큰 주소 공간을 지원하기 위해서 하드 디스크 드라이브를 사용한다. 이제 메모리 계층에서 크고 느린 하드 디스크 드라이브가 가장 하부에 위치하고 그 위에 메모리가 있다.핵심 질문운영체제는 어떻게 크고 느린 장치를 사용하면서 마치 커다란 가상 주소 공간이 있는 것 처럼 할 수 있을까?왜 프로세스에게 굳이 ..
개요페이징은 상당한 성능 저하를 가져올 수 있다.페이징은 프로세스 주소 공간을 작은 고정 된 크기 로 나누고 각 페이지의 실제 위치를 메모리에 저장한다.핵심 질문주소 변환을 어떻게 빨리할 수 있을까?페이징에서 발생하는 추가 메모리 참조를 어떻게 피할 수 있을까?어떤 하드웨어가 추가로 필요할까?운영체제는 어떤식으로 개입하는가?TLB 의 등장운영체제의 실행 속도를 개선하려면 대부분의 경우 헤드위어로부터 도움을 받는다.변환-색인 버퍼(translation-lookaside buffer) 또는 TLB라고 부르는 것을 도입한다.TLB는 MMU의 일부로 자주 참조되는 가상 주소-실주소 변환 정보를 저장하는 하드웨어 캐시이다.가상 메모리 참조 시, 하드웨어는 먼저 TLB에 원하는 변환 정보가 있는지를 확인한다.만약 ..
개요운영체제는 거의 모든 공간 관리 문제를 해결할 때 두 가지 중 하나를 사용한다.우리가 가상 메모리의 세그멘테이션에서 보았듯이 가변 크기 조각을 분할하는 것이다.이 해결책은 태생적인 문제를 가지고 있다. 공간을 다양한 크기의 청크로 분할할 때 공간 자체가 단편화(fragmented) 될 수 있고, 할당은 점점 더 어려워진다.두 번째 방법인 공간을 동일한 크기의 조각으로 분할하는 것을 고려해볼 필요가 있다.이를 페이징(Paging)이라 부른다.이 각각의 고정 크기 단위를 페이지(Page) 라고 부르고, 물리 메모리도 페이지 프레임이라고 불리는 고정 크기의 슬롯의 배열이라고 생각한다. 이 프레임 각각은 하나의 가상 메모리 페이지를 저장할 수 있다.프로세스의 주소 공간을 몇개의 가변 크기의 논리 세그멘트(코..
메모리 관리 시스템모든 메모리 관리 시스템의 근본적인 측면, 구체적으로 빈 공간 관리에 관련된 문제를 논의 할 것이다.고정 크기 공간 관리메모리가 일정 크기로 나누어져있으면 리스트만 유지하다가 요청 시 첫번 째 블록을 반환하면 되어 간단가변 크기 공간 관리malloc/free나 세그멘테이션처럼 크기가 다양한 빈 공간들로 구성되면 외부 단편화가 발생총 빈 공간이 20바이트여도 10바이트짜리 두 개로 나뉘어 있으면, 15바이트 요청은 실패핵심 질문빈 공간을 어떻게 추적, 관리 할 것인가가변 크기 요구를 만족시키면서 단편화를 최소화 하려면 어떤 전략을 써야할 까?각 전략은 시공간 오버헤드가 어떻게 되는가?가정주로 사용자 수준 메모리 할당 라이브러리(예: malloc/free)의 역사와 기법에 초점을 맞춤voi..