커널

포스트: 228|조회수: 0|CIVILIZATION
Items

Posts

228 posts
[라즈베리파이] 워크큐(Workqueue) - 워크를 워크큐에 어떻게 큐잉할까?(2)

[라즈베리파이] 워크큐(Workqueue) - 워크를 워크큐에 어떻게 큐잉할까?(2)

Guillermo Austin Kim|2018년 9월 9일

From: 워크를 워크큐에 어떻게 큐잉할까?(1)에서 계속... 이번에는 28줄 코드를 보겠습니다.28last_pool = get_work_pool(work);struct work_struct 구조체인 work 변수로 get_work_pool() 함수를 호출해서 struct worker_pool 구조체 주소를 last_pool 지역변수로 읽습니다. get_work_pool() 함수는 조금 후 분석할 예정입니다. 이 코드만 보면 이해하기 쉽지 않으니 다음 그림을 같이 보겠습니다. 워크를 실행한 적이 있으면 struct work_struct.data 란 멤버 변수에 풀워크 주소를 저장합니다. get_work_pool() 함수는 위 그림에서 [1],[2] 번호와 같이 동작하면서 워커풀 주소를 가져옵니다.

[라즈베리파이] 워크큐(Workqueue) - 워크를 워크큐에 어떻게 큐잉할까?(1)

[라즈베리파이] 워크큐(Workqueue) - 워크를 워크큐에 어떻게 큐잉할까?(1)

Guillermo Austin Kim|2018년 9월 8일

워크를 초기화만 하면 워크를 실행할 수는 없습니다. 우선 워크를 워크큐에 큐잉해야 워커 쓰레드는 워크를 실행할 수 있습니다. 이번절에서는 워크를 워크큐에 큐잉하면 워크큐 전체 흐름으로 어떤 동작을 하는지 알아 보겠습니다. 워크 초기화는 struct work_struct 타입 변수를 INIT_WORK() 함수에 전달하거나 DECLEAR_WORK() 함수로 struct work_struct 변수를 선언하면 됩니다. 이 워크를 워크큐를 큐잉하려면 struct work_struct 타입 변수를 schedule_work()이라는 함수에 파라미터로 전달하면 됩니다. 이번에는 워크를 워크큐에 큐잉하는 코드는 다음과 같습니다.[https://elixir.bootlin.com/linux/v4.14.43/source/d

[라즈베리파이] 커널동기화 - 임계영역(Critical Section)이란

Guillermo Austin Kim|2018년 9월 7일

리눅스 커널이나 운영체제에서 임계영역(Critical Section)이나 커널 동기화를 설명할 때 화장실을 예를 많이 듭니다. 하나밖에 없는 화장실 문에 있는 자물쇠를 잠그고 용무를 보는 상황입니다. 위 상황을 리눅스 커널 동기화 과정과 빗대서 생각해 봅시다. 첫 번째, 자물쇠는 화장실 문에 있는 잠금장치입니다. 누구나 화장실에 들어갈 때 화장실 문을 잠급니다. 화장실에 들어갈 때 먼저 화장실 문에 있는 자물쇠가 잠겨 있나 확인하는 습관입니다. 화장실 잠금장치는 여러 가지 종류가 있듯 리눅스 커널에도 스핀락, 뮤텍스 기법에 따라 자물쇠 잠금 방법이 다릅니다. 두 번째, 화장실에서 용무는 딱 한 사람만 볼 수 있습니다. 화장실에서 두 사람이 동시에 들어갈 수 없습니다. 유일하게 한 사람이 일을 보는 순

[라즈베리파이]워크큐(Workqueue) - 워크 초기화는 어떻게 하나

Guillermo Austin Kim|2018년 9월 5일

워크를 실행하기 위해서 먼저 워크를 초기화해야 합니다. 워크를 초기화하기 위해서 INIT_WORK() 혹은 DECLARE_WORK() 매크로를 써야 합니다. INIT_WORK() 매크로는 함수가 실행할 때 워크를 동적으로 초기화하고 DECLARE_WORK()은 컴파일이 될 때 전역 변수로 워크를 설정합니다. 두 매크로를 쓰면 워크를 어떻게 초기화하는지 드라이버 코드를 확인하겠습니다. 첫 번째로 INIT_WORK() 매크로로 워크를 초기화하는 방법입니다. 다음 4번째 줄 코드를 보겠습니다.1 void tty_buffer_init(struct tty_port *port)2 {3 struct tty_bufhead *buf = &port->buf;..4 INIT_WORK(&buf->wo