Linux 11

DBus Policy 적용 규칙/범위/단위 분석

dbus-daemon은 policy 관련한 룰을 파싱해 들고 있으면서 해당 policy들을 request들에 대해서 적용한다.sender receiver 간에 어떻게 rule을 적용하게 되는지 알아보자.busname 단위로 conf 파일 rule과 매칭이 되는 것으로 보임(좀 더 분석 예정)dispatch란? dbus-daemon으로 들어온 DBusMessage하나를 적절한 수신자에게 routing 하는 절자.1. bus_client_policy_check_can_send()는 sender가 보낼 수 있는지에 대한 rule 검사.BusResultbus_client_policy_check_can_send (DBusConnection *sender, ..

Linux 2025.05.21

RPM build .pc 파일과 pkgconfig 의존성 정리

보통 A.rpm 패키지가 빌드될 때, foo.rpm 패키지에 의존성이 걸리면(foo가 설치되어야 A가 설치되어야 한다면)다음과 같은 방법으로 A.spec 파일에 룰이 작성된다. BuildRequires: pkgconfig(foo)=> 빌드할때 foo.pc 파일이 필요하니 알아서 해당 .pc가 들어있는 devel 패키지를 깔아 달라는 뜻.=> 참고로 pkgconfig(foo)는 foo.pc가 들어있는 devel 패키지를 가리키는 이름.위의 행위는 이를 만족시키는 foo-devel이 설치된다. foo-devel이 설치되는 것은 어떤 의미인데?devel이 붙는 패키지는 개발용 패키지임.좀 더 정확하게 말하자면 foo-devel.rpm 은 아래의 파일들이 정의된다.1. 헤더 파일(/usr/include/foo/..

Linux 2025.05.15

File descriptor란? process 간 공유에 대하여

File descriptor란?- 유닉스 및 리눅스에서 파일, 소켓, 파이프, 장치 등과 같은 I/O 리소스를 나타내는 정수(integer) 핸들.커널이 프로세스마다 관리하는 fd 테이블이 있고, 이 fd 는 특정 항목을 참조하는 인덱스 역할을 함.기본적으로 모든 프로세스에서 아래와 같은 fd가 설정된다.fd 값설명0표준 입력(stdin)1표준 출력(stdout)2표준 에러(stderr) 예제)#include #include #include int main() { int fd = open("test.txt", O_WRONLY | O_CREAT, 0644); // open()으로 파일을 열면 fd가 반환됨. if (fd == -1) { perror("open"); ret..

Linux 2025.03.15

리눅스 스터디 #8 메모리 계층

캐시 메모리CPU 동작을 단순히 표현하면 다음과 같은 동작의 반복이다.1. 명령을 읽고 명령 내용에 따라 메모리에서 레지스터로 데이터를 읽음2. 레지스터에 있는 데이터를 가지고 계산3. 계산 결과를 메모리에 다시 저장 레지스터에서 처리하는 계산 시간에 비하면 메모리 접근 속도는 매우 느림. 예를 들어 레지스터 계산이 1회당 약 1 나노초 미만일때, 메모리 접근은 1회당 수십 나노초가 걸린다. 위의 처리 2번이 아무리 빠르더라도 1, 3번 메모리 read/write에서 병목 현상이 일어나서 전체 처리 속도가 느려지는 것이다.해당 문제를 해결하기 방법으로 캐시 메모리가 있다. 일반적으로 캐시 메모리는 CPU 내부에 존재하는 고속 기억장치이다. 캐시 메모리에 접근하는 속도는 일반 메모리에 접근하는 속도에 비해..

Linux 2025.01.19

리눅스 스터디 #7 파일 시스템

대부분의 저장 장치는 파일 시스템을 통해 접근한다.파일 시스템이 없다면? 데이터를 디스크 어떤 위치에 저장할지 직접 정해야하고, 다른 데이터를 훼손하지 않도록 영역 관리, 나중에 다시 읽어오기 위한 위치, 사이즈, 배치등을 기억해야한다.파일 시스템은 이러한 정보들을 대신해서 관리해준다.아래와 같이 사용자가 발표자료 0 - 10GiB의 데이터를 요청했다고 가정하자.사용자 모드커널 모드하드웨어프로세스(발표 자료 10기가 데이터 요청, 시스템 콜 호출)파일 시스템 코드(하드웨어 저장 장치 검색, 읽기, 사용자에게 넘기기)발표 자료 관련 data 저장되어 있음파일 형식으로 데이터를 관리하는 저장 장치의 영역(관리 영역) + 저장 영역을 다루는 처리(파일 시스템 코드) 양쪽을 합쳐서 파일 시스템이라고 부른다. 리..

Linux 2025.01.19

리눅스 스터디 #6 장치 접근

프로세스가 장치 접근을 직접 하지 못하는 이유여러 프로그램이 동시에 장치를 조작한다면, 예상할 수 없는 방식으로 작동할 위험성이 있다.원래라면 접근해서는 안되는 데이터를 훼손하거나 훔쳐 볼 위험성이 있다.따라서 프로세스 대신해서 커널이 장치에 접근하는데, 다음과 같은 인터페이스를 사용한다.디바이스 파일이라는 특수한 파일을 조작한다.블록 장치에 구축한 파일 시스템을 조작한다.네트워크 인터페이스 카드는 속도 등의 문제로 디바이스 파일을 사용하는 대신에 소켓 구조를 사용한다.디바이스 파일디바이스 파일은 장치마다 존재한다. 예를 들어 저장 장치라면 /dev/sda나 /dev/sdb 같은 파일이 디바이스 파일이다. 리눅스는 프로세스가 디바이스 파일을 조작하면 커널 내부의 Device driver라고 부르는 소프트..

Linux 2025.01.19

리눅스 스터디 #5 프로세스 관리(응용)

빠른 프로세스 작성 처리 fork() 함수 고속화: 카피 온 라이트fork() 함수를 호출할 때 부모 프로세스의 메모리를 자식 프로세스에 모두 복사하는 것이 아니라, 페이지 테이블만 복사한다. 페이지 테이블 엔트리 내부에는 페이지에 쓰기 권한을 관리하는 필드가 있는데 이때 부모와 자식 양쪽을 대상으로 모든 페이지에 쓰기 권한을 무효화 한다. 부모 프로세스의 페이지 테이블가상 주소물리 주소쓰기 권한0 - 100500 - 600X100 - 200600 - 700X 자식 프로세스의 페이지 테이블가상 주소물리 주소쓰기 권한0 - 100500 - 600X100 - 200600 - 700X 이후, 메모리를 읽을 때 부모와 자식 사이에 공유된 물리 페이지에 접근 가능하다. 그러다 둘 중 하나가 data를 갱신하려고 ..

Linux 2025.01.19

리눅스 스터디 #4 메모리 관리 시스템

메모리 관리 정보 수집하기시스템에 설치된 메모리 용량, 사용 중인 메모리 용량은 free 명령어로 확인이 가능하다.$ free total used free shared buff/cache availableMem: 7729028 1552460 4177240 536648 1999328 5375580Swap: 0 0 0free 명령어를 통해 얻은 정보는 아래와 같다.필드명의미total시스템에 설치된 전체 메모리 용량.free명목상 비어 있는 메모리(자세한 건 available 참고)buff/cache버퍼, 캐시, 페이지 캐시가 이용하는 메모리. 시스템의..

Linux 2025.01.19

리눅스 스터디 #3 프로세스 스케줄러

프로세스 스케줄러리눅스 커널에서 프로세스에 CPU 자원할당을 담당한다.하나의 논리 CPU는 동시에 하나의 프로세스만 처리한다.실행 가능한 여러 프로세스가 타임슬라이스 단위로 순서대로 CPU를 사용한다.논리 CPUprocess0 동작process1 동작process2 동작process0 동작..경과시간 사용시간경과시간이란? 프로세스 시작 ~ 종료까지 경과된 시간.사용시간이란? 프로세스가 실제로 논리 CPU를 사용한 시간.time 명령어를 통해 프로세스 경과시간, 사용시간을 알 수 있다. 아래와 같이 사용time ./doSomething.pyreal 0m2.357suser 0m2.357ssys 0m0.000s 여기서 real -> 경과 시간, user + sys 는 사용시간이다. user는 사용자 공간에서 ..

Linux 2025.01.19

리눅스 스터디 #2 프로세스 관리

프로세스 생성 새로운 프로세스를 생성하는 목적은 무엇일까?목적 1. 동일한 프로그램 처리를 여러 프로세스에 나눠서 처리하기 ex) 웹서버에서 다수의 요청 받기목적 2. 다른 프로그램을 생성하기 ex) bash에서 각종 프로그램을 새로 생성프로세스 생성을 실제로 실행하는 방법으로 리눅스는 fork(), execve() 함수를 사용한다. 내부적으로는 각각 clone(), execve() 시스템 콜을 호출한다.목적 1이라면 fork()만 사용, 목적 2라면 fork(), execve() 둘 다 사용한다. 같은 프로세스를 두 개를 분열시키는 fork() 함수부모 프로세스가 fork() 함수 호출커널이 부모 프로세스 메모리를 자식 프로세스 쪽에 복사1) 부모 프로세스가 fork()에서 복귀2) 자식 프로세스가 f..

Linux 2025.01.19