php thread linux,Linux_linux内核函数kernel_thread,设备驱动程序中,如果需要几 - phpStudy...

linux内核函数kernel_thread

设备驱动程序中,如果需要几个并发执行的人物,可以启动内核线程,启动内和县城的函数为:

int kernel_thread (int ( * fn )( void * ), void * arg, unsigned long flags);

kernel_thread函数的作用是产生一个新的线程

内核线程实际上就是一个共享父进程地址空间的进程,它有自己的系统堆栈.

内核线程和进程都是通过do_fork()函数来产生的,系统中规定的最大进程数与

线程数由fork_init来决定:

[/arch/kernel/process.c/fork_init()]

void __init fork_init(unsigned long mempages)

{

#ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR

#ifndef ARCH_MIN_TASKALIGN

#define ARCH_MIN_TASKALIGN   L1_CACHE_BYTES

#endif

/* 在slab高速缓存中建立task_struct结构专用的缓冲区队列 */

task_struct_cachep =

kmem_cache_create("task_struct", sizeof(struct task_struct),

ARCH_MIN_TASKALIGN, SLAB_PANIC, NULL, NULL);

#endif

/*

把默认线程数设置到一个安全值,因为内核中总的线程占用的空间

可能要内存一半还要多.

参数mempages系统中总的物理内存结构大小,它等于mempages/PAGESIZE.

比如我机器的内存是512m,那么在我的系统最多能同时产生线程数为

(512*2^20/2^12) / 2^3 = 512*2^5 = 16384

*/

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

/*

* 启动系统的时候至少需要20个线程

*/

if(max_threads < 20)

max_threads = 20;

/*

* 每个进程最多产生max_threads/2,也就是线程总数的一半,在我的机器上为8192.

*/

init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;

init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

}

kernel_thread原形在/arch/kernel/process.c中.

(*fn)(void *)为要执行的函数的指针,arg为函数参数,flags为do_fork产生线程时的标志.

int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)

{

struct pt_regs regs;

memset(&regs, 0, sizeof(regs));

regs.ebx = (unsigned long) fn;   /* ebx指向函数地址 */

regs.edx = (unsigned long) arg;   /* edx指向参数 */

regs.xds = __USER_DS;

regs.xes = __USER_DS;

regs.orig_eax = -1;

regs.eip = (unsigned long) kernel_thread_helper;

regs.xcs = __KERNEL_CS;

regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;

/* 利用do_fork来产生一个新的线程,共享父进程地址空间,并且不允许调试子进程 */

return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);

}

[/arch/i386/kernel/process.c/kernel_thread_helper]

extern void kernel_thread_helper(void); /* 定义成全局变量 */

__asm__(".section .text\n"

".align 4\n"

"kernel_thread_helper:\n\t"

"movl %edx,%eax\n\t"

"pushl %edx\n\t"   /* edx指向参数,压入堆栈 */

"call *%ebx\n\t"   /* ebx指向函数地址,执行函数 */

"pushl %eax\n\t"

"call do_exit\n"   /* 结束线程 */

".previous");

在kernel_thread中调用了do_fork,那么do_fork是怎样转入kernel_thread_helper去执行的呢,继续跟踪下do_fork函数.

[kernel/fork.c/do_fork()]

long do_fork(unsigned long clone_flags,

unsigned long stack_start,

struct pt_regs *regs,

unsigned long stack_size,

int __user *parent_tidptr,

int __user *child_tidptr)

{

....

....

p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, pid);

....

....

}

它调用copy_process函数来向子进程拷贝父进程的进程环境和全部寄存器副本.

[kernel/fork.c/do_fork()->copy_process]

static task_t *copy_process(unsigned long clone_flags,

unsigned long stack_start,

struct pt_regs *regs,

unsigned long stack_size,

int __user *parent_tidptr,

int __user *child_tidptr,

int pid)

{

...

...

retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);

...

...

}

它又调用copy_thread来拷贝父进程的系统堆栈并做相应的调整.

[/arch/i386/kernel/process.c/copy_thread]:

int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,

unsigned long unused,

struct task_struct * p, struct pt_regs * regs)

{

...

...

p->thread.eip = (unsigned long) ret_from_fork;

}

在这里把ret_from_fork的地址赋值给p->thread.eip,p->thread.eip表示当进程下一次调度时的指令开始地址,

所以当线程创建后被调度时,是从ret_from_fork地址处开始的.

[/arch/i386/kernel/entry.s]

到这里说明,新的线程已经产生了.

ENTRY(ret_from_fork)

pushl %eax

call schedule_tail

GET_THREAD_INFO(%ebp)

popl %eax

jmp syscall_exit

