系统调用大讨论

目录

调用SpringContextShutdownHook_子进程

1. 为什么说系统调用是用户态进程与硬件设备打交道的接口?

系统调用,通俗的讲,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。

调用SpringContextShutdownHook_系统调用_02

2. 操作系统服务员的角色是如何体现的?
什么是操作系统?
操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
操作系统的类型非常多样,不同机器安装的操作系统可从简单到复杂,可从移动电话的嵌入式系统到超级电脑的大型操作系统。许多操作系统制造者对它涵盖范畴的定义也不尽一致,例如有些操作系统集成了图形用户界面,而有些仅使用命令行界面,将图形用户界面视为一种非必要的应用程序。
操作系统理论在计算机科学中,为历史悠久而又活跃的分支;而操作系统的设计与实现则是软件工业的基础与内核。[维基百科]
3. 为什么遵循POSIX标准的操作系统,其上的应用软件具有可移植性?
什么是POSIX?
POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE(电气和电子工程师协会)为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。X表示其是对Unix API的传承。简单可以理解POSIX标准是为操作系统设计API时遵循的规范,一套规范的系统调用集。
POSIX解决的问题?
POSIX的诞生和Unix的发展是密不可分的。当年最早的Unix,源代码流传出去了,加上早期的Unix不够完善,于是之后出现了好些独立开发的与Unix基本兼容但又不完全兼容的OS,通称Unix-like OS。这样版本混乱的情况导致相互之间的竞争和不兼容之处越来越多,给软件的可移植性带来很大困难,对Unix的发展极为不利。为了提高兼容性和应用程序的可移植性,结束混乱局面,IEEE提出了POSIX标准,POSIX在源代码级别上定义了一组最小的Unix(类unix)操作系统接口。 这套标准涵盖了很多方面,比如Unix系统调用的C语言接口,shell程序和工具、线程和网络编程等。POSIX标准意在期望获得源代码级别的软件可移植性。为一个POSIX兼容的操作系统编写的程序,可以在任何其他POSIX操作系统上编译执行。
POSIX现在已经发展成为一个非常庞大的标准族,并不局限于Unix, 一些其他的操作系统,如Microsoft windows NT, Linux等都支持或者部分支持POSIX标准。
4.为什么说不管是图形接口,还是命令接口,最后都可能调用系统调用?

什么是系统调用?

一个稳定运行的Linux操作系统需要内核和用户应用程序之间的完美配合,内核提供各种各样的服务,然后用户应用程序通过某种途径使用这些服务,进而契合用户的不同需求。用户应用程序访问并使用内核所提供的各种服务的途径即是系统调用。

如何使用系统调用?

调用SpringContextShutdownHook_系统调用_03

什么是图形接口?什么是命令接口?

用户接口(User Interface,简称 UI)是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。通常指软件接口,一般有命令接口、程序接口、图形接口三种。

为什么说不管是图形接口,还是命令接口,最后都可能调用系统调用?

因为不管是命令行还是图形,用户实质上都是通过程序来使用计算机。而这些程序的关键就是里面的函数,比如read() , write()等,这些函数调用就是应用程序和操作系统的接口。又因为这些函数调用时系统提供的,所以又叫系统调用。

5.系统调用是被如何处理的,Intel x86是如何不断优化系统调用的处理过程,为什么要进行优化?

什么是intel x86?

x86泛指一系列基于Intel8086且向后兼容的中央处理器指令集架构。最早的8086处理器于1978年由Intel推出,为16位微处理器。该系列较早期的处理器名称是以数字来表示80x86。由于以“86”作为结尾,包括Intel 8086、80186、80286、80386以及80486,因此其架构被称为“x86”。由于数字并不能作为,因此注册商标Intel及其竞争者均在新一代处理器使用可注册的名称,如Pentium,来描述x86架构下的处理器产品。现时英特尔将其称为IA-32,全名为“Intel Architecture, 32-bit”,一般情形下指代32位的架构。

系统调用是被如何处理的?

系统调用把应用程序的请求传给内核,调用相应的内核函数完成所需的处理,将处理结果返回给应用程序。

6. 通过strace工具追踪你自己写的程序,你有何感悟?

什么是strace?

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

用strace追踪自己程序的感悟?

采用strace可以查看是否有系统调用错误,同时还可以统计系统调用的耗时。这样可以大大提升了在编写代码时的效率,也在编写长代码的时候能更轻松的找到问题。

7.回答实验楼中实验9中的四个问题(其中的第一个问题给出运行结果

(1)

调用SpringContextShutdownHook_父进程_04

(2)在第12行执行fork()时系统进入到什么态?
系统进入内核态
(3)结合PPT中的fork的执行流,分析getpid()的执行流
创建一个子进程,父进程并发运行;子进程复制父进程除PID外的属性;父进程从fork返回处继续执行,在父进程中,fork返回子进程的PID; 子进程从fork返回处开始执行,在子进程中,fork返回0;getpid获取当前进程ID; 在子进程中getpid为子进程的PID; 在父进程中getpid为父进程的PID;
(4)fork()的执行对你有什么启发
当一个进程调用了fork以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有它的进程ID和父进程ID,其他的都是一样。创建两个一模一样的进程是没有意义的,为了区分父进程和子进程,我们必须跟踪fork的返回值。 当fork掉用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1,否则 fork的返回值有重要的作用。对于父进程fork返回子进程的ID,而对于fork子进程返回0。我 们就是根据这个返回值来区分父子进程的。
父进程为什么要创建子进程呢?因为Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源,重要的是进程是可以并发执行。有时 进程为了早一点完成任务就创建子进程来争夺资源。 一旦子进程被创建,父子进程一起从 fork处继续执行,相互竞争系统的资源。提高了系统的执行效率。

组内提问?
一次系统调用开销有多大?
系统调用虽然使用了“快速系统调用”指令,但耗时仍大约在200ns+,多的可能到十几us每个系统调用内核要进行许多工作,大约需要执行1000条左右的CPU指令
系统调用的目的是什么?
请求系统服务。操作系统不允许用户直接操作各种硬件资源,因此用户程序只能通过系统调用的方式来请求内核为其服务,间接地使用各种资源。