DMSCDeviceScheduler

Struct DMSCDeviceScheduler 

Source
pub struct DMSCDeviceScheduler { /* private fields */ }
Expand description

§Device Scheduler

This file implements a comprehensive device scheduler for DMSC, responsible for:

  1. Managing device resource allocation and scheduling
  2. Implementing multiple scheduling algorithms
  3. Recording allocation history and statistics
  4. Providing scheduling recommendations based on historical data

§Design Principles

  1. Multiple Scheduling Algorithms: Supports FirstFit, BestFit, WorstFit, RoundRobin, PriorityBased, and LoadBalanced policies
  2. Policy Per Device Type: Different device types can have different scheduling policies
  3. Allocation History: Maintains detailed records of all allocations
  4. Statistics and Recommendations: Provides insights into scheduling effectiveness and recommendations for optimization
  5. Resource Pool Integration: Works closely with the resource pool manager
  6. Thread Safety: Uses Arc and Mutex for thread-safe operations
  7. Scalability: Designed to handle large numbers of devices and allocations

§Usage Examples

use dmsc::device::{DMSCDeviceScheduler, DMSCAllocationRequest, DMSCDeviceType, DMSCDeviceCapabilities};
use dmsc::device::pool::DMSCResourcePoolManager;
use std::sync::{Arc, Mutex};
 
fn example() {
    // Create resource pool manager
    let pool_manager = Arc::new(Mutex::new(DMSCResourcePoolManager::new()));
     
    // Create device scheduler
    let mut scheduler = DMSCDeviceScheduler::new(pool_manager);
     
    // Set scheduling policy for GPUs
    scheduler.set_policy(DMSCDeviceType::GPU, dmsc::device::DMSCSchedulingPolicy::PriorityBased);
     
    // Create allocation request
    let request = DMSCAllocationRequest {
        device_type: DMSCDeviceType::GPU,
        capabilities: DMSCDeviceCapabilities {
            memory_gb: Some(16.0),
            compute_units: Some(512),
            storage_gb: None,
            bandwidth_gbps: None,
            custom_capabilities: HashMap::new(),
        },
        priority: 5,
        timeout_secs: 30,
    };
     
    // Allocate device
    if let Some(allocation_id) = scheduler.allocate(&request) {
        println!("Allocated device with ID: {}", allocation_id);
         
        // Record release when done
        scheduler.record_release(&allocation_id);
    }
     
    // Get statistics
    let stats = scheduler.get_statistics();
    println!("Total allocations: {}", stats.total_allocations);
}

Device scheduler - manages device resource allocation and scheduling

This struct implements a comprehensive device scheduling system that manages resource allocation using various scheduling algorithms. It works closely with the resource pool manager to access available devices and implements multiple scheduling policies per device type.

Implementations§

Source§

impl DMSCDeviceScheduler

Source

pub fn new(resource_pool_manager: Arc<RwLock<DMSCResourcePoolManager>>) -> Self

Create a new device scheduler with default policies and empty allocation history.

This method initializes the scheduler with default scheduling policies for each device type and connects it to the provided resource pool manager.

§Parameters
  • resource_pool_manager: Resource pool manager for accessing available devices
§Returns

A new DMSCDeviceScheduler instance with default policies and settings.

Source

pub fn get_policy(&self, device_type: &DMSCDeviceType) -> &DMSCSchedulingPolicy

Get the scheduling policy for a specific device type.

This method returns the scheduling policy configured for the specified device type. If no policy is configured, it returns the default FirstFit policy.

§Parameters
  • device_type: Device type to get the policy for
§Returns

A reference to the DMSCSchedulingPolicy for the specified device type.

Source

pub fn set_policy( &mut self, device_type: DMSCDeviceType, policy: DMSCSchedulingPolicy, )

Set the scheduling policy for a specific device type.

This method configures the scheduling policy for the specified device type.

§Parameters
  • device_type: Device type to set the policy for
  • policy: Scheduling policy to use for this device type
Source

pub async fn select_device( &self, request: &DMSCAllocationRequest, ) -> Option<Arc<DMSCDevice>>

Select a device based on the scheduling policy for the requested device type.

This method selects the best device for the allocation request by:

  1. Getting the appropriate scheduling policy for the device type
  2. Collecting available devices from the resource pool manager
  3. Filtering devices that meet the requirements
  4. Applying the scheduling policy to select the best device
§Parameters
  • request: Allocation request with device type, capabilities, priority, and timeout
