Jun*_*Zhi 8 linux multithreading kernel pthreads linux-kernel
这是一个概念性问题.
根据这篇文章,pthread实际上是使用clone()系统调用实现的.因此,我们可以推断在用户空间中有一个内核线程(或轻量级进程)备份pthread.内核知道pthread并且可以像进程一样安排它.
至于kthread,根据Robert Love的说法,kthreads也是用clone()系统调用创建的:
clone(CLONE_VM| CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0)
Run Code Online (Sandbox Code Playgroud)
所以pthread和kthread都使用clone()调用.我的第一个问题是:
为了回答我自己的问题,我继续读到:
内核线程和普通进程之间的显着区别是内核线程没有地址空间(事实上,它们的mm指针是NULL).
这有区别吗?我的意思是,由pthread_create()创建的线程与正常进程共享地址空间.相反,kthread没有自己的地址空间.那是对的吗?
还有什么不同?
相反,kthread没有自己的地址空间.那是对的吗?
是
由pthread_create()创建的线程与正常进程共享地址空间.
kernel:如何从进程的task_struct中查找所有线程
pthreads:pthread_create()用于用户空间,其中应用程序中的多个线程共享相同的进程地址空间.为此,您需要将程序与pthread库链接以使用此功能.pthreads在应用程序级别或用户空间中提供多线程.在内部,它转换为clone()系统调用,它将新映射struct task_struct到每个应用程序线程.
kthreads:内核线程的一些例子是用于刷新磁盘缓存,服务softirqs,刷新脏缓冲区等.这些线程只在内核空间内运行,并且不能访问用户空间虚拟内存,并且它们之后只使用内核空间内存地址PAGE_OFFSET,因此,current->mm任务描述符中的字段始终为NULL.在内部,这个kernel_thread()api可以转换到do_fork()内核中.内核线程是异步创建的,无论是init进程出现还是加载了某些内核模块(从文件系统到文件系统).
| 归档时间: |
|
| 查看次数: |
6291 次 |
| 最近记录: |