内核就是常驻内存的部分。
进程
进程是一个正在执行中程序的一个具体的实例。它消耗CPU资源且占用内存。进程一般都有名字,同时还有一个编号(PID)
程序是一堆代码和数据,总是运行在某个进程的上下文中。
上下文是由程序正确运行所需的状态组成的。这个状态包括放在内存中的程序代码和数据,他的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
进程这一抽象能够为每个进程提供自己私有的虚拟地址空间(虚拟内存产生,虚拟内存方便内存管理,内存保护),可以免受其他进程的错误读写。
进程可以共享物理内存的同一个区域,避免物理内存的浪费,对共享对象的读写对其他进程是可见的,对私有对象的写操作对其他进程是不可见的,从而形成了私有的虚拟地址空间概念。
虚拟内存是存储在磁盘上面的,由内存映射可以从磁盘上选取所需的页表,页表是物理内存的常驻部分。
每个逻辑控制流都是一个进程,由内核来调度和维护。因为进程有独立的虚拟地址空间,要想和其他流通性,控制流必须使用某种显示的进程间通信机制。(IPC)
I/O多路复用
应用程序在一个进程的上下文中显示的调度他们自己的逻辑流。数据到达文件描述符后,主程序显示地从一个状态转换到零一个状态,因为程序是一个单独的进程,所以所有的流都共享同一个地址空间。
线程
线程是运行在一个单一进程上下文中的逻辑流,有内核进行调度,可以把线程看成是其他两种方式的混合体,像进程一样有内核进行调度,而像I/O多路复用流一样共享同一个虚拟地址空间。
全局变量
定义在函数之外的变量,虚拟内存的读写区域只包含每个全局变量的一个实例,任何线程都可以引用。
本地自动变量
定义在函数内部但是没有static属性的变量,每个线程的栈都包含他自己所有本地自动变量的实例,会在栈内分别分配自己实例。
本地静态变量
定义在函数内部有static属性的变量,虚拟内存的读写区域只包含在程序中声明的每个静态变量的一个实例,所有线程共享这个实例。
信号量
P(S)操作:如果s非零,这条指令会执行对s的减一操作然后继续执行后面的指令,如果此时s为零,那么这条指令会阻塞在这里,一直检测s的状态,直到得知s不为零以后,这条指令才能执行完毕减一操作。
(我就是来减1的,你没有1让我减我就不走,反正我不能是负数)
V(s)操作:这条指令直接将s进行加一操作,目的是启动P操作让他正常执行;
并发
一个逻辑流的执行在时间上与另一流重叠,这里的重叠是指一个流在另一个流的开始之后和结束之前,并不是同时执行两个流的部分,只是在流的部分之间暂时挂起来执行另一个流,这种现象叫做并发。
过程
过程是软件中一种很重要的抽象。他提供了一种封装代码的方式,简单地说就是一个函数。