Linux 架构蓝图简谈

笔记内容来源于《How Linux Works》CH01 Linux系统中的抽象级别和层数 Linux操作系统有三个主要的层级,它们分别是Hardware、Linux Kernel、User Processes三层,具体包含的内容可以看下图。 Hardware层和User Processes层都很容易去理解它,这里重点讲解Linux Kernel层。内核是操作系统核心,内核是在内存中用来告诉CPU要做什么事情的软件,内核可以管理硬件并且作为Hardware和Running Program的接口。 进程是运行中的程序,是由内核管理的程序。Kernel和User Processes之间重要的区别,Kernel运行在Kernel Mode,User Processes运行在User Mode。 代码运行在Kernel Mode可以完全无限制的执行任何CPU instruction和引用any memory address。这是非常强大但也是充满危险的特权,内核程序很容易崩溃整个系统,因为只有内核程序可以访问内核空间。 在用户模式下,执行代码无法直接access hardware或reference meory,在用户模式下运行的代码必须委托给系统API(system call)才能访问硬件或内存。因为这种隔离,用户模式下的崩溃总是可恢复的,并且计算机上大多数代码运行在用户模式下。 Hardware | 理解主内存 在计算机系统所有硬件中,Main Memory可能是最重要的。它用来存储运行中的内核和进程,CPU也只能操作在内存上,CPU读取指令和数据从内存中,然后写数据返回给内存。 在内存中,state术语经常被描述为当前进程已经完成或正在执行等状态,而不是描述为比特的排列顺序,因为进程通常都是有数百万比特组成。

May 21, 2023

Linux 进程间的通信方式 | 信号

Linux进程间通信方式简要 在Linux中,使用进程之间通过多种方式进行通信,包括管道、信号、共享内存、消息队列、套接字等。进程间通信实现不同进程之间的数据共享和协作,更好完成各自任务。 管道 - pipe 比如ls | grep 123 中,就将ls这个进程的输出,作为grep的输入进行传递。 信号 - signal 一个进程,可以向另一个进程发送信号,并且另一个进程可以去处理这个发送来的信号。 共享内存 - shard memory 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。 消息队列 - message queues 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 信号量 - semaphores 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 套接字 - socket 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。例如访问远端的MySQL服务器,需要注意,如果MySQL服务在本地,则套接字使用的unix套接字,而非tcp套接字。 列出所有的信号类型 可能会有疑问,为什么是kill,因为在linux当中,大部分信号都是将进程给杀死,所以干脆就统一称为kill了。64种死法。 1 2 kill -l HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2 如何终止一个进程 1 2 px -aux | grep xxx # 通过进程名等获取进程pid kill -9 111 # 给pid为111的进程发送sigkill信号 在程序开发过程中,可以让程序捕捉并处理kill进程发送来的信号。 但是有个约定俗成的约定,kill -9信号,也就是sigkill信号是不可以被捕捉并处理的,即程序接收到kill -9信号,则必须得死。...

May 20, 2023