4.1进程和线程
资源所有权:指的是进程拥有进程映像(代码,数据,栈,属性),资源的所有权
调度/执行:一个进程沿着可以通过一个或多个程序执行路径执行,进程拥有一个执行状态和被分配的优先级,备操作系统调度和分派的实体。
目前操作系统分派的单位通常称为线程,拥有资源控制权的单位通常称为进程
4.2 线程分类
线程的实现可以分为:用户级线程和内核级线程。
线程上下文:寄存器内容,程序计数器和栈指针。
用户级线程
在一个纯粹的用户级线程软件中,线程管理的工作是由应用程序完成,内核意识不到线程的存在。
线程库是用于用户级线程管理的历程包,包含用于创建和销毁小城代码,在线程间传递信息和数据的代码,调度线程的代码,以及保存和恢复线程上下文的代码。
也就说在这种模型下,用户自己管理线程。
相当于一个进程级的多道程序。
因此会发生如下的情况,进程A有两个线程1,2
- 当进程A中的线程1执行IO操作的时候,需要陷入内核,然后内核阻塞进程A,然后切换到别的进程
此时,线程2在处理器角度不处于运行态,因为处理器不知道线程2的存在。在线程库角度处于运行态 - 时钟中断传递给内核,内核确定当前进程用完了时间片,进程切换。线程处于运行态
- 线程1需要等待线程2的某个动作(某种形式的同步),此时线程2阻塞,转为执行线程1
这种情况下,由于IO会造成进程切换,引起不能使用线程的好处。
为了解决这个问题,
- 编写多进程应用
不能使用线程的好处 - jacketing技术
将一个产生阻塞的系统调用转化成一个非阻塞的系统调用。将系统IO调用转化为应用级IOjacket历程
内核级线程
在纯粹的内核级线程软件中,县城管理工作有内核完成,应用程序部分没有进行线程管理的代码,只用到了线程的api
内核为进程和其他内部结构的每个线程维护上下文信息,线程调度是由内核基于线程完成。
有点:内核可以把同一个进程中的多个线程调度到多个处理器中运行(也就是不同的处理器执行同一进程中的不同线程),进程中的一个线程阻塞,内核可以调度同一个进程中的另一个线程。
缺点:当进行线程切换的时候,需要到内核的状态切换。
混合方法
混合系统中,县城创建在用户空间中完成,调度和同步也在用户空间中进行。
一个进程中的多用户及线程被映射到一些(少于用户级线程数目)内核级线程上。
4.3多核和多线程
多核处理器任务调度和通信以及高速缓存一致性维护都给软件带来了额外的开销。
因此导致cpu增多以后,性能先上升后下降。