操作系统的重要性及系统调用和编程语言的移植性

简介: 操作系统的重要性及系统调用和编程语言的移植性

一、操作系统的重要性


       对于程序员来说,程序员创造的不是硬件,而是各种应用程序,但是如果程序员只做应用不懂硬件层面的知识的话,是无法成为硬核程序员的


       在操作系统诞生之后,程序员不需要在硬件层面考虑问题,所以程序员的数量就增加了。哪怕自称 对硬件一窍不通的人也可能制作出一个有模有样的程序。不过,要想成为一个全面的程序员,有一点需要清楚的就是,掌握硬件的基本知识,并借助操作系统进行抽象化,可以大大提高编程效率


       下面就看一下操作系统是如何给开发人员带来便利的,在Windows 操作系统下,用C语言制作一个具有表示当前时间功能的应用。time()是用来取得当前日期和时间的函数,printf()是把结果打印到显示器上的函数,如下:


#include <stdio.h>
#include <time.h>
void main(){
    // 保存当前日期和时间信息
    time_t tm;
    // 取得当前的日期和时间
    time(&tm);
    // 在显示器上显示日期和时间
    printf("%s\n",ctime(&tm));
}


● 通过time_ttm,为time_t类型的变量申请分配内存空间


● 通过time(&tm),将当前的日期和时间数据保存到变量的内存空间中


● 通过printf("%s\n",ctime(&tm)),把变量内存空间的内容输出到显示器上


       应用的可执行文件指的是,计算机的CPU可以直接解释并运行的本地代码,不过这些代码是无法直接控制硬件的,事实上,这些代码是通过操作系统来间接控制硬件的。变量中涉及到的内存分配情况,以及time0和printf0这些函数的运行结果,都不是面向硬件而是面向 操作系统 的。操作系统收到应用发出的指令后,首先会对该指令进行解释,然后会对 时钟IC 和显示器用的1/0进行控制


       计算机中都安装有保存日期和时间的实时时钟(Real-time clock),上面提到的时钟IC就是值该实时时钟。


应用程序通过OS调度硬件:



二、系统调用和编程语言的移植性


操作系统控制硬件的功能,都是通过一些小的函数集合体的形式来提供的。这些函数以及调用函数的行为称为 系统调用,也就是通过应用进而调用操作系统的意思。在前面的程序中用到了 time()以及printf()函数,这些函数内部也封装了系统调用


C 语言等高级编程语言并不依存于特定的操作系统,这是因为人们希望不管是 Windows 操作系统还是Linux操作系统都能够使用相同的源代码。因此,高级编程语言的机制就是,使用独自的函数名,然后在编译的时候将其转换为系统调用的方式(也有可能是多个系统调用的组合)。也就是说,高级语言编写的应用在编译后,就转换成了利用系统调用的本地代码


高级语言的函数调用在编译后变成了系统调用



      在高级语言中也存在直接调用系统调用的编程语言。不过,利用这种方式做成应用,移植性并不友好


移植性:移植性指的是同样的程序在不同操作系统下运行时花费的时间,时间越少证明移植性越好

目录
相关文章
|
5月前
|
Unix 编译器 Shell
[oeasy]python0033_先有操作系统还是先有编程语言_c语言是怎么来的
本文回顾了计算机语言与操作系统的起源,探讨了早期 Unix 操作系统及其与 C 语言的相互促进发展。Unix 最初用汇编语言编写,运行在 PDP-7 上,后来 Thompson 和 Ritchie 开发了 C 语言及编译器,使 Unix 重写并成功编译。1974 年 Ritchie 发表论文,Unix 开始被学术界关注,并逐渐普及。伯克利分校也在此过程中发挥了重要作用,推动了 Unix 和 C 语言的广泛传播。
121 9
[oeasy]python0033_先有操作系统还是先有编程语言_c语言是怎么来的
|
3月前
|
Linux 开发者 iOS开发
Python系统调用实战:如何在不同操作系统间游刃有余🐟
本文介绍了 Python 在跨平台开发中的强大能力,通过实际例子展示了如何使用 `os` 和 `pathlib` 模块处理文件系统操作,`subprocess` 模块执行外部命令,以及 `tkinter` 创建跨平台的图形用户界面。这些工具和模块帮助开发者轻松应对不同操作系统间的差异,专注于业务逻辑。
74 2
|
4月前
|
网络协议 Linux 调度
深入探索Linux操作系统的心脏:内核与系统调用####
本文旨在揭开Linux操作系统中最为核心的部分——内核与系统调用的神秘面纱,通过生动形象的语言和比喻,让读者仿佛踏上了一段奇妙的旅程,从宏观到微观,逐步深入了解这两个关键组件如何协同工作,支撑起整个操作系统的运行。不同于传统的技术解析,本文将以故事化的方式,带领读者领略Linux内核的精妙设计与系统调用的魅力所在,即便是对技术细节不甚了解的读者也能轻松享受这次知识之旅。 ####
|
4月前
|
缓存 算法 安全
深入理解Linux操作系统的心脏:内核与系统调用####
【10月更文挑战第20天】 本文将带你探索Linux操作系统的核心——其强大的内核和高效的系统调用机制。通过深入浅出的解释,我们将揭示这些技术是如何协同工作以支撑起整个系统的运行,同时也会触及一些常见的误解和背后的哲学思想。无论你是开发者、系统管理员还是普通用户,了解这些基础知识都将有助于你更好地利用Linux的强大功能。 ####
65 1
|
4月前
|
Linux 开发者 iOS开发
Python系统调用实战:如何在不同操作系统间游刃有余🐟
【10月更文挑战第2天】Python 以其卓越的跨平台能力和丰富的标准库,成为解决多操作系统环境下编程挑战的理想选择。本文将通过实际例子展示 Python 如何简化跨平台开发。从文件系统操作到系统调用,再到 GUI 应用开发,Python 提供了多种工具和模块,如 `os`、`pathlib` 和 `subprocess`,帮助开发者轻松应对不同平台间的差异,让你成为真正的跨平台高手。
39 5
|
9月前
|
Linux C语言
操作系统 | 添加系统调用
操作系统 | 添加系统调用
86 0
|
6月前
|
Linux 开发者 iOS开发
Python系统调用实战:如何在不同操作系统间游刃有余🐟
【8月更文挑战第5天】Python系统调用实战展示了如何轻松应对跨平台挑战。通过`os`与`pathlib`模块处理文件系统操作,如创建目录及获取用户主目录,自动适配不同操作系统的路径格式。利用`subprocess`模块执行外部命令,智能选择`ls`或`dir`等系统特定指令。借助Tkinter创建图形用户界面,实现一次编写到处运行的目标。这些技巧让开发者专注于应用逻辑,简化跨平台开发流程。
71 0
|
8月前
|
IDE Oracle Java
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。
|
存储 缓存 Linux
【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
148 1
|
9月前
|
存储 程序员
操作系统的运行机制、中断和异常、系统调用
操作系统的运行机制、中断和异常、系统调用
125 1