码迷,mamicode.com
首页 > 编程语言 > 详细

进程和线程

时间:2017-07-20 23:48:37      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:win   调用   init   get   style   idt   调度   线程模型   导致   

1、线程的模型

在Windows上,线程的模型大致为:

技术分享

一个内核线程调用了多个用户线程如果某一个用户线程阻塞了,

导致内核线程也阻塞了,进而影响了其他线程也被阻塞了,又因为

Windows上用户线程特别多,所以Windows的线程调度器是跑在用户

态上的,那么线程之间的切换就比Linux上快的多。

在Linux上线程模型大致如下:

技术分享

一个内核线程操纵一个 内核线程。所以Linux上会有200-300个线程。在Linux上

创建线程,直接就是创建内核线程,内核线程调用get_free_page会产生自己线程栈,

占两个页面,8k大小,默认的内核空间大小只有1G所以创建线程的数目是恒定的。

然而所有的线程都有自己的栈空间和一组寄存器包括PC寄存器。

二、进程:

 操作系统分配资源的基本单位,在Linux上创建一个进程,会调用fork()函数,Linux上独有的

写时拷贝技术,大大的提升了创建进程的时间,Linux上0号进程就是专门提供用来写时拷贝的init;

在Windows上会调用create_process()函数,重新创建,所以时间会稍微慢一点。

进程的必要条件:task_struct、text、独立的用户空间,独立的内核空间。

内核线程:与进程相比,没有独立的用户空间,用kernel_thread()创建;

用户线程:与进程相比,用户空间是共享的,用pthread_create()创建。

总结:Linux上调度的基本单位是进程,多线程的优点是数据共享,交互,节省

大量的时间,所以多线程不适用于Linux;Windows上调度的基本单位是线程,

线程切换快,进程只是容器用来装载线程。

 

进程和线程

标签:win   调用   init   get   style   idt   调度   线程模型   导致   

原文地址:http://www.cnblogs.com/waiting999/p/7214809.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!