C++
文章平均质量分 74
Mirants
这个作者很懒,什么都没留下…
展开
-
Effective STL 第1条:慎重选择容器类型
C++提供了几种不同的容器供我们选择,这里简单回顾一下:1、标准STL序列容器:vector、string、deque和list。2、标准STL关联容器:set、multiset、map、和multimap。3、非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一“重型”string。4、非标准关联容器hash_set、hash_multiset、has原创 2014-12-21 19:38:09 · 991 阅读 · 0 评论 -
I/O多路复用之总结
poll() 和 select() 的区别虽然 poll() 和select() 完成相同的工作,但 poll() 调用在很多方面仍然优于 select() 调用:poll() 不需要用户计算最大文件描述符值加 1 作为参数传递给它。poll() 对于值最大的文件描述符,效率最高。试想一下,要通过 select() 监视一个值为900的文件描述符,内核需要检查每个集合中的每个位原创 2015-08-08 23:55:54 · 1156 阅读 · 0 评论 -
I/O 多路复用之poll
概述poll() 系统调用是System V 的I/O多路复用的解决方案。它解决了一些 select() 的不足,不过 select() 还是被频繁的使用(还是出于习惯或可移植性的考虑)。Poll() #include int poll(struct pollfd *fds, nfds_t nfds, int timeout);select() 使用了原创 2015-08-08 14:11:35 · 840 阅读 · 0 评论 -
I/O 多路复用之select
概述Linux提供了三种 I/O 多路复用方案:select,poll和epoll。在这一篇博客里先讨论select和poll,epoll是Linux特有的高级解决方案,将在下一篇中介绍。select()select()系统调用提供了一种实现同步 I/O 多路复用的机制:#include int select (int n, fd_set原创 2015-08-08 12:40:39 · 1238 阅读 · 0 评论 -
线程小结
二进制程序,进程和线程二进制程序(binaries)是指保存在存储介质上的程序,以给定操作系统和计算机体系结构可访问的格式编译生成,可以运行但尚未开始。进程(process)是操作系统对运行的二进制程序的抽象,包括:加载的二进制程序,虚拟内存,内核资源如打开的文件,关联的用户等。线程(threads)是进程内的执行单元,具体包括:虚拟处理器,堆栈,程序状态。换句话说,进程是正在运行的二进制程序原创 2015-08-09 14:23:45 · 883 阅读 · 0 评论 -
线程模式
创建多线程应用的第一步原创 2015-08-09 16:10:30 · 3087 阅读 · 1 评论 -
线程模型
内核级线程模型在一个系统上实现线程模型的方式有好几种,因内核和用户空间提供的支持而有一定程度的级别差异。最简单的模型是在内核为线程提供了本地支持的情况,每个内核线程直接转换成用户空间的线程。这种模型称为“1:1线程模型(threading)”,因为内核提供的线程和用户的线程的数量是1:1。该模型也称为“内核级线程模型(kernel-level threading)”,因为内核是系统线程模型的核原创 2015-08-09 20:54:12 · 3475 阅读 · 0 评论 -
POSIX 线程小结
POSIX 在IEEE Std 1003.1c-1995 (也称为POSIX 1995 或 POSIX.1c) 对线程库进行了标准化。开发人员称之为 POSIX线程,或简称为 Pthreads。Pthreads 是 UNIX 系统上 C 和 C++ 语言的主要线程解决方案。Pthreads APIPthreads API 定义了构建一个多线程程序需要的方方面面——虽然是在很底层做的。Pth原创 2015-08-11 13:11:32 · 1287 阅读 · 0 评论 -
POSIX 线程小结(续)
join (加入)线程和 detach (分离)线程由于线程创建和销毁很容易,必须有对线程进行同步的机制,避免被其他线程终止——对应的线程函数即 wait() 。实际上,即 join(加入) 线程。join 线程join 线程支持一个线程阻塞,等待另一个线程终止: #include int pthread_join (pthread_t原创 2015-08-11 13:50:57 · 745 阅读 · 0 评论 -
Pthread 互斥
初始化互斥对互斥加锁对互斥解锁Mutex示例Scoped锁原创 2015-08-11 13:59:16 · 980 阅读 · 0 评论 -
随机置换算法
算法过程:在内存块初始化后,取出页面访问序列队列的队头。首先判断内存块中是否已经存在该队头页面,如果存在则直接显示内存块当前情况;否则,判断此时内存是否已满。如果内存未满,循环遍历找出空闲内存块,进行页面置换;若内存已满,在所有的内存块中随机选出一个作为被置换页面,缺页数加1。如此循环迭代,直到页面访问序列队列为空时,整个算法执行完毕。最后计算并显示缺页率。其流程图如图所示。原创 2015-06-16 15:14:16 · 5118 阅读 · 0 评论 -
FIFO先进先出置换算法
算法过程:将内存块数组视为队列,在实现的过程中,初始化时,队头指针指向第一个内存块位置,队尾指针指向最后一个内存块位置。每次进行页面置换时,算法总置换当前队头,并且,队头指针循环加1,队尾指针循环加1.在内存块初始化后,取出页面访问序列队列的队头。首先判断内存块中是否已经存在该队头页面,如果存在则直接显示内存块当前情况;否则,判断此时内存是否已满。如果内存未满,循环遍历找出空闲内存块,原创 2015-06-16 15:20:53 · 12259 阅读 · 0 评论 -
Effective STL 第12条:切勿对STL容器的线程安全性有不切实际的依赖
在多线程中,对一个STL实现,我们最多只能期望:1、多个线程读是安全的。多个线程可以同时读同一个容器的内容,并且保证是正确的。自然的,在读的过程中,不能对容器有任何写入操作。2、多个线程对不同的容器做写入操作是安全的。多个线程可以同时对不同的容器做写入操作。在一般情况下,我们可以有下面的解决方法:1、自己手工做同步控制。vector v;...getMu原创 2014-12-21 13:49:58 · 729 阅读 · 0 评论 -
Effective STL 第2、3、4条
第2条:不要试图编写独立于容器类型的代码第3条:确保容器中的对象副本正确而高效 容器中保存了对象,但并不是你提供给容器的那些对象。而当从容器中取出个对象时,你所取出的也并不是容器中所保存的那份。当向容器中加入对象时(通过insert或push_back之类的操作),存入容器的是你所指定的对象的副本。当(通过如front或back之类的操作)从容器中取出一个对象时,你所得到的是容原创 2014-12-21 20:06:52 · 656 阅读 · 0 评论 -
Effective STL 第5条:区间成员函数优先于与之对应的单元素成员函数
使用区间成员函数而不是其相应的单元素成员函数的原因:l 通过使用区间成员函数,通常可以少写一些代码。l 使用区间成员函数通常会得到意图清晰和更加直接的代码。l 在一般情况下,效率更高。 区间操作有以下几种:区间创建。所有的标准容器都提供了如下形式的构造函数:container::container (InputIteratorbegin, InputIter原创 2014-12-21 21:13:19 · 776 阅读 · 0 评论 -
Effective STL 第7条:如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉
STL中的容器相当“聪明”,它们提供了迭代器,以便进行向后和向前的遍历(通过begin、end、rbegin等);它们告诉你所包含的元素类型(通过它们的value_type类型定义);在插入和删除的过程中,它们自己进行必要的内存管理;它们报告自己有多少对象,最多能容纳多少对象(分别通过size和max_size);当然,当它们自身被析构时,它们自动析构所包含的每个对象。 有了这么“原创 2014-12-21 22:31:47 · 1463 阅读 · 0 评论 -
慎重选择删除元素的方法
总结本条款,一共有以下几点是需要牢记的:1、要删除容器中有特定值的所有对象:(1)、如果容器是vector、string或deque,则使用erase-remove习惯用法。(2)、如果容器是list,则使用list::remove(3)、如果容器是标准关联容器,则使用它的erase成员函数。eg: 假定你有一个标注的STL容器c,它包含int类型的整数:Cont原创 2014-12-21 11:34:05 · 722 阅读 · 0 评论 -
LRU最近最久未使用算法
算法过程最近最久未使用算法需要引入内存块时钟,即为每个内存块设定一个计时器,用于记录相应内存块中的页面已经存在的时间。每次置换选出所有内存块时钟中最大者作为被置换页面,当页面发生置换时,将其对应的计时器清零,并且其他计时器加1.可用等长的整型数组来表示每个内存块的计时器。在内存块初始化后,取出页面访问序列队列的队头。首先判断内存块中是否已经存在该队头页面,如果存在则直接显示内存块当前情况;原创 2015-06-16 15:22:01 · 12051 阅读 · 0 评论 -
简单Clock算法
算法过程: 简单Clock算法需要根据页面内存是否被访问来决定是否置换该页面。实际编程中,与最近最久未置换算法类似,用整型数组来表示当前每个内存页面是否被访问,其中1代表被访问过,0代表未访问过。每次置换,指针循环遍历,找出第一个访问位不为1的那个内存页面。并且在找到被置换页面之前,将所经过的所有页面内存对应的访问位置0.在内存块初始化后,取出页面访问序列队列的队头。首原创 2015-06-16 16:05:58 · 29974 阅读 · 0 评论 -
改进型Clock算法
算法过程:改进型的Clock算法需要综合考虑某一内存页面的访问位和修改位来判断是否置换该页面。在实际编写算法过程中,同样可以用一个等长的整型数组来标识每个内存块的修改状态。访问位A和修改位M可以组成一下四种类型的页面。1类(A =0, M = 0):表示该页面最近既未被访问,又未被修改,是最佳淘汰页。2类(A =0, M = 1):表示该页面最近未被访问,但已被修改,并不是很好的淘原创 2015-06-16 16:15:50 · 20851 阅读 · 3 评论 -
最佳替换算法模拟
定义最佳(Optimal)置换算法是指,其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。但由于人们目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用该算法去评价其它算法。算法过程现举例说明如下。 假定系统为某进程原创 2015-06-15 21:01:22 · 2398 阅读 · 0 评论 -
分散/聚集 I/O(scatter-gather I/O)
概述分散/聚集 I/O是一种可以在单次系统调用中对多个缓冲区输入输出的方法,可以把多个缓冲区的数据写到单个数据流,也可以把单个数据流读到多个缓冲区中。其命名的原因在于数据会被分散到指定缓冲区向量,或者从指定缓冲区向量中聚集数据。这种输入输出方法也称为向量 I/O(vector I/O)。与之不同,标准读写系统调用(read,write)可以称为线性I/O(linear I/O)。与线性 I原创 2015-08-06 23:43:28 · 9732 阅读 · 0 评论