自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 fork函数详解与进程替换(exec)

<1>fork定义一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。我们经常说fork后的子进程相当于是子进程的一个克隆,fork出来的父子进程并行fork之后的代码,但是子进程真的是完全复制了父进程吗?答案是不,那么到...

2018-08-10 21:43:06 2626

原创 Linux虚拟地址映射

我们定义一个局部变量,然后打印出这个局部变量的地址,那么这个局部变量的地址是线性地址?物理地址?还是逻辑地址?要明白这些,先来看看以下的知识吧。X86体系:指的是特定微CPU执行的有些计算机语言指令集,定义了芯片的基本用规则CPU的位数:ALU一次性最多能处理的整数的字节数,也即ALU的宽度,ALU的数据是从寄存器拿来的,寄存器中的值是从数据总线拿来的,所以也可以说是数据总线的条数。但...

2018-08-07 19:21:25 1671

原创 孤儿进程与僵尸进程产生及其处理

在探讨这个问题之前,我们先来弄清什么是进程。进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数...

2018-08-03 17:53:58 22816 14

原创 KVC与KVO

KVC基础概念KVC键值编码也即NSKeyValueCoding,是一个非正式的协议,它提供了一种间接访问对象其属性方法或成员变量的机制,简单来说,是可以通过对象属性的名称(Key)直接给属性值(value)编码(coding),“编码”也可以理解为“赋值”。这样可以免去我们调用getter和setter方法,从而简化我们的代码,也可以用来修改系统空间内部属性。基本操作在NSKeyValueCoding中提供了KVC通用的访问方法,分别是getter方法valueForKey:和setter

2020-06-16 18:00:40 507

原创 iOS开发中的MVC、MVP以及MVVM模式

大家都知道MVC设计模式

2020-06-14 11:32:22 765

转载 合并两个有序链表

合并两个有序链表

2019-12-23 12:25:20 252

原创 Linux内核剖析-----IO复用函数epoll内核源码剖析

本文参考董浩博客http://donghao.org/uii/epoll内核实现(1)内核为epoll做准备工作这个模块在内核初始化时(操作系统启动)注册了一个新的文件系统,叫"eventpollfs"(在eventpoll_fs_type结构里),然后挂载此文件系统。另外还创建两个内核cache(在内核编程中,如果需要频繁分配小块内存,应该创建kmem_ca...

2019-08-16 11:03:34 2586 3

原创 Linux内核剖析-----IO复用函数poll内核源码剖析

调用流程应用层调用poll时,内核调用了sys_poll在sys_poll中首先初始化,判断了nfds是超过struct file支持的最大的fd数(默认256),将传入的timeout时间转化为cpu时钟周期,并且调用了poll_initwait初始化了一个函数指针,用于操作系统异步回调的;接下来,进行了一个while循环,从0到nfds给每一个struct pollf...

2019-08-15 16:18:40 921

原创 git教程二(远程仓库管理)

远程仓库(GitHub)Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。在实际情况是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器...

2019-07-05 19:41:11 235

原创 git教程

Github我们使用github来托管项目代码仓库(Repository):用来存放项目代码,每个项目对应一个仓库,多个项目则有多个仓库复制克隆项目(Fork):将别人的仓库完全复制到你的账号下(生成一个相同的仓库,会说明来自哪个用户)发起请求(Pull Request):这个事基于fork的,张三复制了李四的test仓库,那么张三可以在复制过来的仓库中添加东西,但是两者的仓库是独...

2019-07-03 20:18:26 179

原创 C++协程

产生背景对于后台开发我们一个重要问题即使用尽可能少的服务器资源处理海量的请求,除了我们再架构上做多机自动扩容外,我们还必须尽可能提高单机硬件的利用率(CPU利用率+IO利用率)为了提高硬件的利用率往往我们采用三种技术路径:多线程 异步IO 协程协程和异步IO以及多线程的对比多线程多线程可以充分利用CPU的多核,实现真正的并行,它是操作系统的基础设施。但是线程是一个粗粒度、...

2019-06-13 21:41:52 5044 2

原创 MySQL----索引

索引概念是帮助Mysql高效获取数据的排好序的数据结构,索引存储在文件里,它包含着对数据表里所有记录的引用指针,通过索引可以快速定位数据,就好比书的目录,可以加快数据库查询速度(一般数据库默认会以主键生成索引)索引类型mysql的索引分为单列索引(主键索引,唯一索引,普通索引)和组合索引.主键索引(可以将其归为唯一索引,但是主键索引的列不能为NULL)。主键索引会自动创建。 唯一...

