进程的内存结构
Text段 程序本身 PC值 寄存器的值 … 堆栈段 方法参数 返回地址 局部变量 … 数据段 全局变量 … 注:UNIX环境中“数据段”专指用来放已初始化的全局变量的内存空间,另有一个bss段用来放未初始化的全局变量。 堆(Heap, 可选) 运行期间动态分配的内存 UNIX环境下可以用size命令查看一个可执行程序的text段,数据段和bss段的大小: $size hello_world.o 引用 text data bss … 2573 292 8 …
Text段 程序本身 PC值 寄存器的值 … 堆栈段 方法参数 返回地址 局部变量 … 数据段 全局变量 … 注:UNIX环境中“数据段”专指用来放已初始化的全局变量的内存空间,另有一个bss段用来放未初始化的全局变量。 堆(Heap, 可选) 运行期间动态分配的内存 UNIX环境下可以用size命令查看一个可执行程序的text段,数据段和bss段的大小: $size hello_world.o 引用 text data bss … 2573 292 8 …
中断、陷阱都算异常(exception)。CSAPP把异常分为四类: 1. 中断(interrupt) 2. 陷阱(trap),比如系统调用 3. 故障(fault),比如虚拟内存缺页时,会发生page fault, 然后对应的缺页处理程序就会从磁盘中取出页面 4. 终止(abort), 不可恢复的致命错误,比如DRAM出现位损坏。abort会导致应用程序被中止。 系统启动时,操作系统会分配和初始化“异常表”,维护异常类型和异常处理程序的对应关系。 异常也是程序从用户态进入内核态的唯一手段。
按不同的上下文,虚拟存储有不同的指代: 1. 一种是指每个进程有自己的地址空间,这个空间从0开始编址,运行时才对应到真实的物理地址。 2. 另一种是指使用把磁盘视为内存,把内存数据交换到磁盘中。这时也可以把内存视为磁盘的缓存。
蠕虫故意让缓冲区溢出,覆盖函数执行后的ret地址,使它指向一段攻击代码的地址。 蠕虫的防御需要在编译器甚至CPU体系结构中做手脚。
一个多线程的进程 由于多个线程共享部分数据结构,所以在进程内创建新线程或者上下文切换比创建、切换进程要快得多
PCB=进程控制块
线程有两种实现方式: 1. 内核直接支持,称为内核线程 2. 用户态的程序自己实现,称为用户线程 ================================================================ 用户线程在用户态运行,所以创建、切换都比内核线程效率高 但是,内核不知道用户线程的存在,它只知道用户进程;当进程中的一个线程被阻塞时,会导致整个进程被阻塞。 内核线程就没有这个问题。 同理,由于一个进程中的多个用户线程在内核里只对应一个执行绪,所以这种机制无法利用多处理器的能力。 ============================================================================= 两种线程机制并不是互斥的。在有的系统中,可以把用户线程按1:1或m:n映射到内核线程上. 用户线程的典型例子是POSIX的Pthread, 而很多UNIX都支持内核线程。 Linux中没有线程。你可以通过clone()来创建一轻量的子进程,这个子进程并不会复制父进程的所有数据,而是通过一个指针指向父进程的数据结构,从而与父进程共享资源和地址空间。 clone()一般与pthread联合使用,即用phtread作为API,clone()作为实现。 ============================================================================= Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。 Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是由JVM的实现来确定的。Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核轻量级进程有一一对应的关系。
摘自Tanenbaum《操作系统设计与实现》 操作系统的两种基本职能: 1. 为程序员屏蔽机器语音、硬件细节的复杂性 2. 资源管理,比如进程调度
适配器:用于在CPU和低速外设之间进行速度匹配和同步,又可称作I/O接口。 1.控制外围设备 2.在速度上起到缓冲作用 3.提供状态信息 4.数据转换(串-并 e.g.)和修改 5.发出中断 在系统中的位置: