欢迎各位兄弟 发布技术文章
这里的技术是共享的
线性地址就是虚拟地址
内核数据结构
任务结构
线性地址(就是虚拟地) 物理地址
本进程以为 4G(1G是内核使用),其余3G供本进程使用
不停的动态的增加的内存就是堆内存,是属于用户的
栈内存是属于系统的,是本地变量,比如函数内部的变量
全局的在 initiazed data 中存放
MMU memory Manggement Unit 内存管理单元 管理虚拟内存页面和真实的物理内存页面之间的对应关系
TLB是cpu缓存内 缓存虚拟内存页面和真实的物理内存页面之间的对应关系
进程上下文切换 Context Switch
环境
从内往外0环到3环
0环供系统使用
3环供用户使用
1,2环用不到 没作用
进程
进程号
内存空间
用户
父进程
CPU time (cpu上运行的时间)
rss resident size 常驻内存集 事实上位于物理内存当中的数据的大小 (不包括共享库) (物理内存当中的,而且不能被交换出去的) (交换就是内存不够用的时候,把内存交换到硬盘) (打开的文件可以交换,但是指令,变量等核心状态数据是不能够被交换的)
vsz virtual size 虚拟内存集 虚拟内存大小 (包括共享库)
常驻内存集 不包括swap交换
指令 以及变量等核心状态数据是不能被交换出去的,打开的文件是可以被交换出去的
时间 其实有两种:一种是真正的运行时间 (较短)
另一种是时钟走过的时间(较长,因为还包括切换进程的时间)(挂钟 挂表时长)
如果是两个cpu的话 执行指令可以在两个cpu,但是不能同时执行,因为指令是从上往下执行的
两个cpu可以运行一个进程,但不能同时运行一个进程,这是什么意思?可以,但是不能同时运行
并行编程模型 进程(process) 线程(thread) 一个进程可以分成几个线程
使用线程:一个进程打开三个文件,然后三个线程共用这三个文件(共享打开的文件),所以线程开销小,更节约内存
使用进程:三个进程打开这三个文件三次,那么浪费内存
多进程 单进程多线程
防止数据有问题, 线程要加锁
线程加锁
死锁:两个资源都加了锁,两个线程都等待对方先放手
进程的状态
进程及作业管理
Uninterruptible sleep 不可中断的睡眠 (I/O是不可中断的,必须等到文件全部加载进来,唤醒才起作用)
Interruptible sleep 可中断的睡眠 (数据库进程是可中断的,随时有用户来随时可以唤醒的,不是,外部I/O的调用来导致睡眠的)(不过本质上数据库进程有用户进来也算I/O,这里为了说明可中断的问题,不说它是I/O)
Zombie 僵尸进程 正常运行了,也结束了,但是占据的内存就是不释放 (物理内存共4G,但是占用了2G,就是告诉你内存没有空间可用了,这是内存泄漏的一种表现) 程序经常是僵死态(进程处于僵死状态),能够回收过来的就是正常的,否则,就是彻底成了僵尸进程
(一个进程死了,由它的父进程来回收子进程内存)
sleep 睡眠态
进程是有父子关系的
所有进程都是另一个进程的子进程
kernel
init: init是由内核生成的第一个进程 (其它的进程都由init来clone生成) init挂了,整个系统就挂了
clone 任何一个进程都是操作系统上init的子进程
[root@localhost ~]# export
[root@localhost ~]# echo $LANG
en
[root@localhost ~]#pstree