C语言
spring_hui123
本人新浪博客地址 http://blog.sina.com.cn/u/5551884115
内容无特殊说明均为原创,欢迎转载分享知识,因本人尚且属于学习阶段,因此博文中可能会出现错误的知识,如有前辈发现错误请及时指出,不胜感激!
展开
-
大数据处理之Hash哈希表(一)
现在的网络公司对于数据的处理的非常看重的。比如拿百度来说,10大热搜词就是从海量的用户搜索的数据中找到的,我们想的很简单,只要把所有用户搜索的数据按搜索次数 排列下来,随便用个快排?归并?取前10种出现频次最高的不同的数据就好了,可是用户搜索的数据实在是太多了。使用快排归并那种内部排序是需要我们使用电脑内存的,现在电脑一般都是4-8G的内存。这可能连数据百分之1都存放不下。数据都不齐全,何谈排序...原创 2018-02-09 16:36:07 · 871 阅读 · 0 评论 -
I/O复用---select
I/O复用也是提高服务器性能的一种非常高效的方式,它的原理是什么呢? 我们知道服务器在 接受新的客户端链接,接受已连接客户端发来的数据 等事情上不总是连续的,持续的。假如 一个服务器不使用多线程编程的话,只用一个main线程只能做到和一个客户端链接,接受数据。然而这个客户端只 和服务器链接一次,并且发送数据也不是特别频繁,特别持续的。那么这个服务器可以说是大部分时间在无谓的等待客户端...原创 2018-02-09 16:54:19 · 365 阅读 · 0 评论 -
线程池网络编程
多线程编程中,每有一个新连接时就会创建一个新的线程去维护连接进行收发数据,但是这会有一个问题,就是频繁的线程创造结束会使系统内核的负担加重,对于执行任务的效率也相对低下,因为还要多出创造线程的时间。 那么如何提高效率,减轻内核的负担呢?我们知道主要原因是由于频繁的创建线程。想要改善效率 不可能选择不创建线程。那只能让线程创建的时间提前,并且不会频繁的再结束再创建。因此就有了线程池的提出。 线...原创 2018-02-09 16:53:46 · 490 阅读 · 0 评论 -
多进程网络编程
本文概述如何使 服务器同时 连接处理 客户端们。 即服务器的一个进程只负责接受 请求连接的客户端。而具体如何跟各个客户端发送数据交给自己创造的子进程去完成。 用TCP协议来举例。 服务器在创造套接字,并用套接字创建监听队列后,陷入循环,循环里负责的是只要accept接受到了客户端的链接,就会fork出一个子进程,子进程里和客户端去具体的send recv。而父进...原创 2018-02-09 16:52:28 · 400 阅读 · 0 评论 -
网络编程 TCP
网络编程的传输层协议一般分为UDP和TCP 其中TCP协议是面向连接的,可靠的,流式服务的协议。简而言之就是安全性完整性更高的,但效率低于UDP的协议。 本文将重点涉及linux下具体的采取TCP协议的网络编程代码实现。 首先最基本的要有两份代码,即服务器端和客户端各一份。 服务器端编程流程如下:1.首先要创建一个套接字socket,其本质为文件描述符 Int...原创 2018-02-09 16:50:14 · 317 阅读 · 0 评论 -
函数调用栈
我们常用函数,知道使用函数时会跳到函数定义的代码段去执行,然后执行完后再返回到调用函数去,但以下的一些问题却仍不清楚。这个调用过程的原理是什么调用函数前要做什么事情函数的参数是如何传递的如何跳转到被调用函数执行完被调函数后如何返回调用函数并且保证能接着运行要知道这些,需要结合代码的反汇编来看。写了一段简单的函数调用的代码以下为main函数的反汇编其中ebp为栈底指针,esp为栈顶指针。可以看到我们...原创 2018-02-09 16:48:38 · 501 阅读 · 0 评论 -
线程同步与线程安全
1线程同步 同步:多线程访问临界资源时,必须进行同步控制,多进程或者多线程的执行并不完全是绝对的并行运行,又可能主线程需要等待函数线程的某些条件的发生。 多线程的临界资源有全局数据,堆区数据,文件描述符 同步控制方式: 1.1信号量 需要用到头文件semaphore.h 获取: int sem_init(sem_t *sem,int pshared...原创 2018-02-09 16:47:32 · 4784 阅读 · 0 评论 -
线程
线程是什么 线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列:main的执行体。进程可以通过线程库创建N条线程,新建的线程为函数线程,main是主线程。虽然感觉是进程包含着线程,进程由线程组成,但是进程提出的概念比线程概念要早。 线程与进程的区别 1.进程是资源分配的最小单位,线程是CPU调度的最小单位。 2.线程是轻量级的进程 3.管理方式不一样。进程是pcb管理...原创 2018-02-09 16:47:09 · 298 阅读 · 0 评论 -
进程通讯(五)--共享内存
共享内存就是俩进程共同拥有的内存,一般执行一个程序,会给内存上分配该进程的空间吧。 如果两个进程有一部分是使用共享内存,那么这俩进程其他部分会各自分配自己的内存空间,而使用共享内存的地方只会分配一个共有的内存空间,也就是说这部分共享内存空间都属于这两个进程,这部分空间对于这俩进程来说都是自己的。共享内存本身不难理解,使用起来也无非是介绍几种函数,熟悉下用法。和其他IPC比较一下,还是很容易的。...原创 2018-02-09 16:46:43 · 277 阅读 · 0 评论 -
进程通讯(四)--消息队列
消息队列和管道很像。但它比起管道不需要固定进程的只读和只写,通讯间的进程都可以读写,并且支持多个进程。 而消息队列发送的消息 实际是一个消息类型和实际的消息。消息类型是什么?它其实是一个长整型数字,具体多少完全由用户来定义,为的是读消息时可以根据这个类型来调整读取的优先级顺序。 所以说消息队列发送的是数据块,一般发送的消息就定义为以下的结构体。 struct msg{ long type;//...原创 2018-02-09 16:46:21 · 268 阅读 · 0 评论 -
进程通讯(三)--信号量
信号量虽然也是进程通讯的一部分,但比起其他的通讯方式比如管道,消息队列这些直接发送数据的形式不太相同。主要起到控制同步异步的作用。 何为同步异步?听到同步不要因为这个“同”字就联想到俩进程同时运行。恰恰相反,同步往往要求一个进程等待另一个进程而达到协同作用。比如AB俩进程,A进程执行到了某段代码需要 B进程运行返回的数据 ,那么A就会等到了B进程执行直到B返回了A需要的数据时,A才会继续执...原创 2018-02-09 16:45:53 · 278 阅读 · 0 评论 -
进程通讯(二)--无名管道
无名管道是父子进程间的通讯。无名的管道创建使用完全是在内存中。甚至连有名管道要创建的管道文件都没有。 有名管道的管道文件虽然没有大小,但好歹磁盘中有个标记,可以被需通讯的进程们看到共同使用。而无名管道的管道完全隐藏在一个程序的代码中,在进程运行时创建销毁,正是因为这个特点,所以限制了通讯的范围。 无名管道创建打开的函数 int pipe(int fd[2]); 参数其实已经退化...原创 2018-02-09 16:45:27 · 316 阅读 · 0 评论 -
进程通讯(一)--有名管道
进程间通讯的意义很多书上都有说,总之是非常重要的一部分,就不多啰嗦了,简单来说是为了完成进程间的协作功能。 然而进程间的通讯方式也不少,信号,信号量,管道,共享内存..... 今天先来说说管道中的有名管道。当然有有名管道自然也有无名管道。至于他俩的区别,我们暂且记着有名管道是可以让同一台计算机上的任意两个无关系的进程通信。而无名管道则是必须需要通信的进程间存在关系,比如父子进程。 有名管...原创 2018-02-09 16:44:49 · 295 阅读 · 0 评论 -
如何获取两个单链表交点
之前的一篇博客《如何判断两条单链表是否有交点》只说了如何判断是否有交点,但并没有提及如何得到交点。 设置数组分别存储两条链表所有节点的地址,然后一 一比较?可行是可行,不过空间时间复杂度太高,不建议使用。 那有没有更高效的方法呢?方法1 从相交链表的特点来切入分析,看看下面这张图。 一般来说,相交链表会自相交点后有一段公共区域。绿色圈起部分。然而这两条红色A和蓝色B链表的长度差别是不是就是进...原创 2018-02-09 16:43:46 · 953 阅读 · 0 评论 -
单链表有关 环 的问题
说起关于单链表的环,无非以下几种常见问题 。 1求单链表是否有环 。 2求单链表的入环点。 3求环的长度。 对于问题1,记得我第一次接触的时候,比较暴力,直接定义了个数组存放链表所有节点的地址。 遍历链表每读到下一个节点的时候,都要和已知结点的地址数组比较,看是否相同。这种解法的优点 仅仅是的确很好想,但时间复杂度 空间复杂度都很高。 因此就要寻找更优的解法,我起初的那个很差...原创 2018-02-09 16:42:14 · 358 阅读 · 0 评论 -
大数据处理之哈希表(二)--出现频率最多的top xxx 位
上篇文章中只是求了出现频次最高的值,可是大数据处理往往需求的是top 10 ,top 100或者某一段区间的数据。显然只定义一个Hash a是不能放下的。如果是求出现频次top100呢?最起码定义 Hash arr[100]吧。比如拿计数器10000长度和数据范围为32767来说。我们最少要分4次,分别是数据取余4后 0 1 2 3的四种情况第一次余数为0,即4的倍数这一组,我们是不是要先算...原创 2018-02-09 16:37:22 · 2354 阅读 · 0 评论 -
select,poll和epoll的区别
Select就是通过监听事件写入到一个32个元素 累计1024位的long数组中(就是fed_sets结构体的内容),用户加入监听位,如果有监听事件发生就会改变位的标志。但这样会有两个缺点,一是监听的数量被限制在了1024(三种事件:可读,可写,异常),而且复杂的位操作,即使提供了多个操作宏,仍会感到编程的繁琐,还有每次调用select(是每次,进入循环后每次使用select前都要做得事)要重新把...原创 2018-02-09 16:59:51 · 419 阅读 · 0 评论