2019-06-01 13:57:45 234

原创 vim用法

vi/vim是linux系统下标准的编辑器,十分强大,vim可以当作vi的升级版本,他可以用多种颜色的方式来显示一些特殊的信息。如何使用vim下文详细介绍vim三种模式命令行模式:在此模式下可以控制屏幕光标移动,字符或行的删除,移动复制某区段及进入插入模式或者底行模式 插入模式:只有在此模式下才可以做文字输入,按ESC即可退到命令行模式 底行模式:将文件保存或退出vim,也可以设置编辑...

2019-05-06 13:50:00 286

原创 makefile文件

简介在一个大的工程中,源文件不计其数,其可能会按类型、功能、模块分别放在若干个目录中,那我们每次去编译的时候就会输入一长串编译命令以及相应的路径,极其麻烦;另外一点就是每次若更改了一个源文件,对于其他没有更改的文件也得重新编译,效率低下。为了解决这些问题,makefile出现了。makefile1:makefile关系到整个工程的编译规则(根据你写的依赖关系执行),决定了哪些文件需要先...

2019-05-05 13:13:47 257

原创 算法----动态规划(2)

基于动态规划的思想我们再来做几个练习练习2:在一组数中选择几个数字使其加起来和最大,但是选中的几个数字不能相邻,求最大的和以以下这组数据举栗子 我们依旧是之前的思想:选或者不选!!!!!!依旧是最优解OPT(i)代表到第i个元素最优解是什么+代表选择第i个 -代表不选择第i个我们发现这个展开图中依旧出现了重叠子问题 ,比如OPT(3)和OPT...

2019-04-23 18:16:41 429

原创 算法----动态规划(1)

动态规划思想把问题拆分成若干个子问题,类似递归(分治),但是动规多用于处理最优解,有重叠子问题的问题,因为动态规划对于重叠子问题不会反复计算,会创建一张表将之前计算过的子问题答案直接保存,避免了重复计算,加快计算速度练习1:有8个任务,每个任务完成需要一定的时间,完成之后就会有相应的报酬(图上的红色字段),但是任务有时间点限制,比如第一个任务在1点到4点。。。。任务之间不能并发,那么一个人...

2019-04-23 16:02:13 172

转载 Linux惊群现象如何解决

高并发中的惊群效应linux惊群效应详解

2019-01-22 16:10:16 584

转载 Linux下MD5算法使用

作者:无脑仔的小明 出处:http://www.cnblogs.com/wunaozai/ 我们以一个字符串为例,新建一个文件filename.txt,在文件内写入hello ,然后在Linux下可以使用命令md5sum filename.txt计算md5值 ==> b1946ac92492d2347c6235b4d2611184  。虽然写入的是hello这5个字符,但是我们使用命令...

2019-01-11 18:59:13 2380

原创 LT和ET模式比较及实现

我前几个博客说过epoll支持ET工作模式,这种有人可能会问,我们不是read/recv函数是阻塞的嘛,为啥修改文件描述符的文件状态来说明是非阻塞I/O呢?其实read函数只是一个通用的读文件设备的接口,其是否阻塞需要由设备的属性(文件描述符)和设定(设置recv的参数)所决定。一般来说,读字符终端、网络的socket描述字,管道文件等,这些文件的文件状态默认都是阻塞的方式,如果是读磁盘上...

2018-12-08 12:43:14 1066 1

原创 I/O复用三种API的比较

I/O复用虽然可以同时监听多个文件描述符,但他本身是阻塞的。并且,当多个文件描述符同时就绪时,如果不采用额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这样I/O复用看起来就像是串行的,要实现并法就需要用多进程或多线程实现。select  poll  epoll  比较1:事件集select的参数没有将文件描述符单独与事件绑定,而是用文件描述符的集合fd_set中的每一位代...

2018-12-06 14:28:59 416

原创 高性能服务器编程-----I/O多路复用(epoll)

对于poll我们也有很大的缺陷,比如我们依旧需要每次监听时从用户态将要监听的事件拷贝到内核态进行操作,并且poll与select都不能直接返回我们已就绪的文件描述符,而是需要用户进行循环判断事件是否就绪。。。Linux给我们提供了一个独有的I/O复用函数epoll,解决了这些问题。epoll是Linux独有的,是select和poll的改进epoll API详解epoll不像poll和...

2018-12-05 19:49:15 277

原创 高性能服务器编程-----I/O多路复用(poll)

