Skip to content

GitLab

  • Menu
Projects Groups Snippets
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in
  • P Praktikum-Betriebssysteme
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 2
    • Issues 2
    • List
    • Boards
    • Service Desk
    • Milestones
    • Iterations
    • Requirements
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Container Registry
    • Infrastructure Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • ACS
  • Public
  • Teaching materials
  • Praktikum-Betriebssysteme
  • Issues
  • #1

Closed
Open
Created Jan 11, 2021 by Simon Schöning@simon.schoening

Probleme im Zusammenhang mit Semaphoren

Philipp und ich hatten einige Fehler beim Implementieren der Semaphoren.

Mein Code, der eventuell Fehler enthält: semaphore.rs

Anmerkungen zum Code:

  • Auch in der post-Fkt. wird ein neuer FifoScheduler erstellt, falls dies noch nicht passiert ist. Das ist eigentlich nicht notwendig.
  • Ich denke, dass der FifoScheduler nicht durch einen InterruptSpinlock geschützt werden muss, da er schon durch den Mutex für den Zähler geschützt werden kann.

Fehler die bei dem Test "sem_test" auftreten können (Nur wenn der Timer aktiviert ist):

  • [PANIC] panicked at 'already borrowed: BorrowMutError', edu-kernel/src/scheduler/mod.rs:72:41 (Zeilennummern sind eventuell verschoben zur Vorlage)
    Zeile 72: let mut task_ref = task.borrow_mut(); in der Fkt. "wakeup"

  • [PANIC] panicked at 'not implemented: Interrupt handler "invalid_opcode" stack_frame = InterruptStackFrame { instruction_pointer: VirtAddr(0x216212), code_segment: 8, cpu_flags: 0x11002, stack_pointer: VirtAddr(0x483d58), stack_segment: 16, }', edu-kernel/src/arch/x86_64/interrupts.rs:133:1

Möglicherweise wird der BorrowMutError dadurch verursacht, dass ein Task auf eine RefCell (in diesem Fall einem TaskRef) die Funktion borrow() oder borrow_mut() aufruft und vor dem Beenden des Borrows vom Timer-Interrupt unterbrochen wird. Daher sollten alle (public) Fkt. im Code, die borrow() oder borrow_mut() nutzen, vor Interrupts geschützt werden.

Dies wäre z. B. pub fn spawn_prio in edu-kernel/src/scheduler/thread.rs, aber auch block_current_task, get_current_stack oder wakeup_task in edu-kernel/src/scheduler/mod.rs

Es wäre auch nicht schlecht einen Arc für TaskRef zu verwenden: pub type TaskRef = Arc<RefCell<Task>>;.

Mit den genannten Veränderungen scheinen die oben genannten Fehler nicht mehr aufzutreten.

Assignee
Assign to
Time tracking