본문 바로가기

CS

(20)
동시성 이슈 동기화는 근본적으로 어려운 문제라고 한다. 어떤 종류의 동시성 흐름이 공유 자원을 조작할 때 발생하는 일반적인 이슈들을 정리해 보자. 스레드 안전 (Thread safety) 쓰레드로 프로그래밍할 때, 스레드 안전성이라고 부르는 특성을 가지는 함수를 작성하도록 유의해야 함. 다수의 동시성 스레드로부터 반복적으로 호출될 때 항상 정확한 결과를 만드는 경우에만 스레드-안전이라고 한다. 병렬 프로그램에서는 단순히 lock만 신경 쓴다고 해결되지 않는 다고 한다. 만일 어떠한 함수가 스레드 안전하지 않다면 이것은 thread-unsafe라 한다. 스레드-위험한 함수의 네 가지 클래스를 다음과 같이 식별할 수 있다. 클래스 1: 공유 변수를 보호하지 않는 함수들 예를 들어 보호되지 않는 전역 변수를 증가시키는 경..
Nonlocal jumps c에서 비지역성 점프라고 부른 사용자 수준의 예외적 제어 흐름의 형태를 제공하며, 이것은 보통의 콜-리턴 순서를 통할 필요 없이 하나의 함수에서 현재 실행하고 있는 다른 함수로 제어를 이동한다. 비지역성 점프는 setjmp와 longjmp함수로 제공한다. setjmp함수는 현재 호출하는 환경을 jmp_buf 타입의 버퍼에 저장해서 후에 longjmp가 사용되며 0을 리턴한다 호출하는 환경은 프로그램 카운터, 스택 포인터, 범용 레지스터를 포함한다. 책에서는 이런 식으로 설명해 주는데, 찾아보니 goto함수는 함수의 범위를 넘어서 이동할 수 없는 제약이 있다고 한다. jmp_buf는 아키텍처별 정보를 담는데 x86의 경우에는 레지스터 정보를 담기 위해 6 개의 정수로 이뤄진다. setjmp() 최초 호출시..
Volatile 지정자 시그널 핸들러 관련해서 CS:APP 책을 읽다가 Volatile 지정자를 쓰는 이유가 정확히 와닿지 않아서 정리해보려고 한다. 검색하면 알 수 있듯이 volatile 지정자는 사용할 때마다 항상 메모리에 접근한다. 이 변수는 언제든 값이 바뀔 수 있으니 메모리에 항상 접근하라고 컴파일러에게 알려주는 것이다. 간단한 예시를 들어서 설명해보자면 int i=10; while (i
dup, dup2 , 파일 서술자 복제 함수 네트워크 공부를 하다가 cgi 프로그램에서 표준 출력으로 컨텐츠를 전송하는 방식으로 구현된다고 나와있었다. 궁금해서 dup2에 대해 찾아봤다. dup 와 dup2는 파일 디스크립터를 복사하는 시스템 콜이다. #include int dup(int fd); dup는 fd로 받은 파일 서술자를 복제하여 반환하는데 사용되지 않은 가장 낮은 서술자를 반환합니다. #include int dup2(int src, int dst); 매개변수만 보면 src를 dst로 옮기는 것 같은데, dup2는 dst가 가리키는 출력을 src로 바꾸는 함수다. 예를 들어 dst가 1이라면 stdout의 결과가 src에 출력이 되는 것이다. 위의 내용을 정리해서 cgi 프로그램 이야기를 다시 하자면, CGI 프로그램이 클라이언트에 보낼..