• 磁盘非跨盘访问算法实现


    1. 背景说明

    本算法基于已将磁盘分布合并并排序为升序线性表。实现示例为:磁盘扇区大小:32(可自定义),待拆分磁盘内存: [0 - 50],[60 - 100](可增加)。示意图如下:

    2. 示例代码

    allocateAddr.c

    1. /* 地址分配算法 */
    2. #include
    3. #include
    4. #define MAX_SIZE 10
    5. #define SEC_SIZE 32
    6. typedef struct {
    7. int startAddr;
    8. int endAddr;
    9. } IoAddr;
    10. int GetUpBound(const IoAddr *addr)
    11. {
    12. int i;
    13. for (i = 1; i <= SEC_SIZE; ++i) {
    14. if ((addr->startAddr + i) % SEC_SIZE == 0) {
    15. return i - 1;
    16. }
    17. }
    18. return 0;
    19. }
    20. int GetMin(int a, int b)
    21. {
    22. return (a <= b) ? a : b;
    23. }
    24. IoAddr *Process(int addrSize, int *detaSize, IoAddr *addr)
    25. {
    26. IoAddr *detatch = (IoAddr *)malloc(sizeof(IoAddr) * MAX_SIZE);
    27. int secLength;
    28. int upBound;
    29. *detaSize = 0;
    30. int min;
    31. for (int i = 0; i < addrSize; ++i) {
    32. secLength = (addr + i)->endAddr - (addr + i)->startAddr + 1;
    33. while (secLength) {
    34. upBound = GetUpBound(addr + i);
    35. min = GetMin(upBound, secLength - 1);
    36. detatch[*detaSize].startAddr = (addr + i)->startAddr;
    37. detatch[*detaSize].endAddr = (addr + i)->startAddr + min;
    38. ++(*detaSize);
    39. (addr + i)->startAddr += (min + 1);
    40. if ((addr + i)->startAddr > (addr + i)->endAddr) {
    41. break;
    42. }
    43. secLength = (addr + i)->endAddr - (addr + i)->startAddr + 1;
    44. }
    45. }
    46. return detatch;
    47. }
    48. int main(void)
    49. {
    50. IoAddr *memory = (IoAddr *)malloc(sizeof(IoAddr) * 2);
    51. memory[0].startAddr = 0;
    52. memory[0].endAddr = 50;
    53. memory[1].startAddr = 60;
    54. memory[1].endAddr = 100;
    55. int detaSize;
    56. IoAddr *detatch = Process(2, &detaSize, memory);
    57. printf("The allocation is as follows:\n\n");
    58. for (int i = 0; i < detaSize; ++i) {
    59. printf("[%-3d %-3d]\n", detatch[i].startAddr, detatch[i].endAddr);
    60. }
    61. free(memory);
    62. free(detatch);
    63. return 0;
    64. }

    3. 运行结果

  • 相关阅读:
    链表经典面试题(二)
    矩阵分析与应用+张贤达
    免费 AI 代码生成器 Amazon CodeWhisperer 初体验
    计算机组成学习-数据的表示和运算总结
    centos7安装nacos2.1.0
    群晖外网访问终极解决方法:IPV6+阿里云ddns+ddnsto
    Vue ref获取元素和组件实例
    Android 开发学习(二)
    334 - 线程通信问题
    外卖点餐自取连锁多店小程序开发
  • 原文地址:https://blog.csdn.net/qq_40613544/article/details/133823260