Linux内核详解(一)

Linux内核描述

通常Linux内核有负责响应中断的中断服务程序,负责管理多个进程从而分享cpu时间的调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序组成。在系统中运行的应用程序通过系统调用来与内核通信,通常是调用库函数(比如C库函数),再由库函数通过系统调用让内核完成各种不同任务。另外库函数和系统调用并不一定是一一对应的。

内核还要负责管理系统的硬件设备,当硬件设备要与系统进行通信时(比如键盘),它(键盘控制器)首先会发出一个异步中断信号打断cpu的执行,继而打断内核的执行,中断通常对应一个中断号,内核通过这个中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。

Linux进程管理

在Linux中进程的创建是通过父进程调用fork创建子进程,在调用结束时,在返回点这个相同的位置上,父进程回复执行,子进程开始执行。fork系统调用从内核中返回两次:一次回到父进程,另一次回到子进程。进程创建完成后紧接着调用exec方法创建新的地址空间,并把新的程序载入进入。最终程序通过exit系统调用终结进程并释放其所占用的资源。进程退出执行后被设置为僵死状态,直到其父进程调用wait或waitpid为止。


内核把进程列表存放在task list的双向循环链表中,链表的每一项都是称为进程描述符task_struct,进程描述符包含了一个具体进程的所有信息。对于进程描述符的分配是通过slab分配器动态生成task_struct,所以只需要在栈底创建一个新的结构struct thread_info,在thread_info中有一个指向task_struct的指针。


内核通过PID来唯一标识每个进程(存放在进程描述符task_struct中);进程描述符中的state域描述了进程当前状态,在Linux中有五种:运行(就绪/执行,是进程再用户空间唯一可能的状态)、可中断(睡眠/阻塞)、不可中断、被其他进程跟踪(ptrace对调试程序进行跟踪)、终止。

每个进程都有一个父进程,相应的,每个进程也可能有零个或多个兄弟进程,进程间的关系存放在进程描述符中;具体来说,每个task_struct包含一个指向其父进程task_struct的名为parent的指针,还包含一个名为children的子进程链表。


Linux创建进程使用fork和exec两个函数来实现:首先fork通过拷贝当前进程创建一个子进程,子进程与父进程的区别仅仅在于PID、PPID(父进程PID)以及某些资源和统计量(比如挂起的信号);exec函数负责读取可执行文件并将其载入到地址空间开始运行。

Linux中的fork使用写时拷贝(copy-on-write)来实现,它可以推迟甚至避免拷贝数据,此时内核并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝,并且只有需要写入的时候才会复制数据,从而使各个进程拥有各自的拷贝,如果页不会被写的话就不需要拷贝。fork的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符,通常进程再创建后随即运行一个可执行文件,通过写时拷贝就可以避免复制大量根本就不会被使用的数据。

Linux通过clone系统调用来实现fork,fork库函数根据不同参数去调用clone,然后由clone去调用do_fork。在do_fork中,首先为新进程创建一个内核栈、thread_info和task_struct,这些值与当前进程的值一致(即父子进程的描述符相同);接着检查确保当前进程数没有超过阈值;然后task_struct部分成员初始化(比如子进程的状态、PID等),最后根据传递给clone的参数标志,拷贝或共享打开的文件、文件系统信息、进程地址空间和命令空间等,并返回一个指向子进程的指针。


Linux实现的线程机制非常独特,Linux把所有线程都当做进程来实现,每个线程都拥有自己的task_struct,所以在内核中,线程仅仅被当做和其他进程共享某些资源(比如地址空间)的进程。而Windows在内核中专门提供了线程机制,即轻量级进程(而Linux的进程本身就够轻量级了)。线程的创建和进程类似,只不过在clone调用时需要传递一些参数标志来指定需要共享的资源。


Linux内核线程是独立运行在内核空间的标准进程,通常用来在后台执行一些操作。内核线程和普通进程间的区别在于内核线程没有独立的地址空间(实际上指向地址空间的mm指针被置为NULL)。


如果父进程在子进程之前退出,那么必须保证子进程找到一个新的父进程,否则这样称为孤儿的进程就会在退出时永远处于僵死状态,白白耗费内存——可以在当前线程组内找一个线程作为父进程(或让init作为父进程),查找是在一个单独的被ptrace跟踪的子进程链表中搜索相关的兄弟进程(init进程会例行调用wait来检查其子进程,清除所有与之相关的僵死进程)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值