一、JSON的简单介绍 JSON(JavaScript Object Notation):JS对象表示法 是轻量级的文本数据交换格式;独立于语言,JSON解析器和库支持多种编程语言 json文件的文件类型是”.json” 语法规则: 数据在 名称/值对 中 名称在双引号中,后面写一个冒号,然后是值 值可以是:数字(整数或者浮点数)、string(在双引号中)、逻辑值(true/false)、数组(在[]中)、对象(在花括号中)、null,这些结构可以嵌套。 eg.数组: { "people": [ {"firstname":"jr","lastname":"smith"}, {"firstname":"palu","lastname":"george"} ] } 对象people包含两个对象的数组,每个对象是某人的姓和名,people[0].lastname返回smith 数 继续阅读 >>


杜肖孟 17/06/12 19:49:44
I/O设备分类: 按使用特性 人机交互类外设:打印机、显示器、鼠标、键盘等 存储设备:磁盘、磁带、光盘等 网络通信设备:网络接口、调制解调器等 按传输速率分类 低速设备:每秒几个到数百个字节(< KB/s),如键盘、鼠标 中速设备:每秒数千个字节至数万个字节,如激光打印机 高速设备:数百个千字节至千兆字节(>100 KB/s),如磁带机、光盘机 信息交换的单位分类 块设备:信息的存取以数据块为单位,读写的基本单位是数据块,如磁盘 字符设备:用于数据输入输出的设备为字符设备,读写的基本单位是字符,如交互式终端机、打印机 设备控制器 什么是设备控制器? 设备控制器是计算机中的一个实体,物理上看控制器是一块接口卡或主板上的一个功能模块。主要职责是控制一个或多个I/O设备,以实现CPU与I/O设备之间的数据交换。设备控制器收到命令后,CPU可以转向执行其他工作,而让设备控制器自行完成具体的I/O操作。当命令执行结束后,控制器发出一个中断信号,OS重新获得CPU控制权并检查执行结果。这样把CPU解脱出来。 设备控制器 继续阅读 >>


杜肖孟 17/06/03 14:45:34
想用C++写项目,数据库是必须的,所以这两天学了一下C++操作Mysql数据库的方法。也没有什么教程,就是在网上搜的知识,下面汇总一下。 连接MySQL数据库有两种方法:第一种是使用ADO连接,不过这种只适合Windows平台;第二种是使用MySQL自己的C API函数连接数据库。我是在Linux平台下开发,所以就采用第二种方法,有很多Api函数,但是常用的就几个,我也是就用到其中的几个。 API函数 1.mysql_real_connect() 连接一个mysql服务器 MYSQL *mysql_real_connect (MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag) 如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回 继续阅读 >>


杜肖孟 17/05/28 23:28:44
进程调度的功能 记录系统中的所有进程的状态、优先级数和资源的需求情况 确定调度算法,决定将CPU分配给哪个进程多少时间 分配处理机给进程,进行CPU现场的保护和移交 调度的层次 一个作业从提交开始直到完成,往往要经历以下三级调度,如图所示。 作业调度。又称高级调度,.其主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它(们)获得竞争处理机的权利。简言之,就是内存与辅存之间的调度。对于每个作业只调入一次、调出一次。 多道批处理系统中大多配有作业调度,而其他系统中通常不需要配置作业调度。作业调度的执行频率较低,通常为几分钟一次。 中级调度。又称内存调度。引入中级调度是为了提高内存利用率和系统吞吐量。为此,应使那些暂时不能运行的进程,调至外存等待,把此时的进程状态称为挂起状态。当它们已具备运行条件且内存又稍有空闲时,由中级调度来决定,把外存上的那些已具备运行条件的就绪进程,再重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待。 进程调度。又称为低 继续阅读 >>


杜肖孟 17/05/03 21:11:07
信号量S的物理含义 S>0:表示有S个资源可用;S=0表示无资源可用;S<0绝对值表示等待队列或链表中的进程个数。信号量的初值应大于等于0。 PV原语小结 通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 信号量是由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原语)来访问,它们在执行时是不可中断的。初始化可指定一个非负整数,即空闲资源总数。 P原语:P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。操作为:申请一个空闲资源(把信号量减1),则若成功,则退出;若失败,则该进程被阻塞; V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。 P(S):表示申请一个资源,S减 1;若 减1 后仍S> 继续阅读 >>


