分配的内存空间有两种,
一种叫物理地址空间,一种是线性地址空间(虚拟的内存空间)
在分配内存的时候(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 是不一样的