操作系统实验—处理机调度算法的模拟

2023-11-06

一、实验目的:

熟悉处理器调度算法的工作原理,掌握调度算法的实现、进程的状态及状态转换。具体如下:

  1. 设计并实现模拟进程调度的算法:时间片轮转调度算法。
  2. 理解进程控制块的结构。
  3. 理解进程运行的并发性。
  4. 掌握进程调度算法。

二、实验内容:

在多道程序运行环境下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由进程调度程序完成的。一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其组织成不同的进程队列。于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。进程调度的算法有多种,常用的有优先级调度算法、先来先服务算法、时间片轮转算法。
进程是程序在处理机上的执行过程。进程存在的标识是进程控制块

PCB进程控制块结构

typedef struct PCB 
{ 
   int id;                            /* 进程id */
   char name[10];                    /* 进程标识符 */ 
   int allTime;                       /* 进程共需要占用 CPU 时间 */ 
   int needTime;                      /* 进程到完成还需要的时间 */ 
   int cpuTime;                      /* 进程已经占用CPU的时间 */
   int startBlock;                      /* 开始阻塞的时刻,-1表示不会发生阻塞*/
   int blockTime;                      /* 阻塞消耗的总时间 */
   char state;                        /* 进程的状态:就绪、阻塞、运行、完成*/ 
    struct node *next                   /*链指针*/ 
}PCB; 

系统创建一个进程,就是由系统为某个程序设置一个PCB,用于对该进程进行控制和管理,进程任务完成,由系统收回其PCB,该进程便消亡。每个进程可以有四个状态:运行状态、就绪状态、阻塞状态和完成状态。
用C语言编写一个程序实现进程调度的算法,模拟进程调度的过程,加深对进程控制块概念和进程调度算法的理解。

设计要求:

  1. 进程的调度采用时间片轮转算法。
  2. 设计3个链队列,分别用来表示就绪队列、阻塞队列和完成队列。
  3. 进程的相关信息通过一个文本文件的形式传给程序,程序在接受到进程的信息后,为每个进程申请空间并存放进进程控制块PCB中。文本文件的内容自行设置。
  4. 为了清楚的观察各个进程的调度过程,每当有进程状态变化时,程序应该将所有进程当前的状态显示出来,一直到所有进程运行完成为止。具体参照如下的格式:

各个就绪进程的信息如下:
在这里插入图片描述

时间片轮转调度的基本原理:系统将所有就绪的进程按先来先服务的原则排成一个就绪队列。系统设置每一个时间间隔便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。当它运行完毕后,又把处理机分配给就绪队列中新的队首进程,也让它执行一个时间片。这样,就可以保证就绪队列中的所有进程在确定的时间段内,都能获得一个时间片的处理机时间。
在时间片轮转调度算法中,触发进程调度有如下几种情况:○1若一个时间片尚未用完,正在运行的进程便已经完成,就会立即激活调度程序,将它从就绪队列中删除,再调度就绪队列的队首进程运行。○2在一个时间片用完时,计时器中断处理程序被激活;如果进程尚未运行完毕,调度程序就把它送到就绪队列的末尾,再调度就绪队列的队首进程运行。○3进程在运行过程中遇到事件需要阻塞,这时即把该进程的状态由运行改为阻塞并置入事件阻塞队列末尾,然后激活调度程序,调度就绪队列的队首进程运行。○4在进程的阻塞事件完成后,向系统发送阻塞完成的信息,系统在收到相关信息后,就把该进程从阻塞队列中删除并置入就绪队列末尾。

三、实验过程记录:

1、算法的思路

首先实现本算法需要用到PCB以及PCB队列两个主要数据结构,编写函数实现PCBQueue的增删以及输出,还要实现对PCB控制块赋值的代码。通过对文件的操作封装readFile方法,获取txt文件中的数据对PCBQueue初始化,根据要求格式化输出。最后根据时间片轮转调度算法对进程进行模拟操作,输出每次运行的结果。

2、主要数据结构

	PCB结构体
