![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 54
xiaoju233
Talk is cheap, show me the code.
展开
-
简易协程库
协程本项目Github地址简介使用C++和x86汇编设计并实现了一个简易的有栈协程库。通过保存和恢复Callee Save寄存器的方式实现协程的切换。通过admin协程进行协程调度,每次协程调度都会先切换回admin,由admin选择下一个上台运行的协程。使用显示运行时打桩机制Hook常用的库函数例如read和accept函数等,改为使用非阻塞的方式调用,从而避免线程被挂起。从x86-64汇编开始Callee Save和Caller Save在x86-64体系结构中,寄存器可以分为两种:Call原创 2021-10-06 21:01:54 · 251 阅读 · 0 评论 -
Linux批量kill进程
Linux批量kill进程 ps -ef | grep something | awk '{print $2}' | xargs kill -9解释:ps -ef 打印所有进程信息| 管道,将上一个进程的输出输入下一个进程,下同grep something 筛选相关进程信息awk '{print $2}' 输出相关进程号xargs kill -9 用上一个进程的输入作为kill -9的参数或者ps原创 2021-10-04 17:09:34 · 88 阅读 · 0 评论 -
Linux查看磁盘空间
Linux查看磁盘空间查看磁盘空间:df -h查看当前目录所占空间:du -sh查看当前目录下各个文件夹所占的空间:du -sh *查看某个文件夹所占空间:du -sh filepath原创 2021-10-02 17:11:25 · 195 阅读 · 0 评论 -
Make命令与Makefile文件
Make命令使用Make命令只会在必要时重新编译所有受改动影响的源文件。而不会因为只改动了一个文件而重新编译整个项目。Make命令不仅仅用于编译程序,无论何时,当需要通过多个输入文件来生成输出文件时,你都可以利用它来完成任务,它的其他用法还包括文档处理。make命令选项和参数:-k 让make命令在发现错误时仍然继续执行下去,而不是在检测到第一个错误时就停止。-n 让make命令输出将要执行的操作步骤,而不真正执行这些操作。-f 告诉make命令将哪一个文件作为makefile文件。若没有原创 2021-07-08 14:34:48 · 1222 阅读 · 0 评论 -
【小技巧】爆栈?栈的大小不够用怎么办?
爆栈?栈的大小不够用怎么办?Linux系统栈帧大小我们先从一段代码开始:#include<stdio.h>const int N = 4*1024*1024;int func(){ int buf[N]; printf("%d\n", N); printf("%d\n", sizeof(buf)); return 0;}编译执行上述代码,显而易见,报Segment Fault错误。用如下指令查看系统栈帧的最大size:ulimit -s原创 2020-11-29 16:06:22 · 3296 阅读 · 0 评论 -
Linux进程中的RSS和VSZ
Linux进程中的RSS和VSZ64位Linux系统中虚拟内存空间大小我们都知道32位系统的虚拟内存空间大小是2^32B,也就是4GB。但是,64位系统的虚拟内存空间的大小并不是2^64B,而是2^48B,也就是256TB。而64位系统支持的物理内存大小最高为2^46B,也就是64TB(这当然远超出了目前我们日常使用的物理内存的规格)。查看Linux系统支持的物理内存和虚拟内存大小的方法:cat /proc/cpuinfo | grep 'address sizes'RSSRSS is th原创 2020-11-28 10:45:53 · 3042 阅读 · 2 评论 -
Linux程序设计之线程池(C语言实现)
Linux程序设计之线程池(C语言实现)首先介绍Linux下线程的基础编程知识。创建线程#include<pthread.h>int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);函数用于创建一个新线程,调用成功返回值为0,如果失败则返回错误代码。与fork创建进程不同的是,fork后,父子进程将在同一位置继续执行下去,只是fork原创 2020-09-12 22:06:53 · 570 阅读 · 1 评论 -
Linux服务器框架设计思路
Linux服务器框架设计思路关键词:进程池、线程池、协程、IO多路复用多进程(进程池)主进程侦听socket,将客户端socket分配给子进程去处理。这样编程简单,可能需要用到进程间的通信,但进程开销很大,并发量非常小。多线程(线程池)主线程侦听socket,将客户端socket分配给每一个线程去处理。这样编程较简单,但线程的创建和切换同样开销较大,并发量较小。无论是进程池还是线程池,其作用都是为了减少进程/线程频繁创建和回收带来的性能损失,本质上依然是一个CPU指向单元在请求的生命周期内,只能原创 2020-09-11 22:52:11 · 351 阅读 · 0 评论 -
同步异步和阻塞非阻塞概念辨析
同步异步和阻塞非阻塞概念辨析IO系统调用阻塞和非阻塞描述的是进程的一个操作是否会使得进程被挂起等待。阻塞总是和系统调用联系起来,若进程调用了系统调用,而该系统调用不能够立即完成(例如涉及到了IO操作),于是内核会将该进程设置为等待状态,调度其他进程上台运行,直到所请求的IO操作完成后再调度其重新上台运行。在进行IO操作时,CPU需要与外部设备(例如磁盘、键盘鼠标等)进行交互,例如CPU向外设发送一个读取数据的请求后,就转而去执行其它任务了,直到外设准备好数据后向CPU发送一个中断信号,CPU再来读取相原创 2020-07-20 15:40:02 · 140 阅读 · 0 评论 -
Linux系统之越界访问
Linux系统之越界访问Linux系统采用页式存储管理机制通过页目录和页面表将每个线性地址转换为物理地址。MMU在内存映射的过程中若遇到下面几种情况会导致映射失败,使得CPU产生一次页面出错异常(Page Fault Exception):相应的页面目录或页面表项为空,即线性地址与物理地址的映射尚未建立。相应的物理页面不在内存中。指令中规定的访问方式与页面的权限不符。接收到缺页中断后,内核会执行预定的页面异常处理程序,使得应用程序得以从因映射失败而暂停的指令出重新恢复执行,或进行一些善后处理。原创 2020-07-19 23:09:55 · 717 阅读 · 0 评论 -
Linux系统内存管理简介
Linux系统内存管理简介Linux内存管理之物理空间Linux内核中有个全局变量mem_map,指向一个page数据结构的数组,每个page数据结构代表着一个物理页面,整个数据就代表着系统中的全部物理页面。页表项的高20位对于软件和MMU硬件有着不同的意义。对于软件,这是一个物理页面的序号,将这个序号用作下标就可以从mem_map找到这个物理页面的page数据结构。对于硬件,在低位补上12个0后就是物理页面的起始地址。在内存映射的过程中,MMU首先检查的是P标志位,它指示所映射的页面是否在内存中。只原创 2020-07-19 22:02:28 · 191 阅读 · 0 评论 -
Linux系统之信号signal简介
Linux系统之信号signal简介常见信号信号含义SIGABORT进程异常终止SIGALRM超时警告SIGFPE浮点运算异常SIGHUP连接挂断SIGILL非法指令SIGINT终端中断SIGKILL终止进程(此信号无法被捕获或忽略)SIGPIPE向无读进程的管道写数据SIGQUIT终端退出SIGSEGV无效内存访问SIGTERM终止SIGUSR1用户定义信号1SIGUSR2用户定义信号原创 2020-07-18 19:46:26 · 268 阅读 · 0 评论 -
Linux僵尸进程
Linux僵尸进程一个进程使用fork系统调用创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。为什么会存在僵尸进程?Unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息,就可以得到。这种机制就是,在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存...原创 2020-04-18 10:27:55 · 96 阅读 · 0 评论 -
Linux守护进程
Linux守护进程守护进程简介守护进程是一个在后台运行且不受任何终端控制的进程。用户使守护进程独立于所有终端是因为,同一个终端可能会被其他的用户使用。而用户不希望在使用终端的过程中受到上一个用户进程的任何信息。同样,由终端输入的任何信号也不应该影响先前在该终端启动的任何守护进程的运行。虽然让服务器后台运行只需要shell命令行后加&即可,但用户还应该做些工作,让程序本身能够自动进入后台...原创 2020-04-18 10:27:23 · 100 阅读 · 0 评论 -
为何需要段页式内存管理
为何需要段页式内存管理为何需要虚拟内存空间?虚拟内存是计算机系统内存管理的一种技术,它使得进程认为它拥有连续可用的内存,而实际上在物理内存中,它通常被分割成多个内存碎片,还有部分暂时被交换到外部磁盘上。每个进程都有独立的虚拟内存空间。虚拟内存空间的存在,对于操作系统来说,使得每个进程运行时互不干扰;对于硬件来说,不要求物理内存存在连续的一段空间,可以更好地利用内存碎片;对于每个进程来说,可以...原创 2020-04-05 15:21:17 · 1509 阅读 · 0 评论 -
Unix系统进程图像
Unix系统进程图像Unix系统进程图像包括两部分,一部分是常驻内存图像,如proc结构;另一部分是可交换图像,如PPDA、数据区域、栈区域等,这一部分可以被交换到磁盘上。而代码段是只读的,用来存放作为程序指令的机器代码。某个程序在被同时执行多次时,各进程共享同一个代码段,代码段通过数组text[]进行管理。进程的状态信息和控制信息等由proc结构体和user结构体管理。每个进程都会分配1组p...原创 2020-04-05 10:23:51 · 922 阅读 · 0 评论 -
Unix用户模式和内核模式
Unix用户模式和内核模式处理器一般有两种模式:用户模式和内核模式。在对系统调用进行处理时,处理器需要首先从用户模式切换到内核模式。内核模式和用户模式所使用的进程的虚拟地址空间是相互独立的,因此在两种模式间传输数据时,需要了解处理器当前模式和处理器先前模式。在PDP-11/40计算机中,有一个处理器状态字的16位寄存器PSW。其中1213位表示处理器先前模式,1415位表示处理器当前模式。0...原创 2020-04-04 20:17:53 · 329 阅读 · 0 评论 -
sftp常用命令
sftp常用命令登录命令,与ssh登录命令相似:sftp user@xxx.xxx.xxx.xxx切换服务器目录,与bash中cd命令一样:sftp> cd path切换本地目录:sftp> lcd path显示服务器文件列表,与bash中ls命令一样:sftp> ls显示本地文件列表:sftp> lls显示服务器当前目录,和bash中pwd...原创 2020-04-02 15:41:53 · 1713 阅读 · 0 评论 -
引用动态链接库的原理
引用动态链接库的原理位置无关代码可以架在你而无需重定位的代码成为位置无关代码(Position-Independent Code,PIC)。用户对GCC使用-fpic选项指示GNU编译系统生成PIC代码。动态链接库的编译必须总是使用该选项。在x86-64系统中,对同一个目标模块中符号的引用是不需要特殊处理使之成为PIC。可以用PC相对寻址来编译这些引用,构造目标文件时由静态链接器重定位。然而...原创 2020-03-22 16:04:26 · 1305 阅读 · 0 评论 -
Linux静态链接
Linux静态链接简介什么是静态编译?静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。这样做的优点是编译成功的可执行文件可以独立执行,而不需要再向外部要求读取函数库的内容。缺点是虽然可执行文件可以独立执行,但因为函数库是直接整合到可执行文件中,因此若函数库升级时,整个...原创 2020-03-21 16:40:16 · 772 阅读 · 0 评论 -
基本TCP套接字编程
基本TCP套接字编程下图是TCP套接字客服/服务器程序的流程图:socket函数#include<sys/socket.h>int socket(int family, int type, int protocol);socket函数创建一个socket文件描述符。参数说明:family:指明协议族,为以下值之一:family说明AF_IN...原创 2020-03-21 11:11:20 · 258 阅读 · 0 评论 -
Unix套接字高级IO函数
Unix套接字高级IO函数recv函数#include<sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);recv函数的作用类似于标准IO库中的read函数,不过需要多加一个额外的参数。参数说明:sockfd:指定接收端套接字文件描述符buf:指定接收缓冲区的指针n...原创 2020-03-19 10:00:36 · 115 阅读 · 0 评论 -
Linux系统标准IO函数
标准IO函数使用底层系统调用open/read/write等对文件进行操作效率非常低,原因主要有两个:使用系统调用会影响系统的性能。与函数调用相比,系统调用的开销较大,因为在执行系统调用时,Linux必须从运行用户代码切换到内核代码,然后再返回用户代码。而减少这种开销的一个好方法是,在程序中尽量减少系统调用的次数,并且让每次系统调用完成尽可能多的工作。硬件会限制对底层系统调用一次所能读写的...原创 2020-03-18 22:41:42 · 886 阅读 · 0 评论 -
Linux文件访问系统调用
Linux文件访问系统调用在Linux系统中用于访问设备驱动程序的底层函数(系统调用)有:open:打开文件或设备read:从打开的文件或设备里读取数据write:向文件或设备写数据close:关闭文件或设备ioctl:把控制信息传递给设备驱动程序lseek:对文件读写指针进行设置open系统调用使用open系统调用可以创建一个新的文件描述符。#include<fcn...原创 2020-03-18 13:18:01 · 364 阅读 · 0 评论 -
Linux系统IO多路复用之epoll
Linux系统IO多路复用之epollepoll_create函数int epoll_create(int size); 创建一个epoll的句柄,size指定需要监听描述符的最大数量。该函数返回一个fd,在使用完epoll之后需要调用close()关闭,否则可能导致fd耗尽。epoll_ctl函数int epoll_ctl(int epfd, int op, int fd, str...原创 2020-03-17 23:14:20 · 133 阅读 · 0 评论 -
Linux系统IO多路复用之select
Linux系统IO多路复用之select#include<sys/select.h>#include<sys/time.h>int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);参数介绍:maxfd:最...原创 2020-03-16 23:42:35 · 132 阅读 · 0 评论 -
Linux系统IO多路复用
Linux系统IO多路复用IO多路复用本质上是通过一种机制,让单个进程可以监视多个文件描述符,一旦某个文件描述符就绪,就通知进程进行相应的读写操作。当一个TCP服务器程序需要同时服务于多个客户时(即保持多条与客户端的TCP连接),这里可以采用多种方式处理多个Socket:若采用阻塞方式读写Socket,则会导致其它客户无法得到及时的服务。可以考虑使用多线程的方式,为每一个Socket分配一...原创 2020-03-16 16:56:01 · 511 阅读 · 0 评论 -
Unix系统IO模型简介
Unix系统IO模型简介阻塞式IO阻塞式IO,即调用IO函数之后阻塞,知道IO操作完成后返回,继续进行接下来的操作。非阻塞式IO进程把一个套接字设置成非阻塞是在通知内核:当所请求的IO操作不能立即完成而需要睡眠等待时,不要把本进程进入睡眠,而是返回一个错误。IO多路复用IO多路复用的方法有select、poll、epoll三种。调用select、poll、epoll这三者中的...原创 2020-03-16 12:48:22 · 154 阅读 · 1 评论 -
Linux动态链接库
基本概念动态链接库(Dynamic Link Library)是一个共享函数库的可执行文件,它使进程可以调用不属于本身的可执行文件以及可以调用不属于本身的可执行代码中的函数。函数的可执行代码位于一个独立的动态链接库文件中,这样可以节省内存和磁盘空间,同时使得程序更易于升级。使用动态链接库的优点动态链接库在编译的时候,在程序里面只有一个“指向”的位置而已。也就是说,动态函数库的内容并没有整合到...原创 2020-03-15 12:48:59 · 430 阅读 · 0 评论 -
超线程和多核心简介
超线程和多核心在购买CPU的时候,我们往往会发现CPU的参数列表中核心数和线程数不一致,且大多数情况下线程数是核心数的两倍。这是为什么呢?这就涉及到超线程和多核心的概念。超线程CPU简介超线程技术是英特尔研发的一种技术,与2002年发布。超线程技术把多线程处理器内部的两个逻辑内核模拟成两个物流芯片,让单个处理器就能使用线程级的并行计算,使得CPU空闲资源得以充分利用。虽然采用超线程技术能...原创 2020-03-15 10:36:31 · 1935 阅读 · 0 评论 -
GCC参数介绍
gcc参数介绍-x language filename设定文件所使用的语言,而不是以后缀识别语言-x none filename关掉上个选项的语言设置,使用文件的后缀识别语言-c对文件进行预处理、编译和汇编,生成obj文件gcc -c hello.c-C在预处理的时候,不删除注释信息,一般用于分析程序-S只进行预处理和编译,生成汇编代码gcc -S hello.c...原创 2020-03-08 11:22:40 · 1977 阅读 · 0 评论 -
Make命令与Makefile
Make命令使用Make命令只会在必要时重新编译所有受改动影响的源文件。而不会因为只改动了一个文件而重新编译整个项目。Make命令不仅仅用于编译程序,无论何时,当需要通过多个输入文件来生成输出文件时,你都可以利用它来完成任务,它的其他用法还包括文档处理。make命令选项和参数:-k 让make命令在发现错误时仍然继续执行下去,而不是在检测到第一个错误时就停止。-n 让make命令输...原创 2020-03-07 12:30:44 · 187 阅读 · 0 评论 -
Linux 默认函数栈大小查看与设置
CentOS系统下可以使用ulimit -s 查看当前函数栈大小:使用ulimit -s sum 可以将函数栈大小设置为 sum KB 大小:可用如下代码验证函数栈大小:#include<iostream>using namespace std;//int num[1024*256*20];int main(){ char num[1024*1024*20];...原创 2019-12-29 23:08:08 · 1902 阅读 · 0 评论