linux内核分析之进程fork操作

最近线上遇见了奇怪的现象,redis在做rdb持久化的时候,后台曝出can not allocat memory的错误

具体错误参见redis模块中的错误分析

这里主要说明一下fork(),以及copy-on-write操作

linux内核在2.6以后对fork操作加入copy-on-write,提高系统的可靠性和高性能

首先说明的是fork(),只是一次资源的确认(这里由vm.overcommit参数决定),

网上很多对overcommit参数的说均misunderstanding

简单来讲,

0 - 系统默认,应用来说相对安全合理,是将当前空闲的内存和swap和需要请求的内存量做对比

1 - 相对理想化的,不适合生产环节,无论请求内存如何,直接放行

2 - 系数可配置化,可以限制内存使用量为系统的百分之多少,方便配置

上面的确认决定fork是否还能继续向下走

然而真正的内存资源申请情况是在write时发生的,本身主进程和子进程是内存资源共享的,

如果主进程同时又操作内存的写操作时,这时子进程会申请同样大小的内存区,资源占用直到结束。

时间: 2024-12-11 16:50:04

linux内核分析之进程fork操作的相关文章

Linux内核分析之六——进程的描述与进程的创建

作者:姚开健 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的描述 Linux系统的进程由一个进程描述符PCB,即task_struct结构体来描述,其在内核中代码实现如下: struct task_struct { 1236 volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ 1237 void

linux内核分析之进程地址空间【转】

转自:http://blog.csdn.net/bullbat/article/details/7106094 版权声明:本文为博主原创文章,未经博主允许不得转载. 本文主要介绍linux内核中进程地址空间的数据结构描述,包括mm_struct/vm_area_struct.进程线性地址区间的分配流程,并对相应的源代码做了注释. 内核中的函数以相当直接了当的方式获得动态内存.当给用户态进程分配内存时,情况完全不同了.进程对动态内存的请求被认为是不紧迫的,一般来说,内核总是尽量推迟给用户态进程分配

linux内核分析之进程地址空间管理

1.struct task_struct 进程内核栈是操作系统为管理每一个进程而分配的一个4k或者8k内存大小的一片内存区域,里面存放了一个进程的所有信息,它能够完整的描述一个正在执行的程序:它打开的文件,进程的地址空间,挂起的信号,进程的状态,从task_struct中可以看到对一个正在执行的程序的完整描述. 进程描述符: 1 struct thread_info { 2 struct task_struct *task; /* main task structure */ 3 unsigne

Linux内核分析总结

周子轩 原创作品转载注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 笔记: 冯诺依曼体系结构的核心思想是存储程序计算机.在计算机中有两种指令,一是用户指令,一是系统调用. Linux是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统. 当内核运行的时候,系统以内核态进入内核空间执行.而执行一个普通用户程序时,系统将以用户态进入以用户空间执行. 在系统中运行的应用程序通过系统

《Linux内核分析》第七周笔记 进程的切换和系统的一般执行过程

20135132陈雨鑫 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 一.进程调度与进程调度的时机分析 1.进程调度 不同类型的进程有不同的调度需求 第一种分类:       I/O-bound            频繁的进行I/O           通常会花费很多时间等待I/O操作的完成     CPU-bound            计算密集型          

《Linux内核分析》 第六节 分析Linux内核创建一个新进程的过程

范闻泽 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程 1.删除原来的menu,并clone新的menu,用test_fork.c覆盖test.c 2. make rootfs之后新的内核启动,测试fork功能 3.使用-s -S冷冻内核,准备调试 4.设置断点 5.根据断点,进行跟踪,得到结果 1.以下是执行指令 cd LinuxKernel rm menu -r

《linux 内核完全剖析》 fork.c 代码分析笔记

fork.c 代码分析笔记 verifiy_area long last_pid=0; //全局变量,用来记录目前最大的pid数值 void verify_area(void * addr,int size) // addr 是虚拟地址 ,size是需要写入的字节大小 { unsigned long start; start = (unsigned long) addr; //把地址强制类型转换之后,赋值给start size += start & 0xfff; //取addr在当前虚拟地址中4

LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程

LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程 黄韧(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 Linux中进程调度的基本概念与相关知识 schedule函数如何实现进程调度 Linux进程的执行过程(一般情况与特殊情况) 宏观描述Linux系统执行 二.学习笔记 (一)进程切换的关键代码switch_to分析 进程进度与进程调度的时机分析 1.

Linux内核分析:实验六--Linux进程的创建过程分析

刘畅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本次实验在MenuOS中加入fork系统调用,并通过GDB的调试跟踪,近距离的观察Linux中进程创建的过程.阅读Linux进程部分的源码,结合起来理解Linux内核创建新进程的过程. Linux中对进程的描述 Linux中task_struct结构体用于描述系统中的进程,对应x86机器的此结构体定义放在了/include/li