1.进程:

(1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的

程序的实时结果。

(2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称。

(3)两个或两个以上并存的进程可以共享诸如打开的文件,地址空间等共享资源。

(4)在Linux中通常是调用fork()系统函数的结果,通过复制一个现有的进程来创建一个新的子进程。

fork()系统函数

(5)fork在这个系统调用结束时,在同一位置上返回两次(从内核返回两次),父进程恢复运行,子进程开始运行。

exec()系统函数

(6)  exce这组函数可以创建新的地址空间,并将新的程序载入其中。

exit()系统函数

(7)程序通过exit()系统调用退出执行,这个进程会终结进程,并将其占用的资源释放掉

wait4()系统函数

(8)父进程通过wait4()系统调用来查询子进程是否终结。

执行线程:简称线程,在进程中活动的对象,每个线程都拥有独立的程序计数器,进程栈,和一组进程寄存器。

2.进程描述符及其任务结构

(1)任务队列:进程的列表存放的一个双向循环链表

(2)进程描述符:这个链表的每个元素的类型,为task_stuct的结构体,包含的数据能完整的描述一个正在执行的程序的所         有信息,包括:打开的文件,进程的地址空间,挂起的信号,进程的状态,等。。

(3)分配进程描述符:linux通过slab分配器,分配task_struct结构,每个任务的thread_info结构在它的内核栈的尾端分配         结构中的task域的存放的是指向该任务的实际的task_struct指针。

(4)进程描述符的存放:内核通过唯一的进程标示值或者说PID值来标识每一个进程,PID是一个数,表示为pid_t隐含类型

实际上就是一个int型。

(5)进程的状态:

1>运行态:

2>可中断:(被阻塞)

3>不可中断:就算是接受到信号也不会被唤醒或者准备运行(其它和2相同)

4>:被其他进程跟踪的进程

5>停止:进程停止执行

(6)进程上下文:

一般程序在用户空间执行,当一个程序执行了系统调用或者触发了某种异常时,它就陷入了内核空间,即内核代表

进程执行,并处于进程的上下文中。

当内核执行完毕后,可以退出内核空间,并恢复到程序的用户空间继续运行。

(7)进程家族树:

在unix中进程有着明显的继承关系,进程pid为1的init进程为其它所有进程的父进程,一个父进程可以有许多的子进程

在每个进程的描述符中的task_struct结构体中有指向父进程的指针,有着指向子进程的指针链表

3.进程创建

fork():拷贝当前的进程形成一个新的子进程

exec():负责读取可执行文件,并载入到地址空间开始运行。

(1)写时拷贝技术:

这是一种可以推迟甚至免除拷贝的技术,只有当写入时,数据才会开始复制。

(2)fork():

fork的实际开销是复制父进程的页表已经给子进程创建唯一的进程描述符。

(3)vfork():

除了不拷贝父进程的页表外,其它的和fork没啥区别。

4.线程在linux中的实现

(1)该机制提供了在同一程序内共享内存地址空间运行的一组线程,这些线程还可以共享打开的文件等其它资源

(2)在linux中线程仅仅被看做与其它进程共享一些资源的进程。

(3)对于linux来说,他只是一种进程间共享资源的一种手段(linux进程本来已经够轻量级了)

(4)创建线程和创建进程时都用clone()。只是传入的参数不同,线程还需共享一些资源,还有内存空间

(5)内核线程:独立运行于内核空间中的标准进程,她没有独立的地址空间,她只在内核空间中运行,不会切换到用户空间

5.进程终结

(1)进程的析构是由自身引起的,他发生在显式的或隐式的调用系统函数exit()的过程,并且大部分的工作由do_exit完成

(2)当exit()后,与进程相关的资源被释放掉了,该进程不可运行。

(3)但在do_exit后尽管线程已经僵死不能运行了,但系统还保留了它的进程描述符。

(4)孤儿进程造成的进退维谷:如果父进程在子进程之前退出,必须有机制来保证子进程能找到一个新父亲,否则这些子进           程就会在退出时永远处于僵死状态,白白的耗费内存。

所以在do_exit()函数中会调用exit_notify()。而这个函数又会调用forget_original_parent(),这个函数又会         调用find_new_parent()来执行寻父过程。

Linux内核设计与实现——读书笔记2:进程管理的更多相关文章

  1. Linux内核设计与实现 读书笔记 转

    Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...

  2. Linux内核设计与实现 读书笔记

    第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...

  3. Linux内核设计与实现读书笔记(8)-内核同步方法【转】

    转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...

  4. Linux内核设计与实现——读书笔记1:内核简介

    内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...

  5. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...

  6. Linux内核架构与底层--读书笔记

    linux中管道符"|"的作用 命令格式:命令A|命令B,即命令1的正确输出作为命令B的操作对象(下图应用别人的图片) 1. 例如: ps aux | grep "tes ...

  7. Linux内核设计第十七章笔记

    第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...

  8. Linux内核分析 一二章读书笔记

    第一章 Linux内核简介 1.Unix (1)Unix系统很简洁 (2)在Unix中,所以东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lsee ...

  9. 《Linux内核设计与实现》笔记-1-linux内核简单介绍

    一.Linux内核相对于传统的UNIX内核的比較: (1):Linux支持动态内核模块. 虽然Linux内核也是总体式结构,但是同意在须要的时候动态哦卸除(rmmod xxx)和载入内核模块(insm ...

随机推荐

  1. RPC之远程过程调用

    一. 简介 将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC. RPC是一个计算机通信协议. 1. 类比: 将计算机服 ...

  2. PHP一句话后门过狗姿势万千之后门构造与隐藏

    第二章节主要带给大家一些后门构造思路,与安全狗文件特征检测的机制. 另外强调一下,这篇文章需要大家对于php有一定的认识. 本章节分为三大部分,第一部分针对初级,分析菜刀php代码的执行过程,较基础: ...

  3. Django请求,响应,ajax以及CSRF问题

    二.request对象常用属性: Attribute Description path 请求页面的全路径,不包括域名端口参数.例如: /users/index method 一个全大写的字符串,表示请 ...

  4. 关于Error:Maven Resources Compiler: Maven project configuration required for module '项目名' isn't available. Compilation of Maven projects is supported only&

    总是出现Error:Maven Resources Compiler: Maven project configuration required for module '项目名' isn't avai ...

  5. Can't connect to MySQL server on '127.0.0.1' (10061)

    一条命令解决 mysqld --initialize-insecure --user=mysql 但这只是简单解决问题,详细查看百度经验,知乎上的讨论 forget root password ref ...

  6. 浅谈stiring数

    在组合数学,Stirling数可指两类数,第一类Stirling数和第二类Stirling数. stirling常应用于许多组合枚举问题中. 第一类stirling数: 对第一类Stirling数   ...

  7. STL 源码分析六大组件-allocator

    1. allocator 基本介绍 分配器(allocator))是C ++标准库的一个组件, 主要用来处理所有给定容器(vector,list,map等)内存的分配和释放.C ++标准库提供了默认使 ...

  8. rc-local.service服务启动失败,导致rc.local中的开机启动服务不能启动

    chmod  +x   /etc/rc.d/rc.local 打开/etc/rc.local文件,将启动非后台执行的指令的最后添加 &,以使相关指令后台运行,然后启动服务 systemctl  ...

  9. 优化子查询sql语句为内连接

    背景: 希望提高查询的效率,从sql语句中频繁出现的子查询入手. 数据表如下:Student表中的CityCode对应于City表中的Code. Student表:                   ...

  10. Sql按照字段分组,选取其他字段最值所在的行记录

    引言: 为什么会引入这个问题,在程序中遇到这样的问题,在某个数据表中,相同的AID(项目ID)被多次添加到数据表中,所以对应于不同的时间,只想选取添加时间最早的哪一条记录. 参考:红黑联盟 所用到的数 ...