linux系统编程与网络编程
xunshuidezhu
这个作者很懒,什么都没留下…
展开
-
EINTR
慢系统调用可能永远阻塞的系统调用EINTR调用系统调用被中断,返回错误码EINTR触发例子,永远阻塞的系统调用进程,接收到信号,执行注册的信号回调函数,慢系统调用被中断,触发EINTR处理重复系统调用忽略错误...原创 2020-04-27 17:48:25 · 853 阅读 · 0 评论 -
用户态到内核态
通过系统调用,外围设备中断,异常都可以进入到内核态,主要说一下系统调用过程。PCBPCB是进程控制块,是一个存放进程信息的结构体,主要包括 进程id 进程的状态:就绪,运行,挂起,停止 进程切换时需要保存和恢复的一些寄存器 文件描述符 用户id,组id 信号相关信息 信号信号本质是给PCB写入信息,改变进程相关信息,进程去处理...原创 2020-03-12 10:43:02 · 186 阅读 · 0 评论 -
gcc linux利用CAS实现无锁编程
利用__sync_bool_compare_and_swap(),实现无锁编程CAS即compare and swap,每次都会和old 值进行比较,如果没有发生更改再用new值给ptr赋值,然后返回true#include <bits/stdc++.h>#include <pthread.h>#include <stdlib.h>#includ...原创 2019-12-11 18:28:19 · 899 阅读 · 0 评论 -
gcc linux 利用原子操作实现无锁编程
_ATOMIC_ADD_和_ATOMIC_SUB_是我实现的两个宏,分别对应__sync_fetch_and_add(x, y) __sync_fetch_and_sub(x,y)x需要传地址,y为要加/减的数,可以替代多线程mutex编程#include <bits/stdc++.h>#include <pthread.h>#include &...原创 2019-12-11 16:37:15 · 367 阅读 · 0 评论 -
线程同步,互斥量与条件变量,两个线程交叉打印数据
多线程同步一直是一个难点,利用linux的互斥锁与条件变量实现了两个线程交叉打印数据,并且进行初步封装,可重用/************************************************** * 两个线程交叉打印 * ************************************************/#include <pthread.h...原创 2019-07-11 15:34:12 · 319 阅读 · 0 评论 -
线程资源分配与释放(转载)
很好的文章,提到内核线程与用户态线程以及资源的分配管理释放https://www.jianshu.com/p/ea692d4f5e27转载 2019-07-12 10:18:10 · 1641 阅读 · 0 评论 -
gcc __thread
__thread 变量__thread 标识符修饰的全局或静态变量是线程独立的,线程对该变量的操作对其它线程来说是不可见的。然而线程之间共享内存空间的,因此要达到如些效果就需要针对该变量为每个线程分配变量的存储位置。在 Glibc 中, 所有的 __thread 变量是与 pthread 关联存储的,通过相对于 pthread 变量地址的偏移实现对变量的寻址。即是说,pthread 变量的地址...原创 2019-07-12 10:21:57 · 791 阅读 · 0 评论 -
udp实现可靠传输
做项目正好需要用可靠传输UDP来做传输层,基本思路还是在应用层模仿TCP,超时重传,滑动窗口等机制,三次握手,四次挥手过于复杂,简化成了2次握手,仅确认SEQ或者ACK,如果没有收到正确的报文则重传报文。数据包在发送之前会先存到数据队列,实现缓存,每次发包从数据去取,超时重传时间,超时重传最大次数也要设置,以防止进程被阻塞。...原创 2019-07-23 22:00:48 · 294 阅读 · 0 评论 -
正则表达式总结
正则总结:\将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp...原创 2019-08-17 20:03:30 · 95 阅读 · 0 评论 -
linux服务器设计之Reactor模式
高性能IO之Reactor模式讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty、Redis在使用的IO模式,为什么需要这种模式,它是如何设计来解决高性能并发的呢?最最原始的网络编程思路就是服务器用一个while循环,不断监听端口是否有新的套接字连接,如果有,那么就调用一个处理函数处理,类似:while(true){socket = accept();handle...原创 2019-06-10 19:16:29 · 533 阅读 · 0 评论 -
孤儿进程与僵尸进程
function $initHighlight(block, cls) { try { if (cls.search(/\bno\-highlight\b/) != -1) return process(block, true, 0x0F) + ` class="${cls}"`; } catch (e) { /* handle ex...原创 2019-06-10 19:26:36 · 102 阅读 · 0 评论 -
事件驱动与异步io
https://blog.csdn.net/qq_34173549/article/details/80212101原创 2019-07-09 16:32:01 · 137 阅读 · 0 评论 -
服务器设计:心跳机制
心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。应用场景:在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活什么是心跳机制?...原创 2019-07-13 12:05:38 · 931 阅读 · 0 评论 -
tcp长连接保活与心跳机制
TCP Keepalive的起源TCP协议中有长连接和短连接之分。短连接环境下,数据交互完毕后,主动释放连接;长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电、死机、崩溃、重启,还是中间路由网络无故断开,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪...原创 2019-07-13 12:36:37 · 3227 阅读 · 0 评论 -
进程间通信与线程间通信(二)
一、进程间的七大通信方式signal、file、pipe、shm、sem、msg、socket1,signal信号通信的目的:某某事件发生!此时需要处理什么,进程间(可以是不相关的进程)传递信号场景:信号又被称之为中断,需要处理什么对应的是中断处理函数,此时设置断点,形参入栈,保存现场信息,然后去执行中断处理函数,当处理完成之后,恢复现场信息,程序继续往下执行Linux下可以通...原创 2019-07-04 13:24:18 · 187 阅读 · 0 评论 -
进程间通信与线程间通信(一)
很多书或者博客都说了进程间通信有几种方式,线程间通信有几种方式,我说一下进程间通信与线程间通信的本质以及要注意的问题。1.一个进程如何把信息传递给另一个进程2.确保两个或更多的进程在活动中不会出现交叉,比如,两个工作进程不会服务于一个任务进程, 一个工作进程也不会服务两个任务进程3.正确的执行顺序,比如进程A为创建进程,进程B为消费进程, 则需要A进程先执行,B进程后执行以上都是关...原创 2019-07-04 13:25:41 · 194 阅读 · 0 评论 -
linux条件变量pthread_cond,生产者消费者模型
1.初始化条件变量pthread_cond_init#include <pthread.h>int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);返回值:函数成功返回0;任何其他返回值都表示错误初始化一个条件变量。当参数cattr为空指针时,函数创建的是一个缺省的条件变量。...原创 2019-07-04 17:24:03 · 533 阅读 · 0 评论 -
进程线程协程纤程
任务、作业(Job,Task,Schedule)在进程的概念出现之前,进程有着这样的称谓。进程为了使多个程序能够并发(同一时刻只有一个在运行,但感觉起来像多个同时运行;并行(同一时刻真的多个在运行,不是感觉像多个))的执行,操作系统需要一个结构来抽象和表示这个程序的运行。进程是操作系统对一个正在运行的程序的一种抽象结构。 进程是指在操作系统中能独立运行并作为资源分配的基本单位,由...原创 2019-07-04 19:18:49 · 558 阅读 · 0 评论 -
TIME_WAIT与SO_REUSEADDR
在写tcp服务器代码的时候,关闭服务端进程的时候再次打开会发现bind error,通过netstat查看发现当前端口被占用,查阅Unp发现是TIME_WAIT状态,tcp在断开连接的时候,主动断开连接的一端会在发最后一个ACK之后,等待一段时间,以防止这个ACK丢失。UNP中总结了TIME_WAIT存在的两点理由:(1)可靠的实现TCP全双工连接的终止,(2)允许老的重复分节在网络中消逝。第...原创 2019-05-08 15:29:21 · 564 阅读 · 1 评论