1.	typedef struct PCB
2.	 {
3.	     int id;                            /* 进程id */
4.	     string name;                    /* 进程标识符 */
5.	     int allTime;                       /* 进程共需要占用 CPU 时间 */
6.	     int needTime;                      /* 进程到完成还需要的时间 */
7.	     int cpuTime;                      /* 进程已经占用CPU的时间 */
8.	     int startBlock;                      /* 开始阻塞的时刻,-示不会发生阻塞*/
9.	     int blockTime;                      /* 阻塞消耗的总时间 */
10.	     string state;/* 进程的状态:就绪、阻塞、运行、完成*/
11.	     int blockT=//已经阻塞的时间
12.	     PCB *next;                /*链指针*/
13.	 } PCB;
PCB队列结构体
14.	 struct PCBQueue{
15.	     PCB *head=NULL;
16.	     PCB *end=NULL;
17.	 };
18.	 void addPCB(PCBQueue &q,PCB *next){
19.	     if(q.head==NULL){
20.	         q.head=q.end=next;
21.	         return;
22.	     }
23.	     next->next=NULL;
24.	     q.end->next=next;
25.	     q.end=next;
26.	 }
27.	 
28.	 PCB* deletePCBQueue(PCBQueue &q){
29.	     PCB *p=q.head;
30.	     if(q.head->next==NULL){
31.	         q.head=NULL;
32.	         q.end=NULL;
33.	     }else{
34.	         q.head=q.head->next;
35.	     }
36.	     p->next=NULL;
37.	     return p;
38.	 }
39.	 void PrintPCBQueue(PCBQueue &q){
40.	     if(q.head==NULL)
41.	         return;
42.	     PCB *p=q.head;
43.	     while(p!=q.end){
44.	         cout<<"id"<<p->id<<" -> ";
45.	         p=p->next;
46.	     }
47.	     cout<<"id"<<p->id;
48.	 }

主要数据结构为进程控制块PCB的结构体以及对他进行操作的函数

3、程序代码