§Returns

An Arc<DMSCDevice> if a suitable device was found, or None if no device meets the requirements.

Source

pub async fn allocate(&self, request: &DMSCAllocationRequest) -> Option<String>

Allocate a device based on the scheduling policy.

This method selects a device using the appropriate scheduling policy and records the allocation.

§Parameters
  • request: Allocation request with device type, capabilities, priority, and timeout
§Returns

An allocation ID if successful, or None if no suitable device was found.

Source

pub async fn record_allocation( &self, allocation_id: String, device_id: String, device_type: DMSCDeviceType, capabilities_required: DMSCDeviceCapabilities, )

Record an allocation in the history.

This method records a new allocation in the history, including device information, capabilities required, and allocation time.

§Parameters
  • allocation_id: Unique allocation identifier
  • device_id: ID of the allocated device
  • device_type: Type of the allocated device
  • capabilities_required: Capabilities required for this allocation
Source

pub async fn record_release(&self, allocation_id: &str)

Record the release of an allocation.

This method updates an allocation record to mark it as released, including the release time and duration of the allocation.

§Parameters
  • allocation_id: ID of the allocation to release
Source

pub async fn get_statistics(&self) -> DMSCAllocationStatistics

Get allocation statistics and metrics.

This method calculates comprehensive statistics about allocations, including:

  • Total and successful allocations
  • Success rate
  • Average allocation duration
  • Statistics by device type
§Returns

A DMSCAllocationStatistics struct containing comprehensive allocation statistics.

Source

pub async fn get_recommendations( &self, device_type: &DMSCDeviceType, ) -> Vec<DMSCSchedulingRecommendation>

Get scheduling recommendations based on historical data.

Trait Implementations§

Source§

impl<'py> IntoPyObject<'py> for DMSCDeviceScheduler

Source§

type Target = DMSCDeviceScheduler

The Python output type
Source§

type Output = Bound<'py, <DMSCDeviceScheduler as IntoPyObject<'py>>::Target>

The smart pointer type to use. Read more
Source§

type Error = PyErr

The type returned in the event of a conversion error.
Source§

