下面的讨论是在学校的论坛上一问一答的形式展开的,答案不一定正确
问:
像ucOS,acoral这样的只支持多线程系统,每个时间片分给不同的线程。但对于像linux这样的多进程多线程系统呢?难道是10ms的时间片先分给不同的进程,然后获得时间片的进程下的线程再划分这10ms的时间片,来实现并行?
答:
1、linux的线程就是进程,进程会请求时间片,当cpu空闲时就让这个进程转化为活跃状态,如果时间片结束或者进程主动转化为其它状态,时间片就给其它进程。至于进程之间是怎么分配时间片的有几种算法,在编译内核时可以选择
2、如果是系统级线程,就跟进程一样获得一个时间片,如果是用户级线程就分享它们所属进程的时间片。比如JAVA的多线程就是用户级线程。
3、linux的线程又叫轻量级进程
4、linux提供线程和进程的api是没错,但是在内核级别,创建进程和线程都是通过__clone系统调用(创建进程和创建线程使用的参数不一样),所以从CPU调度的角度上看,线程和进程并没有本质区别,它们都是CPU所能调度的最小单位
PS1:早期的Linux内核,同一进程的不同线程中,对其使用getpid(),获得的值是不一样的,因为内核把线程都当作进程,所以会产生这样的情况。新版本的Linux,相同进程里的不同线程的pid是相同的,但这只是为了在接口上使线程更像线程
PS2:多线程编程是windows鼓励的做法,这是因为windows的进程创建需要耗费大量的时间,多进程在windows下的效率很低,所以windows的多线程模式大大提高了并行运算的效率。但在Linux下,进程创建耗费的时间要远小于windows的,所以Unix/Linux从很早就开始广泛使用多进程编程。Linux引入多线程比起windows,意义就不那么大了,因为多进程就可以具备较好的效率(当然多线程一般还是要快一些,因为clone的属性更少)。
PS3:在CPU看来。对于Linux而言,多线程和多进程没有本质区别,对windows,CPU调度的最小单位是线程,如果没有用多线程,那一个进程就相当于是一个线程,使用了多线程,则一个进程等同于多个线程,然后cpu对这些线程进行统一调度
PS1:早期的Linux内核,同一进程的不同线程中,对其使用getpid(),获得的值是不一样的,因为内核把线程都当作进程,所以会产生这样的情况。新版本的Linux,相同进程里的不同线程的pid是相同的,但这只是为了在接口上使线程更像线程
PS2:多线程编程是windows鼓励的做法,这是因为windows的进程创建需要耗费大量的时间,多进程在windows下的效率很低,所以windows的多线程模式大大提高了并行运算的效率。但在Linux下,进程创建耗费的时间要远小于windows的,所以Unix/Linux从很早就开始广泛使用多进程编程。Linux引入多线程比起windows,意义就不那么大了,因为多进程就可以具备较好的效率(当然多线程一般还是要快一些,因为clone的属性更少)。
PS3:在CPU看来。对于Linux而言,多线程和多进程没有本质区别,对windows,CPU调度的最小单位是线程,如果没有用多线程,那一个进程就相当于是一个线程,使用了多线程,则一个进程等同于多个线程,然后cpu对这些线程进行统一调度
PS4: Linux的进程开销比windows要小得多,但据说windows的线程开销要略小于Linux的线程
PS5: Linux下的进程和线程还有很多可以挖掘的东西, 为了效率至上,apache的某种工作模式使用了进程池+线程池+内存池的资源分配方式(chrome也是)
PS5: Linux下的进程和线程还有很多可以挖掘的东西, 为了效率至上,apache的某种工作模式使用了进程池+线程池+内存池的资源分配方式(chrome也是)
重新看了下帖子,貌似我讲多了,不过大家看看也好哈,深化下对这两个概念的印象(面试常用哦)
如果要本帖的答案的话,可以这么认为:
不管是windows还是linux,把进程都折算成线程,然后cpu对线程进行调度就可以了。
比如你举的例子,在cpu看来都是两个任务,管它在用户态是线程还是进程
如果要本帖的答案的话,可以这么认为:
不管是windows还是linux,把进程都折算成线程,然后cpu对线程进行调度就可以了。
比如你举的例子,在cpu看来都是两个任务,管它在用户态是线程还是进程
5、进程调度是根据动态优先级来的,内核下线程等同于进程
6、线程windows效率高,进程linux效率高
问:
1六楼的说法怎么说呢?也就是说确实存在进程占用时间片,然后线程在分割进程占有的时间片这样的机制么?(windows下的?)
2lili大神在9楼说,“在内核级别”,那除了内核级别还有什么级别呢?”linux提供线程和进程的api是没错“这句话中提供的api是什么级别呢?
答:
1. 一般说的线程都是系统级线程。java那种线程是java虚拟机提供的线程机制,是怎么用系统实现的我也不清楚,了解有限。这个可以忽略
2. 搜索内核态和用户态
2. 搜索内核态和用户态
3、除了内核还有用户级别,即ring0和ring3,”linux提供线程和进程的api是没错“指的是用户级别的api
4、线程windows效率高,进程linux效率高
ps:感谢河畔大神们的参与,尤其是lili