进程结构

进程在内核的源代码中以结构体表示,篇幅很长,在此列举一小段关键代码,可以发现是个双向链表,具体的可以在内核目录下找一个叫“sched.h”的头文件。

struct task_struct {
struct task_struct *real_parent; /* real parent process */
struct task_struct *parent; /* recipient of SIGCHLD, wait4() reports */
/*
* children/sibling forms the list of my natural children
*/
struct list_head children; /* list of my children */
struct list_head sibling; /* linkage in my parent's children list */
struct task_struct *group_leader; /* threadgroup leader */ ……
};

进程被存放在叫做任务链表(tasklist)的双向循环链表中,linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色(cache coloring)的目的。

结构体中主要由四部分组成

1.进程控制块:进程标志

2.进程程序块:可与其他程序共享

3.进程数据块:进程专属空间,用于存放各种私有数据以及堆栈空间

4.独立的空间:线程

进程状态

#define TASK_RUNNING            0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define __TASK_STOPPED 4
#define __TASK_TRACED 8
/* in tsk->exit_state */
#define EXIT_ZOMBIE 16
#define EXIT_DEAD 32
/* in tsk->state again */
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256

进程的状态一共有五种。

1.TASK_RUNNING(运行)--------进程正在执行,或者在队列中等待执行。这是进程在用户空间中唯一可能的状态,也可以应用到内核空间中正在执行的进程。
2.TASK_INTERRUPTIBLE(可中断)--------进程正在睡眠(也就是他被阻塞)等待某些条件达成。一旦这些条件达成,内核就会把进程状态设置为运行,处于此状态的进程也会因为收到信号而提前被唤醒并投入运行。
3.TASK_UNINTERRUPTIBALE(不可中断)--------除了会因为接收到信号而被唤醒从而投入运行外,这个状态与可打断状态相同。这个状态通常在进程必须等待时不受干扰或事件很快就会发生时出现。由于处于此状态的任务对信号不作响应,所以较之可中断状态,用的较少。
4.TASK_ZOMBIE(僵死)-------该进程已经结束了,但父进程还没有调用wait()系统调用。一旦父进程调用了wait(),进程描述符就会被释放。
5.TASK_STOPPED(停止)---------进程停止执行,进程没有投入运行也不能投入运行。
 

进程的创建

在linux系统中,所有进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程。该进程读取系统的初始化脚本,并执行其他的相关程序,最终完成系统启动的整个进程。

进程是系统中基本的执行单位(线程是最小的调度单位),可以利用fork函数创建一个新的进程;

pid_t fork( void )

fork() 函数不需要参数,但返回两次,返回值有三种情况:

(1)对于父进程,fork函数返回新的子进程的ID。

(2)对于子进程,fork函数返回0。

(3)如果出错,fork函数返回-1。

fork函数创建一个新的进程,并从内核中为此进程得到一个新的可用进程ID,之后为这个新进程分配进程空间,并将父进程的进程空间中的内容复制到子进程的进程空间中,包括父进程的数据段+堆栈段,并与父进程共享代码段。

fork函数之后,子进程从等待fork返回开始执行,而不是从头开始。

  • 注意:子进程完全复制了父进程的地址空间的内容,包括堆栈段+数据段的内容。但是,子进程并没有复制代码段,而是和父进程共享代码段。代码段是只读的,不存在修改的问题,因此可以共用。在创建一个子进程后,子进程的地址空间完全和父进程分开,父子进程是两个独立的进程。

    linux环境下提供一个和fork函数类似的函数,可以用来创建一个共用父进程地址空间的子进程。

    pid_t  vfork();

    vfork()与fork()的区别:

    (1)vfork产生的子进程和父进程完全共享地址空间,包括代码段+数据段+堆栈段。子进程对共享资源进行的修改,也会影响到父进程。

    (2)vfork函数产生的子进程一定比父进程先运行。即父进程调用了vfork函数后会等待子进程运行后再运行。

  • linux 进程管理与调度(一)的更多相关文章

    1. Linux进程管理与调度-之-目录导航【转】

      转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...

    2. Linux进程管理专题

      Linux进程管理 (1)进程的诞生介绍了如何表示进程?进程的生命周期.进程的创建等等? Linux支持多种调度器(deadline/realtime/cfs/idle),其中CFS调度器最常见.Li ...

    3. Linux进程管理 (2)CFS调度器

      关键词: 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 Linux进程管理 ( ...

    4. Linux进程管理 (7)实时调度

      关键词:RT.preempt_count.RT patch. 除了CFS调度器之外,还包括重要的实时调度器,有两种RR和FIFO调度策略.本章只是一个简单的介绍. 更详细的介绍参考<Linux进 ...

    5. [Wolfgang Mauerer] 深入linux 内核架构 第二章 进程管理与调度【未完】

       作为Linux开发爱好者,从事linux 开发有三年多时间.做过bsp移植,熟悉u-boot代码执行流程:看过几遍<linux 设备驱动程序开发>,分析过kernel启动流程,写过驱动, ...

    6. 深入Linux内核架构——进程管理和调度(上)

      如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...

    7. Linux进程管理子系统分析【转】

      本文转载自:http://blog.csdn.net/coding__madman/article/details/51298732 Linux进程管理: 进程与程序: 程序:存放在磁盘上的一系列代码 ...

    8. Linux进程管理知识整理

      Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...

    9. Linux性能及调优指南(翻译)之Linux进程管理

      本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...

    随机推荐

    1. windows下根据tcp端口查询对应的进程id(端口被占用)

      如下: 查询监听LISTENING的端口1027 netstat -navo|find /i "listen"|find /i ":1027" 结果如下(最后一 ...

    2. C/C++ 面试-内存对齐 即不同数据类型存储空间

      下面列举了Dev-C++下基本类型所占位数和取值范围: 基本型                          所占位数              取值范围                输入符举例 ...

    3. python常用英文单词

      application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument ...

    4. 本地mysql启动之后,另外一台电脑利用数据库访问软件,连接问题

      背景:在一台电脑上面安装MySQL数据库之后,利用另一台电脑访问本台电脑上面的数据,访问失败的问题 解决方法 开启 MySQL 的远程登陆帐号有两大步: 1.确定服务器上的防火墙没有阻止 3306 端 ...

    5. linux grep的用法

      linux grep的用法<pre>[root@iZ23uewresmZ ~]# cat /home/ceshis.txtb124230 b034325 a081016 m7187998 ...

    6. 三、Spring的@Scope设置组件作用域

      还是和上节一样,首先来看下配置类:MainConfig2 @Configuration 名 public class MainConfig2 { @Scope("singleton" ...

    7. python is 和 == 区别(8)

      在python中is和==都说常用的运算符之一,主要用于检测两个变量是否相等,返回True或者False,具体区别在哪呢? 一.前言 在讲解is和==区别直接先讲解一下内置函数id(),其实在文章 p ...

    8. 第1/7Beta冲刺

      1.团队成员 成员姓名 成员学号 秦裕航 201731062432(组长) 刘东 201731062227 张旭 201731062129 王伟 201731062214 2.SCRU部分 2.1各成 ...

    9. C语言函数库帮助文档

      C语言函数库帮助文档 安装 1.C语言库函数基本的帮助文档 sudo apt-get install manpages sudo apt-get install manpages-de sudo ap ...

    10. 【LEETCODE】48、数组分类,简单级别,题目:189,217,219,268,283,414

      package y2019.Algorithm.array; import java.util.Arrays; import java.util.Stack; /** * @ClassName Rot ...