목록CS/운영체제 (18)
빙응의 공부 블로그

📝서론 이제까지 쓰레드를 중심으로 병행 프로그램을 설명하였다. 인터넷 서버에서는 다른 스타일로 병행 프로그래밍을 하기도 한다. 이런 스타일을 이벤트 기반의 병행성이라고 부른다.예를 들어보면 node.js나 스프링의 WebFlux 같은 것들이다. 물론 시작점은 C와 유닉스 시스템이다. 핵심 질문 : 어떻게 스레드 없이 병행 서버를 개발할까? 📝기본 개념 : 이벤트 루프우리가 다룰 이벤트 기반 병행성은 특정 사건(이벤트)의 발생을 대기한다. 즉 사건이 발생하면, 사건의 종류를 파악한 후 I/O를 요청하고 추후 처리를 위해 다른 이벤트를 발생시킨다. 이게 전부다. 이제 이벤트 루프에 대해 알아보자while (1) { events = getEvents(); for (e in events) { proce..

📝서론 우리는 그동안 교착 상태에 초점을 맞춰서 오류를 해결했다.핵심 질문 : 일반적인 병행성 관련 오류들은 어떻게 처리하는가? 📝비 교착 상태 오류 원자성 위반 오류 "다수의 메모리 참조 연산들 간에 있어 예상했던 직렬성이 보장되지 않았다." 즉 코드의 일부에 원자성이 요구되었으나, 실행 시에 그 원자성이 위반되었다는 오류이다. 해결방법은 간단하게도, 락을 추가하여 원자성이 보장되어야 하는 부분에 락 변수를 획득하도록 하면 된다. 순서 위반 오류 "두 개의(그룹의) 메모리 참조 간의 순서가 바뀌었다."즉, A가 항상 B보다 먼저 실행되어야 하지만 실행 중에 그 순서가 지켜지지 않았다.해결방법은 또한 간단하다. 순서를 강제하면 된다. 컨디션 변수를 사용하면 된다. 📝교착 상태 오류 앞서 다룬 병..

📝서론 다양한 범주의 병행성 문제 해결을 위해서는 락과 조건 변수가 모두 필요하다.이번 장에서는 세마포어라는 동기화 기법을 알아보자 핵심 질문: 세마포어를 어떻게 사용하는가 락과 컨디션 변수 대신에 세마포어를 사용하는 방법은 무엇인가?세마포어의 정의는 무엇인가?이진 세마포어는 무엇인가?락과 컨디션 변수를 사용하여 세마포어를 만드는 것이 가능한가?그 반대로 세마포어를 사용하여 락과 조건 변수를 만드는 것이 가능한가? 📝세마포어 : 정의세마포어는 정수 값을 갖는 객체로서 두 개의 루틴으로 조작할 수 있다. POSIX 표준에서 이 두개의 루틴은 sem_wait()과 sem_post()이다. 세마포어는 초기값에 의해 동작이 결정되기에 사용전에 제일 먼저 값을 초기화해야한다. #include sem_ts..

📝서론 지금까지 락의 개념을 학습하면서 하드웨어와 운영체제의 적절한 지원을 통해 제대로된 락을 만드는 법을 알아보았다. 쓰레드가 계속 진행하기 전에 어떤 조건이 참인지 검사해야 하는 경우가 많다.예를 들어 부모 쓰레드가 작업을 시작하기 전에 자식 쓰레드가 작업을 끝냈는지 검사하기를 원할 수 있다.이런 경우 부모 쓰레드가 특정 조건이 참이 될때까지 잠자면서 기다리는 방법을 선택한다. 그렇다면 조건을 기다리는 법은 무엇일까?조건이 참이 될 때까지 회전을 하며 기다리는 것이 간단하지만 CPU 사이클 낭비가 심하다. 📝정의와 루틴들조건이 참이 될 때까지 기다리기 위해 컨디션 변수를 활용할 수 있다.컨디션 변수는 일종의 큐 자료 구조로서, 어떤 실행의 상태가 원하는 것과 다를 때 조건이 참이 되기를 기다리는 ..

📝서론 병행성에 대한 소개 이후 병행 프로그램의 근본적인 문제 몇 개를 살펴보았다. 여러 개의 명령어들을 원자적으로 실행해보고 싶지만 단일 프로세스의 인터럽트로 인해서 그렇게할 수 없다. 이 장에서는 임계 구역에서 상호 배제를 할 수 있는 것 중 하나인락(Lock)에 대해 알아보자 📝락 : 기본 개념예제를 위해 다음과 같은 임계 영역이 있다고 하자. 전형적인 예제인 공유 변수 갱신이다.banlance = balance + 1; 락은 하나의 변수로 사용한다. 이 락 변수는 락의 상태를 나타내며 사용 가능 상태 & 사용 중 상태가 있다.lock_t mutex; // 글로벌 변수로 선언된 락lock(&mutex);balance = balance + 1;unlock(&mutex); 📌 Pthread 락쓰레..

📝서론 지금까지 운영체제가 다루는 기본 개념들의 발전 과정을 살펴보았다. 하나의 물리적 CPU를 다수의 가상 CPU로 확장하여 마치 여러 개의 프로그램이 동시에 실행하는 듯한 착시를 만들었고 개별적인 프로세스가 모두 독립적으로 많은 가상 메모리를 가지는 것처럼 만들었다. 이번 장에서는 프로세스를 위한 새로운 개념인 쓰레드를 소개한다.프로그램에서 한 순간에 하나의 명령어만 실행하는 관점에서 벗어나 멀티 쓰레드 프로그램은 하나 이상의 실행 지점을 가진다. 차이점 1, 쓰레드의 주소 공간 공유와 동일한 값 접근 가능문맥 교환을 통해 실행중인 쓰레드가 교체할 때 쓰레드 제어 블록( thread control block, TCB)쓰레드 간의 문맥 교환은 주소 공간을 공유한다. 즉, 같은 주소 공간을 공유한 상태..