fn into_pyobject( self, py: Python<'py>, ) -> Result<<Self as IntoPyObject<'_>>::Output, <Self as IntoPyObject<'_>>::Error>

Performs the conversion.
Source§

impl PyClass for DMSCDeviceScheduler

Source§

type Frozen = False

Whether the pyclass is frozen. Read more
Source§

impl PyClassImpl for DMSCDeviceScheduler

Source§

const IS_BASETYPE: bool = false

#[pyclass(subclass)]
Source§

const IS_SUBCLASS: bool = false

#[pyclass(extends=…)]
Source§

const IS_MAPPING: bool = false

#[pyclass(mapping)]
Source§

const IS_SEQUENCE: bool = false

#[pyclass(sequence)]
Source§

const IS_IMMUTABLE_TYPE: bool = false

#[pyclass(immutable_type)]
Source§

const RAW_DOC: &'static CStr = c"# Device Scheduler\n\nThis file implements a comprehensive device scheduler for DMSC, responsible for:\n1. Managing device resource allocation and scheduling\n2. Implementing multiple scheduling algorithms\n3. Recording allocation history and statistics\n4. Providing scheduling recommendations based on historical data\n\n## Design Principles\n\n1. **Multiple Scheduling Algorithms**: Supports FirstFit, BestFit, WorstFit, RoundRobin, PriorityBased, and LoadBalanced policies\n2. **Policy Per Device Type**: Different device types can have different scheduling policies\n3. **Allocation History**: Maintains detailed records of all allocations\n4. **Statistics and Recommendations**: Provides insights into scheduling effectiveness and recommendations for optimization\n5. **Resource Pool Integration**: Works closely with the resource pool manager\n6. **Thread Safety**: Uses Arc and Mutex for thread-safe operations\n7. **Scalability**: Designed to handle large numbers of devices and allocations\n\n## Usage Examples\n\n```rust\nuse dmsc::device::{DMSCDeviceScheduler, DMSCAllocationRequest, DMSCDeviceType, DMSCDeviceCapabilities};\nuse dmsc::device::pool::DMSCResourcePoolManager;\nuse std::sync::{Arc, Mutex};\n\nfn example() {\n // Create resource pool manager\n let pool_manager = Arc::new(Mutex::new(DMSCResourcePoolManager::new()));\n \n // Create device scheduler\n let mut scheduler = DMSCDeviceScheduler::new(pool_manager);\n \n // Set scheduling policy for GPUs\n scheduler.set_policy(DMSCDeviceType::GPU, dmsc::device::DMSCSchedulingPolicy::PriorityBased);\n \n // Create allocation request\n let request = DMSCAllocationRequest {\n device_type: DMSCDeviceType::GPU,\n capabilities: DMSCDeviceCapabilities {\n memory_gb: Some(16.0),\n compute_units: Some(512),\n storage_gb: None,\n bandwidth_gbps: None,\n custom_capabilities: HashMap::new(),\n },\n priority: 5,\n timeout_secs: 30,\n };\n \n // Allocate device\n if let Some(allocation_id) = scheduler.allocate(&request) {\n println!(\"Allocated device with ID: {}\", allocation_id);\n \n // Record release when done\n scheduler.record_release(&allocation_id);\n }\n \n // Get statistics\n let stats = scheduler.get_statistics();\n println!(\"Total allocations: {}\", stats.total_allocations);\n}\n```\nDevice scheduler - manages device resource allocation and scheduling\n\nThis struct implements a comprehensive device scheduling system that manages\nresource allocation using various scheduling algorithms. It works closely with\nthe resource pool manager to access available devices and implements multiple\nscheduling policies per device type.\x00"

Docstring for the class provided on the struct or enum. Read more
Source§

const DOC: &'static CStr

Fully rendered class doc, including the text_signature if a constructor is defined. Read more
Source§

type BaseType = PyAny

Base class
Source§

type ThreadChecker = SendablePyClass<DMSCDeviceScheduler>

This handles following two situations: Read more
Source§

type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild

Immutable or mutable
Source§

type Dict = PyClassDummySlot

Specify this class has #[pyclass(dict)] or not.
Source§

type WeakRef = PyClassDummySlot

Specify this class has #[pyclass(weakref)] or not.
Source§

type BaseNativeType = PyAny

The closest native ancestor. This is PyAny by default, and when you declare #[pyclass(extends=PyDict)], it’s PyDict.
Source§

fn items_iter() -> PyClassItemsIter

Source§

fn lazy_type_object() -> &'static LazyTypeObject<Self>

§

fn dict_offset() -> Option<isize>

§

fn weaklist_offset() -> Option<isize>

Source§

impl PyTypeInfo for DMSCDeviceScheduler

Source§

const NAME: &'static str = "DMSCDeviceScheduler"

Class name.
Source§

const MODULE: Option<&'static str> = ::core::option::Option::None

Module name, if any.
Source§

fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject

Returns the PyTypeObject instance for this type.
§

fn type_object(py: Python<'_>) -> Bound<'_, PyType>

Returns the safe abstraction over the type object.
§

fn is_type_of(object: &Bound<'_, PyAny>) -> bool

Checks if object is an instance of this type or a subclass of this type.
§

fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool

Checks if object is an instance of this type.
Source§

impl DerefToPyAny for DMSCDeviceScheduler

Source§

impl ExtractPyClassWithClone for DMSCDeviceScheduler

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<'py, T> IntoPyObjectExt<'py> for T
where T: IntoPyObject<'py>,

§

fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr>

Converts self into an owned Python object, dropping type information.
§

fn into_py_any(self, py: Python<'py>) -> Result<Py<PyAny>, PyErr>

Converts self into an owned Python object, dropping type information and unbinding it from the 'py lifetime.
§

fn into_pyobject_or_pyerr(self, py: Python<'py>) -> Result<Self::Output, PyErr>

Converts self into a Python object. Read more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PyErrArguments for T
where T: for<'py> IntoPyObject<'py> + Send + Sync,

§

fn arguments(self, py: Python<'_>) -> Py<PyAny>

Arguments for exception
§

impl<T> PyTypeCheck for T
where T: PyTypeInfo,

§

const NAME: &'static str = T::NAME

👎Deprecated since 0.27.0: Use ::classinfo_object() instead and format the type name at runtime. Note that using built-in cast features is often better than manual PyTypeCheck usage.
Name of self. This is used in error messages, for example.
§

fn type_check(object: &Bound<'_, PyAny>) -> bool

Checks if object is an instance of Self, which may include a subtype. Read more
§

fn classinfo_object(py: Python<'_>) -> Bound<'_, PyAny>

Returns the expected type as a possible argument for the isinstance and issubclass function. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> Ungil for T
where T: Send,