进程管理相关初始化(三)
来源:互联网 发布:吉他弹唱表演曲目知乎 编辑:程序博客网 时间:2024/05/17 03:39
我们接下来要说的初始化函数是创建进程的相关初始化fork_init(),下面我们来仔细分析一下它的代码吧
void __init fork_init(unsigned long mempages)//mempages这个参数一般是指实际存在的物理内存总页数。
{
#ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR//ARM没有定义这个的
#ifndef ARCH_MIN_TASKALIGN//ARM是没有定义这个的
#define ARCH_MIN_TASKALIGN L1_CACHE_BYTES//放置struct task_struct结构体的位置的最小对齐方式为处理器的cache line 大小。
#endif
/* create a slab on which task_structs can be allocated */
task_struct_cachep =
kmem_cache_create("task_struct", sizeof(struct task_struct),
ARCH_MIN_TASKALIGN, SLAB_PANIC, NULL, NULL);//task_struct_cachep是一个全局变量,它指向一个告诉缓存,在我们看来这个高速缓存的每个对象都好像是sizeof(struct task_struct)这样的大小。说明这个高速缓存专门用来存放struct task_struct结构体的。同时也是要求了对齐方式。
#endif
/*
* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);//其实就是物理内存总页数/每一个线程所占页数/8,就是说最都只可以用到系统内存总页数的1/8来存放线程结构体。这里就是用最大限度的空间来存放结构体统计出来的数量。
/*
* we need to allow at least 20 threads to boot a system
*/
if(max_threads < 20)
max_threads = 20;
init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;//将0号进程的信号描述结构体中的进程数资源限制的当前值设置为max_threads/2。
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;//将0号进程的信号描述结构体中的进程数资源限制的最大值值设置为max_threads/2。
}
其实这里就是创建进程前先创建struct task_struct高速缓存,同时还要统计系统至少可以支持多少个进程。
接下来要介绍的函数就是为进程管理的相关数据结构创建高速缓存内存proc_caches_init()
void __init proc_caches_init(void)
{
sighand_cachep = kmem_cache_create("sighand_cache",
sizeof(struct sighand_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为信号处理描述结构体申请高速缓存
signal_cachep = kmem_cache_create("signal_cache",
sizeof(struct signal_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为信号描述结构体申请高速缓存
files_cachep = kmem_cache_create("files_cache",
sizeof(struct files_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为进程打开的文件表描述结构体申请高速缓存
fs_cachep = kmem_cache_create("fs_cache",
sizeof(struct fs_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为进程的文件系统信息的描述结构体申请高速缓存
vm_area_cachep = kmem_cache_create("vm_area_struct",
sizeof(struct vm_area_struct), 0,
SLAB_PANIC, NULL, NULL);//这里是为线性内存区域的描述结构体申请高速缓存
mm_cachep = kmem_cache_create("mm_struct",
sizeof(struct mm_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为内存描述结构体申请高速缓存
}
到这里我们已经完成了内存管理的相关初始化。
- 进程管理相关初始化(三)
- 进程管理相关初始化(一)
- 进程管理相关初始化(二)
- 进程管理(三)
- 进程管理(三)
- 进程以及Linux中的进程相关概念(三)
- Android学习进程(三):布局管理
- linux进程调度与管理(三)
- 进程管理--之三
- Linux学习之进程三(进程管理)
- Nginx系列(三)--管理进程、多工作进程设计
- centos 进程管理相关命令
- (四)1进程管理的相关概念
- 三、操作系统之进程管理
- 多进程编程的相关知识总结(三)
- 通过Linux理解操作系统(三):进程管理(下)
- 通过Linux理解操作系统(三):进程管理(下)
- Windows CE 进程、线程和内存管理(三)
- (二十四)优秀员工 - 6
- (二十四)优秀员工 - 7
- Linux下Socket编程
- 锻炼腹肌和胸肌的最好方法
- USP理论
- 进程管理相关初始化(三)
- Hot Patching
- 二项式系数 & 递推关系初步
- 编译器 链接 选项解释:link incrementally的作用
- 用Java实现断点续传(HTTP)
- MFC消息响应机制
- 中九升级成功经验分享
- 多线程
- just try