进程调度

问题描述

进程调度是操作系统设计中非常重要的问题。每个进程都需要一定的资源才能运行,这些资源在进程结束时都会被释放。不同的资源分配策略会对系统的运行效率产生很大的影响,甚至可能导致死锁。

某系统中现有𝑛个进程和m种资源。每个进程开始时得到部分资源,但不足以使得进程顺利执行,还需要得到其它资源才能执行。现已知该系统中各类可用资源的总量,给定的若干进程及其资源分配和需求情况,请指出这些进程是否能够顺利执行?

输入

输入数据有若干组,每组包括四部分:

第一部分为一行,含两个正整数 𝑛(𝑛≤50000) 和 𝑚(𝑚≤100) ,分别表示进程数量和资源的种类。

第二部分为随后的 𝑚 行。每行含有 𝑛 个整数,为各个进程得到的资源数。

第三部分也是 𝑚 行,紧随第二部分之后。每行包含 𝑛 个整数,代表进 程还需要的资源数。

第四部分为一行,紧随第三部分之后。该行包含 𝑚 个整数,为系统中当前各类可用资源的数量。

所有的整数值小于或等于 109 。

输出

输出中只包含只YesNo

如果所有进程均能顺利完成,输出Yes, 否则输出No

示例输入

4 3
1 6 2 0
0 1 1 0
0 2 1 2
2 0 1 4
2 0 0 2
2 1 3 0
0 1 1
4 3
2 5 2 0
0 1 1 0
1 1 1 2
1 1 1 4
2 0 0 2
1 2 3 0
0 1 1 

示例输出

Yes
No

解答

#include 
#include 
#define MAXN 50000
#define MAXM 100
int main() {
    int n, m;
    while (scanf("%d %d", &n, &m) != EOF) {
        int allocation[n][MAXM], need[n][MAXM], work[MAXM], finish[n];
        int available[MAXM];
        // 初始化allocation数组
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                scanf("%d", &allocation[j][i]);
            }
        }
        // 初始化need数组
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                scanf("%d", &need[j][i]);
            }
        }
        // 初始化available数组
        for (int i = 0; i < m; ++i) {
            scanf("%d", &available[i]);
            work[i] = available[i];
        }
        // 初始化finish数组
        for (int i = 0; i < n; ++i) {
            finish[i] = 0;
        }
        // 寻找可以完成的进程
        int allFinish = 1;
        do {
            allFinish = 1;
            for (int i = 0; i < n; ++i) {
                if (!finish[i]) { // 如果进程未完成
                    int canAllocate = 1;
                    for (int j = 0; j < m; ++j) { if (need[i][j] > work[j]) {
                            canAllocate = 0;
                            break;
                        }
                    }
                    if (canAllocate) { // 如果有足够的资源分配给进程
                        for (int j = 0; j < m; ++j) {
                            work[j] += allocation[i][j]; // 回收资源
                        }
                        finish[i] = 1;
                        allFinish = 0;
                    }
                }
            }
        } while (!allFinish);
        // 检查是否有未完成的进程
        int canComplete = 1;
        for (int i = 0; i < n; ++i) {
            if (!finish[i]) {
                canComplete = 0;
                break;
            }
        }
        if (canComplete) {
            printf("Yes\n");
        } else {
            printf("No\n");
        }
    }
    return 0;
}
作者:星尘旅人
1.本网站部分素材来源于网络,仅供大家参考学习,如有侵权,请联系博主删除处理。
2.本网站一切内容不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
3.版权&许可请详阅版权声明
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
//音乐播放