Month: February 2013

用户线程 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线程跟内核轻量级进程有一一对应的关系。

线程的结构

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

指令周期

指令周期(Instruction Cycle): 取出一条指令并执行的时间。一个指令周期由若干个 CPU周期组成(至少两个,一个用于取指,一个用于执行) CPU周期:  由若干个 时钟周期(Clock Cycle)组成 时钟频率(Clock Rate):  时钟周期的倒数 . 时钟频率就是 主频

指令集

指令集: 一台机器能够理解的所有指令的集合,如ADD, MOV等 各平台有自己的指令集。指令集的不同会影响系统软件的兼容性。 指令 = 操作码OP + 数据地址码A 操作码实际上也是用0,1编码的,因为机器语言只认0,1 汇编语言是机器语言的可读版,比如,它可能用ADD来代表001

外设适配器

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

什么是POSIX标准

POSIX = Portable Operating System Interface     POSIX定义了一系列最小的系统调用和库函数接口;所有号称兼容POSIX的UNIX/Linux版本都必须支持这些接口。     如果你的程序调用的系统接口都是POSIX定义的标准接口,那么它就可以在任意支持POSIX标准的*nix版本上编译后运行。

如何避免spinlock

如果Semaphore这样实现,就可能导致spinlock:     acquire(){ while(value <= 0) ; //no-op value–; } release(){ value++; } 当进程等待时,cpu会空转,也就是说进程会spin(自旋),导致CPU浪费。     所以应该改空转为阻塞,把cpu让给操作系统的scheduler. 恐龙书上介绍的实现为:     acquire(){ value–; if(value < 0){ add this process to list; block(); } } release(){ value++; if(value <= 0){ remove a process P from list wakeup(P); } }