linux
qq_43313035
勇于拼搏 永远年轻
展开
-
多线程及其同步问题
线程的定义线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。为什么要引入线程在多道程序环境下,程序的执行属于并发执行,此时它们将失去其封闭性。并具有间断性及不可再现性的特征。这就决定了通常的程序是不能并发执行的而程序的顺序执行使系统资源利用率低,为此引入线程。线程的三种实...原创 2019-03-19 21:30:59 · 686 阅读 · 0 评论 -
高级I/O框架libevent库简介
基于Reactor模式实现的I/O框架库包含了如下几个组件:句柄(Handler)事件多路分发器(EventDemultiplexer)事件处理器(EventHandler)具体的事件处理器(ConcreteEventHandler)、Reactor。 句柄作用:当内核检测到就绪事件时,它将通过句柄来通知应用程序这一事件在Linux下,I/O事件对应的句柄是文件描...原创 2019-04-26 23:38:33 · 176 阅读 · 0 评论 -
IO复用—select系统调用
ser#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<assert.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys...原创 2019-04-18 17:02:26 · 280 阅读 · 0 评论 -
I/O复用—poll
文章目录poll系统调用poll举例select和poll的区别由于poll和select非常相似,对于其理论内容就不过多介绍,我们直接看其系统调用接口。poll系统调用poll的原型#include<poll.h>int poll(struct pollfd,nfds_t nfds,int timeout); fds参数:一个pollfd结构类型的数组,指定所有我...原创 2019-04-19 08:48:05 · 117 阅读 · 0 评论 -
I/O复用—epoll
文章目录epoll系统调用内核事件表操作epoll的内核事件表的函数epoll举例由于select和poll 存在很多不足之处,因此我们针对这些缺点使用epoll解决。epoll系统调用内核事件表epoll是Linux特有的I/O复用函数。它用一组函数来完成任务,而不是一个函数epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中(只需传一次),不是像select和poll那样...原创 2019-04-19 10:08:41 · 108 阅读 · 0 评论 -
Linux内核do_fork()分析
中断和异常向量每个中断和异常是由0-255之间的一个数来标识。因为一些为重的原因,Inter把这8位无符号整数叫做一个向量。不可屏蔽中断的向量和异常的向量是固定的,而可屏蔽中断的向量可以通过对中断控制器的编程来改变。Linux利用了下列向量:0-31的向量对应于异常和不可屏蔽中断32-47的向量被分配给可屏蔽中断,即由IRQ引起的中断。生于的48-255的向量用来标识软中断。Linux...原创 2019-05-24 19:31:21 · 1384 阅读 · 0 评论 -
Linux内存管理—buddy算法
文章目录伙伴的算法的引入满足以下条件的两个块称为伙伴伙伴位图伙伴算法的思想伙伴算法的数据结构伙伴算法内存分配的过程伙伴算法分配的思想伙伴算法的具体内存分配过程__alloc_pages()函数的实现_rmqueue()函数的实现伙伴算法的具体释放过程伙伴算法释放的思想__free_one_page()函数的实现位图位图的使用伙伴的算法的引入在系统运行过程中,经常需要分配一组连续的页,而频繁的申...原创 2019-05-30 12:33:53 · 2009 阅读 · 0 评论 -
Linux内存管理—Slab分配器
Slab分配器的引入内部碎片内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。举例:某进程向系统申请了3K内存空间,系统通过伙伴系统算法可能分配给进程4K(一个标准页面)内存空间,导...原创 2019-05-30 21:29:15 · 878 阅读 · 2 评论 -
top命令详解
文章目录top中一些字段的含义top内部命令top使用方法top举例讲解top中一些字段的含义 VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量 RES:resident memory usage 常驻内存1、进程当...原创 2019-06-05 14:27:34 · 625 阅读 · 0 评论 -
静态库与动态库的制作和使用
文章目录库文件库文件与可执行文件的区别静态库制作静态库使用静态库总结动态库的制作动态库使用库文件库文件是编译好的二进制文件,用于在链接阶段同目标代码一起生成可执行文件,或者运行可执行文件的时候被加载,以便调用库文件中的某段代码。库文件通过头文件向外导出接口。用户通过头文件找到库文件中找到函数实现的代码从而把这段代码链接到用户程序中去。库的位置: /usr/lib /lib我们开...原创 2019-06-06 14:40:02 · 483 阅读 · 1 评论 -
ptmalloc 内存管理概述
文章目录ptmalloc引入ptmalloc简述内存管理的设计假设内存管理数据结构概述主分配区(main_arena) 与 非主分配区(non_main_arena)chunk的组织chunk 格式空闲 chunk 容器binsfast binsunsorted bintop chunkmmaped chunklast remaindersbrk 与 mmap内存分配概述分配算法概述ptmallo...原创 2019-06-01 22:12:36 · 1089 阅读 · 1 评论 -
Linux高端内存映射
文章目录高端内存的由来物理内存映射永久内核映射临时内核映射非连续内存分配高端内存的由来通常32位Linux内核地址空间划分0 ~ 3G为用户空间,3 ~ 4G为内核空间当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射。 物理地址 = 逻辑地址 – 0xC0000000假设按照上述简单的地址映射关系,内核只能访问1G物理...原创 2019-05-29 20:50:56 · 276 阅读 · 0 评论 -
死锁、死锁的预防和避免
死锁死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。产生死锁的原因由死锁的定义可知,死锁主要是由于竞争资源引起的,那么这里的资源指的是哪些资源呢?系统中的资源可以分为两类:可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其...原创 2019-08-22 10:23:57 · 4779 阅读 · 0 评论 -
软链接和硬链接区别
文章目录硬链接符号链接(软连接)软连接和硬链接的区别建立软链接和硬链接的命令Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。硬链接硬连接指通过索引节点来进行连接.在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在L...原创 2019-08-22 11:05:49 · 253 阅读 · 0 评论 -
HTTP和HTTPS的区别、HTTPS的加密通信过程
文章目录HTTP的缺点HTTP和HTTPS协议的区别HTTPS 下的加密加密算法HTTPS一般使用的加密与HASH算法HTTPS的加密通信过程客户端发起HTTPS 请求服务端的配置传送证书客户端解析证书传送加密信息服务端解密信息传输加密后的信息客户端解密信息HTTPS的加密通信过程总结HTTP的缺点HTTP协议通信使用明文(未加密的报文),不对传输内容进行加密。如果使用fiddler等抓包工...原创 2019-08-26 18:29:49 · 1305 阅读 · 0 评论 -
DNS
一、概述域名系统DNS是因特网使用的命名系统,用来把便于人们使用的机器名字转换为IP地址。因特网的域名系统DNS被设计成为一个联机分布式数据库系统,并采用客户服务器方式。DNS使大多数名字都在本地进行解析,仅少量解析需要在因特网通信,因此DNS系统的效率很高。由于DNS是分布式系统,即使单个计算机出了故障,也不会妨碍整个DNS系统的正常运行。域名到IP地址的解析是由分布在因特网上的许多域名服...原创 2019-04-17 23:54:18 · 255 阅读 · 0 评论 -
守护进程
进程间的层次关系 进程组一个或多个进程的集合一般与同一个作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID进程组的结束要等到组中所有的进程结束kill发送给进程组的命令:kill -9 -进程组号question:为什么要产生进程组??anwser:提供进程组就是为了方便对进程进行管理。假设要完成一个任务,需要同时并发100个进程。当用户处于某种原因要...原创 2019-04-21 18:00:19 · 182 阅读 · 0 评论 -
HTTP协议
HTTP协议HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。默认HTTP的端口号为80,HTTPS的端口号为443。HTTP协议的主要特点支持客户/服务器模式。简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联...原创 2019-04-09 23:41:33 · 113 阅读 · 0 评论 -
Linux一个进程最多能开启的线程数
PCB(进程控制块)对于一个进程,它在被执行前是一个可执行程序。这个程序是被放在磁盘上的,当它要被执行的时候,它先被加载到内存当中,然后再放入到寄存器中,最后再让cpu执行该程序,这个时候一个静态的程序就变成了进程。操作系统如何管理进程操作系统用一个双向链表把进程连起来,但是进程是一个抽象的概念,于是系统用一个东西来描述进程,进而管理进程。这个东西就是PCB,双向链表链接的就是PCB。PCB...原创 2019-03-22 09:11:35 · 2479 阅读 · 0 评论 -
线程同步——信号量和互斥锁的区别
文章目录两者在定义上的区别两者在语义上的区别信号量实现同步互斥锁实现同步条件变量实现同步条件变量满足之后唤醒其他线程加锁两者在定义上的区别信号量是用在多线程同步上的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程就可以进行某些动作,如果所有的线程都在(sem_wait),就会阻塞。互斥锁是用在多线程的互斥的,对于临界资源的访问,需要互斥进行。也就是说当一个线程占用了一个资源的时...原创 2019-03-22 10:47:55 · 908 阅读 · 0 评论 -
进程间通信—管道、信号量
文章目录进程间通信的方式管道分类无名管道有名管道进程间通信的方式管道、信号量、共享内存、消息队列管道定义:当一个进程连接数据流到另一个进程时,使用管道。通常是把一个进程的输出通过管道连接到另一个进程的输入。管道文件(大小永远为0,写入管道的数据在内存中写着)创建有名管道命令形式:mkfifo fifo函数形式:在这里插入代码片必须有两个进程同时打开管道文件,一个读...原创 2019-04-03 21:01:47 · 637 阅读 · 0 评论 -
进程间通信—共享内存
共享内存共享内存是正在运行的进程之传递数据的一种非常有效的方式。大多数共享内存的具体实现,都把不同进程之间共享的内存安排为同一段物理内存。其他进程可以将同一段共享内存连接到他们自己的地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由malloc分配的一样。如果某个进程向共享内存写入了数据,所作的改动将立刻被可以访问同一段共享内存的任何其他进程看到。共享内存是最快的一种 IPC,...原创 2019-04-03 23:38:25 · 128 阅读 · 0 评论 -
进程间通信—消息队列
消息队列消息队列与命名管道很相似,它提供了一种在两个不相关之间传递数据的相当简单且有效的方法。与命名管道相比,消息队列的优势在于,它独立于发送和接受进程而存在,这消除了在同步命名管道的打开和关闭时可能产生的一些困难。(某个进程往一个消息队列中写入消息之前,不需要另外某个进程在该队列上等待消息的达到)接口函数#include<sys/msg.h>/*控制函数,一般用于删除消息队...原创 2019-04-04 10:15:10 · 115 阅读 · 0 评论 -
线程安全问题
strtok()函数和strtok_r()函数char *strtok(char *str,const char *delim);char *strtok_r(char *str,const char *delim,char **saveptr);#include<stdio.h>#include<stdlib.h>#include<string.h>...原创 2019-03-24 17:26:31 · 132 阅读 · 0 评论 -
TCP协议
TCP协议特点面向链接、字节流、可靠传输tcp的连接是全双工的面向连接使用TCP协议通信的双方必须先建立连接,然后才能开始的数据的读写。双方都必须为连接分配必要的内核资源,一管理连接的状态和连接上数据的传输。字节流字节流:发送端执行的写操作次数和接收端执行的读操作此时之间没有任何数量关系。具体表现在:当发送端应用程序连续执行多次写操作时 ,TCP模块先将这些数据放入TCP缓冲区...原创 2019-03-31 23:26:50 · 578 阅读 · 0 评论 -
TCP的滑动窗口
滑动窗口的作用提供TCP的可靠性是提供TCP的流控特性滑动窗口基本原理 对于TCP会话的发送方,任何时候在其发送缓存内的数据都可以分为4类,已经发送并得到对端ACK的已经发送但还未收到对端ACK的未发送但对端允许发送的未发送且对端不允许发送其中:已经发送但还未收到对端ACK的、未发送但对端允许发送的这两部分数据称之为发送窗口图片来源于网络当收到ACK=36时窗口滑...原创 2019-04-06 20:58:21 · 602 阅读 · 0 评论 -
三次握手和四次挥手
三次握手两次的问题:如果两次,客户端发送完SYN之后关闭,服务器端就不知道是否建立链接,文件描述符就会被一直占用。四次挥手为什么需要TIME_WAIT状态当建立链接后,服务器重启,客户端接着发送数据,会出错,无法正确读取数据。怎么区分断电、断网还是长时间占用不发数据??隔一段时间发送心跳包每隔5分钟发送一个数据包,不需要恢复,有可能丢掉,3次没收到,认为掉线,在服务器端主动断...原创 2019-04-12 02:11:35 · 584 阅读 · 0 评论 -
一个服务器和多个客户端进行通信
多线程处理服务器端accept()放在线程函数中可能会造成的问题:有可能多个线程同时去已完成三次握手的队列中建立链接,这时候需要加锁。以保证互斥的访问。#include<stdlib.h>#include<unistd.h>#include<string.h>#include<stdio.h>#include<assert.h&...原创 2019-04-07 11:27:04 · 2104 阅读 · 2 评论 -
拥塞控制
定义tcp模块还有一个重要的任务,就是提高网络利用率,降低丢包率,并保证网络资源的对每条数据流的公平性。这就是所谓的拥塞控制。拥塞控制的目标提高网络利用率降低丢包率保证网络资源的对每条数据流的公平性组成部分慢启动、拥塞避免、快速重传和快速恢复慢启动之前我已经介绍过滑动窗口,它的主要作用就是流量控制可以避免发送方过载接收方,但是却无法避免过载网络,这是因为接收窗口「rwnd」只...原创 2019-04-07 18:15:14 · 17958 阅读 · 3 评论 -
UDP协议
UDP无链接、UDP服务器-客户端编程流程应用场景数据丢失影响不大视频,不能传文件代码实现服务器端#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<sys/socket.h>#include<ne...原创 2019-04-07 20:01:01 · 113 阅读 · 0 评论 -
网络通信基础
文章目录网络结点互联网网络编程网络设备套接字OSI模型网络网络是由若干结点和链接这些节点的链路组成结点可以是计算机、集线器、交换机或路由器互联网网络和网络之间通过路由器连起来,就构成了一个覆盖范围更大的网络,即互联网网络编程通过使用套接字来达到进程间通信目的编程是网络编程网络设备计算机(无论其为个人电脑或服务器)、集线器、交换机、网桥、路由器、网关、网络接口卡(NIC)、无线...原创 2019-03-29 11:58:26 · 215 阅读 · 0 评论 -
输入网址回车后发生的过程
总过程DNS解析当我们输入一个网址的时候,这个网址例如www.baidu.com,我们需要知道这个网址其实是一个主机名,需要通过映射关系根据主机名获取IP地址。这个映射关系可以称为DNS。获取IP地址的途径浏览器浏览器会将我们近一段时间访问的主机名及对应的IP地址进行缓存,缓存时间与浏览器有关,在该缓存时间内,我们输入同样的主机名就可以快速从浏览器缓存区获取IP地址并建立连接。...原创 2019-04-12 02:42:37 · 445 阅读 · 0 评论