제5장 신호량과 상호 배척체
10325 단어 신호량
제4장은 디버깅 기술을 소개했는데 제가 본 것도 모호하고 시도할 기회도 없을 것 같아서 먼저 뒷부분의 학습에 들어가 쓸 때 나중에 보충하려고 합니다.여기 는 대단한 문장 을 제공한다
http://www.cnblogs.com/yangnas/archive/2010/03/18/1688885.html, eclipse와qemu 가상기를 사용하여 한 응용 프로그램과 같은 단일 디버깅을 하는 방법을 소개합니다.절차에 따라 나는 마침내 효과에 도달했다.특히 eclipse 버전은 최신 3.7을 사용하지 말고 3.5를 사용하세요.이곳에서 나는 매우 큰 고생을 했다.그리고 원본 저장의 힘은 중국어를 최대한 사용하지 마세요.이게 다 내 경험이지?다음은 5장으로 들어갑니다.
————————————————————————————————————————
제3장의 scull 프로젝트는 매우 간단한데 병발 문제를 전혀 고려하지 않아 형성된 경쟁 상태이다.프로그래머로서 병발에 있어서는 낯설지 않을 것이다. 일부 응용 프로그램을 작성하는 것도 프로그램의 병발 실행을 고려해야 한다.더 나아가 linux의 장치 드라이버에 이르렀을 때 병발 문제는 더욱 현저하다.이전에 여러 차례 언급한 바와 같이 드라이브는 기능(메커니즘)을 제공할 뿐이고 어떻게 기능을 사용하는지는 사용자 응용 프로그램에 의해 결정된다.즉, 드라이버가 언제든지 호출될 수 있고, 언제든지 무슨 일이 일어날 수 있다.
scull의 write 함수를 돌아봅니다.
1 if (!dptr->data[s_pos]) {
2
3 dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL);
만약 쓸 위치가 비어 있다면 메모리 공간을 신청해서 쓰십시오.두 개 혹은 두 개 이상의 프로세스가 이 코드를 동시에 실행하면 경쟁 상태가 나타나는 것이 분명하다.그 결과 후자의 부가가치가 전자를 덮어쓰고 전자가 신청한 메모리도 유출됐다.야단났네.
경쟁 상태가 발생하는 원인은 사실 매우 뚜렷하다. 바로 두 실행 라인이 동시에 같은 데이터 구조에 접근해야 한다는 것이다.이러한 공유된 데이터 구조를 없애는 것은 분명 비현실적이다. 문제를 해결하는 관건은 이러한 공유 데이터 구조에 대한 접근 관리에 있다.즉, 제3자의 관리자가 있어야 한다. 그는 이런 공유 자원을 관리하고 같은 시간에 자원은 한 라인에서만 접근할 수 있도록 한다.이 동시에 이 관리자는 이 자원의 상태를 신청한 자원의 라인에 알려주는 것을 책임져야 한다.자원 방문자로서, 그는 자원에 대한 접근권을 얻거나, 자원이 현재 사용할 수 없다는 것을 알린다.
이 목적을 달성하기 위해 운영체제는 신호량의 개념을 도입하였다.하나의 프로세스가 공유된 자원에 접근할 때 그는 P를 호출해야 한다. 현재 신호량의 값이 0보다 크면 프로세스는 공유 자원에 접근할 수 있고 신호량의 값이 1로 줄어든다.현재 신호량의 값이 0보다 작으면 프로세스가 공유 자원에 접근할 수 없고 프로세스가 대기 대기열에 들어가면 신호량의 값을 1로 줄여야 합니다.따라서 신호량의 값이 마이너스일 때, 이 값의 절대값은 현재 대기 대기 대기열의 프로세스의 수량입니다.하나의 프로세스가 공유된 자원을 방출할 때 그는 V를 호출해야 한다. 현재 신호량의 값이 0보다 크면 신호량의 값이 1을 더한다.현재 신호량의 값이 0보다 작으면 대기 대기열의 프로세스를 깨우고 신호량의 값이 1을 추가합니다.
특수한 것은 임계 구역에서 같은 시간에 하나의 프로세스만 운행하도록 요구하면 모델 양의 값은 반드시 1로 초기화해야 한다. 이런 상황을 상호 배척이라고 한다.
linux에서 struct semaphore 구조체 (
1 void sema_init(struct semaphore *sem, int val);
두 번째 매개 변수 val은 신호량의 초기 값입니다. 물론 서로 밀어붙이려면 이 값은 1입니다.신호량의 P 함수와 V 함수에 대한 조작에는 대응하는down 함수와 up 함수가 있다.
다음은 scull에서 신호량에 대한 사용을 살펴보겠습니다. 우선 모든 scull 장치의 sculldev 구조에서 우신호량의 정의:
1 struct scull_dev {
2
3 struct scull_qset *data; /* Pointer to first quantum set */
4
5 int quantum; /* the current quantum size */
6
7 int qset; /* the current array size */
8
9 unsigned long size; /* amount of data stored here */
10
11 unsigned int access_key; /* used by sculluid and scullpriv */
12
13 struct semaphore sem; /* mutual exclusion semaphore */
14
15 struct cdev cdev; /* Char device structure */
16
17 };
장치 구동의 초기화 함수에서 모든 scull 장치를 초기화하는 동시에 모든 scull 장치의 신호량의 초기화도 포함한다.
1 for (i = 0; i < scull_nr_devs; i++) {
2
3 scull_devices[i].quantum = scull_quantum;
4
5 scull_devices[i].qset = scull_qset;
6
7 init_MUTEX(&scull_devices[i].sem);
8
9 scull_setup_cdev(&scull_devices[i], i);
10
11 }
주의, 저자가 제시한 원본 코드는 init 를 사용합니다MUTEX 매크로, 커널 버전 때문에 컴파일할 수 없으면 sema 로 변경합니다.init입니다. 자세한 내용은 처음에 제시한 글의 외사슬에 설명되어 있습니다.
데이터 공유를 신청할 때, 먼저 P, 즉down 을 호출해야 한다interruptible, 반환 값이 마이너스일 경우 신청이 실패했습니다. 반환:
1 if (down_interruptible(&dev->sem))
2
3 return -ERESTARTSYS;
마지막으로 방문 데이터를 완성한 후에 반드시 V를 호출해야 한다. 즉,
1 up(&dev->sem);
코드를 작성할 때 오류가 발생한 후에도 이 V 작업이 실행될 수 있도록 각별히 조심해야 한다. 이것은 매우 중요하다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
sem_t신호량으로 인해 두 개의 Doubango 응용 프로그램(idoubs)이 등록 메시지를 수신하는 것이 정상적이지 않습니다.최근에sip와 관련된 몇 가지를 연구하고 있습니다. 한 개의 idoubs가 아이폰에서 정상적으로 작동할 수 있지만 두 개를 동시에 실행하면 서버에 등록되지 않은 하나가 있습니다. 예를 들어 현재 두 개의 idoubs...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.