Linux
文章平均质量分 77
咚伢
linux C
展开
-
ubuntu16 go语言环境搭建和踩坑
基于ubuntu的go语言学习环境搭建以及踩坑原创 2022-02-22 22:24:47 · 245 阅读 · 0 评论 -
nginx惊群问题解决原理和负载均衡实现
nginx学习笔记——惊群问题和负载均衡实现原创 2022-01-09 17:31:31 · 1325 阅读 · 0 评论 -
深入Linux系列(3)锁与进程通信
锁与进程通信 内核控制机制 竞态条件 几个进程在访问资源的时候彼此干扰的情况通常称为竞态条件(race condition)。由于导致竞态条件的情况非常罕见,因此需要提出一个问题:是否值得做一些(有时候是大量的)工作来保护代码避免竞态条件。在某些环境中(比如航空飞机的控制系统、重要机械的监控、危险装备),竞态条件是致命问题。 临界区 每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界资源是一次仅允许一个进程使用的共享资源)。 内核锁机制 内核可以不受限制地访问整个地址空间。原创 2021-12-29 22:59:31 · 441 阅读 · 0 评论 -
深入Linux系列(2)进程调度
进程调度 调度器 核心调度器 调度器的实现基于两个函数:周期性调度器函数和主调度器函数。这些函数根据现有进程的优先级分配CPU时间。这也是为什么整个方法称之为优先调度的原因。 周期性调度器函数 周期性调度器在scheduler_tick中实现,如果系统正在活动中,内核会按照频率HZ自动调用该函数。该函数主 要有两个任务如下: 更新相关统计量:管理内核中与整个系统和各个进程的调度相关的统计量。其间执行的主要操作是对各种计数器+1 激活负责当前进程的调度类的周期性调度方法 更新统计量函数:update_rq原创 2021-12-29 22:56:59 · 438 阅读 · 0 评论 -
深入Linux系列(1)进程原理
Linux 进程原理 进程原理 进程 Linux内核把进程称为任务(task),进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,每个进程有独立的用户空间虚拟地址空间。 进程大致有两种特殊的形式 内核进程:没有用户虚拟地址空间的进程 用户进程:有用户虚拟地址空间的进程 共享同一个用户虚拟地址空间的所有进程我们称之位一个线程组 进程的四要素 有一段程序供其执行 有进程专用的系统堆栈空间 在内核用task_struct数据结构维护 有独立存储空间,拥有专有的用原创 2021-12-26 12:51:56 · 982 阅读 · 0 评论 -
协程的实现思路与原理
协程的实现思路与原理 为什么要有协程 以同步的方式实现异步的效率,同步的效率低 综合同步和异步的优势 异步方式 发数据 socket connect 服务器 设置协议 send fd ADD epoll 接数据 epoll_wait() read fd 解析对应数据 上面两个流程是异步的。 那么如何使用同步的方式实现异步的效率? 我们引入yield 和 resume原语。yield 为让出,resume为恢复 那么流程就变成如下: 发数据 socket connect 服务器 设置协议 sen原创 2021-08-16 22:40:28 · 389 阅读 · 0 评论 -
无锁CAS及无锁队列实现
CAS ⽐较并交换(compare and swap, CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据 交换操作,从⽽避免多线程同时改写某⼀数据时由于执⾏顺序不确定性以及中断的不可预知性产⽣的数据 不⼀致问题。 该操作通过将内存中的值与指定数据进⾏⽐较,当数值⼀样时将内存中的数据替换为新的值。 bool CAS( int * pAddr, int nExpected, int nNew ) atomically { if ( *pAddr == nExpected ) {原创 2021-07-13 02:00:10 · 435 阅读 · 0 评论 -
常见锁使用(互斥,读写,自选,原子操作)以及CAS原理简介
锁 posix api 为什么需要锁? 数据竞争,不加锁数据修改的结果不一定为理想结果。(原子操作执行顺序可能会不同) 例子 #include <stdio.h> #include <pthread.h> #include <unistd.h> #define THREAD_SIZE 10 int count = 0; void *func(void *arg) { int *pcount = (int *)arg; int i = 0;原创 2021-07-11 13:37:18 · 285 阅读 · 0 评论 -
定时器设计以及最小堆定时器方案实现
定时器概述 定时器在服务端的应用 对于服务端来说,驱动服务端逻辑的事件主要有两个,⼀个是⽹络事件,另⼀个是时间事件; 在不同框架中,这两种事件有不同的实现⽅式; 第⼀种,⽹络事件和时间事件在⼀个线程当中配合使⽤;例如nginx、redis; // 第⼀种 伪代码 while (!quit) { int now = get_now_time();// 单位:ms int timeout = get_nearest_timer() - now; if (timeout < 0) timeout原创 2021-07-11 11:10:13 · 524 阅读 · 0 评论 -
reactor模型原理以及采用epoll的简单实现
reactor 模型 UML Reactor模式是处理并发IO的常见模式,用于同步I/O。中心思想是将所有要处理的IO事件注册到一个中心复用器上,同事主线程或进程阻塞在多路复用器上。一旦有I/O事件到来或是准备就绪,那么多路复用器返回并将事先注册的I/O事件分发到对应的处理器中。 组成部分 多路复用器:由OS提供,在linux一般指select,poll,epoll 事件分发器:将多路复用器中返回的就绪事件分到对应的处理函数中 事件处理器:负责处理特定事件的处理函数 优点 响应快,不必为单个同步时间原创 2021-06-11 10:11:40 · 492 阅读 · 2 评论