- 博客(34)
- 资源 (10)
- 收藏
- 关注
原创 排序算法(三)
堆排序堆给人的感觉是一个二叉树,但是其本质是一种数组对象,因为对堆进行操作的时候将堆视为一颗完全二叉树,树种每个节点与数组中的存放该节点值的那个元素对应。所以堆又称为二叉堆,堆与完全二叉树的对应关系如下图所示:把堆看成一个棵树,有如下的特性:(1)含有n个元素的堆的高度是lgn。(2)当用数组表示存储了n个元素的堆时,叶子节点的下标是n/2+1,n/2+
2015-08-31 20:33:01 385
原创 排序算法(二)
归并排序基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序示例:算法实现void merge(int *arr,int *store,int start,int mid,int end){ int i,j,k; for(i
2015-08-30 16:10:20 391
原创 排序算法(一)
冒泡排序基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。冒泡排序的示例:算法实现void print(int *arr, int size){ int i; for( i = 0; i < size
2015-08-30 15:28:08 460
转载 epoll 模型
Epoll模型相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE 1024表示select最多同时监听1024个fd,当然,可以通过修改头文件再重编
2015-08-29 19:27:26 392
转载 poll函数
函数原型#includeint poll(struct pollfd fdarray[],nfds_t nfds, int timeout); 返回值:准备就绪的描述符数目;若是超时,返回0;若是出错,返回-1第一个参数 pollfd 结构体定义如下:struct pollfd{ int fd; /* poll 的文件描述符. */
2015-08-28 21:46:15 586
原创 Select 函数
函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它。函数说明#include#includeint select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset,const struct timeval *timeout); 若
2015-08-28 21:16:13 465
转载 static 关键字详解
static 关键字详解首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.1. 用static声明的函数和变量小结 static 声明的变量在C语言中有两方面的特征:1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。2)、变量用static告
2015-08-17 16:34:07 546
转载 sizeof 操作符详解
1、定义sizeof是C语言的一种单目操作符,它并不是函数。sizeof操作符以字节形式给出了其操作数所占存储空间的大小。操作数可以是一个表达式或括在括号内的类型名。操作数所占存储空间的大小由操作数的类型决定。作用就是返回一个对象或者类型所占的内存字节数。2、语法sizeof有如下三种语法形式:(1) sizeof( object ); // sizeof( 对象 );
2015-08-16 19:58:37 772
原创 const的用法
const 的用法修饰变量类型const int bufSize = 512; //任何对bufSize进行赋值的操作都是错误的。 const int j = get_num(); //因为const对象一旦创建就不能改变,所以const对象const int j = 21; //必须初始化,可以运行是初始化和编译时初始化注意:默认情况下,const对象
2015-08-16 16:00:56 390
转载 c++的引
引用简介 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名; 【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名 说明: (1)&在此不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型
2015-08-16 15:10:09 440
原创 线程私有数据
线程私有数据创建私有数据之前得先创建一个键,需要创建与该数据相关联的键#includeint pthread_key_create(pthread_key_t *keyp, void (*destructor)(void *));成功--0,出错--返回错误编号参数;keyp -- 存储创建的键,可以被任何线程使用,但每个线程把这个键和不同的线程私有数据地址进行关联
2015-08-10 19:27:13 376
转载 线程私有数据实现的原理
在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的索引来实现访问,但是有一个问题是系统生成的线程ID不能保证是一个小而连续的整数,并且用数组实现的时候由于其他线程也可以访问其数组中的数据,这样会引起数据混乱。这时候我们可以借助线程的私有数据来解决这个问题。 线程私有数据实现的主要思想是:在分配线程私有数据之前,创建与该数据相关联的健,
2015-08-10 17:23:53 1689
原创 线程同步
线程同步互斥量:从本质上是一把锁,在访问共享资源前对互斥量加锁,在访问完后解锁,对互斥量加锁后任何其他试图再次对其加锁都会被阻塞,知道当前线程对互斥量解锁。互斥量初始化1)静态初始化将互斥量设置为PTHREAD_MUTEX_INITIALIZER或者调用怕pthread_mutex_init函数2)动态初始化#includeint pth
2015-08-10 16:15:52 395
原创 线程原语
线程原语比较两个线程是否相等#includeint pthread_equal(pthread_t tid1,pthread_t tid2);相等--非0,否则-- 0获得自身的线程ID#includepthread_t pthread_self(void);创建线程#includeint pthread_create(pthread_
2015-08-10 11:31:21 526
原创 共享存储函数
共享存储共享存储允许两个或多个进程共享一个给定的存储区。数据不需要在客户进程和服务器进程之间复制,因此这是最快的一种进程间通信的方式。使用的窍门是多个进程访问存储区时,需要采取一定的同步控制。获取一个共享存储标志:shmget函数#includeint shmget(key_t key, size_t szie, inf flag);成功--共享存储ID,出
2015-08-09 15:57:56 443
转载 va_start和va_end使用详解
va_start和va_end使用详解 本文主要介绍va_start和va_end的使用及原理。 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理:1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);void foo(parm_list,...);这种方式和我们以前认识的不大一样,但我们要记住
2015-08-07 09:08:33 422
转载 define 的高级用法
define 的高级用法1、前言 今天看代码时候,遇到一些宏,之前没有见过,感觉挺新鲜。如是上网google一下,顺便总结一下,方便以后学习和运用。C语言程序中广泛的使用宏定义,采用关键字define进行定义,宏只是一种简单的字符串替换,根据是否带参数分为无参和带参。宏的简单应用很容易掌握,今天主要总结一下宏的特殊符号及惯用法。 (1)宏中包含特殊符号:#、##. (
2015-08-07 00:18:08 1094
原创 VIM 使用技巧
VIM 使用技巧1)删除空行 ==>:g/^$/d2)替换: 用字符串 str2 替换正文中所有出现的字符串 str1 ==>:1,$ s/str1/str2/g 或 :g/str1/s//str2/g g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换; g 放在命令开头,表示对正文中所有包
2015-08-06 23:54:12 393
原创 消息队列操作函数
消息队列操作函数1、概述 消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识。具有足够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息。在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。System V 消息队列是随内核持续的,只有在内核重起或者显示删除一个消息队列时,该
2015-08-05 22:22:02 919
原创 进程间通信之管道和FIFO
进程间通信管道特点:1)半双工,数据只能在一个方向上流动。 2)只能在具有血缘关系的进程间使用。#includeint pipe(int fd[2]);成功-- 0,出错-- -1fd 参数:返回的是文件描述符,fd[0] 读端,fd[1]写端。1.如果所有指向管道写端的文件描述符都关闭了(管道写端的引用计数等于0),而仍然有进程
2015-08-04 23:43:42 838
原创 Linux 进程管理命令
Linux 进程管理命令:& ==>将命令放在后台执行 #cp src_file dest_file & 命令:jobs ==> 查看目前的后台工作状态参数:-l 列出后台工作的进程 -s 仅列出正在后台当中暂停的工作 -r 仅列出正在后台run的工作命令:fg ==> 将后台工作拿到前台来处理 #fg %jobnum
2015-08-04 22:00:38 396
原创 记录锁 和 fcntl函数
记录锁和fcntl函数1 .记录锁的功能 当一个进程正在读或修改文件的某个部分时,它可以阻止其他进程修改同一文件区。我们不应该从字面上去理解记录锁,实际上它应该叫“区域锁”,因为它锁定的只是文件的一个(也可能是整个文件)。这个区域用来存放多用户的共享区。2 .记录锁的分类 记录锁分为共享读锁和独占写锁,前者也叫做共享锁后者也叫做排他锁。3
2015-08-04 16:53:21 504
原创 时间处理函数
时间处理函数time函数返回当前时间#includetime_t time(time_t *calptr);成功-- 时间值(秒数),出错-- -1若参数calptr非空,时间值也存在calptr上clock_gettime函数#includeint clock_gettime(clockid_t clock_id,struct timespec *t
2015-08-04 16:00:31 431
原创 mmap 函数
mmap 函数#includevoid *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t off);成功-返回映射区域的起始地址,出错-返回MAP_FAILEDaddr 参数用于指定映射存储区的起始地址。通常设置为NULL,表示由系统选择映射区的起始地址。此函数返回值是映射区的起始地址。len 参数
2015-08-04 11:43:59 433
转载 同步和信号量
信号量概述下面介绍用信号量进行同步。信号量概念由荷兰科学家Dijkstra首先提出。信号量是一个特殊类型的变量,它可以被增加或者减少。但对其的关键访问被保证是原子操作,即使在一个多线程程序中也是如此。信号量有两种类型:(1)二进制信号量。它只有0和1两种取值。(2)计数信号量。它可以有更大的取值范围。如果要用信号量来保护一段代码,使其每次只能被一个执
2015-08-03 19:41:31 692
转载 线程属性设置
在上一篇文章中,介绍了线程的创建和退出,以及相关函数的使用。其中pthread_create函数的第二个参数,是关于线程属性的设置,这也是今天所有讲述的。这些属性主要包括邦定属性、分离属性、堆栈地址、堆栈大小、优先级。其中系统默认的是非邦定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。(1)邦定属性。
2015-08-03 17:19:09 1752
转载 同步和互斥量
互斥量(也称为互斥锁)出自POSIX线程标准,可以用来同步同一进程中的各个线程。当然如果一个互斥量存放在多个进程共享的某个内存区中,那么还可以通过互斥量来进行进程间的同步。互斥量,从字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用于保护临界区(共享资源),以保证在任何时刻只有一个线程能够访问共享的资源。互斥量类型声明为pthread_mutex_t数据类型,在中有具体的定义。
2015-08-03 12:07:02 421
转载 同步和条件变量
条件变量变量也是出自POSIX线程标准,另一种线程同步机制,。主要用来等待某个条件的发生。可以用来同步同一进程中的各个线程。当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量来进行进程间的同步。每个条件变量总是和一个互斥量相关联,条件本身是由互斥量保护的,线程在改变条件状态之间必须要锁住互斥量。条件变量相对于互斥量最大的优点在于允许线程以无竞争的方式等待条件的发生。当
2015-08-03 12:03:51 410
转载 同步与读写锁
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步,和互斥量不同的是:互斥量会把试图进入已保护的临界区的线程都阻塞;然而读写锁会视当前进入临界区的线程和请求进入临界区的线程的属性来判断是否允许线程进入。相对互斥量只有加锁和不加锁两种状态,读写锁有三
2015-08-03 11:48:49 396
转载 线程的结合态和分离态
线程的分离与结合 在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。线程的分离状态决定一个线程以什么样的方式来终止自己。在上面的例子中,我们采用
2015-08-03 09:42:36 1323
转载 Linux 多线程的基本概念
一、基本概念1、线程是计算机中独立运行的最小单位。进程是分配资源的单位。2、为什么使用多线程?(1)启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间
2015-08-03 09:39:36 380
转载 僵尸进程和孤儿进程
1、前言 之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧。晚上回来google了一下,再次参考APUE,认真总结一下,加深理解。2、基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的
2015-08-02 18:21:16 408
转载 exit函数 和 _exit函数区别
exit()函数定义在stdlib.h中,而_exit()定义在unistd.h中,从名字上看,stdlib.h似乎比 unistd.h高级一点,那么,它们之间到底有什么区别呢?_exit()函数的作用最为简单:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit() 函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序,也是因为这个原因,有些人认为e
2015-08-02 18:14:59 406
原创 Linux 进程控制函数
返回标识符函数#includepid_t getpid();//返回值:调用进程的进程IDpid_t getppid();//返回值:调用进程的父进程pid_t getuid();//返回值:调用进程的实际用户IDpid_t geteuid();//返回值:调用进程的有效用户IDpid_t getgid();//返回值:调用进程的实际组IDpid_t get
2015-08-02 17:24:56 497
打通Linux脉络系列:进程、线程和调度.pdf
2020-01-05
跟我一起写Makefile
2015-07-10
socket编程原理
2015-07-10
Linux与Unix Shell编程指南pdf
2015-03-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人