linux基本思想
Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。
在LINUX系统中有一个重要的概念:一切都是文件。 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。这样带来优势也是显而易见的
在unix中要了解文件系统,就要先了解文件链接的概念。在一个磁盘中有n个分区,一个分区又有自举块,超级块,柱面组等的概念组成的文件系统。柱面组下又分节点,数据块等。由磁盘,分区到文件系统一层一层的嵌套。下图是Linux整体分层结构图
Linux中断
Linux中断分为硬中断和软中断。
硬中断是由硬件设备触发的中断。I/O设备要产生硬中断时,会由中断控制器发送一个电信号,内核的设备驱动程序接收到这个电信号,就会调用相应的中断处理函数对这个中断进行处理。硬中断可以在任何时刻到来,它代表的系统必须马上处理的紧急任务,也简称为中断的上半部,与此对应的是中断下半部(buttom half),也称为软中断,代表的系统不必马上处理的、没那么紧急的任务。
软中断处理函数一般在硬中断处理函数的末尾调用。硬中断处于所谓的“中断上下文中”。与此对应的是“进程上下文”。下面解释一下进程上下文,每个用户进程都可以分为用户态和内核态,一般情况下进程运行在用户态,当进程调用系统调用函数时,会进入内核态,这个时候进程就处于内核态的“进程上下文”中,当然内核的线程也属于进程上下文,如ksoftirqd线程。所以内核态有两种上下文,一种是“中断上下文”,一种是“进程上下文”。中断上下文一般处理一些耗时不是很长,对实时性要求很高,执行频度较高的应用。
比较特殊的是软中断,软中断会在中断处理完成后返回时执行,这个时候是处于中断上下文中的。在以前的内核版本中,没有出现ksoftirqd内核线程来防止软中断的重复调用,此时软中断会一直运行在“中断上下文中”。在后期的内核版本中,为了防止执行软中断的时候软中断又一直被触发,而让别的进程等的太久的情况发生, 在执行次数到了一个最大值的时候就执行内核线程ksoftirqd,然后中断就返回了.而不是一直 执行软中断.在ksoftirqd这个内核线程中执行软中断,此时就是在进程上下文中了。此时,软中断极可能出现在“中断上下文”,也可能出现在“进程上下文”。
中断有各自的优先级,以响应不同的处理请求。软中断的优先级相对来说处于低位,可被硬中断中断,但不会被用户的代码中断。而
硬中断不可能被其他中断中断。
中断上下文与进程上下文的不同之处:
(1)中断是异步执行的,它们可以在任何时间发生。
(2)中断上下文中不能调用调度器,因而不能自动地放弃控制权。
(3)中断处理程序不能进入睡眠状态。原因是中断上下文不允许中断,进程睡眠后,内核只能永远地等待下去。
Linux进程
Linux是一个多用户多任务的操作系统。
进程的特性
(1)并发性:可以与其它进程在宏观上同时向前推进(一会在下面讲解和并行性的区别)。
(2)动态性:进程是执行中程序,动态产生、动态消亡、动态变化。
(3)独立性:进程是系统资源分配的基本单位。
(4)交往性:与其它进程可以进行交互。
(5)异步性:不统一推进。
(6)结构性:每个进程有一个控制块PCB。
(7)并行性:只有在多cpu多处理器的计算机上,进程才能并行执行。
进程需要了解 进程,父进程,进程组,会话和控制终端的相关概念。
-
进程和父进程:每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构
-
进程组:每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (process group leader),领导进程的PID成为进程组的ID (process group ID, PGID),以识别进程组。
kill给组发送信号进程组号前加负号如:kill -9 -2189
-
会话:一个或是多个进程组集合。 进程可以通过调用 pid_t setsid(); 来建立一个新会话,如果调用此函数的进程不是进程组长,就会创建一个新的会话,那么此时会:
- 该进程称为会话首进程 (session leader)
- 该进程称为进程组组长
- 该进程没有控制终端,即使之前有控制终端这种联系也会断掉
可以使用第三个特性来创建 daemon 进程。 调用 getsid 可以获得会话首进程进程组 pid,也就是会话首进程进程 id。
-
控制终端:
- 一个会话持有一个控制终端 (controlling terminal),可以是终端设备也可以是伪终端
- 建立与控制终端连接的会话首进程被称为控制进程 (controlling process)
- 一个会话有多个进程组,允许存在多个后台进程组 (backgroup process group) 和一个前台进程组 (foregroup process group)
- 键入终端的中断键 (Ctrl+C) 会发送中断信号给前台进程组所有进程
- 键入终端的退出键 (Ctrl+) 会发送退出信号给前台进程组所有进程
- 终端或是网络断开会将挂断信号发送给会话首进程
linux系统调用
系统调用和普通函数调用非常相似,区别仅仅在于,系统调用由操作系统内核实现,运行于内核态;而普通函数调用由函数库或用户自己提供,运行于用户态。
系统调用工作原理:应用程序首先用适当的值填充寄存器,然后调用一个特殊的指令跳转到内核某一固定的位置,内核根据应用程序所填充的固定值来找到相应的函数执行。
内存管理
Linux管理内存时使用了虚拟内存,它使得每个应用程序都认为自己拥有独立且连续的可用的内存空间(一段连续完整的地址空间),而实际上,它通常是被映射到多个物理内存段,还有部分暂时存储在外部磁盘存储器上,在需要时再加载到内存中来。
当进程执行一个程序时,需要先从内存中读取该进程的指令然后执行,获取指令时用到的就是虚拟地址,这个地址是程序链接时确定的(内核加载并初始化进程时会调整动态库的地址范围),为了获取到实际的数据,CPU需要将虚拟地址转换成物理地址,CPU转换地址时需要用到进程的page table,而page table里面的数据由操作系统维护。
心得体会与改进建议
本门课程的学习,不仅接触到了很多Linux内核的实现细节,而且对内核原理也给出了很精要的概括。学习完课程最大的体会就是,对自己以前学过的操作系统课程有了更清晰的概念,知道了理论究竟是如何在具体应用中实现的。要增加自己Linux的技能,要多多增加实践。了解了进程的创建与调度,了解了Linux的启动过程,了解了中断是什么,中断是如何发生的以以及cpu相关的操作,文件系统的制作与挂载。由孟老师和李老师深入浅出的讲解,带领我一步步的认识Linux操作系统,多谢老师在疫情期间坚持不懈的讲课,我才能通过老师的讲课得到这么多的收获。