计算机基础
文章平均质量分 87
CC_YXK
这个作者很懒,什么都没留下…
展开
-
程序的编译过程---预处理,编译优化, 汇编, 链接
c/c++代码转换成计算机能够执行的语言要经过一下过程 一、编译预处理(生成 .i 文件) (1)宏定义指令如#define Name TokenString,#undef等。 对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的 Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现...原创 2018-05-02 23:28:56 · 772 阅读 · 0 评论 -
信号量和互斥锁的区别
信号量是用在多线程多任务同步的,互斥锁是用在多线程多任务互斥的信号量可以做到一个线程完成了某个动作就通过信号量告诉别的线程,别的线程再进行某些动作。互斥锁是指一个线程使用某个资源通过对其加锁而使得其他线程无法访问,直到这个线程解锁,其他线程才可以继续访问。...原创 2019-03-10 13:25:15 · 1615 阅读 · 1 评论 -
三次握手和四次挥手
三次握手1、 客户端申请建立连接,发送自己的序号2、 服务器接到序号之后发送确认号,并发送自己的序号3、 客户端对服务器发送确认号四次挥手1、 客户端断开连接,发送序列号2、 服务器确认客户端断开,发送确认号3、 服务器断开连接,发送序列号4、 客户端确认服务器断开,发送确认号其中第2步和第3步,是可以在一次报文发送中完...原创 2018-12-05 22:13:31 · 179 阅读 · 0 评论 -
长连接和短连接
相信很多人听到长短连接就会联系到http协议,并且很清楚http1.1之前是没有长连接的,直到http1.1才出现长连接,而且http1.1默认使用长连接。什么是长连接和短连接? 很多人在这里就会有这样一个误区:http协议分为长连接和短连接 为什么说这是一个误区呢,首先我们回顾以下http协议,http是应用层的请求/响应协议,http协议只是对客户发来的请求做出...原创 2019-03-14 20:23:23 · 334 阅读 · 0 评论 -
IP报头
IP协议是TCP/IP协议族中最为核心的协议。所有的TCP、IP、ICMP、IGMP数据都以IP协议数据报格式发送。IP协议提供无连接、不可靠的数据报传送服务。不可靠:它不保证数据能成功地发送到目的地,IP协议仅提供最好地传输服务。如果发生某种错误,如路由器暂时用完缓冲区,IP协议的处理算法是:丢弃该数据报,然后发送ICMP消息给发送源(告诉发送源为什么丢弃).任何要求的可靠性都需...原创 2019-03-07 19:25:46 · 5332 阅读 · 1 评论 -
TCP协议的安全机制——滑动窗口
网络出现堵塞一般有两种情况:网络内部出现瓶颈,这个问题TCP协议有专门的解决方法,具体请看:TCP拥塞控制 接收方容量太小,因此就需要进行流量控制,也就是本文的重点:滑动窗口 流量控制的原理很简单,如果发送方发送的数据量远大于接收方的容量,就会出现阻塞,对此可以维护一个接收窗口大小,接收方每次告诉发送方:这是我的窗口大小,不要发多了。 那为什么叫滑动窗口呢?接下来我...原创 2019-03-07 20:21:57 · 765 阅读 · 0 评论 -
10亿数据找出前100大的数据
方法1:利用堆排实现取前m个数,建立一个小根堆。建堆的时间复杂度为O(mlogm) 顺序读取后边的元素,如果该元素比堆顶的元素小,直接丢弃。如果大于堆顶的元素则替换它,然后调整堆,最坏的情况是每一次都需要调整堆。时间复杂度为O(nlogm)。n为数据总数,m表示前m大的数。方法2:快排划分的思想首先对数据进行划分,并且划分之后,持续对基准右边的数据继续递归 直到右边的数据小于100,...原创 2019-03-07 21:59:05 · 3183 阅读 · 0 评论 -
进程、线程和协程
进程:进程就是应用程序的启动实例,比如我们打开一个游戏、运行一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源、数据资源、独立的内存空间。线程:线程从属于进程,是程序的实际执行者。一个进程至少包含一个线程,也可以拥有更多的线程,线程拥有自己的栈空间。协程:协程的出现是为了解决进程和线程存在的问题的。使用多进程和多线程往往效率往往都不高(多线程比多进程效率高),因为在同步时会不可...原创 2019-03-20 15:22:31 · 202 阅读 · 0 评论 -
线程池
什么是线程池 线程池就是提前创建一些线程,它们的集合叫做线程池。程序会将任务交给线程池,线程池会分配一个空闲的线程取执行任务,等待任务执行完成之后,该线程不会被销毁,而是重新还给线程池。这样减少了大量的线程创建销毁的操作,提高了程序的执行效率。线程池的工作原理在有任务要执行时,不用想内核去申请创建线程,而是将任务交给线程池,线程池分配一个空闲的线程取执行任务在任务执行完毕...原创 2019-03-20 15:38:45 · 150 阅读 · 0 评论 -
堆和栈的区别
栈:栈区空间由操作系统分配与释放,用于存储局部变量、函数参数等。函数种定义的变量按定义的先后顺序入栈,其操作方式类似于操作系统中的栈。栈的内部地址是由高到低分配的,因此后定义的变量在栈中的地址低于先定义的变量。堆:堆区的空间由程序员自主分配与释放,程序员没有主动释放则在程序结束时由操作系统回收。堆区的内部地址生长方向与栈相反,由低到高。1、管理方式不同栈区空间操作系统自动分配释放 堆...原创 2019-03-13 14:22:55 · 329 阅读 · 0 评论 -
内核栈和用户栈
内核在创建进程的时候创建进程控制块以及进程的堆栈。每个进程有两个栈:用户栈、内核栈用户栈在用户地址空间中,内核栈在内核地址空间中。用户栈 用户栈不难理解,用户栈是用户空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值以及局部变量等信息。在linux系统中,用户栈的大小一般为8M。可以通过ulimit -s来手动设置。进程用户栈和内核栈的切换 ...原创 2019-03-13 15:50:14 · 11763 阅读 · 9 评论 -
栈溢出
在想搞明白栈溢出之前,我们先弄清楚另外一件事:函数调用栈的过程函数调用栈过程用ebx寄存器和esx寄存器来表示一个函数栈帧,ebx表示栈底指针、esx表示栈顶指针。函数调用栈的过程如下:开辟栈帧函数参数入栈:参数入栈的顺序是从右向左,当参数小于8个字节的时候用寄存器记录参数值,并将寄存器中的值入栈;当参数大于8个字节的时候,首先将主调函数的栈顶指针向上移动参数大小的位置,然后将参数...原创 2019-03-13 20:46:28 · 225 阅读 · 0 评论 -
多进程和多线程
在介绍多进程和多线程之前,首先搞清楚一个问题,多进程和多线程解决的是什么问题?或者说为什么需要多进程和多线程?1、并发 对于一个程序,如果只有一条执行路径,那么效率将会是非常低的,一个程序往往有多个部分组成,每个模块执行不同的任务,如果让这些任务同时执行,各自完成自己的任务,将会使效率得到大大的提升。2、多进程 进程是一个正在执行的程序。对于并发执行,那就不可...原创 2019-03-18 22:37:45 · 154 阅读 · 0 评论 -
TCP/IP协议族——概述
1、分层网络协议通常分不同层次进行开发,每一层负责不同的通信功能。TCP/IP通常被认为是一个四层协议系统,如下:链路层:该层通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他传输介质)的物理接口细节。 网络层:处理分组在网络中的活动,例如分组选择。 运输层:主要为两台主机上的应用层提供端对端的通信。 应用层:负责处理特定的应用程序细节。2、...原创 2019-03-29 15:10:35 · 288 阅读 · 0 评论 -
TCP/IP——链路层
1、链路层的目的为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP发送RARP请求和接收RARP应答注意:TCP/IP支持多种不同的链路层协议,这取决于网络使用的硬件,如以太网、令牌环网、FDDI等。2、以太网和IEEE 802封装 以太网是TCP/IP采用的主要的局域网技术,它采用一种称作CSMA/CD的媒体接入方法,其意思是带...原创 2019-03-30 20:24:06 · 509 阅读 · 0 评论 -
同步异步、阻塞非阻塞
首先我们要清楚同步异步和阻塞非阻塞是两种不同的概念,针对的是不同的层面:同步异步:关注的是消息通信的层面。 阻塞非阻塞:关注的是程序在等待调用结果时的状态。同步异步同步:强调在发出一个请求或功能调用时,主动等待返回结果。在结果没得到前,不能返回或向下执行。异步:强调在发出一个请求或功能调用时,不用等结果,继续向下执行,当有结果时,由被调用方通知主调方,主调方再拿结果示例:情...原创 2019-03-27 14:30:43 · 279 阅读 · 0 评论 -
互斥和同步
互斥:是指散布在不同进程之间的若干程序片段,当某个进程执行其中的一个程序片段时,其他进程就不能运行它们之中的任一程序片段,只能等到该进程运行完之后才可以继续运行。同步:是指散布在不同进程之间的若干程序片段,它们的运行必须严格按照一定的先后次序来运行,这种次序依赖于要完成的任务。比如数据的收发,必须发送方发送了接收方才能收。 同步是一种更为复杂的互斥吗,而互斥是一种特殊的同步。...原创 2019-03-10 12:43:22 · 12119 阅读 · 1 评论 -
epoll详解——从功能到内核
首先我们了解以下什么是I/O复用。I/O就是指网络中的I/O(即输入输出),多路是指多个TCP连接,复用是指一个或少量线程被重复使用。连起来理解就是,用少量的线程来处理网络上大量的TCP连接中的I/O。常见的I/O复用有以下三种:select poll epoll为什么使用epoll?这个问题也可以理解为epoll相比于select和poll有什么缺点。首先我们来分析...原创 2019-03-09 21:55:24 · 377 阅读 · 0 评论 -
程序的编译链接过程
一、概述一段源代码到可执行性程序需要经历预处理、编译汇编和链接等步骤,接下来详细介绍这些过程二、过程假设文件main.czhong有如下代码:# include <stdio.h>int main(){ printf("hello world!"); return 0;}1、预处理(生成 .i 文件)操作命令:gcc -E main...原创 2018-07-29 16:12:36 · 290 阅读 · 0 评论 -
为什么计算机以补码形式存储
大家都直到,在计算机中主要是以补码的形式存储,那么为什么二进制数在原码、反码、补码中选择以补码的形式存储呢?一、为什么不以原码形式存储? 首先,原码是站在用户角度的,是原始的二进制!求原码: 1.用户的数字分为正负数,需要有一位存储符号 2.最高位为符号位:0为正,1为负 3.左边是高位,右边是低位由原码的计算方式可以发现源码存储会引发2个...原创 2018-03-11 23:17:30 · 4116 阅读 · 1 评论 -
服务器编程的基本步骤
一、服务器端 作为服务器端,要想使客户端能够正常访问,必须有自己的地址,使客户端能够在网络中找到该服务器,就相当于在茫茫人海中想和某人交流,必须知道她在哪儿。与此同时,两个人找到了语言不通也无法进行交流,服务器和客户端的进程亦是如此,不使用相同的协议也无法进行通信,因此服务器端需指定所使用的协议。当两个人相遇之后,还有必不可少的一步就是确认身份,在服务器和客户端通信过程中,客户端在网络中找...原创 2018-10-08 18:26:27 · 8354 阅读 · 0 评论 -
如何避免死锁
一、什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因资源争夺而造成的一种相互等待的现象,若不做处理,它们将一直等待下去。例如:进程A和进程B,进程A运行在某一时刻需要进程B所持有的资源,进程B此时运行也需要A进程所持有的资源,因此进程A和进程B都等待对方释放资源,这就产生了死锁。 二、死锁产生的必要条件互斥条件:即某一资源在同一时刻只能被一个进程使用,如果其他进程...原创 2019-02-27 15:00:56 · 178 阅读 · 0 评论 -
僵死进程和孤儿进程的产生和处理
一、僵死进程的产生和处理1、僵死进程的产生 子进程先于父进程结束,这是需要父进程最子进程的pcb进行释放,如果父进程没有对已经结束的子进程进行pcb释放,那么该子进程就一直处于僵死状态,如果父进程运行一段时间也结束了,那还好办,init进程会接收这个僵死的子进程对其pcb进行释放,但是如果父进程一直循环,那么子进程就一直处于僵死状态。2、僵死进程的处理方式(1)将其父进程...原创 2019-02-27 16:43:39 · 549 阅读 · 0 评论 -
tcp粘包问题
一、造成粘包的原因 我们常说tcp是一种流式连接,这里的“流”指的是数据向水流一样,并不区分数据包之间的界限。tcp协议允许发送端将几次发送的数据缓存起来合成一个数据包发送到网络上去,因此这样可以获得更多的效率,这一行为往往由操作系统中的socket提供,应用层对此毫无所觉。所以socket的send被调用发送数据时有可能不是立即发送,而是等待后续数据一起发送。 网络传...原创 2019-02-28 16:40:33 · 179 阅读 · 0 评论 -
线程同步的方法有哪些?
一、线程同步和线程互斥首先我们要清楚什么是线程同步和线程互斥:1、线程同步:线程同步指的是多个线程之间协调同步,按照预定的先后次序进行运行,这种先后次序取决于要完成的特定任务,最基本的场景就是:A线程要完成的任务依赖于B线程的数据。2、线程互斥:线程互斥是指对于线程共享的线程资源,在各个线程访问时具有排它性。当有若干个线程要访问同一共享资源时,任何时刻只允许一个线程进行访问,直到占有资源...原创 2019-02-26 20:41:00 · 6899 阅读 · 0 评论 -
库函数和系统调用的区别
系统调用:操作系统为用户提供了一系列接口,这些接口提供了对硬件设备的操作。举个例子我们用printf想终端打印hello world,程序中调用printf,而printf实际上调用的是write,从而打印信息到终端。库函数:库函数是对系统调用的封装。系统调用作为内核提供给用户的接口,它执行的效率是比较高效和精简的,但有时候我们需要对获取的信息进行一些处理,我们把这些处理过程封装起来提供给程序...原创 2019-03-06 09:03:29 · 553 阅读 · 1 评论 -
http协议
一、什么是http协议 说起http协议,每个人张口就来:超文本传输协议,那么“超文本传输协议”究竟又是什么呢?http协议实际上是一个服务器和客户端的请求和应答标准。客户端是终端用户,服务器是网站。通俗来讲,我们使用谷歌、百度来进行访问就是依赖于http协议的。http协议标准了客户如何向服务器发送请求又如何得到回应。二、http协议的功能用于从www服务器传输超文本到本...原创 2019-02-26 22:36:13 · 1858 阅读 · 0 评论 -
用户态切换到内核态的过程
在linux系统中,每个系统调用被赋予一个系统调用号。这样通过这个独一无二的号码就可以关联系统调用。当用户空间执行的进程执行一个系统调用的时候,这个系统调用号就用来告诉内核要执行哪一个系统调用。 内核记录了系统调用表中所有已注册过的系统调用的列表,这个表为每一个有效的系统调用指定了唯一的系统调用号。用户空间程序无法执行内核代码。它们不能直接调用内核中的函数,因为内核驻...原创 2019-03-06 13:56:51 · 2574 阅读 · 0 评论 -
ARP协议
在介绍ARP协议之前,我们先来区分一下IP地址和网络地址。IP地址:是网络层及以上各层使用的地址,是一种逻辑地址,IP地址是使用软件实现的。MAC地址:是数据链路层和物理层使用的地址。 发送数据时,数据从高层到底层,通过每一层时则加上该层对应的协议报头,直到最底层(链路层),才发送到通信链路上进行传输。使用IP地址的IP数据报一旦交给数据链路层,就被封装成MAC帧,MAC帧...原创 2019-03-08 17:10:36 · 229 阅读 · 0 评论 -
http报文结构
http有两类报文:请求报文——从客户端向服务器发送请求报文 响应报文——从服务器到客户的回答请求报文请求报文的第一行叫做“请求行”,只有三个内容:请求方法、URL、http的版本方法:就是对请求对象进行地操作。例如:GET,请求由URL所标志地信息。POST,给服务器添加信息。 URL:用来定位互联网上资源地位置 http版本:即http协议地版本号请求报文地第二部分是...原创 2019-03-06 14:28:33 · 240 阅读 · 0 评论 -
ping命令的原理
首先,我们来看一下ping命令的作用:简单来说,ping是用来检测本机与网络中的某个主机是否可达命令,如果两台主机之间ping不同,则表明两台主机之间不可建立连接。ping是定位网络通不通的重要手段。ping命令的原理 ping命令是基于ICMP协议来工作的,ICMP是Internet控制报文协议。ping命令会发送一个ICMP回显请求报文给目标主机,并等待目标...原创 2019-03-08 19:35:45 · 805 阅读 · 0 评论 -
域名系统DNS
域名系统是互联网使用的域名系统,用来把便于人们使用的机器名字(即我们常说的网址)转换为IP地址。许多应用层软件经常直接使用域名系统DNS,虽然计算机的用户只是间接而不是直接使用域名系统,但DNS却为互联网的各种网络应用提供了核心服务。 互联网的域名系统DNS被设计成为一个联机分布式数据库系统,并采用客户服务器方式。DNS使大多数名字都在本地进行解析,仅少量解析需要在互...原创 2019-03-08 22:59:46 · 846 阅读 · 0 评论 -
进程和线程的区别
进程:进程是一个正在运行的程序,进程是资源分配的最小单位线程:线程是程序执行的最小单位,一个进程可以由多个线程组成,多个线程共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由cpu独立调度执行,在多cpu下就允许多个线程同时运行。线程和进程之间的区别进程是资源分配的最小单位,线程是程序执行的最小单位 进程有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据...原创 2019-03-06 21:53:32 · 203 阅读 · 0 评论 -
一致性哈希算法
一致性哈希是一种常永于负载均衡的分布式算法。首先我们看一个案例:1、我们有3台服务器S0、S1、S2.2、与此同时我们还有10万张图片需要均匀的缓存在这三台服务器上如何实现将图片均匀的缓存在三台服务器上来减轻缓存的压力一、传统哈希算法首先对图片名称进行哈希计算得到哈希值 用这个哈希值对机器数取模算出该放在哪一个服务器上假设对图片名称进行哈希计算得到的数值为6,此时服务器数为...原创 2019-03-06 23:13:06 · 175 阅读 · 0 评论 -
单例模式的双重if判断与线程安全
单例模式单例模式是指设计一个只能构造一个对象的类。简单来说就是在一个进程运行过程中只可以存在一个该类的对象。单例模式的对象获得设计方式A* getA(){ if(_a == NULL) { lock() if(_a == NULL) { _a = new A(); } }...原创 2019-03-28 17:21:59 · 1507 阅读 · 0 评论