进程VS线程 Process/Thread
进程:
1. 进程是相对独立的
2. 包含多个线程
3. 包含独立的逻辑内存,逻辑内存只是寻址空间,也就是说不是分配一块内存。所谓的32bits和64bits也就是寻址的方式,32bits通常分配2^32=4GB内存
4. 文件/网络句柄,和内存不一样的,是所有进程共享的,也就是说可以打开同一个文件或者抢同一个端口
线程:
1.栈,当程序执行的时候会把参数和返回地址一层层放入这个栈里面去,然后我们每个函数的局部变量也会放进这个栈里面。每个函数的局部变量也会放进去
2.PC,放着当前或者下一条执行指令的地址,指令放在内存里面,每个线程都有一个PC的指针,指向代码所在的内存,我们计算机大部分都是存储程序形的,也就是程序和数据都是存储在同一片内存里面的,既有变量也有程序。缓冲区溢出
3. TLS thread local storage 存放线程独有的数据,进程有相对独立的内存,每个线程也有一个独立的内存,在TLS里面分配内存,存储变量。
线程是操作系统中运行的,进程相当于一个容器,把一部分相关的东西放在一起。
交互,进程间有很强的隔离,所以需要一些交互方案,比较常用的是TCP/IP,线程间的交互相对简单,只要分配同一片共享的内存;
开销,进程的开销相对较大需要分配很大一片内存,而线程开销很小只要分配一个栈一个PC.
1Byte=8bit 1KB=1024Byte 1MB=1024KB 1GB=1024MB 1TB=1024GB
4294967296 = 4 * 1024*1024*1024 = 2^32 =4GB
存储和寻址
层次机构:
硬盘->内存->缓存->寄存器 慢->快 便宜->贵
寻址空间:
就是每一个进程,每一个指针可以取到的范围和我们机器上装了多少内存是没有关系的和此时有多少个进程也是没有关系的,每个进程有自己的一个寻址空间。
寻址空间大小:
32bits = 2 ^32 = 4G, 现在很多机器已经是6/8/12G内存了,如果还是装了一个32bits操作系统,一个进程也只能访问到4G的内存空间
64Bits = 2^64 ~10 ^ 19Bytes
64bits JVM, jvm 是java的虚拟机,用64bits的JVM就可以寻址寻到64位的地址空间,也就可以用更大的内存。重新编译就可以切到64bits虚拟器
操作系统寻址p
指针p 找到逻辑内存,也就是物理内存的地址,这时候就有两种清空,如果物理内存可以找到,就直接把找到的值放到寄存器里面,但是如果在屋里内存里面找不到,操作系统机会去虚拟内存里面找,虚拟内存就是在硬盘上分配的一块区域,如果找到了,就把p所在的一页分页存到物理内存里面,然后再加载到寄存器里面。因为访问硬盘读取数据开销很大,所以通常情况下操作系统会把P所在的整片分页数据放到物理内存里,如果这个时候物理内存放不下了,操作系统会找到不常用的数据,然后清除掉,这个就叫做交换。
进程间通信
线程和线程通信很简单,我开一块地址,然后把地址告诉另一个线程,就可以访问了,当然也会有一些安全限制。进程和进程间通信就很困难了,因为每个进程都有一个完全独立的内存,内存多大跟物理内存没有关系,是和是32bits还是64bits操作系统有关系。
进程间通信方法:
1. 文件
2. Signal,两个进程间发信号,unix man kill/kill -l /kill -2/kill -9 中断是什么?
3.消息队列
4.管道/命名管道 cat xx.log | grep -e "ERROR" --color | wc
5. 共享内存,
6. 同步机制,如信号量
7. Socket (这个是最好的最常用的)可以作为不同机器间通信 也就是通过TCP协议
操作系统常见问题
1. 进程与线程的区别?
2. 简要说说寻址的过程?
3. 32位和64位操作系统区别是什么?
4. 说出你知道的进程间通信机制?
5. 简要说一下中断的概念和流程?