自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 PageRank学习

PageRank DescriptionPageRank是对搜索引擎搜索结果的排序算法,根据谷歌的描述: PageRank works by counting the number and quality of links to a page to determine a rough estimate of how important the website is. The under...

2018-07-03 16:54:34 601

原创 Linux内核编译-4.4版本及添加系统调用

本次实验主要工作是添加一个系统调用并使用,在此过程中需要编译内核。内核下载实验用到的内核版本为4.4: linux-4.4.4.tar.xz xz文件是对tar文件的再次压缩,先用xz命令解压后再用tar命令解压xz -d linux-4.4.4.tar.xztar -xvf linux-4.4.4.tar进入文件根目录,先make一遍,这里并不会对内核进行全部编译,只是预...

2018-05-22 19:18:40 1946

原创 Effective C++笔记--设计与声明

摘自:《Effetive C++》中文版第三版1.让接口正确被使用,不易被误用预测用户会犯什么样的错误比如一个函数string toString(int month, int day, int year); 如果在没有审查机制下,用户可能会乱序填写参数、不按规则填写参数。 这里我们可以将日期对象进行封装,让用户规范进行使用:string toSt...

2018-05-07 23:21:07 250

原创 Effective C++笔记--资源管理

摘自:《Effetive C++》中文版第三版1.以对象管理资源为什么要管理资源?因为所谓资源就是一旦用了它将来必须还给系统。因此将资源放进对象内,用该对象的析构函数可以达到自动释放资源的目的。智能指针auto_ptr就是一个很好的例子。 考虑一个函数class PointerObject{public: #返回一个该类的指针对象 Pointer...

2018-05-06 22:07:07 255

原创 Python入门:实现Echo Server

pycharm实现helloworld创建项目生成helloworld.pyprint 'hello world!' 一行代码搞定!?或者可以print "hello world!"$ python helloworld.py 则可以输出 hello world!单引号和双引号的区别–肤浅的认识对于一个字符串Let’s go,中间包含了一个符号’,那么在定义的时候 str...

2018-05-06 11:23:05 1958

原创 Effective C++笔记--面向对象设计

摘自:《Effetive C++》中文版第三版符号表的概念:从编译器来看,符号表与编译的各个阶段都有交互,一般来讲,符号表有内存地址和函数/变量的对应关系,编译时节点的各种属性(类型,作用域,分配空间大小,(函数)的参数类型等)1.为什么要用const,enum,inline替换#define因为例如#define kkk 1.653代码段在编译器开始处理源...

2018-04-29 21:19:59 221

原创 深入理解计算机系统--信息的表示和处理

程序的运行hello.c:在计算机中中ASCII形式保存。而所有文件分为ASCII文件和二进制文件。gcc程序通过以下流程,将hello.c转换为可执行目标程序: 预处理器cpp:扩展程序文本加入stdio.h形成hello.i–>编译器ccl:形成汇编程序hello.s–>汇编器as:形成可重定位二进制文件hello.o–>链接器ld:将printf.o与hello....

2018-04-29 21:19:44 214

原创 深入理解C++对象模型

C++对象模型每个class产生一堆指向virtual functions的指针,放在表格之中。这个表格称为virtual table(vtbl)。 在每个class中有一个指针vptr,指向相关的vtbl。vptr的设定和重置都是由class的构造函数、析构函数自动完成的。C++的struct和class基类和派生类地址空间explici的作用...

2018-04-29 21:19:09 286

原创 浅析Lambda表达式和for_each

Lambda表达式Lambda表达式表示任何一个可调用的代码单元,可以理解为一个未命名的内联函数。[捕获列表](参数列表)->返回类型(可省){函数体}Lambda表达式采用尾置返回值的形式,也就是将表达式返回值放在->之后显示声明捕获列表:可以理解为Lambda函数的原有变量,也就是类似于一个函数中定义的栈上的变量。 首先假定在某一函数中使用lambda表达式,例如void func(){

2018-04-27 17:33:20 1644

原创 评判性思维工具

评估思维的优缺点今天哪些时候我的思维是最差的?哪些时候是最好的?今天实际上思考了些什么,解决了哪些问题?是否无谓地为一些消极思维而沮丧?今天做了哪些对自己长期目标有益的事情?

2018-04-19 13:54:53 346

原创 对于阻塞和非阻塞,同步和异步的理解

同步和异步重点在于是进程间消息通知机制和系统内事件执行顺序 同步模型 前提条件:进程A B按顺序执行的方式运行 一次完整的执行序列为 A向B发出请求 A变为等待请求应答状态 B接受来自A的请求 B进行处理和计算 B向A发送应答 A接受应答 在本例中同步体现在 A在发出请求后进入等待B应答的状态 A需要接收到B的应答才能进入下一个状态或者是执行后续任务 这样的类似两个进程之间有按顺序的触发执...

2018-02-01 15:50:50 253

原创 C++命名空间:namespace

摘自C++ Primer引入原因当应用程序用到多个供应商提供的库时,不可避免地会发生某些名字相互冲突的情况。多个库将名字放置在全局命名空间中将引发命名空间污染。命名空间定义为防止名字冲突提供了更加可控的机制。命名空间分割了全局命名空间,其中每个命名空间是一个作用域。使用规则只要是出现在全局作用域中的声明,都可以在命名空间中定义,例如:类、变量(初始化及其操作)、

2018-01-26 14:36:21 372

原创 C++和设计模式

C++单继承多重继承多态实现机制静态多态动态多态虚继承虚表和虚函数设计模式单例模式 1.构造函数设为私有 2.类只有一个实例 3.只提供一个静态的全局访问点饿汉模式懒汉模式静态内部双重校验锁策略模式1.开闭原则:找出变化的部分,把他们从不变部分中分离出来这里涉及到在C++中实现接口,因为C++没有interface关键字,因此要通过class和虚函数来实现接口。观察者模式工厂模式

2017-12-23 11:01:51 315

原创 RFC 959--File Transfer Protocol

引入FTP的目标是 - 促进文件的共享 - 支持对远程计算机的间接使用 - to shield a user from variations in file storage systems among hosts - to transfer data reliably and efficiently文件传输协议FTP采用两个TCP连接来传输一个文件控制连接以通常的客户服务器方式建立

2017-09-26 16:31:29 407

原创 Linux内核设计与实现 进程管理

进程进程是处于执行期的程序(目标码存放在某种存储介质上),但进程不仅仅局限于一段可执行程序代码,通常还要包含其他资源,像打开的文件(内核为每个进程分配一个打开文件表),挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程。总之,进程就是正在执行的程序代码的实时结果执行线程简称线程,在现代操作系统中,进程是资源分配和处理机调度的基本单位,而线程是处理机调度的基

2017-08-25 14:30:16 375

原创 APUE第十章 信号

引入同步:一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到搜到返回信息才继续执行。 异步:一个进程在执行某个请求的时候,不需要一直等下去,而是继续执行之后的操作,有消息返回时系统会通知进程进行处理。同步和异步关注的是进程之间的消息通信机制,区别阻塞和非阻塞关注进程等待调用结果时的状态。信号(signal)是软件中断。信号的作用:由发出进程告诉接收

2017-08-17 17:18:25 397

原创 APUE第九章 进程关系

终端登录(串行终端登录BSD终端登录系统自举时,内核创建PID为1的init进程,init进程使系统进入多用户模式。每当有终端连接请求时,init进程则fork一个子进程,子进程调用exec函数执行getty程序。 getty程序:用来开启终端、进行终端的初始化和设置终端Created with Raphaël 2.1.0系统自举,创建init进程终端请求,init进程fork子进程每个子进程

2017-08-17 09:25:31 420

转载 伪终端设备之我见

转自:http://bbs.chinaunix.net/thread-2084721-1-1.htmlLinux上许多网络服务应用,如l2tp、pptp、telnet,都用到了伪终端。有朋友在问这方面的概念,把偶知道的写下来,以供讨论。一、终端 要理解伪终端(Pseudo Terminal),先来看看什么是“终端”(Terminal)。终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类

2017-08-16 17:38:25 473

原创 APUE第八章 进程控制

进程标识每个进程都有一个非负整型标识的唯一进程ID(PID)。 虽然是唯一的,但是可以复用:当一个进程终止后,其PID就称为复用的候选者。 典型的进程:0进程,又称为swapper,是调度进程(内核进程)。 1进程,又称为init进程,在自举过程结束时由内核调用(用户进程,但是以超级用户特权运行)。孤儿进程的父进程就是init进程。#include pid_t getpid(

2017-08-14 16:51:39 363

原创 APUE第七章 进程环境

引言当程序执行时,其main函数是如何被调用的–内核调用启动例程执行exec函数再执行main函数内容。命令行参数是如何传递给新程序的–调用exec的进程可将命令行参数传递给该新程序典型的存储空间布局是什么样式如何分配另外的存储空间进程如何使用环境变量进程的各种不同终止方式longjmp和setjmp以及它们与栈的交互作用查看进程的资源限制main函数int ma

2017-08-10 16:10:03 341

原创 UNP 基于Epoll复用的回射服务器性能测试

回射服务器负载测试负载发生器设计思路(1)在客户端程序设计时,利用循环不断地向服务器发起Connect请求,服务器端通过Accept监听客户端连接请求。连接成功后,利用fcntl函数置已连接套接字为非阻塞模式。 代码:for (i = 0; i < COUNT; i++) { if(connect(sockfd[i], (SA*) &servaddr, sizeof(servadd

2017-08-08 17:34:09 771

原创 Linux线程池实现--基于Select复用的回射服务器

多线程技术多线程技术主要解决处理器单元内多个线程执行的问题,它可以使处理器尽量保持忙碌状态。在C/S模式的服务器–客户端通信中应用多线程技术,即是服务器在Accept调用等待客户端连接成功时,为每一个客户端连接创建一个线程来处理客户请求。在这种情况下,每次客户连接时,服务器都会进行线程创建、任务分配;客户请求完成后,服务器还需要销毁线程,这一系列的工作需要消耗很多时间,尤其是在大量用户并发时此矛盾尤

2017-08-01 09:09:13 867

原创 UNP TCP连接管理

ARQ和重传通信媒介可能会丢失或改变被传递的消息,比如一个有损信道内传输比特流,可能会导致比特被删除或者修改,造成通信的不可靠性。目前有两种方式可以解决上述问题:差错校正码:通过添加一些冗余的比特,使得即使某些比特被毁,真实的信息也可以被恢复过来。ARQ(自动重传请求):通过重新传输消息,直到信息最终被正确接收。 ARQ需要重发分组直到它被正确接受,判断机制为:(1)接受方是否已收到分组(2)

2017-07-28 12:01:35 538

原创 UNP I/O复用模型-EPOLL函数

I/O复用在UNP第五章中介绍了回射服务器(多进程服务器版)的一种特殊情况:在TCP客户同时处理两个输入文件,标准输入stdin和TCP套接字TCP时,可能会由于阻塞发生错误。例如,当客户阻塞于标准输入的fgets调用期间,服务器子进程可能会被杀死(通过lsof -i:端口号查看服务器子进程pid,然后kill pid杀死进程)。在这种情况下,服务器子进程被kill之后虽然可以正确地给客户TCP发送

2017-07-27 09:58:20 913

原创 Centos下配置vim自动补全

https://github.com/ma6174/vim 打开终端,执行下面的命令就自动安装好了: wget -qO- https://raw.github.com/ma6174/vim/master/setup.sh | sh -x我第一次安装时,在vim里面有个显示安装进程的,安装成功一项在左边栏上对应每一行要显示+号,但是第一次有两项没能安装成功。于是我重新执行了自动安装的命令,然后就安

2017-07-26 21:54:35 1384

原创 UNP第二十六章 线程

概述当一个进程需要另一个实体来完成某事时,它就fork一个子进程并让子进程去执行处理。之前的多进程服务器:父进程accept一个连接,fork一个子进程,该子进程处理与该连接对端的客户之间的通信。但是fork调用却存在以下两个问题:fork是昂贵的。fork要把父进程的内存映像复制到子进程,并在子进程中复制所有描述符。当今的实现使用称为写时复制的技术,用以避免在子进程切实需要自己的副本之前把父进程

2017-07-25 16:18:22 306

原创 UNP第十六章 非阻塞式I/O

概述套接字的默认状态是阻塞的,可能被阻塞的套接字调用分为以下四类:输入操作:包括read、readv、recv、recvfrom和recvmsg共5个函数。(1)如果某个进程对一个阻塞的TCP套接字调用这些输入函数之一,而且该套接字的接受缓冲区中没有数据可读,该进程将被投入睡眠,直到有一些数据到达。(2)对于非阻塞的套接字,如果输入操作不能被满足,相应调用将立即返回一个EWOULDBLOCK错误。

2017-07-25 09:20:29 453

原创 UNP第五章 标准I/O库

流和FILE对象在第三章中,所有I/O函数都是不带缓冲的。术语不带缓冲指的是每个read和write都调用内核中的一个系统调用。而对于标准I/O库,它们的操作是围绕流进行的:当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件关联。 关于流的概念,个人理解流是对于数据特殊操作,例如在读数据操作时读一点处理一点;在写数据操作里生成一点, 写入一点。 A stream is

2017-07-22 14:52:50 389

原创 UNP第六章 I/O复用:select和poll函数

# 概述 当TCP客户同时处理两个输入:标准输入和TCP套接字时,问题就在客户阻塞于(标准输入stdin)fgets调用期间,若将对应的服务器子进程杀死,则用户输入完毕并发送套接字后,才能收到收到服务器过早终止的提示。换言之,当在命令行执行了kill pid(服务器子进程)时,服务器TCP是会正确地给客户端程序发送一个FIN的,但是由于客户端程序现在正阻塞与标准输入读入的过程,它将看不到这个

2017-07-21 10:50:38 478

原创 POSIX信号处理

POSIX信号处理信号(signal)就是告知某个进程发生了某个事件的通知,有时也称软件中断(software interrupt)。注意:信号是异步发生的,也就是说进程预先并不知道信号的准确发生时刻。信号可以 1. 由一个进程发送给另外一个进程(包括自身) 2. 由内核发送给某个进程信号处理函数每个信号都有一个与之关联的处置。当有特定信号发生的时候,特定的函数被调用,那么这个特定函数就称为

2017-07-20 16:11:57 1194

原创 Xcode下配置UNIX网络编程(UNP)环境

由于自己配置unp相关头文件时遇到了很多问题,因此记录下Xcode配置unp开发环境的小技巧。apue开发环境也是类似的。首先在Xcode下创建一个项目,选择Command Line Tool,点击next,填写Product Name和Organization Identifier(随意),选择Language为C。至此项目完毕。 ——》 从http://www.unpbook.com/s

2017-07-19 14:40:39 1134

原创 UNP第二章 TCP、UDP和SCTP

概述本章的焦点是传输层,包括TCP、UDP和SCTP。TCP是一个复杂、可靠的字节流协议;UDP是一个简单的、不可靠的数据报协议。用户数据报协议(UDP)–数据包UDP是一个简单的传输层协议,应用进程往UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地。传输控制协议(TCP)–流TCP提供客户与服务器之间的连接。TCP客户先与某

2017-07-18 10:30:53 515

原创 UNP第一章 简介TCP和IP

概述简介Web客户与服务器之间使用传输层的TCP协议通信。TCP转而使用网络层的IP协议通信,IP再通过某种形式的数据链路层通信。 客户和服务器通常是用户进程,而TCP和IP协议通常是内核中协议栈的一部分。 包裹函数:用于检查错误、输出适当的消息,以及在出错时终止程序的运行。一个简单的时间获取客户程序Xcode导入unp.h修改项目Build settings中的Header Se

2017-07-17 11:27:53 575

原创 APUE第四章 文件和目录

函数stat、fstat、fstatat和lstat函数stat#include<sys/stat.h>int stat(const char *restrict pathname, struct stat *restrict buf);//stat函数以文件的路径名pathname为参数,返回与此命名文件相关的信息结构。示例:获取利用stat获取文件的修改时间、创建时间等信息struct t

2017-07-13 11:37:37 425

原创 APUE第三章 文件I/O

函数open和openat调用open或openat函数可以打开或创建一个文件。#includeint open(const char *path, int flag, .../mode_t);int openat(int fd, const char *path, int flag, .../mode_t);//int fd = open("/Users/hupac/Public/

2017-07-12 17:08:56 385

原创 APUE第二章 Unix标准及实现

Unix标准化ISO CISO定义C语言的标准,提供C程序的可移植性,使其能适应于除UNIX以外的操作系统。此标准不仅定义了C语言的语法和语义,还定义了其标准库,也就是该标准定义了24个C语言的头文件,例如stdio.h, math.h, stdlib.h都包含在这24个头文件中。IEEE POSIXPOSIX(Portable Operating System Interface)指的是可移植操作

2017-07-12 10:40:12 359

原创 APUE第一章 Unix基础知识

Xcode下导入apue.h下载apue.3e包,在apue.3e/include下找到apue.h。把apue.3e放到自定义文件夹,这里是/Users/hupac/Public/Lib/ 在Xcode中找到项目,修改项目的Build Settings,添加Header Search Paths为/Users/hupac/Public/Lib/apue.3e/include/。添加Lib

2017-07-12 10:18:28 401

原创 第三章 数据缓冲区高速缓冲

对文件系统的一切存取操作,内核都能通过每次直接从磁盘上读或写入磁盘实现,但这样的方式受到磁盘传输速率的限制,比如读写速度较慢的磁盘会使系统的响应时间加长、吞吐率降低。为了解决多次读写磁盘所花费的大量时间开销,内核通过保持一个称谓数据缓冲区高速缓冲(buffer cache)的内部数据缓冲区来减小对磁盘的读写频率。缓冲头部内核体系结构中高速缓冲模块的位置是在文件子系统与设备驱动程序之间。

2017-07-11 11:32:43 1382

原创 第五章 文件系统的系统调用

文件描述符表、文件表、索引节点表文件描述符:用于内核访问文件,打开或者新建文件时,会返回一个文件描述符,内核使用文件描述符访问文件 分配原则:最小分配 取值范围:非负整数,0~MAX-1 其中默认是0、1、2用于系统标准输入、标准输出、标准错误系统调用open系统调用open是进程要存取一个文件中的数据所必须采取的第一步,因为只有通过系统调用open才能返回对应的文件描述符。文件描述符标志特定

2017-07-10 15:26:35 786

原创 第四章 文件系统的内部表示

索引节点的增强属性Ext2索引节点的长度必须是2的幂,以免造成存放索引节点表的块内碎片。实际上一个128字符的空间中充满了信息,然而256字符的索引节点会造成空间的浪费,而且使用不同索引节点长的Ext2文件系统之间还会造成兼容的问题。因此,引入索引节点的增强属性(extended attribute)来克服上述的问题。 索引节点中设置i_file_acl字段来指向一个存放增强属性的块,

2017-07-10 00:13:19 811

空空如也

空空如也

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

TA关注的人

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