Linux大纲
Linux大纲
进程与线程
- 进程
- 资源分配的基本单位
- 由进程控制块、数据段、代码段组成,本身不可以运行程序,而是像容器一样,先创建出一个主线程,分配给主线程一定资源,这样可以在主线程实现各种功能。
- 一个进程死掉了不影响其他进程;
- 创建进程系统花销大于创建线程;
- 多进程通讯因为需要跨越进程边界,不适合大量数据的传送适合小数据和密集数据的传送
- 线程
- CPU调度的基本单位
- 多线程无需跨越进程边界,适合各线程间大量数据的传送。并且多线程可以共享同一进程里的共享内存和变量
- 进程间通信:有名管道/无名管道、信号、共享内存、消息队列、信号量、socket
- 线程同步:信号量、读写锁、条件变量、互斥锁、自旋锁
- 父进程、子进程:父进程调用fork()以后,克隆出一个子进程,子进程和父进程拥有相同内容的代码段、数据段和用户堆栈。父进程和子进程谁先执行不一定,看CPU。所以我们一般我们会设置父进程等待子进程执行完毕。
init系统服务
init是Unix和类Unix系统中用来产生其他所有进程的程序。它以守护进程的方式存在,其进程号是1。Linux系统在引导记载Linux内核后,便由Linux内核记载Init程序,由Init程序完成余下的引导过程,比如加在运行级别,加载服务,引导Shell/图形化界面等。
systemv守护进程
System V在大多数Linux发行版中使用最广泛。在systemv中,在内核加载后运行的第一个程序成为init程序。Init做一些事情其中之一就是加载一系列脚本来启动系统服务,例如网络,ssh守护程序等。System V中的运行级别描述了某些状态,例如
- 运行级别0:暂停
- 运行级别1:单用户模式
- 运行级别6:重新启动
systemv 的问题在于它需要仔细调整。假设您有一个要在启动时运行的网络文件系统(NFS)客户端。在网络正常工作之前运行 NFS 没有任何意义。因此,您必须等待网络已经正常工作,才能启动 systemv。Systemv init 这样做的方法是为服务启动设置严格的顺序。每个服务都分配有一个优先级编号,init 会按优先级顺序启动服务。如果需要确保网络连接后启动服务,则必须手动为服务分配更高的优先级。这必须由某人(通常是软件包维护者)针对计算机上运行的每项服务来完成。所有 System V 初始化脚本都存储在/etc/rc.d/init.d/或/etc/init.d目录中。这些脚本用于控制系统的启动和关闭。通常,您会在这个目录找到启动ssh 服务器或网络的脚本,可以手工执行它们。比如使用“/etc/init.d/S50sshdstart”开启 ssh 服务“/etc/init.d/S50sshd stop”关闭 ssh 服务。
systemd守护进程
systemd 这一名字源于 Unix 中的一个惯例:在 Unix 中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识。除此以外,systemd 亦是指代英文术语 D 体系,而这一术语即是用于描述一个人具有快速地适应环境并解决困难的能力。
systemd 是 Linux 电脑操作系统之下的一套中央化系统及设置管理程序(init),包括有守护进程、程序库以及应用软件,由 Lennart Poettering 带头开发。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低 Shell 的系统开销的效果,最终代替现在常用的 System V 与 BSD 风格的 init 程序。目前绝大多数的 Linux发行版都已采用 systemd 代替原来的 System V。
将 service(服务)、target(运行模式,类似于运行级别)、mount、timer、snapshot、path、socket、swap 等称为 Unit。比如,一个 auditd 服务(就是 auditd.service)就是一个 Unit,一个 multi-user.target 运行模式也是一个 Unit,其中不同的服务通过 systemctl 来进行统一管理,例如重启一个sshd 服务,需要执行 systemctl restart sshd 命令,同样的如果添加一个启动程序需要自己定义一个 service 服务才可以。