linux操作系统的体系架构从宏观上分为用户态和内核态(或者用户空间和内核)。内核的本质是一种控制计算机硬件资源,并提供上层应用程序运行环境的“软件”。用户态即上层应用程序的活动空间,应用程序的执行必须依托内核提供的资源(CPU资源,存储资源,I/O资源等),为了使上层应用程序能够访问这些资源,内核必须为其提供访问的端口:系统调用。
1.系统调用是操作系统的最小功能单位(类似原子操作)。如果一个应用程序需要太多系统调用,则会给程序员带来负担,良好的程序设计方法是:重视上层的业务逻辑操作,而尽可能避免底层复杂的实现细节。
2.库函数正是一种解脱之法,它封装系统调用,对用户呈现简单的业务逻辑接口,极大增强了程序设计的灵活性,依据不同标准有不同的实现版本,如ISO C标准库,POSIX标准库等。
3.Shell是一个特殊的应用程序,俗称命令行,本质是命令解释器,上通应用,下同系统调用,充当“胶水”,让不同程序能以一个清晰的接口协同工作,从而增强各个程序的功能。符合Shell语法的文本成为Shell脚本,其中语句对系统调用做了一层封装,
两者切换:由于操作系统资源有限,需对操作区分以避免资源访问冲突,Unix/Linux设计哲学之一:“对不同的操作赋予不同的执行等级”(特权)。用户态中的进程(0等级)受限很多,内核态的进程(3等级)没有限制,很多程序在运行过程中的操作需要内核权限才能执行则会涉及切换。C函数库中内存分配函数malloc(),具体是使用sbrk()系统调用来分配内存,printf()调用werite()系统调用来输出字符串。
情形:1.系统调用(本质是软中断)。2.异常事件(当CPU在执行用户态的操作请求时发生不可知事件,触发转向内核态执行异常事件,如缺页异常)。3.外围设备的中断(硬中断)(当外围设备完成用户的请求操作后,会向CPU发出中断信号,CPU会暂停执行下一条指令,转去执行中断信号对应的处理程序。)