物理内存

进程之间的通信

南笙酒味 提交于 2019-12-16 00:07:03
进程通信 今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | grep 8080 学过 Linux 命名的估计都懂这条语句的含义,其中”|“是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。在这里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输入。如果两个进程要进行通信的话,就可以用这种管道来进行通信了,并且我们可以知道这条竖线是没有名字的,所以我们把这种通信方式称之为匿名管道。 并且这种通信方式是单向的,只能把第一个命令的输出作为第二个命令的输入,如果进程之间想要互相通信的话,那么需要创建两个管道。 居然有匿名管道,那也意味着有命名管道,下面我们来创建一个命名管道。 mkfifo test 这条命令创建了一个名字为 test 的命名管道。 接下来我们用一个进程向这个管道里面写数据,然后有另外一个进程把里面的数据读出来。 echo "this is a pipe" > test // 写数据 这个时候管道的内容没有被读出的话,那么这个命令就会一直停在这里,只有当另外一个进程把 test 里面的内容读出来的时候这条命令才会结束。接下来我们用另外一个进程来读取 cat < test // 读数据 我们可以看到

进程之间究竟有哪些通信方式?如何通信?

旧街凉风 提交于 2019-12-14 01:49:35
进程之间究竟有哪些通信方式?如何通信? 1、管道 我们来看一条 Linux 的语句 1 | netstat - tulnp | grep 8080 学过 Linux 命名的估计都懂这条语句的含义,其中”|“是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。在这里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输入。如果两个进程要进行通信的话,就可以用这种管道来进行通信了,并且我们可以知道这条竖线是没有名字的,所以我们把这种通信方式称之为匿名管道。 并且这种通信方式是单向的,只能把第一个命令的输出作为第二个命令的输入,如果进程之间想要互相通信的话,那么需要创建两个管道。 居然有匿名管道,那也意味着有命名管道,下面我们来创建一个命名管道。 1 | mkfifo test 2 | 这条命令创建了一个名字为 test 的命名管道。 接下来我们用一个进程向这个管道里面写数据,然后有另外一个进程把里面的数据读出来。 1 | echo "this is a pipe" > test / / 写数据 这个时候管道的内容没有被读出的话,那么这个命令就会一直停在这里,只有当另外一个进程把 test 里面的内容读出来的时候这条命令才会结束。接下来我们用另外一个进程来读取 1 | cat < test / / 读数据 我们可以看到,test

【Linux】malloc 与共享内存原理区别

戏子无情 提交于 2019-12-14 01:15:06
本文主要分析内存以及I/O相关的系统调用和库函数的实现原理,根据原理给出在使用过程中需要注意的问题和优化的侧重点,本文涉及到的系统调用包括readahead,pread/pwrite,read/write,mmap,readv/writev,sendfile,fsync/fdatasync/msync,shmget,malloc。 本文先简单介绍应用程序对内存的使用以及I/O系统对内存的使用的基本原理,这对理解上述系统调用和库函数的实现有很大帮助。 1 内存管理基础 Linux对物理内存的管理是以页为单位的,通常页大小为4KB,Linux在初始化时为所有物理内存也分配了管理数据结构,管理所有物理页面。 每一个应用程序有独立的地址空间,当然这个地址是虚拟的,通过应用程序的页表可以把虚拟地址转化为实际的物理地址进行操作,虽然系统可以实现从虚拟地址到物理地址的转换,但并非应用程序的每一块虚拟内存都对应一块物理内存。Linux使用一种按需分配的策略为应用程序分配物理内存,这种按需分配是使用缺页异常实现的。比如一个应用程序动态分配了10MB的内存,这些内存在分配时只是在应用程序的虚拟内存区域管理结构中表示这一区间的地址已经被占用,内核此时并没有为之分配物理内存,而是在应用程序使用(读写)该内存区时,发现该内存地址对应得物理内存并不存在,此时产生缺页异常

Linux

