Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

Linux内核分析(四)

两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理子系统、网络子系统、虚拟文件系统在这个阶段进行分析的,但是为了让大家对内核有个整体的把握,今天还是简单的介绍一下剩余的几个子系统,我们对这几个子系统的分析,只要了解其作用和部分内容即可,不必深究,等我们写上几个驱动,到时候按照驱动再来分析这几个子系统我们就清晰多了。

http://www.cnblogs.com/wrjvszq/p/4257164.html一文我们提到过linux由七个部分构成,最重要的四个子系统是内存管理子系统、进程管理子系统、网络子系统、虚拟文件系统、上次我们已经对内存管理子系统进行了分析(谈不上分析,只是个简单了解)。

所以今天我们会分析到以下内容:

1.      Linux进程管理子系统

2.      Linux网络子系统

3.      虚拟文件系统

4.      Linux设备驱动简介

Linux进程管理子系统

在进程管理中最重要的就是进程的调度和进程的通信下面我们一一分析。

1.       进程调度

进程调度使得多个进程增长CPU中“微观串行,宏观并行”的进行执行。进程调度处于系统的中心位置,内核中其他子系统都依赖于它。

a)      进程调度意义

进程调度使得多个进程增长CPU中“微观串行,宏观并行”的进行执行。进程调度处于系统的中心位置,内核中其他子系统都依赖于它。

b)      进程的状态切换

Linux的进程在几个状态间进行切换,如下图展现了其切换关系。

c)      进程调度策略

Linux中常见的有以下

1)    SCHED_OTHER 分时调度策略。

2)    SCHED_FIFO实时调度策略,先到先服务

3)    SCHED_RR实时调度策略,时间片轮转

2.       进程通信

Linux支持进程间的多种通信机制,可以通过这些通信机制进行多个进程、多资源的互斥访问、进程间的同步和消息传递。

a)      linux进程间通信方式

1)        管道:分为有名管道(用于同一系统间的任意进程)和无名管道(用于父子进程)

2)        信号量

3)        信号

4)        消息队列

5)        共享内存

6)        套接字(socket)

Linux网络子系统

Linux网络子系统提供了对各种网络标准的存取和各种硬件的支持。下图是其整体结构。其可以分为协议层和网络驱动程序,其中网络协议主要负责实现每一种可能的网络传输协议,而网络驱动程序负责与硬件通信。

Linux虚拟文件系统

Linux虚拟文件系统(VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,它是对各种文件系统的一个抽象,其实使用超级块super block存放文件系统相关信息,使用索引节点inode存放文件的物理信息,使用目录项dentry存放文件的逻辑信息,其整体架构如下。

Linux设备驱动简介

上面的介绍很简单,仅仅是对这些子系统的概念什么的进行了简介,下面我们对linux设备驱动进行简单介绍。

1.       设备驱动分类

Linux分为下面三种基本设备。

a)      字符设备

是一种按照字节来访问的设备,字符设备适用于大多数的简单硬件。常见的LED、按键等

b)      块设备

是一种以块(通常为512字节)为最小访问单位的设备,常见的硬盘、SD卡等。但在linux中对块没有大小限制,可以访问任意数目的字节。

c)      网络设备

用来负责发送和接收报文的设备,比如网卡。

今天的简单分析就先到这里,我以后会慢慢的伴随着驱动的开发去分析内核,感谢大家的关注。

 

来自为知笔记(Wiz)

时间: 2024-10-18 08:39:25

Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介的相关文章

linux内核学习:进程管理

进程状态 TASK_RUNNING 可运行或正在运行 TASK_INTERRUPTIBLE 进程被阻塞,但可以被信号唤醒 TASK_UNINTERRUPTIBLE 进程被阻塞,且不可以被信号唤醒 TASK_STOPPED 进程已停止,且不能再投入运行 TASK_ZOMBIE 所谓的僵死进程,进程描述符仍然保留 关键函数和结构 task_struct thread_info current clone fork exec wait exit linux内核学习:进程管理,布布扣,bubuko.co

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内核分析之内存管理

1.struct page 1 /* Each physical page in the system has a struct page associated with 2 * it to keep track of whatever it is we are using the page for at the 3 * moment. Note that we have no way to track which tasks are using 4 * a page, though if it

[转]linux内核分析笔记----内存管理

转自:http://blog.csdn.net/Baiduluckyboy/article/details/9667933 内存管理,不用多说,言简意赅.在内核里分配内存还真不是件容易的事情,根本上是因为内核不能想用户空间那样奢侈的使用内存. 先来说说内存管理.内核把物理页作为内存管理的基本单位.尽管处理器的最小可寻址单位通常是字,但是,内存管理单元MMU通常以页为单位进行处理.因此,从虚拟内存的交代来看,页就是最小单位.内核用struct  page(linux/mm.h)结构表示系统中的每个

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

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

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 简单来讲,

DroidPlugin代码分析(四) 进程管理

之所以单列一篇写进程管理,是因为看到注释上写"这是一个复杂的进程管理程序",但是仔细看了一下好像也没那么"复杂"... 这一篇通过分析代码试图搞清楚以下3个问题: ? 插件进程是如何被hook住的? ? 插件进程die是如何被检测到的? ? 插件进程是如何被管理的? 一.插件进程是如何被hook住的? 在写宿主程序的时候,我们知道需要在Application的onCreate()和attachBaseContext()里调用PluginHelper的API来安装ho

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

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

linux内核学习之进程管理------task_struct结构体

struct task_struct { volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */ struct thread_info *thread_info; atomic_t usage; unsigned long flags;    /* per process flags, defined below */ unsigned long ptrace; int lock_depth;     /* Lock