Linux内核设计与实现读书笔记(2)-进程管理

本文介绍了Linux系统中进程管理的核心概念和技术细节,包括进程数量限制、进程描述符、进程状态、系统调用、fork()与vfork()的区别、clone()系统调用及其参数标志等内容。

Linux内核设计与实现读书笔记(2)-进程管理

    今天读了第二章,与大家分享一下我的心得。

    1、linux系统中允许同时存在的进程的最大数目为32767,这是因为PID的最大值默认设置为32767(short int短整型的最大值)。如果需要更多进程,系统管理员可以通过修改/proc/sys/kernel/pid_max来提高上限。

    2、内核把进程存放在叫做任务队列(task list)的双向循环链表中。链表中的每一项都是类型为task_struct,称为进程描述符的结构,该结构在32位机器上大约有1.7K字节。2.6内核通过slab分配器动态生成task_struct。

    3、进程描述符中的state域描述了进程当前的状态,该域的值必为下列五种状态之一:

    •  TASK_RUNNING(运行) — 进程是可执行的;它或者正在执行,或者在运行队列中等待执行。

    •  TASK_INTERRUPTIBLE(可中断) — 进程正在睡眠(也就是说它被阻塞),等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为运行。处于此状态的进程也会因为收到信号而被提前唤醒并投入运行。

    •  TASK_UNINTERRUPTIBLE(不可中断) — 除了不会因为接收到信号而被唤醒从而投入运行,这个状态与可中断状态相同。这个状态通常在进程必须在等待时不受干扰或等待事件很快发生时出现。

    •  TASK_ZOMBIE(僵死) — 该进程已经结束了,但是其父进程还没有调用wait4()系统调用。为了父进程能够获知它的消息,子进程的进程描述符仍然被保留着。

    • TASK_STOP PED(停止) — 进程停止执行。通常这种状态发生在接收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号的时候。此外,在调试期间接收到任何信号,都会使进程进入这种状态。

    4、系统调用和异常处理程序是对内核明确定义的接口。进程只有通过这些接口才能陷入内核执行。Linux中所有的进程都是PID为1的init进程的后代。

    5、fork()通过拷贝当前进程创建一个子进程。Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。

    6、vfork()系统调用和fork()的功能相同,除了不拷贝父进程的页表项。子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec()。子进程不能向地址空间写入。但由于其设计并不优良所以最好让它逐渐淡出。

    7、Linux通过clone()系统调用实现fork()。这个调用通过一系列参数标志来指明父、子进程需要共享的资源。如一个普通的fork()的实现是clone(SIGCHLD,0); vfork()是clone(CLONE_VFORK | CLONE_VM | SIGCHLD,0);

    clone()的参数标志定义如下:

    • CLONE_CLEARTID — 清除TID

    • CLONE_DETACHED — 父进程不需要子进程退出时发送SIGCHLD

    • CLONE_FILES — 父子进程共享打开的文件

    • CLONE_FS — 父子进程共享文件系统信息

    • CLONE_IDLETASK — 将PID设置为0(只供idle进程使用)

    • CLONE_NEWNS — 为子进程创建新的命名空间

    • CLONE_PARENT — 指定子进程与父进程拥有同一个父进程

    • CLONE_PTRACE — 继续调试子进程

    • CLONE_SETTID — 将TID回写至用户空间

    • CLONE_SETTLS — 为子进程创建新的TLS

    • CLONE_SIGHAND — 父子进程共享信号处理函数

    • CLONE_SYSVSEM — 父子进程共享System V SEM_UNDO语义

    • CLONE_THREAD — 父子进程放入相同的线程组

    • CLONE_VFORK — 调用vfork(),所以父进程准备睡眠等待子进程将其唤醒

    • CLONE_VM — 父子进程共享地址空间

    • CLONE_KERNEL — 定义了内核线程常用到的参数标志:CLONE_FS、CLONE_FILES、CLONE_SIGHAND。

以下是关于《Linux内核设计实现》的笔记: 1. 进程管理 - 进程控制块(Process Control Block, PCB):一个进程内核中的表示,包含了进程的状态、各种计数器和指针,以及进程所需要的资源。 - 进程调度:内核须在可能的情况下公平地分配CPU时间片给每个进程Linux内核使用完全公平调度(Completely Fair Scheduler, CFS)来实现这一点。 - 进程同步:进程在访问共享资源时需要同步,以避免冲突。Linux内核提供了多种同步机制,如信号量、自旋锁和读写锁等。 2. 内存管理 - 虚拟内存:每个进程都拥有自己的虚拟内存空间,这使得每个进程都可以认为自己独占整个系统内存。 - 页面置换:当物理内存不足时,Linux内核会使用页面置换算法将一部分未使用的页面从物理内存中移出,以便为正在运行的进程腾出空间。 - 内存映射文件:Linux允许将磁盘上的文件映射到进程的虚拟地址空间中,这样就可以像访问内存一样访问文件。 3. 文件系统 - 虚拟文件系统(Virtual File System, VFS):Linux内核中的抽象层,它允许系统支持多种文件系统格式,如ext4、FAT32等。 - I/O管理:内核须管理所有的I/O操作,包括磁盘读写和网络通信等。 - 文件描述符Linux内核使用文件描述符来标识打开的文件,每个进程都有一个文件描述符表。 4. 网络协议栈 - TCP/IP协议栈:Linux内核支持多种网络协议,其中最常用的是TCP/IP协议栈。 - Socket:在Linux中,进程之间通信的主要方式是使用Socket。Socket是一种抽象的概念,它代表了一个网络连接。 5. 设备驱动程序 - 驱动程序开发:Linux内核的设备驱动程序通常是以模块的形式开发的,它们可以动态地加载和卸载。 - 设备文件:Linux内核将设备表示为文件,它们可以通过文件系统接口来访问。 以上是《Linux内核设计实现》的一些重点内容和笔记,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值