《Linux内核设计与实现》读书笔记 第三章 进程管理

news/2024/7/7 20:47:45

第三章进程管理

            进程是Unix操作系统抽象概念中最基本的一种。我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在。

3.1进程

         概念:

进程:处于执行期的程序。但不仅局限于程序,还包含其他资源(打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内催音社的内存地址空间及一个或多个执行线程,存放全局变量的数据段等)

                  内核需要有效又透明地管理所有细节。

线程:执行线程的简称,是在进程中活动的对象。每个线程有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程而不是进程。

         进程提供两种虚拟机制:虚拟处理器和虚拟内存。

线程之间可以共享虚拟内存,但每个都拥有各自的虚拟存储器。

进程创建:调用fork(),该系统调用通过复制当前进程创建新进程。使用fork()的是父进程。在调用结束时,在返回点这个相同位置,父进程恢复,子进程开始执行。

进程也叫任务。

 

3.2进程描述符及任务结构

         内核把进程的列表存放在叫做任务队列的双向循环链表中。链表中的每一项都是task_struct类型,称为进程描述符的结构。

         该结构内包含了内核管理一个进程所需的所有信息。

分配进程描述符:通过slab分配器分配,为了对象复用和缓存着色。

进程描述符的存放:进程通过一个唯一的进程标识值(process identification value)标识每个进程。PID最大默认32768,,就是系统中允许同时存在的进程最大数目。

进程状态:进程描述符中的state域描述了进程的当前状态,有五种状态:运行、可中断、不可中断、被跟踪、停止。

设置当前进程状态:调整状态使用set_task_state(task,state)函数。

进程家族树:系统进程有明显的继承关系。所有进程都是init的后代。每个进程都有父进程,相同父进程的成为兄弟。

 

3.3进程创建

         Fork()和exec()

Fork()通过拷贝当前进程创建一个子进程。Exec()函数负责都去可执行文件,并将其载入地址空间开始运行。

写时拷贝:fork()复制所有资源是效率低下的,因此采用写时拷贝,推迟甚至免除拷贝数据。只有需要写入的时候,数据才被复制。

Fork():通过clone()系统调用实现fork()。do_fork()调用copy_proceess()函数

l  调用dup_task_struct()为新进程创建一个内核栈、thread_info结构和task_stuct结构。这些与当前进程相同,PID也相同。

l  检查创建子进程后,用户多有进程书目没有超出它分配的资源的限制。

l  进程描述符的许多成员都要清零或设为默认,以和父进程区分开。

l  子进程状态被设置为TASK_UNINTERRUPTIBLE,确保不会被投入运行。

l  调用alloc_pid()为新进程分配一个有效ID

l  Copy_process()做扫尾工作,返回一个指向子进程的指针。

Vfork():与fork()的区别就是不考贝父进程页表项。现在没啥用了。

 

3.4线程在Linux中的实现

         从内核角度说,Linxu没有线程概念。所有线程都被当作进程

         创建进程:和创建普通进程差不多,只是在调用clone()时需要传递一些参数标志。

         内核线程:kernel thread和普通进程的区别在于内核线程没有独立地址空间。只在内核空间运行。

 

3.5进程终结

         当一个进程终结,内核必须释放所占有的资源,并告知父进程。

靠do_exit()实现:

l  将tast_struct中的标志成员设置为PF_EXITING

l  调用del_timer_sync()删除任一内核定时器

l  调用acct_update_integrals()输出记账信息

l  调用exit_mm()释放进程占用的mm_struct。

l  调用sem_exit()若进程排队等候IPC,则离开

l  调用exit_files()和exit_fs()分别递减文件描述符和文件系统数据的应用计数。

l  调用exit_notify()向父进程发送信号,给子进程找养父。。。

l  do_exit调用schedukle(0切换到新进程。

删除进程描述符:

若父进程在子进程之前退出。孤儿进程会在退出时处于永远僵死状态。

转载于:https://www.cnblogs.com/haikong/p/5330819.html


http://lihuaxi.xjx100.cn/news/243522.html

相关文章

SDK开发日积月累(二)

WM_NOTIFY消息和WM_COMMAND消息在一个对话框中,子控件可以有两种方式与父对话框通信。1.向父对话框发送WM_COMMAND消息,但这种消息传递的信息量比较少。2.向父对话框发送WM_NOTIFY消息,信息量比较大。idCtrl (int) wParam; pnmh (LPNMHDR) …

零基础学习Java培训有什么攻略

零基础学习Java培训有什么攻略?java是主流编程语言之一,我们在学习Java的时候需要制定Java学习路线图,Java涉及到的知识点非常的多,我们该从何学起呢?怎么系统的学习呢?来看看下面的详细介绍。 一、Java学习阶段 将Java学习过程分为3个阶段…

笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任何节点的键值大于等于该节点左子树中的所…

深入理解Java内存模型(四)——volatile

2019独角兽企业重金招聘Python工程师标准>>> volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作…

UI设计要做什么,UI设计培训都要学什么

UI设计要做什么,UI设计培训都要学什么?相信有很多人都对这个问题比较感兴趣,近几年,UI设计被越来越多的人关注,行业薪资水平也是一路飙升,很多人都在准备学习UI设计,那么具体的内容,下面我们来…

ThreadLocal源码分析

ThreadLocal的作用 Java对象是线程间共享的,但有时我们需要一些线程间隔离的对象,该对象只能由同一个线程读写,对其他线程不可见。ThreadLocal正式提供了这样的机制,详细使用方式请参考Java ThreadLocal。 ThreadLocal实现原理 自…

一个疯狂想法

2011年新年元旦晚上一直没睡好觉,新一年的网站规划,反思过去。辗转反侧,想到了公司内部网站的打通问题,于是诞生我这个不靠谱的“伟大”想法,哈哈。 全世界的网站,可能代码重复最高的就是类似jquery,protot…

mysql本地可以访问 网络不能访问

远程登陆数据库的时候出现了下面出错信息:  ERROR 2003 (HY000): Cant connect to MySQL server on xxx.xxx.xxx.xxx,  经过今天下午的反复纠结,关于MySql数据库无法远程连接的问题可以归结为以下几点: 1). 没有授予相应的权限:  例如,你想root使用123456从任…