리 눅 스 커 널 깊이 이해 (2.6) 의 관련 데이터 구 조 를 정리 하 다.

4280 단어 리 눅 스 커 널
작업 대기 열
반 까지 썼 더 니 잘 붙 었 다. 하하.
https://www.cnblogs.com/zzb-Dream-90Time/p/6476018.html
작업 대기 열 과 관련 된 주요 데이터 구 조 는 이름 입 니 다. workqueue_struct 의 설명 자 는 NR 를 포함 합 니 다.CPU (CPU 최대 개수) 개 요소 의 배열 입 니 다.
모든 원 소 는 cpuworkqueue_struct 형식의 설명자:
cpu_workqueue_struct 구조
필드 이름
묘사 하 다.
lock
이 데이터 구조의 자 물 쇠 를 보호 합 니 다.
remove_sequence
flush_workqueue () 에서 사용 하 는 시퀀스 번호
insert_sequence
flush_workqueue () 에서 사용 하 는 시퀀스 번호
worklist
링크 (양 방향 링크) 의 끝 점 을 걸다.
more_work
대기 열, 그 중 작업 자 스 레 드 는 더 많은 일 을 기다 리 기 때문에 수면 상태 에 있 습 니 다.
work_done
대기 열, 대기 열 이 새로 고침 되 기 를 기다 리 는 프로 세 스 가 수면 상태 입 니 다.
wq
가리 키 는 workqueuestruct 구조의 지침, 이 설명 자 를 포함 합 니 다.
thread
구조 에서 작업 자 스 레 드 를 가리 키 는 프로 세 스 설명자 포인터
run_depth
run_workqueue () 현재 실행 깊이 (작업 대기 열 링크 의 함수 가 막 힐 때 이 필드 의 값 은 1 보다 커 집 니 다)
worklist 필드 는 양 방향 링크 의 머리 입 니 다. 이 링크 는 작업 대기 열 에 있 는 모든 걸 기 함수 에 집중 되 어 있 습 니 다. 걸 기 함수 용 workstruct 데이터 구조 표시:
work_struct 구조
필드 이름
묘사 하 다.
pending
함수 가 작업 대기 열 링크 에 있 으 면 이 필드 값 을 1 로 설정 합 니 다. 그렇지 않 으 면 0 으로 설정 합 니 다.
entry
함수 링크 앞 이나 뒤의 요 소 를 걸 어 놓 는 지침 을 가리 키 고 있 습 니 다.
func
함수 주소 걸 기
data
걸 려 있 는 함수 에 전달 되 는 매개 변 수 는 포인터 입 니 다.
wq_data
보통 cpu 를 가리 키 는workqueue_struct 설명자 의 부모 노드 지침
timer
함수 실행 지연 에 사용 되 는 소프트 타이머
create_workqueue ("foo") 함수 가 문자열 을 매개 변수 로 받 아들 여 작업 대기 열 을 새로 만 든 workqueue 를 되 돌려 줍 니 다.struct 설명자 의 주소 입 니 다.이 함 수 는 n 개의 작업 자 스 레 드 (n 은 현재 시스템 에서 유효 하 게 실행 되 는 CPU 의 개수) 를 만 들 고 함수 에 전 달 된 문자열 에 따라 작업 자 스 레 드 이름 을 짓 습 니 다. 예 를 들 어 foo / 0, foo / 1 등 입 니 다.create_singlethread_workqueue () 함수 가 비슷 하지만 시스템 에 cpu 가 몇 개 있 든 createsinglethread_워 크 큐 () 함수 가 작업 자 스 레 드 만 만 듭 니 다.커 널 호출 destroy_워 크 큐 () 함수 가 작업 대기 열 을 취소 합 니 다. 워 크 큐 를 가리 키 는 을 받 습 니 다.struct 배열 의 지침 을 매개 변수 로 합 니 다.
2. 커 널 신호 량
struct semaphore

{

    count    //  0:    ;  0:   ,      ;  0:   ,         。

    wait     //      (      )     。

    sleepers //                   :                 ,
             //    0,    1。

}

