进程管理相关的系统调用

2.4 进程管理相关的系统调用
从用户状态切换到核心态的方法,依不同的体系结构二各有不同。这两种状态之间切换的机制,并解释用户空间和内核空间之间如何交换参数。就目前而言,将内核视为有C标准使用的“程序库”即可。

======================================
2.4.1 进程复制
传统的UNIX中用于复制进程的提供调用时fork.但他并不是Linux为此实现的唯一调用,实际上Linux实现了3个。
(1)fork是重量级调用,因为它建立了父进程的一个完整副本,然后作为子进程执行。为减少与该调用相关的工作量,Linux使用了些事复制(copy-on-write)技术。
(2)vfork类似于fork,但并不创建父进程数据的副本。相反,父子进程之间共享数据。vfork设计用于子进程形成后立即执行execve系统调用加载新程序的情形。在子进程退出或开始新程序之前,内核保证父进程处于堵塞状态。
(3)clone产生线程,可以对父子进程之间的共享,复制进程精确控制。

1.写时复制
内核使用了写时复制(Copy-On-Write,COW)技术,以防止在fork执行时将父进程的所有数据复制到子进程。
2.执行系统调用
fork \vfork和clone系统调用的入口点分别是sys_fork sys_vfork和sys_clone函数,其定义以来与具体的体系结构,因为在用户可能更加爱你和内核空间之间传递参数的方法因体系结构而异。上述函数的任务是从处理器寄存器中提取由用户空间提供的信息,调用体系结构无关的do_fork函数,后者负责进程复制。
do_fork(unisgned long clone_flags,
unsigned long stack_start,
struct pt_reg *regs,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
改函数需要下列参数。
*clone_flags是一个标志集合,用来指定控制复制过程的一些属性。
*start_stack是用户状态下栈的起始地址。
*regs是一个指向寄存器集合的指针,其中以原始形式保存了调用参数。改参数使用的数据类型是特定于体系结构的struct pt_regs,其中按照系统调用执行时寄存器在内核栈上的存储顺序,保存了所有的寄存器。
*stack_size是用户状态下栈的大小。
*parent_tidptr和child_tidptr是指向用户空间地址的两个指针,分贝指向父子进程TID.
在子进程生成之后,内核必须执行下列收尾操作:
*由于fork要返回新进程的PID,因此必须获得PID.
*如果将要使ptrace监控新的进程,那么在创建信进程后会立即向器发送SIGSTOP信号。
*子进程使用wake_up_new_task唤醒。换言之,即将器task_struct添加到调度器队列。
*如果使用vfork机制(内核通过设置的CLONE_VFORK标志识别),必须启用子进程的完成机制。
*通过采用这种方法,内核可以确保使用vfork生成的子集成的父进程会一直处于不活动状态,直至子进程退出或执行一个新的程序。

  1. 复制进程
    在do_fork中大多数工作时有copy_process函数完成的,器代码流程。请注意,改函数必须处理3个系统调用。
    thread_info保存了特定于体系结构的汇编语言嗲吗需要访问的案部分进程数据。尽管该结构的定义因不同的处理器而不同。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值