본문 바로가기

전체 글

(117)
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
시그널 핸들러 작성하기 안전한 시그널의 처리 안전한 핸들러를 작성하는 보수적인 지침들을 알아보자 핸들러는 가능한 간단하게 유지하라 Call only async-signal-safe functions in your handlers. 안전한 함수는 재진입 가능하거나, 어떤 시그널 핸들러에 의해 중단될 수 없기 때문에 어떤 시그널 핸들러로부터 안전하게 호출될 수 있는 특성을 가짐 errno를 저장하고 복원하라, errno를 핸들러에 진입할 때 지역변수에 저장하고, 핸들러가 리턴하기 전에 복원함 전역 변수들은 volatile로 선언하라. 컴파일러는 레지스터에 캐시 되어 있는 g값을 사용해도 안전할 것처럼 생각해서 갱신 값이 안 보일 수가 있다.(자세한 이유는 여기로 --> https://kspsd.tistory.com/40) 정확한 ..
Exceptional control flow 줄여서 ECF 라 한다. 프로그램 카운터는 연속된 값들을 가정하고 움직인다. 특정 주소에서 다른 주소로의 전환을 control transfer라 한다. 가장 간단한 유형의 control flow는 점진적인 순서로 메모리에 있는 경우이다. 갑자기 인접해 있지 않은 명령어로 넘어가는 경우도 있는데, 이러한 경우들도 우리가 흔히 아는 jump, call, return 같은 인스트럭션들에 의해 발생한다. 그러나 시스템들은 또한 내부 프로그램 변수에 의해 표시되지 않으며, 프로그램 실행과는 반드시 관련되지 않은 시스템 상태 변화도 반응해야 한다. 예를 들면 하드웨어 타이머가 규칙적으로 꺼지는 것과 패킷들이 네트워크 어댑터에 도착하고 메모리에 저장되는 것과 같은 일들이다. 이와 같은 급격한 변화를 ECF라 한다. ..
백준 21610 마법사 상어와 비바라기 문제 https://www.acmicpc.net/problem/21610 21610번: 마법사 상어와 비바라기 마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기 www.acmicpc.net 마법사 상어와 파이어 볼을 풀고 심심해서 풀어봤는데, 단순한 구현 문제였다. 문제에서 말하는 조건만 잘 지키면 된다. 파이어 볼 때랑 비슷하게 체크해야 될 부분은 N행 또는 N열을 넘으면 다시 첫번째 열과 행으로 올 수 있으니까 나머지를 계산해서 바꿔 주면 된다. 소스코드 import sys input = sys.stdin.readline N, M = map(int, input().s..
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 프로그램이 클라이언트에 보낼..
네트워크 프로그래밍 (수정중) 네트워크 애플리케이션들은 동일한 기본적인 프로그래밍 모델에 기초하고 있다. 이들은 비슷한 전체 논리 구조를 가지며, 동일한 프로그래밍 인터페이스를 사용한다. 11.1 클라이 언트-서버 프로그래밍 모델 모든 네트워크 애플리케이션 프로그램은 클라이언트-서버 모델에 기초하고 있다. 클라이언트-서버 모델에서 근본적인 연산은 트랜잭션이다. 클라이언트-서버 트랜잭션은 4단계로 구성된다. (여기서 말하는 트랜잭션은 DB에서 말하는 트랜잭션과는 다르다. 단순한 수행한 일련의 단계를 의미함) 클라이언트가 서비스를 필요할 때, 한 개의 요청을 서버로 보내는 것으로 트랜잭션을 게시. 서버는 요청을 받고 해석후 자신의 자원들을 적절한 방법으로 조작. 예를 들어 웹 서버가 브라우저로부터 요청받으면 디스크 파일을 읽음 서버는 응..
copy on write 컴퓨터의 한정된 자원을 서로 다른 두 개의 프로세스가 공유할 때 유용하게 쓸 수 있다. 프로세스 2개가 있다고 해보자 private object는 공유 객체와 똑같은 방법으로 만들어지고, 두 개의 프로세스가 한 개의 사적 객체를 서로 다른 자신의 가상 메모리 영역으로 매핑하지만 객체의 동일한 사본을 공유하는 경우를 보여줌, area struct는 copy-on-write로 표시됨. 두 프로세스가 모두 자신의 사적 영역에 쓰려고 하지 않는 한, 이들은 물리 메모리에 단 한 개의 객체 사본을 계속 공유한다. 하지만 한 프로세스가 사적 영역 내의 일부 페이지에 쓰려고 하는 순간 쓰기 작업은 보호 오류를 유발한다 이때 오류 핸들러가 보호 예외가 발생한 것을 알고 새로운 물리 페이지에 새로운 사본을 만들고 , 페..