OS-104
- TR多个T(而非PSS,T指任务)SS实时记录寄存器 一个程序一个TSS(任务寄存器) --EAX EBX,,, 之间实时存储--上下文切换关乎硬件的解释。pc是指令的位置而非语句的位置。
- 进程之间的联系,联系的意义是什么。作用是如何发生的(相交(协作),,)?
- 没关系(无感知,os管理地很好,资源由os和谐分配):资源抢占。
- 临界区(共享资源--第三方,或者读写或者只读只写)。对资源访问时是要保护的排他的,我在写的时候你不能。
- 同步(直接作用,时序--相互等待相互交换信息--共享对方的私有资源而引起的制约,直观的例子)
- 互斥(间接作用,比同步发生更多,没有其他进程自己仍能工作,但是同步不可以。竞争公有资源(公有数据,一般是内存的数据区)--并发进程速度受公有资源制约,例子--进程的顺序和执行的次数、cpu的调度--p3执行结果可能每次都不一样,需要对进程进行控制使得p3执行结果可预测,调度可是参与和设置、算法逻辑、时间片等等设置)。
- 本质区别:同步离了任何进程都无法完成,互斥离了可以运行只是影响结果。
- 通信。(进程间消息的频率和长短:低级(简单,固定的值和状态定义好,但是编程要注意细节--进程自己需要实现通信细节,自己去控制逻辑和频率等等--而复杂)和
- 高级(系统实现要求高--机制由os提供,上层只要调用os提供的方法--os需要提供消息传递机制(三类:
- (os提供临界区的定义--共享存储区(两种:基于数据结构,数据结构内容是定义死的,效率低于共享内存区,
- 例子生产者(写进程)和消费者(读数据的进程)(共享存储),个数不唯一,若干写若干读进程,两个指针in 下一个空位out第一个非空位)),
- 管道,消息缓冲--根据需要的消息传递方式来选择os提供的三种方式的一种)--即可编程简单,调用机制就可以))
item reader;
while(1){
while(out!=null&&out<=size){ reader=buffer[out]; out=out+1;}} 和答案不一样
in==out out=(out+1 )%buffersize
- 直接通信和间接通信。消息缓冲区和信箱(另辟一块)。
过程。发送进程:发送进程-os(内核态)-发送进程返回用户态。接收进程:接收-os(缓冲区复制到接收进程,验证来自和目的地,然后释放缓冲区)-接收用户态。消息链的机制。一对一的同步的对称的方式或一对多,消息链里消息可以来自不同进程--直接的方式缺点产生间接。
信箱--介质。只与信箱打交道,发送方接收方各自信箱。信箱的设置--单双向、大小,判满判空等等。
- 阻塞(同步),非阻塞(异步)--四种机制。
- 线程--非控制资源,然而它又有自己的register和stack heap堆栈寄存器为什么?
- cpu和核,cpu和os关系?
- 线程模式 VxWorks UNIX WindwosNT线程和进程类似--TCB PCB。
- 实现机制:考虑成本。
- User-level Thread
- 用户态实现线程(os仍是原来的逻辑,内核无多大区别,减少开发成本。用户层面的线程库(功能有……,库即软件的集合实现功能)来支持线程管理--典型用户级线程POSIX Pthreads。线程切换无需系统调用不涉及内核了。),内核态的调度对象仍是进程。
- 当线程系统调用时,核心进程阻塞,所以进程中其他线程阻塞:因为线程之间相互影响,发生系统调用时影响其他线程。
- 线程级调度时线程状态和进程状态独立。调度由应用程序特定--选择适合的算法,可运行在有线程库的任何os平台--移植性好。
- 每一线程时间片减少相对于进程,因为核心不知道线程存在。在此级线程之间是相互制约的。
- 库调度器从进程的多个线程中选择一个线程,然后该线程和该进程允许的一个内核线程关联起来。内核线程将被操作系统调度器指派到处理器内核。用户级线程是一种"多对一"的线程映射。
- Kernel-level Thread
- 切换调度完全以线程为基本单位--Windwos,TCB数据放到系统区来跟踪读写;没有线程库核心来提供API。
- 阻塞在线程级,提高并发性--真正线程级的并发。
- 用户线程在其生命期内都会绑定到该内核线程。
- 一旦用户线程终止,两个线程都将离开系统。这被称作"一对一"线程映射。
- 操作系统调度器管理、调度并分派这些线程。运行时库为每个用户级线程请求一个内核级线程。
- 操作系统的内存管理和调度子系统必须要考虑到数量巨大的用户级线程。您必须了解每个进程允许的线程的最大数目是多少。操作系统为每个线程创建上下文。线程的上下文将在本章稍后部分介绍。进程的每个线程在资源可用时都可以被指派到处理器内核。
- 混合线程
- 实现是用户线程和内核线程的交叉,使得库和操作系统都可以管理线程。
- 用户线程由运行时库调度器管理,内核线程由操作系统调度器管理。
- 在这种实现中,进程有着自己的内核线程池。可运行的用户线程由运行时库分派并标记为准备好执行的可用线程。
- 操作系统选择用户线程并将它映射到线程池中的可用内核线程。多个用户线程可以分配给相同的内核线程。当创建新的用户线程时,只需要简单地将它映射到线程池中现有的一个内核线程即可。
- 这种实现使用了"多对多"线程映射。该方法中尽量使用多对一映射。很多用户线程将会映射到一个内核线程。因此,对内核线程的请求将会少于用户线程的数目。
- 内核线程池不会被销毁和重建,这些线程总是位于系统中。它们会在必要时分配给不同的用户级线程,而不是当创建新的用户级线程时就创建一个新的内核线程,而纯内核级线程被创建时,就会创建一个新的内核线程。
- 只对池中的每个线程创建上下文。有了内核线程和混合线程,操作系统分配一组处理器内核,进程的线程可以在这些处理器内核之上运行。线程只能在为它们所属线程指派的处理器内核上运行。
在确定线程的调度模型和竞争范围时,用户级线程和内核级线程变得很重要。竞争范围决定了指定的线程与那些线程竞争处理器的使用,而且对于操作系统对大量线程的内存管理也非常重要。
存在map映射。
- 例子:改动。创建时可以拷贝所有线程来创建新进程,又可以以某一线程来创建新进程。撤销线程方式:异步和延迟。主要区别是等待其他线程还是实时--可以在线程里设置撤销点,在中间过程不可以被撤销,而异步撤销可以随时撤销线程。
- 对于信号的处理:信号传递,信号处理和进程类似。什么创建方式,针对特定事件和突发需求。同步和异步信号。在消息处理里可以指定某一进程的某一线程,也可以该进程里所有线程可见,也可以在进程里专门定义一个线程来专门处理消息。
- 在多线程实现上新的需求提出可以产生新的线程来处理。创建线程的时间点:提前创建好还是在需求来时及时创建。创建线程同样消耗资源比进程少些。关于并发度--线程是否设置最大值?--一种机制:线程池的概念,提前创建好,需要线程则在线程池里初始化好内容即可。
- Java Threads:既非用户级也非内核态--java的跨平台--JVM在软硬件间加了层虚拟机,以用户级线程库来支持用虚拟机实现。内核可以不支持多线程,虚拟机支持;内核支持则实现内核态线程。
From satrys,
Kristen wang