1.	#include <iostream>
2.	#include <queue>
3.	#include <fstream>
4.	#define TIMESLICE 5
5.	using namespace std;
6.	
7.	typedef struct PCB
8.	{
9.	    int id;                            /* 进程id */
10.	    string name;                    /* 进程标识符 */
11.	    int allTime;                       /* 进程共需要占用 CPU 时间 */
12.	    int needTime;                      /* 进程到完成还需要的时间 */
13.	    int cpuTime;                      /* 进程已经占用CPU的时间 */
14.	    int startBlock;                      /* 开始阻塞的时刻,-1表示不会发生阻塞*/
15.	    int blockTime;                      /* 阻塞消耗的总时间 */
16.	    string state;/* 进程的状态:就绪、阻塞、运行、完成*/
17.	    int blockT=0;//已经阻塞的时间
18.	    PCB *next;                /*链指针*/
19.	} PCB;
20.	struct PCBQueue{
21.	    PCB *head=NULL;
22.	    PCB *end=NULL;
23.	};
24.	void addPCB(PCBQueue &q,PCB *next){
25.	    if(q.head==NULL){
26.	        q.head=q.end=next;
27.	        return;
28.	    }
29.	    next->next=NULL;
30.	    q.end->next=next;
31.	    q.end=next;
32.	}
33.	
34.	PCB* deletePCBQueue(PCBQueue &q){
35.	    PCB *p=q.head;
36.	    if(q.head->next==NULL){
37.	        q.head=NULL;
38.	        q.end=NULL;
39.	    }else{
40.	        q.head=q.head->next;
41.	    }
42.	    p->next=NULL;
43.	    return p;
44.	}
45.	void PrintPCBQueue(PCBQueue &q){
46.	    if(q.head==NULL)
47.	        return;
48.	    PCB *p=q.head;
49.	    while(p!=q.end){
50.	        cout<<"id"<<p->id<<" -> ";
51.	        p=p->next;
52.	    }
53.	    cout<<"id"<<p->id;
54.	}
55.	PCB initialize(int id,string name,int allTime,int needTime,int cpuTime,int startBlock,int blockTime,string state,struct PCB *next){
56.	    PCB p;
57.	    p.id=id;
58.	    p.name=name;
59.	    p.allTime=allTime;
60.	    p.needTime=needTime;
61.	    p.cpuTime=cpuTime;
62.	    p.startBlock=startBlock;
63.	    p.blockTime=blockTime;
64.	    p.state=state;
65.	    p.next=next;
66.	    p.blockT=0;
67.	    return p;
68.	}
69.	void readFile(PCB p[6]){
70.	    ifstream outfile("C:\\Users\\社会人\\Desktop\\操作系统\\data.txt");
71.	    int id;string name;int allTime;int needTime;int cpuTime;int startBlock;int blockTime;string state;
72.	    int time=0;
73.	    while(outfile>>id>>name>>allTime>>needTime>>cpuTime>>startBlock>>blockTime>>state){
74.	        p[time]=initialize(id,name,allTime,needTime,cpuTime,startBlock,blockTime,state,NULL);
75.	        time++;
76.	    }
77.	    outfile.close();
78.	}
79.	void printFirstPCB(PCB p[6],PCBQueue readPCB){
80.	    cout<<"程序开始:"<<endl;        /* 用整数表示的时间,开始时为0 */
81.	    cout<<"当前时间:"<<0<<endl;
82.	    cout<<"各个就绪进程的信息如下:"<<endl;
83.	    cout<<"就绪队列:";
84.	    PrintPCBQueue(readPCB);
85.	    cout<<endl;  /* 显示就绪队列所有的进程,假设系统开始有6个进程 */
86.	    cout<<"========================================================================"<<endl;
87.	    cout<<" id name allTime needTime cpuTime startBlock blockTime state"<<endl;
88.	    cout<<"------------------------------------------------------------------------"<<endl;
89.	    for(int i=0;i<6;i++){
90.	        printf("  %d\t %s\t\t\t%d\t\t%d\t\t\t%d\t\t%d\t\t\t%d\t\t%s\n",p[i].id,p[i].name.c_str(),p[i].allTime,p[i].needTime,p[i].cpuTime,p[i].startBlock,p[i].blockTime,p[i].state.c_str());
91.	    }
92.	    cout<<"------------------------------------------------------------------------"<<endl;
93.	}
94.	void printPCB(PCB p[6],int t,int m,PCBQueue readPCB,PCBQueue blockPCB,PCBQueue completPCB){
95.	    cout<<"第"<<t<<"次有程序状态变化:"<<endl;
96.	    cout<<"当前时间:"<<m<<endl;        /* 用整数表示的时间,开始时为0 */
97.	    cout<<"运行状态程序:id, name, allTime, needTime, cpuTime, startBlock, blockTime, state"<<endl;
98.	    cout<<"就绪队列:";
99.	    PrintPCBQueue(readPCB);/* 显示就绪队列所有的进程 */
100.	    cout<<endl;
101.	    cout<<"阻塞队列:";
102.	    PrintPCBQueue(blockPCB);
103.	    cout<<endl;
104.	    /* 显示阻塞队列所有的进程 */
105.	    cout<<"完成队列:";
106.	    PrintPCBQueue(completPCB);/* 显示完成队列所有的进程 */
107.	    cout<<endl;
108.	    cout<<"========================================================================"<<endl;
109.	    cout<<" id name allTime needTime cpuTime startBlock blockTime state"<<endl;
110.	    cout<<"------------------------------------------------------------------------"<<endl;
111.	    for(int i=0;i<6;i++){
112.	        printf("  %d\t %s\t\t\t%d\t\t%d\t\t\t%d\t\t%d\t\t\t%d\t\t%s\n",p[i].id,p[i].name.c_str(),p[i].allTime,p[i].needTime,p[i].cpuTime,p[i].startBlock,p[i].blockTime,p[i].state.c_str());
113.	    }
114.	    cout<<"------------------------------------------------------------------------"<<endl;
115.	}
116.	void SchedulingAlgorithm(PCB p[6],int m,int t,PCBQueue readPCB,PCBQueue blockPCB,PCBQueue completPCB){
117.	    PCB *readp=NULL;
118.	    bool flag;
119.	    int readTime;
120.	    while(readPCB.head!=NULL||blockPCB.head!=NULL){
121.	        if(readPCB.head==NULL){
122.	            PCB *blockP=deletePCBQueue(blockPCB);
123.	            m+=blockP->blockTime-blockP->blockT;
124.	            blockP->blockT=0;
125.	            blockP->state="READY";
126.	            addPCB(readPCB,blockP);
127.	            printPCB(p,t++,m,readPCB,blockPCB,completPCB);
128.	        }
129.	        if(readPCB.head!=NULL){
130.	            readp=deletePCBQueue(readPCB);
131.	            readp->state="RUNNING";
132.	            printPCB(p,t++,m,readPCB,blockPCB,completPCB);
133.	            flag=false;
134.	            readTime=0;
135.	            if(readp->startBlock!=-1){
136.	                if(readp->startBlock<=TIMESLICE){
137.	                    if(readp->needTime<=readp->startBlock){//运行完
138.	                        readTime+=readp->needTime;
139.	                        m+=readp->needTime;
140.	                        readp->cpuTime+=readp->needTime;
141.	                        readp->needTime=0;
142.	                        readp->state="FINISHED";
143.	                        addPCB(completPCB,readp);
144.	                        printPCB(p,t++,m,readPCB,blockPCB,completPCB);
145.	                    }else{//阻塞
146.	                        readTime+=readp->startBlock;
147.	                        m+=readp->startBlock;
148.	                        readp->cpuTime+=readp->startBlock;
149.	                        readp->needTime-=readp->startBlock;
150.	                        readp->state="BLOCKED";
151.	                        readp->startBlock=-1;
152.	                    }
153.	                }else
154.	                    flag=true;
155.	            }else
156.	                flag=true;
157.	            if(flag){//正常运行
158.	                if(readp->needTime<=TIMESLICE){//运行完
159.	                    readTime+=readp->needTime;
160.	                    m+=readp->needTime;
161.	                    readp->cpuTime+=readp->needTime;
162.	                    readp->needTime=0;
163.	                    readp->state="FINISHED";
164.	                    addPCB(completPCB,readp);
165.	                    printPCB(p,t++,m,readPCB,blockPCB,completPCB);
166.	                }else{//没有运行完
167.	                    readTime+=TIMESLICE;
168.	                    readp->cpuTime+=TIMESLICE;
169.	                    readp->needTime-=TIMESLICE;
170.	                    readp->state="READY";
171.	                    m+=TIMESLICE;
172.	                    addPCB(readPCB,readp);
173.	                    printPCB(p,t++,m,readPCB,blockPCB,completPCB);
174.	                }
175.	            }
176.	        }
177.	        while(blockPCB.head!=NULL&&readp!=NULL){
178.	            PCB *blockP=deletePCBQueue(blockPCB);
179.	            if(readTime==0)
180.	                break;
181.	            if(blockP->blockTime-blockP->blockT>readTime){//时间用完
182.	                readTime=0;
183.	                blockP->blockT+=readTime;
184.	                break;
185.	            }else{//阻塞结束
186.	                readTime-=(blockP->blockTime-blockP->blockT);
187.	                blockP->blockT=0;
188.	                blockP->state="READY";
189.	                addPCB(readPCB,blockP);
190.	                printPCB(p,t++,m,readPCB,blockPCB,completPCB);
191.	            }
192.	        }
193.	        if(readp->state=="BLOCKED"){
194.	            addPCB(blockPCB,readp);
195.	            printPCB(p,t++,m,readPCB,blockPCB,completPCB);
196.	        }
197.	    }
198.	}
199.	int main(){
200.	    PCB p[6],*readp;
201.	    readFile(p);
202.	    int m=0,t=1;//时间和次数
203.	    PCBQueue readPCB,blockPCB,completPCB;//就绪 阻塞 完成
204.	    for(int i=0;i<6;i++){
205.	        addPCB(readPCB,&p[i]);
206.	    }
207.	    printFirstPCB(p,readPCB);
208.	    SchedulingAlgorithm(p,m,t,readPCB,blockPCB,completPCB);
209.	}

