查看MIPS Linux 存储管理分析札记的源代码
←
MIPS Linux 存储管理分析札记
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 内核态线程、内核线程以及进程的内核栈问题 == linux 下线程库的实现,以常用的 Linuxthread 或者 NPTL 为例,这些库创建线程是使用这些标志 CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND 调用 clone() 来实现的,就是一个轻量级进程。 在使用 fork, vfork, clone 这些函数创建进程或者轻量级进程时,内核都会调用 alloc_task_struct() 为其分配一个 task_struct; 调用 alloc_thread_info() ,表面上看好像是分配 thread_info 结构,实际上: <source lang=c> #define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL) </source> 分 配了 THREAD_SIZE 的空间,底端为 thread_info ,指向它的指针保存于 task_struct->thread_info 中。可以看到,task_struct->thread_info + THREAD_SIZE 即为进程或者轻量级进程的内核栈栈底。 无论是使用 clone 生成轻量级进程,还是使用 kernel_thread 创建内核线程,他们都会进入 do_fork,进而调用 alloc_thread_info(),因此他们都有内核栈,大小为 THREAD_SIZE,底端为 thread_info 。 因此linux 下,每个线程都会有一个内核栈,这个当线程数目很大时是个问题,因此会对线程数目进行限制: <source lang=bash> # 查看 F1C 系统最大线程数 $ cat /proc/sys/kernel/threads-max 862 # 查看 F1C 每个用户的最大进程数(包含线程) $ cat /proc/sys/kernel/pid_max 32768 # 查看所有限制 $ ulimit -a # 查看特定限制 $ ulimit -u # 最大用户进程数 431 $ ulimit -s # 栈大小 (KB) 8192 </source> threads-max 主要由 kernel/fork.c 中的 sysctl_max_threads() 处理,引用局部变量 max_threads pid_max 定于于内核源码 include/linux/threads.h 中: <source lang=cpp> #define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 0x1000 : 0x8000) #define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \ (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT)) </source> <br>
返回到
MIPS Linux 存储管理分析札记
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面