I/O复用的第二个系统调用pollpoll  API详解poll与select类似,内核中也是在指定时间轮询一定数量的文件描述符,以测试其中是否有就绪者。poll  API原型#include<poll.h>int poll(struct pollfd* fds,nfds_t nfds,int timeout); //返回 -1出错 0超时 ...

2018-12-05 11:14:47 310

原创 网络编程----TCP连接的断开(四次挥手)

上个博客讲解了TCP连接建立的全过程,以及其连接双方的各个状态,那么连接断开的时候又是什么情况呢?TCP断开连接发起链接的主动方基本都是客户端,但是断开连接的主动方服务器和客户端都可以充当。四次挥手是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:由于TCP连...

2018-12-03 11:47:36 2119 2

原创 网络编程---TCP连接的建立(三次握手)

前几个博客一直在说TCP是面向连接的服务,那么TCP连接的建立和关闭是怎样一回事?TCP连接的建立起初两端的TCP进程都处于CLOSED(关闭)状态我们从tcp编程就可以知道每次是服务器首先启动,启动之后实际上是创建了TCB传输控制块,随后进入LISTEN状态,等待客户端连接请求。客户端启动起来也是先创建TCB传输控制块,接下来连接阶段。ps:seq是数据包本身的序列号;ack...

2018-12-02 17:31:47 470

原创 TCP的拥塞控制

