·Jormungand
我会把这个不完美的故事 变成我所期望的样子
展开
-
Linux服务器 | 服务器模型与三个模块、两种并发模式:半同步/半异步、领导者/追随者
文章目录C/S模型P2P模型C/S模型即常说的 客户端/服务器 模型,将资源(视频、文本、图片、软件等)提供者视作服务器,资源请求者视为客户端。由于客户端连接请求(connect函数)是随机到达的异步事件,服务器需要使用某种 I/O模型 来监听这一事件。例如 I/O复用技术之一的 select系统调用:当监听到连接请求后,服务器就调用 accept函数 接收它,并分配一个 逻辑单元(新创建的子进程、子线程等) 管理这个新连接。工作流程如下图所示:服务器在处理一个客户请求的同时还要继续监听其他客原创 2021-11-21 23:26:55 · 1264 阅读 · 0 评论 -
Linux服务器 | 事件处理模式:Reactor模式、Proactor模式
文章目录Reactor模式Proactor模式同步I/O模型模拟Proactor模式两者的优缺点ReactorProactor同步I/O模型通常用于实现 Reactor 模式,异步I/O模型通常用于实现 Proactor 模式。(不是绝对的,同步I/O也可模拟出 Proactor 模式)Reactor模式原理Reactor 模式要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件就绪,如果有则将该就绪事件通知给工作线程(逻辑单元)。除此之外主线程不会进行其他实质性的工作,读写数据、接收原创 2021-11-20 01:08:38 · 1681 阅读 · 0 评论 -
IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
文章目录IO模型阻塞IO非阻塞IO信号驱动IO多路复用IO异步IOIO模型根据各自的特性不同,IO模型被分为阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO五类。最主要的两个区别就是阻塞与非阻塞,同步与异步。阻塞与非阻塞阻塞与非阻塞最主要的区别就是程序在等待调用结果时的状态。阻塞: 为了完成一个功能发起调用,如果不具备完成功能的条件,则调用会一直等待非阻塞: 为了完成一个功能发起调用,如果不具备完成功能的条件,则立即报错返回同步与异步同步与异步最主要的区别就是功能完原创 2021-11-09 22:46:07 · 997 阅读 · 0 评论 -
Linux 服务器程序规范、服务器日志、用户、进程间的关系
文章目录服务器程序规范日志rsyslogd 守护进程服务器程序规范Linux 服务器程序一般以后台进程(守护进程[daemon])形式运行。它没有控制终端,因此不会意外接受到用户输入,守护进程的父进程通常是 init 进程(PID为1)。服务器的调试和维护都需要一个专业的日志系统,Linux 常用一个守护进程 rsyslogd(syslogd的升级版) 来处理系统日志。Linux 服务器程序一般以 非root 的身份运行。如:mysqld、httpd、syslogd 等后台进程分别拥有自己的运行原创 2021-11-07 23:06:06 · 590 阅读 · 0 评论 -
Linux | 高级I/O函数
文章目录创建文件描述符的函数pipe函数dup函数、dup2函数readv函数、writev函数创建文件描述符的函数pipe函数不再赘述,详情见我的另一篇博客。值得一提的是,socket 基础API中有一个 socketpair函数,能够方便地创建双向管道:#include<sys/types.h>#include<sys/socket.h>int socketpair(int domain, int type, int protocol, inf fd[2]);/原创 2021-10-21 15:41:31 · 446 阅读 · 0 评论 -
Linux网络编程 | socket选项设定 及 网络信息API
文章目录socket 接口socket 接口1. 地址信息函数我们可以知道一个连接 socket 的 本端socket地址 ,以及 远端socket 地址 。#include<sys/socket.h>int getsockname(int sockfd, struct sockaddr* address, socklen_t* address_len); // 获取 sockfd 对应的socket地址int getpeername(int sockfd, struct so原创 2021-10-02 15:50:13 · 638 阅读 · 0 评论 -
Linux网络编程 | socket介绍、网络字节序与主机字节序概念与两者的转换、TCP/UDP 连接中常用的 socket 接口
文章目录套接字sockaddr 和 sockaddr_in套接字为什么要用到套接字?我们知道,数据链路层、网络层、传输层协议是在内核中实现的。而 socket 就是 操作系统 提供给 应用程序 通过 系统调用 访问这些 协议服务 的一组 API 。socket 不但可以访问内核中 TCP/IP 协议栈,而且访问其他网络协议栈。socket 定义的 API 提供哪些功能?将 应用程序数据 从 用户缓冲区 中复制到 TCP/UDP 内核发送缓冲区 ,将发送数据交付内核。从 TCP/UDP原创 2021-08-20 10:42:12 · 620 阅读 · 0 评论 -
Linux 进程 | 进程间的通信方式
文章目录在之前的博客中讲过,虚拟空间出现的其中一个目的就是解决 进程没有独立性,可能访问同一块物理内存 的问题。因为这种独立性,进程之间无法直接进行通信,操作系统为了解决这种问题,提出了多种适用于不同情境下的通信方式:数据传输:管道、消息队列数据共享:共享内存进程控制:信号量...原创 2021-08-13 23:06:03 · 541 阅读 · 0 评论 -
操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)
文章目录过程调用系统调用过程调用和系统调用的区别过程调用过程调用也就是 微机原理里的 CALL 、编程时调用的 库函数 。由于库函数调用是基于C库的,因此也就不可能用于内核空间的驱动程序对设备的操作。系统调用系统调用其实是一个过程调用,但在过程调用内部隐藏着 陷阱(trap)指令 。过程调用中封装了系统调用是一种高内聚的设计方式,目的是让系统调用对研发人员透明。系统调用本质上是操作系统提供给用户程序调用的一组“特殊”接口(API)。用户程序可以通过这组 API 来获得操作系统内核提供的服务。以原创 2021-08-12 17:37:44 · 3740 阅读 · 1 评论 -
Linux 内存管理 | 连续分配方式 和 离散分配方式
文章目录前言连续分配单一连续分配分区式分配固定分区分配动态分区分配可重定位分区分配离散分配分段分页多级页表快表(TLB)段页式Linux前言Linux 内存管理 | 虚拟内存管理:虚拟内存空间、虚拟内存分配Linux 内存管理 | 物理内存、内存碎片、伙伴系统、SLAB分配器在之前的两篇博客中,分别介绍了虚拟内存与物理内存的管理方式,那么对于操作系统来说,它是如何管理它们两个之间的关系的呢?如何进行地址的映射呢?内存的分配方式有两种:连续分配: 每个进程分配一段地址空间连续的内存空间。连原创 2021-08-11 19:31:22 · 5620 阅读 · 1 评论 -
Linux 进程控制 :进程创建,进程终止,进程等待,程序替换
文章目录进程创建fork函数**vfork函数**进程终止进程等待程序替换进程创建fork函数创建一个子进程,父子进程代码共享,数据独有。当调用 fork函数 时,通过 写时拷贝技术 来拷贝父进程的信息。写时拷贝技术: 子进程通过复制父进程的 PCB,使得父子进程指向同一块物理内存,运行位置和代码也相同。但又因为进程的独立性,所以当某一个进程数据发生改变的时候会重新给子进程开辟物理内存,将数据拷贝过去。(之所以这样使用是因为如果数据不修改的话还开辟空间拷贝数据会使效率降低)这也就是数据独有的原原创 2021-08-10 11:45:45 · 479 阅读 · 0 评论 -
Linux | 进程概念、进程状态(僵尸进程、孤儿进程、守护进程)、进程地址空间
文章目录进程和程序操作系统如何控制和调度程序进程控制块–PCB子进程进程状态僵尸进程孤儿进程守护进程(精灵进程)进程和程序程序: 一系列有序的指令集合(就是我们写的代码)。进程: 进程就是程序的一次执行,是系统进行资源分配和调度的独立单位。程序最初以某种可执行格式驻留在外存上(如:磁盘)。操作系统运行程序时将需要用到的代码和所有静态数据加载(load)到内存中(惰性执行,暂时用不到的代码不加载),方便 CPU 运行进程时使用。操作系统如何控制和调度程序实际中,一个正常的系统可能会有上百原创 2021-08-09 21:46:10 · 767 阅读 · 0 评论 -
Linux | 编译原理、gcc的命令参数、自动化构建工具 make/Makefile
文章目录编译原理预处理编译汇编链接make 和 makefile 的概念编译原理在解释 makefile 前,首先解释一下 .c 文件变成 .exe 文件要经过的四个步骤——预处理、编译、汇编和链接(参考来源):预处理预处理分为四步:展开所有的宏定义 #define处理含有 # 部分的代码。如:条件编译 “#if”、“#ifdef”、“#elif”、“#else”、“#endif” ;预编译指令 #include ,将被包含的头文件插入到该编译指令的位置。(这个过程是递归进行的,因原创 2021-08-07 00:20:08 · 1370 阅读 · 0 评论 -
Linux 内存管理 | 虚拟内存管理:虚拟内存空间、虚拟内存分配
文章目录虚拟地址空间虚拟地址空间在早期的计算机中,程序是直接运行在物理内存上的,也就是说,程序在运行时所访问的地址都是物理地址,这种情况下只要程序所需要的内存空间不超过物理内存的大小就不会有问题。但是大多数情况下我们必须同时运行多个程序,这样必定会造成内存空间的重叠现象,并且程序去直接操作物理内存也是十分危险的,那么我们如何将计算机有限的物理内存分配给多个程序使用呢?虚拟内存空间是系统的一种技术,当程序被载入内存时,向其呈现出比实际拥有的地址空间大得多的内存,让程序误认为自己目前独占电脑内存,能够占原创 2021-08-04 22:23:44 · 1253 阅读 · 0 评论 -
Linux 内存管理 | 物理内存、内存碎片、伙伴系统、SLAB分配器
文章目录物理内存物理内存分配外部碎片内部碎片伙伴系统(buddy system)slab分配器物理内存在Linux中,内核将物理内存划分为三个区域。在解释DMA内存区域之前解释一下什么是DMA:DMA(直接存储器访问) 使用物理地址访问内存,将数据从一个地址空间复制到另外一个地址空间,从而加快磁盘和内存之间数据的交换,不经过MMU(内存管理单元),这时CPU可以去干别的事,大大增加了效率。DMA内存区域(ZONE_DMA): 包含 0M~16M 之内的内存页框,该区域的物理页面专门供I/O设备原创 2021-08-04 20:56:13 · 1003 阅读 · 0 评论 -
大端小端存储模式详解及判断方法
文章目录大小端模式的概念两种模式出现原因两种模式的优劣大小端的应用情景判断机器的字节序大小端模式的概念当我们查看数据在内存中的存储情况时,我们经常会发现一个很奇怪的现象,什么现象呢?int main(){ int i = 12; return 0;}数据在内存中的存放方式似乎和我们想象的顺序不太一样,在我们的常规认知不一样,在我们的常规认知中,它的存放方式应该是 00 00 00 0c ,那造成这个现象的原因是什么呢?这是因为在内存中存放数据通常会采用两种不同的存储模式:大端存储和原创 2021-08-04 14:02:26 · 4509 阅读 · 0 评论 -
操作系统中避免死锁的银行家算法【表面C++实际C语言】一学就废的菜鸡代码
文章目录银行家算法实验原理数据结构初始化输出资源分配量安全性算法银行家算法完整代码测试数据银行家算法银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。(破坏了环路等待条件)实验原理数据结构1)可利用资源向量Available是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K原创 2020-09-16 21:36:41 · 1060 阅读 · 0 评论