运行效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统实验—处理机调度算法的模拟 的相关文章

  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 每个虚拟主机的错误日志?

    在一台运行 Apache 和 PHP 5 的 Linux 服务器上 我们有多个带有单独日志文件的虚拟主机 我们似乎无法分离 phperror log虚拟主机之间 覆盖此设置
  • Linux 上的“软/硬 nofile”是什么意思

    当我尝试在RedHat EL5上安装软件时 我得到了错误 软 硬nofile的期望值是4096 而默认值是1024 我设法增加了这个数字 但我不知道参数是什么 他们指的是软链接和硬链接吗 我改变的方法是 a 修改 etc security
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 期待、互动,然后再次期待

    有几篇关于相同内容的帖子 但我仍然无法使我的期望脚本正常工作 我的目的是自动化一切 但保留用户输入的密码 所以脚本有 3 个部分 自动登录 给予用户交互以输入密码 将控制权交还给 Expect 脚本以继续工作 所以我有一个将生成的脚本 其中
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • 将 bash 脚本作为守护进程运行

    我有一个脚本 它每 X 次运行我的 PHP 脚本 bin bash while true do usr bin php f my script php echo Waiting sleep 3 done 我怎样才能将它作为守护进程启动 要从
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • 如何防止 CMake 在构建时(而不是安装时)为共享库创建符号链接?

    我正在使用 CMake 在 Linux 上使用 Bullet3 构建一个项目 在构建整个解决方案时 它会构建附加了 SOVERSION 的 Bullet 输出库 并创建一个不带版本的符号链接 对于我的特定场景 我不喜欢这种行为 并且我不想编
  • _dl_runtime_resolve -- 共享对象何时加载到内存中?

    我们有一个对性能要求很高的消息处理系统 最近我们注意到第一条消息比后续消息花费的时间要长很多倍 当它通过我们的系统时 会发生大量转换和消息增强 其中大部分是通过外部库完成的 我刚刚描述了这个问题 使用 callgrind 将仅一条消息的 运
  • 有没有办法让 Linux CLI IO 重定向持久化?

    我有多个管道命令 如下所示 find options grep options xargs grep options 它们中的每一个都可能产生我不感兴趣的错误 权限错误 文件名空格错误等 因此 我想将所有错误重定向到 dev null 我知
  • 我如何知道用户在使用 ncurses (Linux) 的控制台中按下了 ESC 键?

    I have a problem in detecting whether I just got a plain ESC key just code 27 or whether it was another special key such
  • 如何在树莓派上更新到最新的 python 3.5.1 版本?

    我昨天拿到了 Raspberry Pi 我已经在尝试用它来编写代码了 我有一个计划在其上运行的程序 但它仅与 Python 版本 3 5 0 或 3 5 1 兼容 并且我在互联网上找到的所有内容似乎都已经过时 与 Python 2 有关 或
  • /usr/bin/as:无法识别的选项“-EL”

    因此 在为我的1plus手机编译android内核时 经过3天的多次尝试 我放弃了并尝试在这里询问是否有人以前遇到过这个问题 这个错误对我来说有点模糊 但我觉得问题来自于我最近对 GNU Linux 发行版 Gentoo 的更改 它在不应该
  • Docker 容器可以访问 DNS,但无法解析主机

    我在运行 docker 容器时遇到一个有趣的问题 突然间 我无法从容器内解析 DNS 这是一个概要 一切都没有解决 apt get pip 一次性 ping 容器等正在运行docker run it dns 8 8 8 8 ubuntu p
  • CMake:使用其他平台的生成器。如何?

    如何使用 CMake 在 Linux 上生成 Visual Studio 项目文件 你不能 您必须在 Windows 上运行 CMake 才能为 Visual Studio 生成
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 无法使用 tar -cvpzf 解压完整目录

    把我的头敲在这上面 I used tar cvpzf file tar gz压缩一个完整的目录 我将文件移动到另一台服务器 并尝试解压缩复制存档的目录 无法使其发挥作用 bash 3 2 tar xvpzf news tar gz tar

