1.进程调度的功能 记录系统中所有进程的状态、优先数和资源的需求情况 确定调度算法。决定将CPU分配给哪个进程及多长时间 分配处理机给进程 2.进程调度方式 非抢占式 :直到进程完成或因为某时间而不能运行时,才将CPU分配给其他进程 。通常用在批处理系统中。主要优点是简单、系统开销小 抢占式 :当一个进程正在执行,系统可以基于某种策略剥夺CPU给其他进程。剥夺的原则有:优先权原则、短进程优先原则和时间原则。主要用于分时系统和实时系统,以便及时响应各进程请求 3.引进进程调度的时机 正在执行的进程正确完成/由于错误终止运行(陷阱和中断) 执行的进程提出I/O请求,等待其完成 分时系统中,进程时间片用完 按照优先级调度时,有更高的优先级进程变为就绪时(抢占方式) 发生阻塞(执行的进程执行了wait、阻塞原语和唤醒原语时) 4.进程调度算法的评价准则 1)面向系统的调度性能准则 吞吐量 处理及利用率 各个设备的均衡利用 2)面向用户的调度性能准则 周转时间 响应时 继续阅读 >>


吕子健 18/04/14 22:18:09
既然是队列那么先要包含头文件#include <queue> 优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的 定义:priority_queue<Type, Container, Functional> Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆 一般是: //升序队列 priority_queue <int,vector<int>,greater<int> > q; //降序队列 priority_queue <int,vector<int>,less<int> > 继续阅读 >>


吕子健 18/04/14 10:58:07
当我们重载了++这个自增运算符,那么在调用他的时候,编译器如何知道我们是调用了前缀自增还是后缀自增呢 #include <iostream> using namespace std; class tmp { private: int a; public: tmp(int b) { a = b; } tmp& operator++(); //这是前缀 const tmp operator++(int); //这是后缀 void show(); }; tmp& tmp::operator++() { this->a += 1; return *this; } const tmp tmp::operator++(int) { tmp old = *this; //先拿到自增前的值 this->a += 1; //再自增 return old; } void tmp::s 继续阅读 >>


吕子健 18/04/11 00:05:45
今天碰到一个报错 tree.cpp: In function ‘merkle_node* createMerkleNode(std::__cxx11::string, bool)’: tree.cpp:81:63: error: default argument given for parameter 2 of ‘merkle_node* createMerkleNode(std::__cxx11::string, bool)’ [-fpermissive] merkle_node* createMerkleNode(string data, bool isLeaf = false) ^ tree.cpp:20:14: note: previous specification in ‘merkle_node* createMerkleNode(std::__cxx11:: 继续阅读 >>


吕子健 18/04/09 20:23:13
使用命令 sudo apt-get install libssl-dev 安装libssl-dev即可 作者:weixin_36888577 发表于 2018/04/07 19:35:47 原文链接 https://blog.csdn.net/weixin_36888577/article/details/79844161 阅读:256 继续阅读 >>


吕子健 18/04/07 19:35:47
先看代码 #include <iostream> #include <string> using namespace std; class Student { string name; int number; public: Student(const string &str, int n = 1) : name(str), number(n) {} Student() {} void Print(const Student &s); //期待的是Student类的参数 }; void Student::Print(const Student &s) { if (s.name == name) { cout << "same person" << endl; } else { cout << "di 继续阅读 >>


吕子健 18/04/01 11:50:07
c++里初始化静态、非静态,const以及引用的数据成员各不相同 静态成员初始化 class a { private: static int i1 = 1; //错误 static int i2; //应该这么做 static const int i3 =2; //正确 int i4 = 1; //正确 }; int a::i2 = 1; //在这里定义   总结一下,在类里面的静态数据成员,只有常量可以在类内定义,非常量的静态数据成员统一都在类内声明,类外定义   声明只是告诉编译器他的类型,定义时才分配内存空间   因为静态成员是类级别的,不是对象级别的,它的生存周期和源程序等同,为类所有的对象共享,所以如果在类里面就能定义分配内存空间,那么每一个对象被创建时都会分配一次内存,显然是不合理的,所以就放在类外,只分配一次内存空间   而至于常量静态数据成员,编译器知道他是一个常量,不会发生改变,所以可以在类内定义初始化   (小知识:一个变量只有可以拥 继续阅读 >>


吕子健 18/03/30 11:37:12
针对中国软件杯有关区块链的项目,记录一下了解学习的过程   官方说法区块链是:分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。      按照我的理解翻译一下   区块链就是一个使你不需要第三方信任凭证的数据结构.比如:在小组内,我现在和A赌球,他赌今年总冠军是火箭,我坚信湖人总冠军.我们赌了40,但是我们都信不过对方,于是交给中间人B.谁赢把钱给谁.但是也存在B(中心)卷钱跑了,所以我们有了区块链,不需要第三凭证人(中心),而是每一个人都是一个中心都有一个"账本",当我和A赌约成立后,小组内每个人的小账本上都记下了这个赌约,这样A就不能赖账了,以前他耍赖只需要贿赂B(中心),但现在他要改变小组内每一个人,所以当人群基数多起来后,基本是不肯能的,这就保障了区块链的信用可靠性.   所以说,区块链是我们每一个人都拥有一个按时间顺序关联成链记录交易(具体数据)的区块,通过一定的加密算法记录交易数据并使其不可逆      这样一来,我们的网络的服务器模型就是P2P模 继续阅读 >>


吕子健 18/03/20 22:25:33
例子如下: using namespace std; class test { public: void a() { while ( 1 ) signal( SIGINT, change ); } void change( int sag ) { cout << "here\n"; } }; int main() { test t; t.a(); } 这样会报错 error: invalid use of non-static member function 因为signal的函数原型: void (*signal(int signo , void (*func)(int)))(int); signo:表示需要处理的信号; func:是一个指向void funciont(int)类型的函数指针; 返回值:返回值是一个指向void function(in 继续阅读 >>


吕子健 18/03/12 20:03:58
在康康的帮助下找出了内存泄露 C++需要自己来管理内存,真的是很容易发生内存泄露啊,以后需要更加仔细认真 #include<iostream> #include<cstring> #include<cstdbool> using namespace std; class String { char *str; //输出 friend ostream& operator<<( ostream &,String & ); //输入 friend istream& operator>>( istream &,String & ); //初始化 String(); String( const char * ); String( const String & ); String( int ,char ); 继续阅读 >>


吕子健 17/12/26 21:39:44