杜肖孟 17/05/02 21:22:06
指针、迭代器与const的关系 1. 如果关键字出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。如果被指物是常量,把 const 写在类型之前或者类型之后、星号之前是一样的。 2. 迭代器的作用就像 T* 指针,const 在迭代器前,迭代器不能改变,即声明一个 T* const 指针;const 在迭代器变量前,迭代器所指变量不能变,即声明一个 const T* 指针,需要用 const_iterator。 vector<int> vec; const vector<int>::iterator iter = vec.begin(); //iter就像个T* const *iter = 10; //right ++iter; //iter不能变 vector<int>::const_iterator cIter = vec.begin(); //cIter 继续阅读 >>


杜肖孟 17/04/30 18:04:51
预处理器、编译器、汇编、链接 预处理器(cpp) C/C++的预处理器是最低端的一种—–词法预处理器,主要是进行文本替换、宏展开、删除注释、把头文件内容包含进来这类简单工作。 gcc -E选项可得到预处理后的结果,预处理结果会显示到屏幕上,如果需要保存,则得需要重定向,扩展名为 .i; C/C++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于C/C++语句(这也是定义宏时不要加分号的原因),语法检查是编译器要做的事情; 预处理之后,得到的仅仅是真正的源代码,输出一个hello world都有好几百行代码; GCC确实很强大,如果是用VC这种IDE,恐怕就不能看到预处理后的结果。 编译器(ccl) 将文本文件 .i 翻译成文本文件.s,得到汇编语言程序(把高级语言翻译为机器语言),该种语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。 gcc -S 选项可以得到编译后的汇编代码,扩展名为 .s; 汇编语言为不同高级语言的不同编译器提供了通用的输出语言,比如,C编译器和Fortra 继续阅读 >>


杜肖孟 17/04/30 12:28:46
视C++为一个语言联邦 今天的C++已经是个多重范型编程语言,同时支持过程形式、面向对象形式、函数形式、范型形式、元编程形式。为了理解C++,必须认识其主要的次语言,总共有四个: 1. C。C++以C为基础,语句、预处理、内置数据类型等来自C,但C没有模板、没有重载…… 2. Object-Oriented C++。面向对象C++,class、封装、继承、多态、虚函数等 3. Template C++。C++范型编程 4. STL。标准模板库,对containers、iterators、algorithms以及function objects的规约有极佳的紧密配合与协调 尽量以const,enum,inline 替换 #define 现在我们写这样一个宏定义 #define Aspect 1.653 #define 不是语言的一部分,是预处理阶段完成的,没有到编译器,因此 #define定义的记号名称也就没有进入符号表(symbol table)。当我们因为运用#define定义的常量而发生编译错误时,那么会很浪费时间来追踪它。解决方法是 继续阅读 >>


杜肖孟 17/04/29 16:23:27
声明 今年的免试题按照关卡顺序依次是由小组15级成员何攀、楚东方、宫展京、杜肖孟、王一妃同学精心准备的(鼓掌),每个人总结了一下自己负责关卡的解法,我这里整理了一下,给出一套完整的免试题详解,免试题通过方法不唯一哦,想分享的可以留言。文末附上小组前几年的免试题详解,感兴趣的同学可以参考着玩一下。Let’s go! 第一关 免试题链接:点此进入 ,进去之后会有如下页面映入眼帘: 首先,我们看到的是一段代码(运行结果是 11,代表着我们小组成立 11 周年)和一段关于 π 的视频,在欣赏完这曲美妙的钢琴曲后发现并没有什么其他的信息了,然后我们应该想到查看网页源代码(Ctrl+u 或 F12),然后会发现在网页源代码里有一个压缩包文件,如下图: 把这个压缩文件 XiyouLinuxGroup.zip 下载下来后,发现这个压缩包是加密的,然后我们应该想到这个密码肯定隐藏在这个网页的某个地方,这时候应该想起网页上的那段代码和视频,那这个代码的运行结果 11 与关于 π 的视频和那个压缩包的密码有什么联系呢?我们都知道 π 是一个无限不循环小数,所以密码 继续阅读 >>


杜肖孟 17/04/28 20:46:50
最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进行简单的整理。 几种 I/O 模型 为什么 Redis 中要使用 I/O 多路复用这种技术呢? 首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的。 Blocking I/O 先来看一下传统的阻塞 I/O 模型到底是如何工作的:当使用 read 或者 write 对某一个文件描述符(File Descriptor 以下简称 FD)进行读写时,如果当前 FD 不可读或不可写,整个 Redis 服务就不会对其它的操作作出响应,导致整个服务不可用。 这也就是传统意义上的,也就是我们在编程中使用最多的阻塞模型: 阻塞模 继续阅读 >>


杜肖孟 17/04/16 16:21:00