init_MUTEX()                  함수 가 count 필드 를 1 로 설정 합 니 다.
init_MUTEX_LOCKED() 함수 가 count 필드 를 0 으로 설정 합 니 다.
신 호 량 획득 / 방출
커 널 신 호 량 방출: up () 함수 호출, count 필드 의 값 증가, count 가 0 보다 작 으 면 호출up () 함수 가 새로운 수면 프로 세 스 로 바 뀌 었 습 니 다.
커 널 신 호 량 가 져 오기: down () 함 수 를 호출 하여 count 필드 의 값 을 감소 합 니 다. count 가 0 보다 크 면 현재 프로 세 스 가 신 호 량 을 얻 습 니 다. 그렇지 않 으 면 현재 프로 세 스 가 걸 립 니 다.일부 레지스터 내용 을 창고 에 저장 하고 호출down () 함수.
다운 () 함수 의 주요 임 무 는 신 호 량 이 풀 릴 때 까지 현재 프로 세 스 를 끊 는 것 입 니 다.몇 가지 전형 적 인 상황:
MUTEX 신 호 량 오픈 (count 는 1, sleepers 는 0)
MUTEX 신 호 량 이 꺼 지고 수면 프로 세 스 가 없습니다 (count 는 0, sleepers 는 0)
MUTEX 신 호 량 이 꺼 지고 다른 수면 프로 세 스 가 있 습 니 다 (count 는 - 1, sleepers 는 1)
 
down_trylock () 함 수 는 자원 이 바 쁠 때 바로 돌아 갑 니 다.
down_interruptible () 함 수 는 장치 구동 에 광범 위 하 게 사 용 됩 니 다. 수면 프로 세 스 가 필요 한 자원 을 얻 기 전에 다른 신호 에 의 해 깨 어 나 면 이 함 수 는 count 필드 의 값 을 증가 하고 - INTR 로 돌아 가 며 정상 적 인 종료 시 0 으로 돌아 갑 니 다.따라서 반환 값 이 - INTR 일 때 드라이버 는 I / O 작업 을 포기 할 수 있다.
3. 읽 기 / 쓰기 신호 량
struct rw_semaphore

{
    count        //   16    。 16                         
                 //         。 16                。
    wait_list    //          
    wait_lock    //              rw_semaphore      
}

inti_rwsem () 함수 초기 화 rwsemaphore 구조, count 필드 를 0 으로 설정, waitlock 자 물 쇠 를 잠 그 지 않 은 것 으로 설정 하고 waitlist 를 빈 링크 로 설정 합 니 다.
down_read() 읽 기 신 호 량 가 져 오기;
down_write () 쓰기 신 호 량 가 져 오기;
up_read () 읽 기 신 호 량 방출;
up_write () 쓰기 신 호 량 방출;
down_read_trylock () 비 차단 식 으로 읽 기 신 호 량 가 져 오기;
down_write_trylock () 비 차단 식 으로 쓰기 신 호 량 가 져 오기;
downgrade_write () 자동 으로 자 물 쇠 를 읽 기 자물쇠 로 변환 합 니 다.
4. 로 컬 중단 금지
의문:
"eflags 레지스터 의 IF 로고 가 0 으로 정리 되면 매크로 irqs disabled () 는 1 로 돌아 갑 니 다. IF 로고 가 설정 되면 매크로 도 1 로 돌아 갑 니 다."
왜 다 1 로 돌아 가요?
 
타이머 개체
timer_opts 데이터 구조
필드 이름
설명 하 다.
name
타이머 원본 을 표시 하 는 문자열
mark_offset
이전 박자 의 정확 한 시간 을 기록 하고 시계 가 처리 프로그램 을 중단 하여 호출 합 니 다.
get_offset
지난 박자 에서 시작 한 시간 을 되 돌려 줍 니 다.
monotonic_clock
커 널 초기 화 시작 에 걸 친 나 초 수 를 되 돌려 줍 니 다.
delay
지정 한 수의 "순환" 을 기다 리 고 있 습 니 다.

좋은 웹페이지 즐겨찾기