개발
-
addr2line개발/삽질 기록 2018. 12. 22. 12:58
개발하다보면 에러가 발생한 물리 주소만 떡하니 알려주고 바이너리의 어떤 함수에서 죽었는지는 알려주지 않는 로그 메시지를 보게될 때가 있다. 이런 경우에는 addr2line 커맨드를 이용해 어떤 파일 몇번째 라인에서 에러가 발생했는지 확인 할 수 있다. 아래의 예제 코드를 통해 addr2line의 사용법을 익혀보자. void func(void) { } int main() { printf("func:addr %p\n", func); } 위 코드를 gcc에 -g 옵션을 주고 컴파일해서 실행해보면 특정 숫자 값을 출력하게 되는데 이 값은 func함수의 물리 주소 값이다. 이 값을 addr2line에 넣어서 실행해보면 func함수가 어떤 파일 몇번째 라인에 불렸는지 확인 할 수 있다. -e 옵션은 디버깅할 바이너..
-
QEMU를 이용해 커널 이미지 바꿔서 부팅해보기개발/가상화 2018. 12. 20. 22:20
전가상화를 지원하는 QEMU는 게스트 커널을 수정하지 않고 띄울수 있다는 장점이 있지만 virtio 같은 최적화 옵션을 사용하려면 커널의 일부 수정이 필요하다. 기존에 게스트 이미지에 내장된 커널을 수정하는 방법으로 가장 쉽게 떠올릴 수 있는 것은 게스트를 띄운 다음 이 안에서 커널 코드를 수정하고 빌드하는 것인데 답답한 게스트의 성능때문에 오래 걸리고 답답하다. QEMU에서는 이런 점을 고려해서 파라미터를 이용해 사용할 커널 이미지를 지정할 수 있도록 만들었다. 개발자는 호스트 PC 환경에서 게스트에서 사용할 커널 이미지를 빌드한 후 스크립트에 -kernel 파라미터로 지정하면 된다. #!/bin/bash DISK_PATH=. qemu-system-x86_64 \ -cpu host \ -smp 8 \ ..
-
JAVA 파일 생성/읽기/쓰기개발/기술 2018. 11. 25. 13:11
JAVA는 객체지향관점에 따라 시스템에 존재하는 파일이나 폴더를 하나의 객체로 보고 관리한다. 시스템 내에서 특정 위치의 파일을 읽거나 삭제 또는 생성하고 싶다면 해당 파일에 대한 객체를 생성해주면 된다. 파일 객체는 아래의 예제 코드처럼 파일 경로와 파일 이름을 생성자의 인자로 넣어주면 간단히 생성할 수 있다. File file = new File(filepath + File.separator + fileName); 1. 파일 유무 확인 및 생성 파일 객체 안에는 여러가지 함수가 있는데 가장 요긴하게 쓰이는 함수는 exists() 함수다. 주로 파일을 생성하거나 사용하기 전에 해당 위치에 파일 또는 폴더가 이미 존재하는지 아닌지를 확인할 때 사용한다. 아래의 코드는 파일의 유무를 확인하고 없는 경우 파..
-
스택, 힙, 코드, 데이터영역개발/기술 2018. 11. 10. 14:20
OS에서 프로세스가 바라보는 메모리 영역은 크게 코드(Code), 데이터(Data), 힙(Heap), 스택(stack) 영역으로 나뉘어진다. Code 영역 프로세스가 실행할 코드와 매크로 상수가 기계어의 형태로 저장된 공간이다. 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다. Data 영역 코드에서 선언한 전역변수 또는 static 변수 등등이 저장된 공간이다. 전역변수/static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다. 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은 Read-Write로 지정돼있다. 단, 초기화 되지 않는 전역 변수는 BSS 영역에 할당된다. Stack 영역 자료구조로 많이 알려진 Stack은 프로..
-
스핀락, 뮤텍스, 세마포어개발/컴퓨터사이언스 2018. 11. 7. 20:40
여러 개의 프로세스가 동시에 실행 할 수 있는 멀티 코어 환경은 사용자의 시스템 전반의 성능을 향상 시켜 주었지만 개발자들에게는 '프로세스간 공유 자원 접근 관리'라는 골치아픈 숙제를 남겼다. 다수의 컴포넌트가 공유중인 자원을 동시에 읽거나 수정할 때 생기는 문제들을 포괄해서 '동기화 문제'라고 하며 대부분의 소프트웨어는 스핀락, 뮤텍스, 세마포어라는 자료구조들을 이용해 해결 한다. 이번 포스트에서는 각 자료구조들의 작동 원리와 차이점에 대해서 정리해보려고한다. 스핀락 (spinlock) 특정한 자료구조를 획득(lock) 또는 해제(unlock) 함으로서 공유 데이터에 대한 접근 권한을 관리하는 방법이다. 권한을 획득하기 전까지 CPU는 무의미한 코드를 수행하는 busy waiting 상태로 대기하고 있..
-
FFmpeg개발/오픈소스 2018. 10. 31. 20:40
FFmpeg는 동영상업계에 종사하는 사람들이라면 아주 유명하고 지대한 영향력을 쥐고 있는 오픈소스 프로젝트다. FFmpeg의 영향력이 얼마나 막강한지 나무위키에서는 FFmpeg를 '마이크로소프트+애플 정도의 영향력을 가지고 있는 멀티미디어계의 최종 보스이며 갑자기 유료화를 시전한다면 내일부터 전세계 동영상 시청이 불가할지도 모른다'고 표현할 정도이니 FFmpeg을 접해보지 못한 개발자라면 오픈소스계에서 리눅스 커널과 거의 맞먹는 위상을 가지고 있다고 짐작해볼 수 있다. 실제로 사용해보면 FFmpeg가 왜 이렇게 막강한 영향력을 가지고 있는지 어느정도 짐작해볼 수 있다. 동영상에 간단히 수정할 일이 생겼다고 해보자. 평소 같으면 다음 팟플레이어, 곰인코더를 설치해서 깔고 버벅거리는 로딩바를 보며 힘겹게 작..
-
gcc로 pthread API 컴파일하기개발/삽질 기록 2018. 10. 30. 21:59
왠만한 C 코드들은 'gcc 파일명' 명령어로 빌드가 가능한데 코드 안에서 pthread API를 사용하고 컴파일을 하면 아래와 같은 에러 메시지가 나온다. kwony@kwony:~$ gcc thread.c thread.c:(.text+0x79): undefined reference to `pthread_create' thread.c:(.text+0xa9): undefined reference to `pthread_join' collect2: error: ld returned 1 exit status gcc 컴파일 스크립트에 디폴트로 pthread 라이브러리가 포함되지 않아서 발생하는 에러다. `-lpthread` 를 옵션으로 줘서 pthread 라이브러리를 포함시켜 빌드하면 해결 할 수 있다. gcc ..
-
RCU (Read-Copy Update)개발/컴퓨터사이언스 2018. 10. 30. 21:41
공유중인 값을 읽는 쓰레드와 업데이트하는 쓰레의 개수가 각각 하나인 경우에는 경우에는 spin_lock을 이용해도 별 어려움 없이 동기화 작업을 수행 할 수 있다. 그런데 값을 읽는 프로세스가 두개 이상이 될 때부터는 동기화 작업이 골치가 아파진다. 아래의 코드처럼 두개 이상의 쓰레드가 공유중인 val 값을 읽으려고 하고 한개의 쓰레드가 값을 업데이트 하고 있다고 해보자. 본래의 목적은 reader를 호출하는 thd[0]와 thd[1] 쓰레드가 writer를 호출하는 thd[2] 쓰레드가 업데이트 하는 값을 동일하게 읽는 것이었다. reader 두개를 writer보다 앞서서 생성한 덕분에 초반에는 어느 정도 동기화가 유지가 되겠지만 시간이 지나면서 쓰레드의 priority 값이 달라지게되고 어떤 기점에서..