进程

进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。
程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行
-
进程之间是相对独立的。
-
进程包含线程,相当于一个容器。
-
进程中的内存指的是逻辑内存(寻址空间),操作系统分为32位和64位,区别就在于这个逻辑内存(32位逻辑内存最大为4G)。所以32位系统就算有超过4G的物理内存也无法使用。在程序中看到的逻辑内存只是一个寻址空间,与物理内存没有关系。Example: 不然指针的值改一下,指到另外程序的内存中处理敏感数据,显然不可能的事。
-
文件/网络句柄(handle)是进程共有的,多个进程可以打开同一个文件,可以抢同一个网络端口。
线程

线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。
线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。
- 栈习惯叫为调用堆栈,但堆和栈是两种数据结构,这里的堆没有实际意义。函数调用的地址会放入栈中,才能多层调用时可以断定调用哪个函数。函数中的局部变量也放在栈中。
- PC(program conter:程序计数器)存放指令(代码)的地址指向内存(指令存放处,进程的逻辑内存)。计算机大部分是存储程序型(数据和程序存储在同一片内存中),漏洞:缓冲区溢出,比如分配一个一定容量的存数据的地方(缓冲区),但是黑客输入了大量代码,超出了缓冲区,占用了存储程序的位置,于是就可以植入黑客代码。解决办法:防止数据超过缓冲区。
- TLS(thread local Storage :线程局部存储),进程有自己独立的内存,线程也有,就是TLS,线程独有的数据。
- 进程是资源分配的最小单位,线程是程序执行的最小单位。
- 真正干活的其实是线程,进程只是一个容器。
- 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵(开销大)。
- 线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
- 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的交互需要以通信的方式进行。不过如何处理好同步与互斥是编写多线程程序的难点。
- 多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
存储和寻址


- 寻址空间多大跟物理内存没有关系,跟系统位数有关系。

-
模拟寻址
-
因为逻辑内存一般比物理内存大,所以如果对应数据存在物理内存则直接取,找不到会去虚拟内存找(操作系统会在硬盘上开辟一片空间当虚拟内存)。
-
但不是直接在虚拟内存一个个的比对去找,而是有一个分页的概念。会把这个分页放进物理内存,其中就包含所需要的数据。
-
进行交换的话就会有一个问题:物理内存放的下吗?放的下就直接放,完事。放不下的话系统会通过算法把很久没用到或没有用的数据跟虚拟内存交换。这个过程就叫做分页或者交痕。
-
接下来就好办了,从物理内存取出数据放入寄存器就好了。
通常情况下,数据都放在物理内存,使用很方便。但是物理内存占用过多就会发生频繁的分页,硬盘又是很慢的,所以性能就会变得很慢。