Computer Theory

进程的内存结构

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. 另一种是指使用把磁盘视为内存,把内存数据交换到磁盘中。这时也可以把内存视为磁盘的缓存。

线程的结构

一个多线程的进程 由于多个线程共享部分数据结构,所以在进程内创建新线程或者上下文切换比创建、切换进程要快得多

用户线程 V.S. 内核线程

线程有两种实现方式:     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线程跟内核轻量级进程有一一对应的关系。

外设适配器

适配器:用于在CPU和低速外设之间进行速度匹配和同步,又可称作I/O接口。   1.控制外围设备   2.在速度上起到缓冲作用   3.提供状态信息   4.数据转换(串-并 e.g.)和修改   5.发出中断 在系统中的位置: