本文共 2338 字,大约阅读时间需要 7 分钟。
分配的内存空间有两种, 一种叫物理地址空间,一种是线性地址空间(虚拟的内存空间) 在分配内存的时候(1个G内存) 系统会分配一个内存空间给ls用,(在物理上分配从第几字节到第几字节用)物理地址空间,实实在在的哪到哪 对于ls命令来讲,自己并不知道在哪个物理空间运行,也不关心,因为在ls命令里,认为自己运行的空间是线性地址空间 (就认为自己拥有的地址就是从0开始往上涨)内存4个G(32位系统最多支持4个G内存 ,2^32) 系统分配内存(从1M到100M) 程序上再执行的时候并不知道自己对应的内存空间是哪到哪 认为拥有的空间是整个内存空间(从0开始) 所以有个映射关系
MMU硬件设备来负责把线性地址和物理地址做转换,需要专门的设备转换关系实际存放在缓存中的(TLB)翻译后备缓冲器 用户保存虚拟地址和物理地址映射关系的缓存区(这几个缓存区在cpu存放)
应用程序会占用一定的内存空间,但是系统真正分配的空间和实际希望拥有的空间又不一样 一个程序 要运行会向系统申请内存,比如1G,但是系统会给你分配,但是发现实际用不了那么多, 马上要使用的就100M,就分配给100M ,但是承诺将来会给1G
RSS 承诺分配内存 VSZ 虚拟内存(真正分配的内存) 面试的时候,自信(要善于表达自己,不要沉迷于技术)铿锵有力 **IPC进程之间的通讯 inter process communication (如果在一个进程通讯很简单,因为是在一块内存空间里的(signal 信号) 两个进程之间(因为进程都认为各自拥有独立的空间),那怎么通讯) 如果两个进程在同一电脑,就可以通过发信号通讯,或者也可以通过共享内存通讯(shrared memary) (这就是前面命名看到的shred,多个应用程序共享的空间) 一般情况下,每个进程都有自己独立的内存空间,也可以有一部分是共享,这样两个应用程序 访问数据,相互通讯,可以把数据放到共享空间里,可以从这个空间读取数据,这是第一种方式 ** 相当一个计数器,某一种资源,这个资源如果想访问的时候,只能被一个进程独占(semaphore) (类似银行占座排队,10个座位,20个人,10个人等待,1个人不占座位,等待的人补上) 如果在不同电脑,就用socket,简单的说(IP和端口,通过IP可以找到网络中的设备,到达电脑(区分哪个应用程序用端口区分)) 通讯机制,RPC,remote procedure call 远程过程调用 MQ 这两个机制底层实现都是依赖端口号的 通讯机制,RPC,remote procedure call 远程过程调用 可以理解为A机器上的脚本运行的时候,调用了B机器上的脚本,远程调用MQ机制 消息队列 有成熟的产品Kafka ,ActiveMQ(在工作中,或多或少会接触到消息队列的产品) 每个机器把自己任务程序发送到队列,123,任务,排队来处理消息,而不是自己之间相互通讯 把很多进程的消息发送到服务器上
最早叫协作式多任务 进程类型: 前台执行:就是要占用终端 资源 后台执行:不占用终端资源 特殊的进程,守护进程:daemon,通常是后台执行,和终端无关,不占用终端资源 下面都是后台执行的 守护进程,开机就运行,不需要用户登录,和终端无关 就绪态:已经准备好,就等CPU 睡眠态: 可中断:interruptable (就是可以唤醒,继续执行) 不可中断:uninterruptable(必须达到什么条件,才能醒) 停止态:stopped 在内存中暂停了,不能自动醒过来,等于冰冻住,除非手动启动 僵死态:zombie,占用内存空间(进程死了,还占用空间) 多线程 {}这个就是线程 大部分都在可中断的休眠 S:interruptable sleeping 可中断休眠 R 同一时间运行的基于cpu个数,也不会太多(cpu内核只有2,同一时间干活只能是2个) D:uninterruptable sleeping 不可中断的休眠 T:表示停止stopped(只可以手动:线程解冻) Z:一般看不到(程序死掉,占用空间)只有重启机器才会释放 +:表示前台进程 l:线程(process进程 thread 线程)进程里面必然有一个线程,也可有多个线程 {}括起来的就是线程 L:内存分页并带锁 N:低优先级进程 <:高优先级进程 s:session leader,会话(子进程)发起者 加密,加压,压缩,都是cpu密集型(tar命令,解压缩打包比较耗cpu) 如dd 命令往磁盘上写大文件就比较IO密集型 pstree显示进程树,树状结构,子进程父进程 默认如果有两个名称相同的 就显示N* -p建议加p ps:process state进程状态 基于快照的 snapshot ps只列出当前状态。(因为进程时刻在变化,所以只能显示当时的状态) **默认只显示当前一个用户开的进程, (但登录在这台电脑上的还有其他终端,而且除了这些执行的前台进程,还有其他的后台进程,还有很多和终端无关的) 只显示tty0的终端的进程,(还有一些彻底和终端无关的,后台服务开机就运行的) 这些都默认看不见,想看就得加选项 ** 每个数字代表一个进程pid编号 exe指向的就是那个进程名称(真正的程序路径) 红的说明瞬间没有 选项有三种风格(以前的是长格式 – 一种是 -字母 短格式) 因为历史原因(保留unix风格) 执行这个命令要注意风格 a 和-a 效果就不一样 UNIX:dash就是-的选项 BSD 没有dash GNU,two dashs 长格式的选项 ps-aux 和ps aux 是不一样的转载地址:http://rgzgn.baihongyu.com/