본문 바로가기

전체 글

[Linux Kernel] semaphore (3) - 수정, 테스트 해보기 패치를 작성하게 된 이유 semaphore를 분석하다가, struct semaphore의 lock이 좀 성긴 (coarse 한) 것 같아서, semaphore_waiter을 관리하는 락을 reader / writer 락으로 분리해서 성능을 테스트 해봤다. 락을 현재 획득한 프로세스가 writer, wait_list에서 대기중인 프로세스가 reader이므로 rwlock_t를 사용하면 더 빨라질거라고 생각했다. 패치 파일은 아래와 같다. benchmark 이 패치를 메인테이너한테 받아달라고 설득하려면, 이게 성능을 개선한다는 지표가 필요했다. 그래서 간단한 테스트 코드를 작성해보았다. 테스트는 make bzImage, make install로 이미지 설치, 빌드 후에 해당 커널로 부팅해서 모듈을 실행했다. .. 더보기
[Linux Kernel] semaphore (2) - semaphore 분석 semaphore의 매커니즘을 분석해보자. 아래 그림은 코드를 그림으로 옮긴 것이다. struct semaphore 이전 글에서 살펴본 semaphore 구조체다. 구조체 자체를 보호하기 위한 lock, lock을 획득할 수 있는 스레드 수를 나타내는 count, 대기중인 스레드를 나타내는 wait_list가 있다. /* Please don't access any members of this structure directly */ struct semaphore { raw_spinlock_tlock; unsigned intcount; struct list_headwait_list; }; struct semaphore_waiter semaphore 대기를 하기 위해 사용되는 자료구조이다. 매우 직관적이다. .. 더보기
[Linux Kernel] semaphore (1) - semaphore의 개념과 사용법 [kernel/locking] spinlock (1) - spinlock 사용법 앞선 글에서 lock이란 무엇이고, lock의 필요성에 대해서 알아보았다. 이번 글에서는 가장 기본적인 spinlock을 리눅스 커널에서 어떻게 구현했는지 알아볼 것이다. 우선 관련된 개념을 몇 가지 살펴 hyeyoo.com spinlock은 선점을 비활성화하고, 필요에 따라서 interrupt나 bottom half도 비활성화를 하므로 spinlock은 오랫동안 락을 들고있어선 안된다. 오랫동안 스케줄링과 인터럽트가 처리되지 않는다고 생각하면 정말 끔찍하다. spinlock은 그 특성상 락을 획득한 동안에는 sleep이 불가능하다. 이러한 상황에서는 spinlock 대신, "sleeping lock"인 semaphore를 .. 더보기
[Linux Kernel] proc 파일시스템과 seq_file 인터페이스 IT EXPORT, 리눅스 커널 프로그래밍을 읽고 있다. 책에서 다루는 커널 버전은 2.6인데 이걸 5.8에서 따라하려니 인터페이스가 많이 바뀌었다. 책 따라해보다 짜증나서 정리해보려고 한다. (아, 책은 정말 좋다.) 이 글은 5.8 기준으로 작성되었다. proc 파일시스템이란 procfs는 말 그대로 파일시스템이다. 하지만 디스크 기반 파일시스템과는 달리, 실제로 하드디스크 상에 존재하지는 않는다. 다만, 커널 상에서 VFS 인터페이스를 활용해 특수한 파일시스템을 구현한 것이다. procfs는 일반적으로 /proc에 마운트되어있다. 비슷하게 sysfs, debugfs 등이 존재한다. 한 번 쉘에서 /proc에 무엇이 들어있는지 확인해보자. ls /proc 숫자인 것과 아닌 것이 있다. 숫자된 폴더들은.. 더보기
[LInux Kernel] 문자 디바이스 드라이버 작성 디바이스 드라이버란 디바이스 드라이버란 마우스, 키보드, 모니터, 디스크, 네트워크 인터페이스 카드 등 컴퓨터의 주변 장치를 제어하기 위한 프로그램이다. 디바이스 드라이버가 없다면 주변 장치들을 사용할 수가 없다. read()라는 작업을 디스크 관점에서 어떻게 처리할 것인가?와 같은 하드웨어에 밀접한 기능들은 모두 디바이스 드라이버로 구현된다. 디바이스 드라이버는 리눅스 커널에서 모듈로 구현하므로, 먼저 리눅스 커널 모듈에 대해서 알아야 한다. 이건 글로 정리해두었다. 디바이스의 종류 디바이스는 문자 디바이스 드라이버, 블록 디바이스 드라이버로 나눌 수 있다. 문자 디바이스는 시간 순으로 들어오는 데이터를 처리한다. 예를 들어 마우스, 키보드의 입력과 같이 순서대로 처리하는 것이 의미가 있는 데이터들이다.. 더보기
[Linux Kernel] 가상 파일시스템이란 (VFS, Virtual Filesystem Switch) Virtual Filesystem이란 리눅스를 사용하면 다양한 형식으로 포맷된 디스크를 사용할 수 있다. 보통 리눅스어세는 ext2, ext3, ext4를 사용하지만 윈도우에서 사용하는 NTFS나 FAT같은 디스크도 사용할 수 있다. 그런데, 어떤 디스크를 사용하던간에 관계 없이 프로그램을 작성할 땐 open, read, write, close와 같은 시스템 호출을 사용해서 이 모든걸 처리할 수 있다. 지금은 이게 모두 당연하지만, 예전에는 그렇지 않았다. 실제 파일 시스템이 무엇이냐에 관계 없이 공통된 인터페이스 (open/read/write/close 등)로 접근하는 것은 매우 어려운 일이었다. 이렇듯 리눅스에서, 실제 파일시스템에 관계 없이 공통된 인터페이스로 파일시스템에 접근하도록 하는 계층을 가.. 더보기
[Linux Kernel] 리눅스 커널 모듈 작성 리눅스 커널 모듈이란 리눅스 커널 모듈은, 시스템에 설치된 커널 바이너리와는 다르게 동적으로 기능을 추가할 수 있는 오브젝트 파일이다. 예를 들어 커널에 어떤 기능을 추가하기 위해선 코드를 수정하고, 커널을 컴파일하고 설치한 후에 재부팅을 해야한다. 하지만 모듈로 작성하면 시스템이 실행중인 도중에도 동적으로 기능을 추가하거나 제거할 수 있다. 물론 모듈을 추가하거나 제거하려면 root 권한이 필요하다. 시스템 호출을 구현하거나, 문자/블록 디바이스 드라이버, 파일시스템 구현 등 다양하게 사용될 수 있다. 커널 모듈의 로딩과 언로딩 lsmod로 설치된 모듈을 확인하고, insmod로 모듈을 로드하고, rmmod로 모듈을 언로드할 수 있다. modprobe, depmod 등의 명령도 존재한다. 간단한 차이점.. 더보기
[kernel/locking] spinlock (2) - Test And Set, Ticket, ABQL, MCS [kernel/locking] - spinlock(1) 앞선 글에서, 아키텍처에 종속적인 부분을 제외하고 spinlock을 어떻게 사용하는지 이야기해보았다. 실제 아키텍처별로 구현된 spinlock 구현체를 보려면 일단 spinlock에 대한 개념들이 더 필요하므로 개념을 짚고 넘어가겠다. Test And Set (TAS) spinlock의 기본적인 구현은 lock을 획득할 수 있을 때까지 loop를 도는 Test And Set lock이라고 할 수 있다 // Test and Set lock pseudocode while (test_and_set(lock) == FAILED) { // spin } // 위의 while문이 끝나면 lock을 획득했다는 것이 보장된다. 여기서 test_and_set이란, 현.. 더보기