LINUX
文章平均质量分 87
晚风_清扬
路漫漫
展开
-
读写锁实现读写者问题
注意:LINUX 读写锁是写者优先锁/*producer and constmer*/#include#include#include#includepthread_rwlock_t rwlock;int good = 0;void *writer(void *argv){ while(1) { pthread_rwlock_wrlock(&rwlock); good原创 2017-10-18 15:00:15 · 484 阅读 · 0 评论 -
LINUX内核研究----IO复用函数epoll内核源代码深度剖析
select和poll的效率瓶颈有两个 1、每次调用这些函数的时候都需要将监控的fd和需要监控的事件从用户空间拷贝到内核空间,非常影响效率。而epoll就是自己保存用户空间拷入的fd和需要监控的事件,只需在调用epoll_ctl的时候就把所有的fd和需要监控的事件只进行一次从用户空间到内核空间的拷贝。 2、select和poll在内核中都是采用线性轮询的方式检查整个数组(poll是链表...原创 2018-02-25 21:45:42 · 1599 阅读 · 0 评论 -
LINUX内核研究----C/C++内存管理glibc运行库底层ptmalloc内存管理源码分析总结
基础知识:32位进程的虚拟地址空间64位进程的虚拟地址空间应用程序的堆栈从最高地址处开始向下生长,.bss段与.Stack之间的空间是空闲的,空闲空间被分成两部分,一部分为heap,一部分为mmap映射区域。Heap和mmap区域都可以供用户自由使用,但是它在刚开始的时候并没有映射到内存空间内,是不可访问的。在向内核请求分配该空间之前,对这个空间的访问会导致segmentationfault(段错...原创 2018-02-24 20:43:46 · 800 阅读 · 0 评论 -
LINUX内核研究----内核角度看fork(),clone(),vfork() 的异同
Linux系统将进程的创建与目标进程的执行分成两步第一步是从已经存在的进程那里像细胞分裂一样复制出一个子进程。子进程有自己的task_struct结构和系统的堆栈空间,但是和父进程共享其他所有资源。比如说文件描述符,文件的读写指针都停留在一个地方,父子共用。LINUX为复制提供三个系统调用:fork():父进程的所有的资源通过PCB复制给子进程。那么fork底层究竟做了哪些复制?一个函数返回两次是...原创 2018-02-24 19:49:52 · 1545 阅读 · 0 评论 -
LINUX内核研究----系统调用过程分析
系统调用的定义: 因为计算机中的各种资源都是由操作系统统一管理,凡是和系统资源相关的操作都必须通过操作系统来完成,例如IO操作、分配内存、文件操作等。而用户程序是没有权限直接进行这些操作的,所以必须通过某种方式来向操作系统提出服务请求。因此操作系统必须提供一套某种方式的接口,让用户通过这些接口使用操作系统提供的各项功能或者访问系统资源,操作系统给应用程序的接口就是系统调用。系统调用实现的...原创 2017-10-29 22:23:59 · 472 阅读 · 0 评论 -
LINUX内核研究----IO复用函数poll内核源代码深度剖析
原创 2018-02-25 22:02:42 · 290 阅读 · 0 评论 -
LINUX内核研究----深入程序加载执行过程
程序的装载执行过程从操作系统的角度来看一个程序最关键的特征是拥有独立的虚拟地址空间。进程的建立:程序启动时,操作系统会新建一个进程来执行该程序,主要分为三个步骤:1、创建一个独立的虚拟地址空间,这一步的映射关系是从虚拟空间到物理内存的映射关系。创建一个虚拟地址空间实际上并不是创建空间,而是内核中创建地址映射需要的数据结构。linux内核对虚拟地址空间进行抽象描述的数据结构是在用于虚存管理的mm_s...原创 2018-02-16 00:19:39 · 2118 阅读 · 0 评论 -
linux服务器出现大量TIME_WAIT的解决方法
转载自:http://www.2cto.com/os/201411/355811.html近期服务器出现大量time_wait的TCP连接造成服务器连接数过多而最终导致tomcat假死状态。连接服务器查看连接数的时候提示如下。[html] view plain copy[root@test apache-tomcat-7.0.53]# netstat -n | awk '/^tcp/ {++S[$...转载 2018-04-14 22:17:00 · 995 阅读 · 0 评论 -
GDB查看内存、函数栈、寄存器
gdb查看指定地址的内存地址的值:examine 简写 x-----使用$gdb> help x 来查看使用方式 $x/ (n,f,u为可选参数)n: 需要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义f:显示格式 x(hex) 按十六进制格式显示变量。 d(decimal) 按...转载 2018-04-14 22:45:39 · 4672 阅读 · 0 评论 -
Linux下如何检测内存泄漏
Linux检测程序内存泄漏1.安装valgrind: 这是一款开源的程序内存检测工具,mtrace为内存分配函数(malloc, realloc, memalign,free)安装hook函数。这些hook函数记录内存的申请和释放的trace信息。Valgrind详解:Valgrind包括以下一些工具:1.Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够给发现...原创 2018-03-28 16:16:07 · 6390 阅读 · 0 评论 -
LINUX----惊群效应
什么是惊群效应?惊群现象(thundering herd)就是当多个进程和线程在同时阻塞地等待同一个事件,如果这个事件发生,会唤醒所有的进程,但是最终只可能有一个进程/线程对该事件进行处理,其他进程/线程会在失败后重新休眠,这种性能浪费就是惊群。惊群效应的危害?(1)、系统对用户进程/线程频繁地做无效的调度,上下文切换系统性能大打折扣。(2)、为了确保只有一个线程得到资源,用户必须对资源操作进行加...转载 2018-05-01 21:56:37 · 552 阅读 · 0 评论 -
对同步和互斥的理解
相交进程之间的关系主要有两种,同步与互斥。互斥:是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行这个程序片段,只能等到该进程运行完这个程序片段后才可以运行。同步:是指散布在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。总结: 互斥:是指某一资源同时只允许一个访问者对其进行访问...原创 2018-05-02 17:00:51 · 2956 阅读 · 3 评论 -
进程同步之条件变量
条件变量 #include<pthread.h>特点:读写锁和互斥锁不是任何时候都能阻塞线程,只能保证一个线程访问共享资源。概念:提供了阻塞线程的一种机制,相当于把不符合条件的线程阻塞在一定的代码区域。尤其记住的是条件变量不能实现线程同步,它不是不是锁,但是可以在线程不满足条件的时候阻塞线程,不让线程继续运行。满足条件时通知线程继续运行。它的最主要作用是阻塞线程,因此还必须使用条件变...原创 2017-10-08 17:22:02 · 1270 阅读 · 1 评论 -
互斥锁、读写锁、自旋锁、条件变量的特点总结
读写锁特点: 1)多个读者可以同时进行读2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者) 互斥锁特点:一次只能一个线程拥有互斥锁,其他线程只有等待互斥锁是在抢锁失败的情况下主动放弃CPU进入睡眠状态直到锁的状态改变时再唤醒,而操作系统负责线程调度,为了实现锁的状态发生改变时唤醒阻塞的线程或者进程,需要把锁交给操作系...原创 2018-05-02 18:17:42 · 3470 阅读 · 0 评论 -
LINUX内核研究----内核角度看什么是进程
Linux下的进程拥有以下四个要素:进程的四要素: 一、进程有需要执行的代码,也就是CPU指令和被操作的数据。代码相当于进程的剧本,可以和其他进程共用,不一定是该进程所私有。 二、有进程专用的系统堆栈空间。 三、在内核中有描述进程信息和进程占用各项资源的信息的结构体task_struct,用于对该进程进行管理。也就是PCB进程控制块,有这个数据结构,进程才能成为一个接受内核调度的...原创 2018-02-15 16:11:02 · 593 阅读 · 0 评论 -
LINUX内核研究----地址映射的全过程
内核空间的地址映射:物理地址和虚拟地址之间相差0XC0000000虚拟地址 –0XC0000000 ==物理地址物理地址 +0XC0000000 ==虚拟地址并且内核的页面不交换,不进行换出到磁盘中。因为内核要随时准备服务。Inter X86 32 cpu linux kernel实模式:CPU一上电强制进去实模式,只能访问2^20==1M的内存且没有程序间隔离,没有内存的读写保护,内存的越界保...原创 2018-02-15 16:06:34 · 839 阅读 · 0 评论 -
两个信号量实现生产者消费者模型
/*producer and constmer*/#include#include#include#include#includesem_t pro_sem;sem_t cus_sem;int good = 0;void *customer(void *argv){ while(1) { sem_wait(&cus_sem); good--; printf("cu原创 2017-10-18 14:18:25 · 1662 阅读 · 0 评论 -
互斥量和条件变量实现生产者消费者模型
/*producer and constmer*/#include#include#include#includepthread_mutex_t mutex;pthread_cond_t cond;//int good = 0;void *customer(void *argv)//消费者代码{ while(1) { pthread_mutex_lock(&mutex);原创 2017-10-18 14:10:29 · 479 阅读 · 0 评论 -
线程同步之信号量
信号量头文件 semaphore.h信号量类型:sem_t 加强版的互斥锁:1、互斥锁的初始值只能是1,但是信号量可以人为的规定有几个互斥量,规定共享资源的数量。2、互斥锁规定只能一个线程进行加锁和解锁的操作,但是信号量可以让这个线程加锁,另一个线程解锁。3、 互斥量用于线程的互斥,信号线用于线程的同步。 这是互斥量和信号量的根本区别原创 2017-10-08 19:01:40 · 384 阅读 · 0 评论 -
线程同步之互斥锁(互斥量)
互斥锁:#include1、互斥锁的数据类型:pthread_mutex_t2、互斥锁的特点:同步线程,控制数据的访问是同步的3、互斥锁的缺点:效率低,操作之前要加锁和解锁操作4、互斥锁的使用步骤: 创建一把锁 :pthread_mutex_t mrtux; 初始化这把锁:pthread_mutex_init(&mutex,原创 2017-10-08 14:38:39 · 294 阅读 · 0 评论 -
线程同步之死锁的原因和解决方法
造成死锁的原因:1、 自己锁自己,线程获得锁A,没有给自己解锁又去拿锁A,一直阻塞造成死锁。2、 两个共享数据,两把锁。线程一获得锁 A阻塞在B锁上,但是线程二获得B锁阻塞在A锁上,两者造成死锁解决方法:1让线程按顺序访问共享资源。2在访问另外一个共享资源之前先解锁已经拥有的锁3在访问之前使用trylock函数尝试加锁,如果失败就直接返回原创 2017-10-07 15:33:08 · 1068 阅读 · 0 评论 -
进程间通信—信号
信号概念:信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。进程在接收到这个信号以后,可以设置响应的处理动作:忽略或者调用函数进行处理。在linux下命令行$kill -l可以查看linux下的所有信号:一共64个信号,从1开始编号,其中也存在0号信号,但是0号信号是用来测试某原创 2017-10-07 15:10:07 · 339 阅读 · 0 评论 -
进程间的通信—管道pipe和fifo
进程间的通信管道的学习笔记原创 2017-09-24 22:26:48 · 803 阅读 · 0 评论 -
main函数前后要做的事情
操作系统装载程序之后,首先运行的代码并不是main函数的第一行代码,而是一些特别的代码这些代码负责准备初始化Mian函数执行需要的环境,这些完成后才负责调用mian函数开始执行main函数代码。运行Mian函数之前的代码的函数称之为入口函数,入口函数往往是运行库的一部分而运行库跟平台相关,如linux下的C语言运行库是glibc,glibc下的入口函数是_star。而windows下是Msvc,M...原创 2018-02-15 21:08:44 · 681 阅读 · 0 评论 -
虚拟内存小记
虚拟地址空间:虚拟内存管理方案给每个用户进程分配的一个虚拟的地址空间,由PCB中的虚拟内存管理数据结构mm_struct中的VM_area_数据结构描述。虚拟内存:是一种操作系统的内存管理方案,由MMU硬件单元和操作系统软件单元合作完成。简单的过程描述:CPU发出虚拟地址------------》》》MMU硬件进行地址映射过程的计算-------------》》》》软件是内核提供页目录地址,页表地...原创 2018-02-15 15:55:58 · 225 阅读 · 0 评论 -
进程和线程联系和区别
进程和线程的区别和联系,一个经典的概念问题。作为一个程序员都应该好好的回答这个问题,提高自己对程序的抽象认识。简单的概念区分:进程:1、进程是磁盘上的可执行文件加载到内存中运行时候的状态,是一种动态的概念,进程是应用程序的运行实例。2、进程是资源分配的基本单位,以进程为单位向操作系统请求资源:虚拟地址空间、打开文件。线程:1、线程是相对于进程来说更小的一个概念:线程只是进程里的一条执行序列,基本上...原创 2017-10-06 21:41:26 · 337 阅读 · 0 评论 -
多进程和多线程的区别及适用场景
原文地址:http://blog.csdn.net/wujiafei_njgcxy/article/details/77098977对比维度多进程多线程总结数据共享、同步数据共享复杂,需要用IPC;数据是分开的,同步简单因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂各有优势内存、CPU占用内存多,切换复杂,CPU利用率低占用内存少,切换简单,CPU利用率高线程占优创建销毁、切换创建...转载 2018-03-11 13:02:54 · 15924 阅读 · 1 评论 -
进程间通信
进程间的通讯方式有:管道、消息队列、共享内存、信号量、信号、本地套接字管道:管道是一种半双工的通信方式,数据只能单向流动;管道在内存中存取数据,磁盘上只保留管道的信息,故管道的大小恒为0。管道用于连接读进程和写进程,以字符流的形式在进程间传递信息。管道的大小:一个页的大小4K,最大容量是64K(65535字节)管道的实现管道是一个固定大小的缓冲区,缓冲区的大小是1页即4K,管道的实现是使用文件系统...原创 2018-03-11 13:50:02 · 246 阅读 · 0 评论 -
C/C++代码:递归遍历当前文件夹下的文件和子文件夹
#include <iostream>#include <io.h>#include <string>using namespace std;void listFiles(const char * dir,int tab);int main(){ string dir; cout << "Enter a directory (e...原创 2018-09-01 14:06:33 · 5530 阅读 · 0 评论