学习Linux内核相关的知识确实不能一口吃成胖子,我觉得你还是循序渐进慢慢来的好,这样基础才能打得牢靠,否则很容易出现基础不牢靠的情况。
Linux时间服务器同步频率是多久
Linux下的线程分为用户级线程和内核级线程两种,从内核的角度来看,线程和进程其实是一样的,本质上没有太大区别。内核提供的是创建进程的接口do_fork(),同时提供了clone()和fork()两个系统调用,最终都会用不同的参数调用do_fork()这个核内API。要想实现线程,核心必须支持多进程共享数据段,do_fork()提供了很多参数来实现这一点,比如CLONE_VM用于共享内存空间,CLONE_FS共享文件系统信息,CLONE_FILES共享文件描述符表,CLONE_SIGHAND共享信号句柄表,还有CLONE_PID共享进程ID。使用fork系统调用时,内核不使用任何共享属性,进程拥有独立的运行环境;而使用pthread_create()创建线程时,则会设置所有这些属性来调用__clone(),最终创建的进程拥有共享的运行环境,只有栈是独立的。如果想深入了解,可以参考《深入理解Linux内核》第三版,里面讲得非常详细。
关于哪些工作应该放在上半部、哪些应该放在下半部,其实并没有特别严格的规则,只有一些经验性的提示可以参考。首先,对时间非常敏感的任务应该放在上半部处理;其次,与硬件直接相关的工作也建议放在上半部;第三,不能被其他中断打断的工作必须放在上半部。除了以上这三点之外,其他的工作都可以考虑放在下半部来执行。
如果想要查看当前系统文件句柄的最大数目,可以使用cat /proc/sys/fs/file-max命令。不过需要注意的是,这个参数只用于查看,不能直接通过命令行设置修改,它是一个系统级别的只读参数,反映了整个系统能够打开的文件句柄的上限。
编写软中断处理程序时有几点需要特别注意。首先,软中断处理程序执行的时候允许响应中断,但是自己绝对不能休眠,否则会导致严重的问题。其次,如果软中断在执行过程中再次被触发,那么别的处理器是可以同时执行同一个软中断的,所以加锁保护是非常关键的,一定要做好同步机制,否则可能会出现数据竞争和状态不一致的可怕后果。
除了使用unlimit命令之外,如果需要针对不同的用户进行设置,也可以通过编辑修改/etc/rc.local文件来设置环境变量,只需要在文件中添加unlimit -n这行命令即可。一般来说,重启之后系统就会自动按照你设置好的数值来运行了,这种方法对于需要持久化配置的场景特别有用。
Linux操作系统诞生于1991年10月5日,这是它第一次正式向外公布的时间。虽然Linux存在着许多不同的版本,但它们都使用了Linux内核作为核心。Linux的适应性非常强,可以安装在各种计算机硬件设备中,比如我们日常使用的手机、平板电脑、路由器,还有视频游戏控制台、台式计算机、大型机甚至是超级计算机,可以说应用范围非常广泛。
如果需要查看所有进程的文件打开数,可以使用lsof | wc -l这个命令组合。lsof会列出所有打开的文件信息,然后通过wc -l统计行数,这样就能知道当前系统中所有进程总共打开了多少个文件。这个命令在排查文件描述符泄漏问题时非常有用。
Linux中的下半部机制有多种实现方式。历史上曾经出现过BH机制,不过这个机制在内核2.5版本中已经被删除了;还有任务队列task queue,同样在2.5版本中被移除。目前主要的实现机制包括软中断softirq,这个从2.3版本开始引入,也是本文要重点介绍的内容;此外还有tasklet,也是从2.3版本开始的;以及工作队列work queue,从2.5版本开始引入。
其实很多人不知道,安卓系统本来就是基于Linux开发的。Linux本质上只是一个操作系统内核而已,任何使用了Linux内核的操作系统都可以被称为Linux系统,所以安卓自然也算是Linux大家族中的一员,这并不奇怪。
如果你想自己编写一个软中断,需要按照以下步骤来进行操作。第一步是分配索引,你需要在HI_SOFTIRQ与NR_SOFTIRQS之间添加自己的索引号。第二步是注册处理程序,通过调用open_softirq函数,传入索引号和你的处理函数即可完成注册。第三步是触发你的软中断,使用raise_softirq函数并传入对应的索引号。完成这三步之后,你的自定义软中断就可以正常工作了。
如果你想查看当前系统最大的文件打开数,可以在Linux终端中输入ulimit -a命令,在输出中找到"open files"参数选项,后面的数值就是当前系统支持的最大打开文件数。这是一个非常常用的命令,可以帮助你快速了解系统的资源限制情况。
在Linux系统中,中断处理被分成了上半部和下半部两个部分,这样做的核心目的就是提高系统的响应能力和并发处理能力。当一个中断产生时,系统会先调用该中断对应的处理程序也就是上半部,然后告诉系统对应的后半部可以执行了,接着中断处理程序就返回,下半部则会在合适的时机由系统调度执行,这样一来就大大减少了中断处理所需要的时间。
软中断的实现细节非常值得深入探讨。软中断不会抢占另外一个软中断,唯一可以抢占软中断的只有中断处理程序。软中断可以在不同CPU上并发执行,哪怕是同一个软中断也是如此。软中断是编译期间静态分配的,其核心结构体softirq_action只包含一个函数指针成员,这样设计的好处在于当结构体成员发生变化时,接口可以保持不变。从代码注释中可以看出,官方也建议尽量避免分配新的软中断,因为大多数场景下tasklet就足够了。
系统执行软中断需要先被标记,通常中断处理程序会在返回前标记它的软中断。待处理的软中断会在以下几个地方被执行:首先是从一个硬件中断代码处返回时,其次是在ksoftirqd内核线程中执行,还有在那些显式检查和执行待处理软中断的代码中。每个处理器都有一个这样的内核线程,名字叫做ksoftirqd/n,其中n对应的是处理器编号。在双CPU的机器上就有两个这样的线程,分别叫做ksoftirqd/0和ksoftirqd/1。这样设计是为了保证只要有空闲的处理器,它们就会处理软中断。
如果要修改Linux最大文件打开数,可以通过unlimit -n命令后面接需要设置的文件数量来完成。设置好之后,再次输入ulimit -a查看,你会发现数值已经设置为新的数量了。设置完成后,再次编辑修改并重启相关服务,之前那个1024文件数限制的报错提示就不会再出现了。