Następna Poprzednia Spis

6. Rozwiązania

Zadanie 1

Na przykład:


void list_add_tail(struct list_head *new, struct list_head *head)
{
	__list_add(new, head->prev, head);
}

Zadanie 2

Jest możliwe stworzenie takiej kolejki. Będziemy mogli spokojnie dodawać do niej, usuwać z niej, sprawdzać, czy kolejka jest pusta. Niemożliwe będzie jednak przeglądanie tej kolejki, bo nie wiemy częścią jakiej struktury jest kolejno napotkany element.

Zadanie 3

Na przykład:

 void move_last_runqueue(struct task_struct * p)
  {
	list_del(&p->run_list);
	list_add_tail(&p->run_list, &runqueue_head);
  }

Zadanie 4


struct task_struct p; /*proces, który chcemy oszukać*/ 
struct task_struct nowy_ojciec;
    REMOVE_LINKS(p);
	p->p_pptr = nowy_ojciec;
	SET_LINKS(p);

Zadanie 5

Jeżeli początek listy jest związany z jakimś procesem, to ten proces musi być cały czas obecny w systemie. Dysponujemy co prawda idle, ale sprawa się komplikuje, gdy mamy wiele procesorów i musimy wybierać idle. Tak jest szybciej.

Zadanie 6

Zgodnie z semantyką flagi wyłączności, żeby procesy były budzone rzeczywiście pojedynczo, każdy element kolejki musi mieć ustawioną tę flagę. Poza tym oczywiście wszystko zależy od funkcji budzącej - może ona w ogóle nie zwracać uwagi na flagę wyłączności.

Zadanie 7

Konieczne jest zabezpieczanie pojedynczych operacji - bo mogły by się poplątać wskaźniki. Istotne jest również usuwanie procesów - jeśli przerwanie usunie proces, gdy chcemy go przejrzeć, może być problem. Nic nam natomiast nie grozi w przypadku dodawania - nie zakłóci to przeglądania.


Następna Poprzednia Spis