随机推荐

  • STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云

    STM32 ESP8266 ESP 12F 物联网温度计 移植paho MQTT协议连接阿里云 目录 STM32 ESP8266 ESP 12F 物联网温度计 移植paho MQTT协议连接阿里云 一 硬件及软件准备 1 硬件 STM32单
  • stm32串口通信,收发字符串,并对其进行解析

    串口以字符串接收和发送 将传输的数据转化为整数 正负 stm32发送端 motor position Read Encoder Angle Encoder sensor position Get Adc Average Angle Adc
  • Java后端WebSocket的Tomcat实现

    一 WebSocket简单介绍 随着互联网的发展 传统的HTTP协议已经很难满足Web应用日益复杂的需求了 近年来 随着HTML5的诞生 WebSocket协议被提出 它实现了浏览器与服务器的全双工通信 扩展了浏览器与服务端的通信功能 使服
  • SSM框架学习记录-Spring_day01

    1 核心概念 当前项目中的问题 下面代码的实现十分简单 但是业务层需要调用数据层的方法 就要在业务层new数据层的对象 如果数据层的实现类发生变化 业务层的代码也需要跟着改变 意味着要编译打包和重新部署 数据层实现 public class
  • pytorch实现深度学习常用图像分类数据集的划分与读取(Oxford-102flower,CIFAR10/CIFAR100)

    Oxford 102flower花分类数据集 CIFAR10 CIFAR100数据集 Oxford 102flower Oxford 102flower是牛津工程大学于2008年发布的用于图像分类的数据集 总共分为102个类 每个类包含40
  • Centos7通过宝塔安装mysql

    文章目录 一 在桌面安装数据库 安装好可以修改端口号 二 开放3306端口号 打开远程访问权限 2 1开放3306端口号 2 1 为需要远程登录的用户赋予权限 三 查看密码 第一种方式控制面板查看 第二种方式修改密码 四 测试 五 修改连接
  • Python压缩目录文件夹,解压目录文件夹及耗时效率统计

    Python用zip file压缩文件夹 用unzip file解压文件夹 1 压缩效果对比 发现压缩率挺低的 压缩前 28 9MB 压缩后依然 27 8MB 2 压缩耗时 运用了Python 装饰器 拦截每个方法 并输出方法的耗时 可以参
  • spark用submit提交程序遇到的错误(机器内存较小)

    部署使用的spark版本是spark1 3 0部署环境 主节点centos7操作系统 2g内存 从节点debian系统1g内存 2个 spark env sh的设置如下 export SCALA HOME usr local scala 2
  • Apple Tree【树链剖分模板题】

    There is an apple tree outside of kaka s house Every autumn a lot of apples will grow in the tree Kaka likes apple very
  • altium Designer22 AD22 CAD电子绘图员三级知识点操作说明

    文章目录 AD22 一 解决局域网中多台电脑冲突 禁用license的网络功能 二 添加库文件 三 库的使用 四 库绘制 1 原理图库绘制 2 PCB封装库绘制 五 动态标题栏 六 原理图模板的使用 七 层次电路图设计 1 在母图上放置页面
  • 苹果Mac mini装win 7系统

    我用的主机是苹果Mac mini 4G内存 500G硬盘 i5双核的处理器 现在要从事嵌入式软件开发 所以要在苹果机器上装个win 7的系统 再在win 7系统中装Linux的虚拟机 折腾了好几天 终于差不多快搞好了 中途把win 7系统装
  • 通过三个示例,看Java读取文件数据与Java写入数据到文件操作

    Java读取文件 1 JAVA读取文件内容的程序 2 JAVA写入内容到指定文件 3 JAVA读取文件A的内容 并将内容写入文件B 1 JAVA读取文件内容的程序 提供文件所在位置 扫描文件内容 逐字输出文件内容 文件的内容逐字输出 因为n
  • 网络层协议-IP分组

    网络层Internet Protocol 在数据链路层提供的两个相邻端点之间的数据帧的传送功能上 进一步管理网络中的数据通信 将数据设法从源端经过若干个中间节点传送到目的端 从而向运输层提供最基本的端到端的数据传送服务 IP分组首部的格式功
  • Vue如何让页面加载时请求后台接口数据

  • NULL0路由的作用(概述)

    简单的来说 NULL0是属于路由器的逻辑接口 NULL0接口总是处于Up状态 但不转发任何报文 当NULL0接口接收到报文后 会把报文丢弃 不能在NULL0接口上配置IP地址 也不能在NULL0接口上封装任何链路层协议 NULL0主要用于防
  • Elasticsearch查询——Sort(查询排序)

    Sort 查询排序 测试索引 Elasticsearch针对普通数据 数组 嵌套对象 地理位置都提供了排序功能 为了测试其排序方式我们需要可以能够足够数据类型的索引 所以创建了下面一个索引以及其映射 PUT offline sales PU
  • AcWing 3708. 求矩阵的鞍点

    输入样例 3 4 1 2 3 4 1 2 3 4 1 2 3 4 输出样例 1 4 4 2 4 4 3 4 4 include
  • mysql安装(Linux中redhat版本,redhat密码破解)

    破解密码 1 先重启系统 开始界面点击鼠标入进电脑 按下e键 2 在界面中间输入rd break 输入Ctrl x执行 3 输入下面命令 修改命令 mount o 是字母o不是数字0 remount rw sysroot chroot sy
  • 【华为OD机试真题 python】等和子数组最小和【2022 Q4

    前言 华为OD笔试真题 python 专栏含华为OD机试真题 华为面试题 牛客网华为专栏真题 如果您正在准备华为的面试 或者华为od的机会 有任何想了解的可以私信我进行交流 我会尽可能的给一些建议 和帮您解答 PS 文中答案仅供参考 不能照
  • 操作系统实验—处理机调度算法的模拟

    操作系统实验 处理机调度算法的模拟 一 实验目的 二 实验内容 PCB进程控制块结构 设计要求 三 实验过程记录 1 算法的思路 2 主要数据结构 3 程序代码 运行效果 一 实验目的 熟悉处理器调度算法的工作原理 掌握调度算法的实现 进程