不止TCP流量控制(滑动窗口),超时重传是TCP可靠的保证,TCP的拥塞控制仍然是TCP可靠传输的保证。TCP拥塞控制流量控制解决了 两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,也会产生丢包问题。拥塞:对资源的需求超过了可用的资源(计算机...

2018-12-02 16:07:35 389

原创 高性能服务器编程-----I/O多路复用(select)

我们从多进程/多线程编程到进程池与线程池编程,效率在一步一步提高,但是对于线程池/进程池还是有个弊端,就是一旦分配一个进程/线程与某一个客户端进行交互时,这个进程/线程不论客户端有没有事件请求,都必须等待直到客户端与其断开这个进程/线程才能与其他客户端进行交互,实际上这是非常不好的,因为我们根本不知道客户端什么时候断开链接,那么在客户端没有事件请求的时候,我们怎么样将这些时间利用起来处理有事件发生...

2018-12-01 15:45:09 276

原创 高性能服务器编程-------线程池与进程池

使用多进程或多线程与客户进行交互的时候(子进程/子线程实现并发服务器),每一个客户端链接就会给其分配一个为其服务的进程/线程,有什么弊端?动态创建线程/进程是比较耗费时间的,这就导致较慢的客户响应 动态创建的子进程/子线程通常只为一个客户服务,这就导致系统上产生大量的进程/线程,程序员难以管理,并且进程/线程间的切换是很耗费CPU时间的 对于多进程我们必须要谨慎的管理其分配的文件描述符及堆...

2018-11-27 21:29:00 352

原创 高性能服务器编程----多进程与多线程

看过我之前的TCP编程的那个博客大家可以看到,我一个客户端没有和服务器断开时,其他的客户端不能与客户端进行交互(相当于串行的交互模式,效率很低),因为服务器获取其他连接的accept函数被前一个客户端的交互(recv)阻塞住了,那么有什么办法可以使得我们服务器在同一时刻可以连接多个客户端呢?给大家介绍两种方法,但是原理是一样的。我以线程举例,我们需要用一个线程来获取客户端的连接,一旦有一个客户...

2018-11-27 08:29:30 217

原创 浅谈jsoncpp及实现服务器客户端之间json包传输

JSON是什么?JSON 是一种用于数据交换的文本格式(本质是一种文件组织方式,比如你熟悉的txt, csv, doc,docx文件等等),目的是取代繁琐笨重的XML格式。这种格式不仅人很容易进行阅读和编写,同时机器也很容易解析和生成,是当前十分流行的数据格式,尤其是在前端领域。JSON是一种传递对象的语法,对象可以是name/value对、数组和其他对象,现在浏览器都自带json解析。简...

2018-11-24 18:08:08 889

原创 TCP流量控制(滑动窗口)

滑动窗口协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组(IP数据包或TCP报文段)就停下来等待确认,因此该协议可以加速数据的传输,增大了吞吐量。并且该协议可以控制流量,下面讲解。停止等待协议是最简单但也是最基础的数据链路层协议。与滑动窗口协议不同的是停止等待协议就是每发送完一个分组就停止发送,等待对方的确认,在收到确认后再发送下一个分组。当发送窗口和接收窗口的大小...

2018-11-22 21:44:34 1244

原创 简述HTTP与HTTPS的区别

超文本传输协议 (HTTP) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议,是应用层的协议,其传输层采用的是TCP协议,HTTP和HTTPS都被用于在Web浏览器和网站服务器之间传递信息,那么HTTPS与HTTP有什么区别呢?1:SSLSSL中文名为安全套接字层,现如今是应用最广泛的数据加密协议,该协议主要用于Web的安全传输协议。该协议历...

2018-11-22 20:10:24 920

原创 Linux下HTTP通信简析及实现HTTP服务器

在Linux下我们使用HTTP协议进行通讯,即客户端在浏览器请求服务器的某个服务(页面)。我们在主机上进行测试的时候,可以开启httpd服务以处理客户端的请求,一般来说我们的页面放在/var/www/html底下,我们这些操作需要切换到root用户。开启httpd服务  :  service  httpd  start查看httpd状态  :  service  httpd  statu...

2018-11-21 14:38:32 3055 4

转载 乐观锁与悲观锁

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,...

2018-11-21 13:06:53 142 1

原创 浅谈读写锁、自旋锁

读写锁(共享--独占锁)读写锁也是一种锁,与互斥锁相似,但是在互斥锁的基础上进行了改进,允许更高的并行性。互斥锁只能是加锁与不加锁状态,一次只有一个线程可以对其加锁。读写锁有三种状态,读模式下加锁,写模式下加锁,不加锁。当一个线程获得写加锁时,其他的线程仍然不能获得锁,都会被阻塞。但是当读写锁是读加锁状态,所有试图对其进行读加锁的线程仍然可以加锁,只不过对其进行写加锁的线程不会获得锁,需要等到...

2018-11-21 12:46:10 851

原创 多线程环境下fork的使用以及锁的变化

关于线程的创建与使用,前几个博客说的很详细了,那么我们如果在某一个函数线程中调用fork函数有什么需要注意的吗?一:线程中使用fork函数在线程中调用 fork 函数,子进程只会启用调用 fork 函数的那条线程,其他线程不会启用。示例代码:#include<stdio.h>#include<stdlib.h>#include<unistd....

2018-11-16 16:06:46 1094

原创 网络编程---TCP/UDP/IP头部详解及其可靠性与服务类型详解

TCP:面向连接的  可靠的   字节流服务UDP:无连接的   不可靠的   数据报服务 关于这个流式服务及可靠性在本次博客会给大家解答,连接性在下篇博客给大家解答 TCP/UDP的流式服务与数据报服务说明TCP流式服务:当发送端应用程序连续执行多次写操作时,TCP模块会先将这些数据放入TCP发送缓冲区中,当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封...

2018-11-15 20:24:04 499

原创 网络编程基础

计算机网络是通过通信设备将地理上分散的具有自治功能的多个计算机系统互连起来,进行信息交互资源共享与协同工作的系统。互联网就是将各个网络串联起来,inter是最大的互联网。网络中通讯的主角是运行在不同机器上的两个进程。我们要确定网络中通讯的两个进程需要两个信息:ip地址与端口号IP地址:点分十进制的字符串,标识网络中的主机端口号:标识主机上运行的进程 协议是一种约定,一种规定...

2018-11-14 21:01:15 321

原创 网络编程---UDP编程流程

上一篇针对于TCP的编程流程很详细的给大家讲解了,那么对于无连接的UDP编程又是什么流程呢?请看下文同TCP编程一样,我们都是基于C/S模型的编程方式UDP编程流程<一>总流程:服务器:socket   bind   recvfrom  sendto  close客户端:socket   sendto  recvfrom   close<二>函数详解...

2018-11-14 15:39:10 846

原创 网络编程---TCP编程流程

对于上一个博客我大致讲解了网络的基本概念与相关协议,这篇博客我给大家介绍传输层的网络编程流程基础。怎样完成网络编程在网络应用进程通信时,最主要的进程间的交互的模型是客户/服务器(C/S)模型。服务器: 提供数据的为服务器客户端: 获取数据的为客户端在传输层我们常用的两种协议是TCP和UDP,TCP是面向连接的、可靠的、流式服务。UDP: 无连接、不可靠的、数据报服务。TCP...

2018-11-14 14:04:29 532

原创 线程同步(信号量/互斥锁/条件变量)

线程同步:同步的概念与进程同步的概念一致,让多个线程按照顺序协同执行。为什么线程需要线程同步呢?因为线程很多资源都是共享的,比如全局数据,内存,文件,数据库等等。当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。(同步大多都互斥)还有一点,因为我们在一个线程中有时候进行的操作并不一定是原子操作,...

2018-11-07 21:23:20 1644

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除