5. Linux启动流程
概括描述linux系统从开机到登陆界面的启动过程
1.开机BIOS自检
2.MBR引导
3.grub引导菜单
4.加载内核
5.启动init进程
6.读取inittab文件执行rc.sysinit、rc等脚本
7.启动mingetty进入系统登录界面
现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。(包括程序段,相关数据段,和进程控制块PCB)
线程: 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
关系:一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.相对进程而言,
线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列
。
区别:主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响
,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮
,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
优缺点:线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
操作系统的四个特征: 并发、共享、异步、虚拟
并发:指两个或多个事件在同一时间间隔内发生。在多道程序环境下,一段时间内,宏观上有多个程序在同时运行,而每一时刻,单处理器环境下仅能有一道程序执行,故微观上这些程序还是在分时地交替执行。操作系统的并发性是通过分时实现的。
共享:指系统中的资源可以被多个并发执行的程序共同使用,而不是被其中一个独占。资源共享有两种方式,互斥访问和同时访问。
异步:在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一管到底,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。异步性使得操作系统运行在一种随机的环境下,可能导致进程产生与时间有关的错误。但只要运行环境相同,操作系统必须保证多次运行程序,都获得相同的结果。
虚拟:虚拟性是一种管理技术,把物理上的一个实体变成逻辑上的一个或多个对应物。采用虚拟技术的目的是为用户提供易于使用、方便高效的操作环境。
在Linux上,通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。
可以通过如下指令来创建或者修改你自己的crontab文件,
1 | crontab -e |
cron job是周期性运行的,我们按如下格式来进行设置,
1 | * * * * * command to be executed |
当然有更简单的方法,你可以在 https://crontab.guru/ 网站进行在线设置,设置好了直接拷贝过来。网页提供了图形化的操作界面,对新手特别友好。
ZooKeeper曾是Hadoop的正式子项目,后发展成为Apache顶级项目,与Hadoop密切相关但却没有任何依赖。它是一个针对大型应用提供高可用的数据管理、应用程序协调服务的分布式服务框架,基于对Zab算法的使用,使该框架保证了分布式环境中数据的强一致性,提供的功能包括:配置维护、统一命名服务、状态同步服务、集群管理等。
在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此。
代码整洁是我们一直追求的目标,不仅仅是为了成为更好的程序员,而且也为了节省他人时间,减少阅读、维护代码的时间成本,提高工作效率。本文将从命名、函数风格、注释等不同方面对《Clean Code》中的内容进行总结。