Guillermo Austin Kim

Sources

Posts

998 posts

[라즈베리파이] 프로세스: 컨택스트 스위칭 이란

Guillermo Austin Kim|2019년 1월 9일

마운드에 A란 투수가 있습니다.마운드에는 투수 한 명만 공을 던질 수 있습니다. 그런데 마운드에 오르고 싶어하는 B, C란 투수가 불펜에서 몸을 풀고 있습니다. 감독은 마운드에서 혼자 공을 던지고 있는 A란 투수가 불펜에 있는 B, C 투수보다 잘 던지는지 꾸준히 모니터링합니다. 시간이 흘러 감독이 B란 투수틀 마운드에 올려야 겠다고 결단을 내렸습니다. 감독은 마운드에 있는 A 투수를 마운드에서 내리고 B 투수를 마운드에 올립니다. 컨택스트 스위칭에 대한 이해를 돕기 위해 잠깐 야구에서 투수 교체에 대해 설명을 했습니다. 그럼 다시 컨택스트 스위칭에 대한 설명으로 되돌아 가겠습니다. 사용자 입장에서 컴퓨터나 휴대폰에서 여러 프로그램을 동시에 실행할 수 있습니다.프로그램을 구성 중인 프로세스도 동

[리눅스커널] wait_event_interruptible() 분석 & 프로세스 상태 변경

Guillermo Austin Kim|2019년 1월 7일

프로세스가 INTERRUPTIBLE 상태로 변경되는 가장 대표적인 함수는 wait_event_interruptible() 함수입니다. wait queue 전체 흐름도보통 wait_event_interruptible() 함수는 wake_up_interruptible() 함수와 함께 씁니다. wait_event_interruptible() 함수와 wake_up_interruptible() 함수를 어떻게 쓰는지 예제를 들어서 설명을 하겠습니다.[https://elixir.bootlin.com/linux/v4.14.70/source/sound/usb/line6/midi.c]1 static void line6_midi_output_drain(struct snd_rawmidi_substream *substream)

[리눅스커널] 프로세스 상태: 언제 TASK_RUNNING 변경할까?

Guillermo Austin Kim|2019년 1월 7일

이번 시간에 프로세스를 RUNNING 상태로 누가 언제 변경하는지 알아봅시다. wake_up_new_task()[set_filter 가능 함수]wake_up_new_task() 함수는 _do_fork() 함수에서 프로세스를 생성하는 과정에서 호출됩니다. 코드를 봅시다.[https://elixir.bootlin.com/linux/v4.14.70/source/kernel/sched/core.c]1 void wake_up_new_task(struct task_struct *p)2 {3 struct rq_flags rf;4 struct rq *rq;56 raw_spin_lock_irqsave(&p->pi_lock, rf.flags);7 p->state = TASK_RUNNING; 7번째 줄

[라즈베리파이] 동기화 - 스핀락(spinlock) Deadlock으로 생기는 문제

Guillermo Austin Kim|2019년 1월 6일

스핀락 코드를 잠깐 살펴봤는데 뮤텍스와 다르게 상당히 코드 복잡도가 낮습니다. tickets.next과 tickets.owner 두 값으로 스핀락을 획득하는 순서를 콘트롤하죠. spin_lock 함수가 처음 실행되는 시점에 tickets.owner 값을 로컬 변수에 저장하고 전역 tickets.next 값이 업데이트 될 때까지 Busy-wait합니다. 여기서 중요한 포인트는 tickets.owner 값을 로컬 변수 즉 스택 메모리 공간에 저장해서 제어한다는 점입니다. 모든 프로세스들은 각각 스택 공간에서 돌기 때문에 ticket 스핀락을 획득한 순서를 정확하게 파악할 수 있습니다. 낮은 복잡도에 정확하기 까지 합니다. 이렇게 스핀락 함수는 빠른 시간 내에 실행돼야 하는 인터럽트 서비스 루틴에서 공유 데이

[라즈베리파이] 가상 파일시스템 동작 분석(유저 프로세스 입장)

Guillermo Austin Kim|2019년 1월 3일

이번에 유저 어플리케이션 입장에서 가상 파일시스템 동작을 살펴보겠습니다. 먼저 유저 공간에서 실행하는 다음 코드를 같이 작성해 봅시다.1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 89 #define FILENAME_NAME "/home/pi/sample_text.text"1011 int main() 12 { 13 int fd = 0;14 ssize_t read_buf_size;15 off_t new_file_pos;