在不同的操作系统,线程的实现方式是不一样的
OS/2,Windows实现的内核级线程;而很多数据库管理系统实现的是用户级线程;还有Solaris实现两种类型的线程
用户级线程:
内核级线程:
内核:其实就是最靠近硬件一层的代码
用户级线程特点:线程库适用于管理用户级线程的软件包,是供所有应用程序共享的应用既实用程序,里面包含线程各种操作的代码,不同的应用程序利用线程库设计多线程程序
1.用户级线程的创建,撤销,以及切换都不利用系统调用,这种线程与内核无关,内核不知道这种线程的存在
2.用户级线程的调度由其所属的进程进行调度,内核只负责对进程的调度
3.线程切换不需要系统状态的转换,也就不需要系统调用,会减少用户态<-->和心态转换的时空开销
4.每个进程可以使用本进程专用的线程调度算法来调度线程
5.用户级线程可以在任何操作系统中运行
6.当用户级线程调用一个系统调用时,系统会认为是线程所在进程的行为,因此进程会被阻塞,进程内所有线程都不能执行
7.不能利用多处理机技术,因为内核一次只把一个进程分配给一个处理机,也就是说无法做到真正的并行(可以用多进程技术)
内核级线程特点:
1.应用程序要使用内核线程,需要通过内核提供的API,也就是说需要进行系统调用(速度慢)
2.系统调度的单位不再是进程,而是线程
3.系统内核知道线程属于哪个进程,但是不需要考虑线程属于哪个进程,进程只作为系统资源的拥有者
4.可以并行运行同一个进程的不同线程,也可以运行不同进程的不同线程,但是前者开销更小(可以利用多处理机技术)
5.线程切换需要更大的开销(但不代表综合所用时间会更长,需要具体情况分析,比如一个应用程序大多都是系统调用)
6.内核级线程阻塞不会影响到其所属的进程
同时实现两种线程:Solaris系统
1.需要引入一个新的概念:轻型进程(LWP)
2.轻型进程拥有自己的PCB
3.用户级线程可能会有很多,但是LWP却不多,用户线程要进行系统调用需要通过LWP这个中介与内核线程连接
4.用户级线程:LWP=n:1 LWP:内核级线程=1:1
5.当一个用户级线程阻塞时,则与之相连的LWP也阻塞,随后与这个LWP的所有用户级线程(用户线程只连接了这个LWP的话) 都将无法访问内核,但是依旧可以运行