syscall_exit:

...

work_resched:

call schedule

...

当它从ret_from_fork退出时,会从堆栈中弹出原来保存的ip,而ip指向kernel_thread_helper,

至此kernel_thread_helper被调用,它就可以运行我们的指定的函数了相关阅读:

CSS的书写有怎样的功能

10g中构建“高”索引

驯服CSS选择器--健壮我们的样式表

收藏一些不常用,但是有用的代码

Oracle数据库中创建合理的数据库索引

HTML表格标记教程(29):单元格的亮边框色属性BORDERCOLORLIGHT

HTML网页的基本组成概述

两个vbs脚本利用了wscirpt.network

HTML V5 与 XHTML V2

ASP SQL防注入的方法

CssGaga教程:自动同步文件和哀悼日网站一键变灰

HttpWebRequest实现浏览器请求(Cookie)

关注于使用常用对象来加快Access 2007数据库下

PHP 工厂模式使用方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ljc.framework_Java 9模块系统(拼图)@ LJC的HackTheTower

ljc.framework今天&#xff0c;我们花了半天时间参加了第一次HackTheTower活动。 伦敦的Java用户组&#xff08;aka LJC &#xff09;的成员应邀在伦敦市的SalesForceTower&#xff08;aka Heron Tower &#xff09;26楼聚会。 Heather VanCura是Java社区流程的主席 马尼萨卡…

微信小程序注册/登录接口开发

文章目录后端有关说明前端有关说明接口设计小程序注册/登录接口APP 注册/登录接口PC Web 端的注册/登录接口小程序注册/登录序列图校验 token后端有关说明 登录和注册的逻辑要独立抽取写成2个接口&#xff1a;注册接口、登录接口 小程序、APP、PC端的登录接口和注册接口要分开…

php中符号 的作用是什么意思,PHP中@符号的用途是什么?

PHP支持错误控制运算符&#xff0c;即at符号()。当放在表达式之前时&#xff0c;该表达式可能生成的任何错误消息都将被忽略。要在PHP中使用符号&#xff0c;代码如下-示例<?php $file file (non_existent_file) ordie ("Failed in opening the file: Error Message …

couchbase_使用Portworx和Couchbase的有状态容器

couchbase容器本应是短暂的&#xff0c;因此可以很好地扩展以用于无状态应用程序。 有状态的容器&#xff08;例如Couchbase&#xff09;需要区别对待。 管理Docker容器的持久性概述了如何管理有状态容器的持久性。 该博客将说明如何使用Docker Volume Plugins和Portworx创建有…

jpa获取数据库当前时间_SpringDataJPA存储数据时通过注解自动设置创建时间和修改时间...

如果我们此时是通过 Spring Data JPA进行数据库的操作&#xff0c;Spring Data JAP提供了Auditing特性&#xff0c;我们可以通过起很好的实现我们的需求。其原因基本时通过插入监听器&#xff0c;当我们对被特定注解的数据bean进行操作时&#xff0c;其在中间自动进行一系列的操…

在 MyEclipse 中配置 tomcat

在 IDE 配置 tomcat 实则就是让 IDE 来管理 tomcat 配置 步骤 1 点击工具栏上的“Run/Stop/Restart MyEclipse Servers”图标旁边的下拉箭头 步骤 2 选择“Configure Server” 步骤 3 在弹出的对话框“Preferences”中展开“MyEclipse” – “Servers” – “Tomcat”–“To…

finalizer_Java Finalizer和Java文件输入/输出流

finalizer在与主题直接合作或花时间学习它们之后&#xff0c;我经常会发现自己在网上注意到更多主题。 最近的Stephen Connolly &#xff08; CloudBees &#xff09;发表了FileInputStream / FileOutputStream被认为有害的文章&#xff0c;引起了我的注意&#xff0c;因为我最…

unity 陶瓷质感_一种基于Unity3D的虚拟陶瓷设计方法与流程

本发明涉及虚拟现实领域&#xff0c;特别涉及一种基于Unity3D的虚拟陶瓷设计方法。背景技术&#xff1a;陶艺工艺制作环境要求严格&#xff1a;不仅在拉坯成型需要利用旋转机器&#xff0c;在烧制过程则需要窑炉锻造&#xff0c;如何将陶瓷制作工艺与虚拟现实开发完美结合在一起…

java 中怎么加汉字,jquery怎么向body里面增加文字

jquery如何向里面增加文字jsp代码是这样的&#xff1a;我想在页面加载时动态的将一行文字增加到里面&#xff0c;不知道为什么总是加不进去&#xff0c;js代码如下&#xff1a;$(document).ready(function(){if($("#type").val()"MESSAGE") {$(".ke-t…