a 夏天 提交于 2019-12-12 20:45:52
Linux操作命令 一、系统监控 1、free命令 free 命令能够显示系统中物理上的空闲和已用内存,还有交换内存,同时,也能显示被内核使用的缓冲和缓存 语法:free [param] 1 param可以为: -b:以Byte为单位显示内存使用情况; -k:以KB为单位显示内存使用情况; -m:以MB为单位显示内存使用情况; -o:不显示缓冲区调节列; -s<间隔秒数>:持续观察内存使用状况; -t:显示内存总和列; -V:显示版本信息。 在这里插入图片描述 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) used:表示系统分配给缓存使用的数量(这里的缓存包括buffer和cache) free:表示未分配的物理内存总数 shared:表示共享内存 buffers:系统分配但未被使用的buffers 数量。 cached:系统分配但未被使用的cache 数量。 -/+ buffers/cache:表示物理内存的缓存统计 (-buffers/cache) 内存数: (指的第一部分Mem行中的used – buffers – cached) (+buffers/cache) 内存数: (指的第一部分Mem行中的free + buffers + cached) (-buffers/cache)表示真正使用的内存数, (+buffers

Linux top命令的用法详细详解

孤者浪人 提交于 2019-12-12 19:19:30
Linux top命令的用法详细详解 首先介绍top中一些字段的含义: VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量 RES:resident memory usage 常驻内存 1、进程当前使用的内存大小,但不包括swap out 2、包含其他进程的共享 3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反 4、关于库占用内存的情况,它只统计加载的库文件所占内存大小 SHR:shared memory 共享内存 1、除了自身进程的共享内存,也包括其他进程的共享内存 2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小 3、计算某个进程所占的物理内存大小公式:RES – SHR 4、swap out后,它将会降下来 DATA 1、数据占用的内存。如果top没有显示,按f键可以显示出来。 2、真正的该程序要求的数据空间,是真正在运行中要使用的。 top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下: s – 改变画面更新频率 l – 关闭或开启第一部分第一行 top 信息的表示 t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus

linux系统下安装redis

狂风中的少年 提交于 2019-12-12 18:20:34
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 下载最新版本的 redis-2.6.14.tar.gz 1:下载地址:https://code.google.com/p/redis/downloads/list linux系统环境是:centos6.4 2、解压文件 tar -zxvf redis-2.6.14.tar.gz /解压路径 3、进入目录 cd /usr/local/redis/redis-2.6.14 4、编译 make 5、安装 make install 6、设置配置文件路径 mkdir -p /etc/redis cp redis.conf /etc/redis 7、修改配置文件 vim /etc/redis/redis.conf 仅修改: daemonize yes 8、启动 /usr/local/bin/redis-server /etc/redis/redis.conf 9、查看启动 ps -ef | grep redis 10、使用客户端 redis-cli >set name david OK >get name "david" 11: 关闭redis服务 redis-cli shutdown redis服务关闭后,缓存数据会自动dump到硬盘上,硬盘地址为redis.conf中的配置项dbfilename dump.rdb所设定

暴力搜索内存进程对象反隐藏进程

♀尐吖头ヾ 提交于 2019-12-12 17:52:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我们前面说过几种隐藏进程的方法: 遍历进程活动链表(ActiveProcessLinks) 遍历PspCidTable表检测隐藏进程 但还是不能防止别人通过各种方法来隐藏进程,所以下面来介绍一种通过暴力搜索内存枚举进程的方法。 一个进程要运行,必然会加载到内存中。基于这个事实,隐藏进程要在目标机运行,在内存中一定会存在对应的EPROCESS结构体。基于系统内存搜索的进程监测技术利用EPROCESS结构体特征找到EPROCESS地址指针进而输出进程信息,可以有效地对进程进行全面的监测。 那我们应该搜索进程的什么结构?进程的PEB(PEB(Process Environment Block)——进程环境块)。主要原因是PEB地址的高4位是相同的。 image 可以看到除了system,其他进程的PEB都是0x7ffdxxxx.为什么? 找到wrk源码,MiCreatePebOrTeb这个函数负责分配peb和teb的地址。 贴出关键代码: //判断是不是分配PEB地址,通过与PEB的大小比较 if (Size == sizeof(PEB) #if defined(_WIN64) || (Size == sizeof(PEB32)) #endif ) { PVOID HighestVadAddress; LARGE

计算机操作系统 - 内存管理

爷,独闯天下 提交于 2019-12-12 01:09:31
• Read 摘自 github CS-Notes - 计算机操作系统 一、虚拟内存 将物理内存抽象为地址空间,每个进程都有各自的地址空间,地址空间被分割成多个块, 每一块称为一页 。这些页被 映射到物理内存 ,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。目的是让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。 1、分页系统地址映射 内存管理单元负责地址空间和物理内存的转换,其中页表存储着 页(程序地址空间) 和 页框(物理内存空间) 的映射表。一个虚拟地址分为 页面号 (16位地址是前4位)和 存储偏移量 。页面号的十进制数对应页表的索引,一个页表项最后一位表示是否存在于内存,前几位即为页框的前几位。 2、页面置换算法 在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而 将该页调入内存 中。此时如果内存已无空闲空间,系统必须从内存中 调出一个页面到磁盘对换区 中来腾出空间。 页面置换算法的主要目的就是 使页面置换频率最低 。 大专栏 计算机操作系统 - 内存管理 > 最佳 (OPT):所选择的被换出的页面将是最长时间内不再被访问(理论上不知道将来使用页面的情况) 最近最久未使用( LRU):通过维护链表保证表尾的页面是最近最久未访问的,代价很高 最近未使用 :每个页面有 R 和 M 两个状态位 先进先出

第 17 章 计算机体系结构基础

旧巷老猫 提交于 2019-12-11 13:45:57
一、参考网址   1、 linux C编程一站式学习 二、笔记   1、一级cache与二级cache的区别     一级缓存是用VA寻址的,二级缓存是用PA寻址的,这是它们的区别   2、VA(虚拟地址)和PA(物理地址)的区别     CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将VA映射成PA(Physical Address)   3、MMU     1)MMU将VA映射到PA是以页(Page)为单位的,32位处理器的页尺寸通常是4KB     2)物理内存中的页称为物理页面或者页帧(Page Frame)     3)虚拟内存的哪个页面映射到物理内存的哪个页帧是通过页表(Page Table)来描述的,页表保存在物理内存中,MMU会查找页表来确定一个VA应该映射到什么PA     4) MMU除了做地址转换之外,还提供内存保护机制      5|)x86平台的虚拟地址空间是0x0000 0000~0xffff ffff,大致上前3GB(0x0000 0000~0xbfff ffff)是用户空间,后1GB(0xc000 0000~0xffff ffff)是内核空间 来源: https://www.cnblogs.com

OS内存管理相关实现(原题: Linux中的内存管理)

风格不统一 提交于 2019-12-10 15:13:39
前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技术所存在的哪些问题。弄清楚了这些,我们才能比较清晰的把握某一项技术。有些资料在介绍某个概念的时候直接就介绍这个概念的意义,原理,而对其发展过程和背后的原理丝毫不提,仿佛这个技术从天上掉下来的一样。介于此,还是以内存管理的发展历程来讲述今天的主题。 首先,我必须要阐述一下这篇文章的主题是Linux内存管理中的分段和分页技术。 让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的。换句话说,就是程序在运行的过程中访问的都是物理地址。如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存就不会出现问题,我们也就不需要考虑内存管理这个麻烦事了,反正就你一个程序,就这么点内存,吃不吃得饱那是你的事情了。然而现在的系统都是支持多任务,多进程的,这样CPU以及其他硬件的利用率会更高,这个时候我们就要考虑到将系统内有限的物理内存如何及时有效的分配给多个程序了