MacBook 推出移动硬盘时总是提示有程序在使用它,如何解决?

如下图所示&#xff1a; 先使用命令 df -lh 在终端查看当前系统的所有硬盘&#xff0c;命令如下&#xff1a; liaowenxiongliaowenxiongdeMacBook-Air ~ % df -lh Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s5s1 234Gi…

m_map投影_MATLAB使用m_map工具箱演示绘制m_map logo

第二&#xff0c;新建脚本(CtrlN)&#xff0c;输入如下代码&#xff1a;close all; clear all; clcm_proj(ortho,lat,45,long,-95);m_coast(color,[0,1,0],linewidth,5);m_coast(patch,r);m_grid(linestyle,:,xticklabels,[],yticklabels,[]);patch(0.5*[-1,1,1,-1],0.25*[1,1,…

webcrypto库下载_使用WebCrypto API的电子签名

webcrypto库下载有时我们需要让用户进行电子签名。 通常&#xff0c;人们会理解为以某种方式将您的手写签名放置在屏幕上。 根据管辖范围&#xff0c;可能很好&#xff0c;或者仅存储图像可能还不够。 例如&#xff0c;在欧洲&#xff0c;有910/2014号法规 &#xff0c;该法规定…

21朵水仙花算法java,柏拉图说,如果你有两块面包,你应当用一块去换一朵水仙花。。。。。...

昨天做了一回“黑心商贩”&#xff0c;和我们的团伙一起去卖花了。街上的小情侣们很甜蜜啊&#xff0c;看男孩们眼里的宠爱和迁就还有女孩们小鸟依人的姿态&#xff0c;真是替他们幸福啊&#xff01;(我跟这儿瞎激动啥啊&#xff01;)关键是&#xff0c;正谈恋爱的小情侣们掏钱…

Linux 命令之 ps -- 显示进程状态/查看进程信息

文章目录介绍语法格式常用选项命令示例示例 1&#xff0c;查看进程的 PID、名称以及 CPU 占用率示例 2&#xff0c;查看所有的进程示例 3&#xff0c;按内存资源的使用量对进程进行排序示例 4&#xff0c;按 CPU 资源的使用量对进程进行排序示例 5&#xff0c;显示所有进程信息…

ts获取服务器数据_怎么使用Satruts2实现页面列表数据导出到Excel表格

Java codeprivate InputStream excelFile;public void setExcelFile(InputStream excelFile) {this.excelFile excelFile;}public InputStream getExcelFile() {return excelFile;}public String createExcelFile() {try {String[] headName { "昵称","电子邮…

java登录界面命令_Java命令行界面(第5部分):JewelCli

java登录界面命令细算在Java命令行处理与Apache的百科全书CLI &#xff0c; args4j &#xff0c; jbock和命令行中先前的文章&#xff0c;我把注意力转向在这个岗位使用JewelCli完成的命令行参数相似的处理Java中。 几个Java命令行处理库使用批注来定义命令行选项。 到目前为止…

matlab 三维图像配准,[转载]Matlab实现多种图像配准(转)

本文讲述如何利用Matlab Image Processing Toolbox中的图像配准工具实现线性正投影、仿射、投影、多项式、分段线性、局部加权平均配准的过程。实验平台X86 PC&#xff0c;Windows XP sp2, Matlab 7.1资源的获取matlab工具的使用方法&#xff1a;查看帮助mage Processing Toolb…

Linux 命令之 pstree -- 以树状图显示进程/查看进程信息

文章目录介绍常用选项命令示例介绍 Linux 系统中 pstree 命令的英文全称是“process tree”&#xff0c;即将所有进程以树状图显示&#xff0c;树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 (root)&#xff0c;如果有指定使用者 id&#xff0c;则树状图会只显…

totolinkn200up怎么设置_totolinkN200R无线路由器如何设置啊,求高人指点

展开全部totolinkN200R无线路e68a84e8a2ad3231313335323631343130323136353331333337393532由器设置方法&#xff1a;【设置无线路由器方法】【家庭网络环境布线】&#xff1a;1、有猫(modem)&#xff1a;猫(modem)----路由器wan口&#xff1b;路由器lan口----电脑。2、没有猫(…

jersey 入门示例_Jersey Web Service Hello World Java示例

jersey 入门示例在Restlet之后&#xff0c; Jersey是另一个流行的开源框架&#xff0c;可以用Java创建RESTful Web服务 。 Jersey符合JAX-RS规范&#xff0c;实际上它是JAX-RS&#xff08;JSR 311&#xff09;&#xff08;http://jsr311.java.net/nonav/releases/1.1/index.htm…