返回介绍

2. 操作系统

发布于 2024-10-12 21:58:06 字数 1907 浏览 0 评论 0 收藏 0

操作系统管理硬件资源,装载并执行程序,提供编程接口。

体系结构

                                                      +---> Application
                                                      |
硬件 -- driver -> 操作系统 -- syscall -> 运行库 -- api --+
                                                      |   
                                                      +---> Development Tool

应用程序编程接口(API)

libc 提供 POSIX API。

libc 是 ANSI C 定义的 C 标准库,glibc 是 GNU 的实现版本(libc.so)。

POSIX 可移植操作系统接口,IEEE(电机电子工程师协会) 为 UNIX 系统定义的一套 API 标准。Linux 基本实现了 POSIX 兼容,Windows 部分实现。使用 ltrace 跟踪标准库调用。

$ ldd ./test   # 查看链接库
	linux-vdso.so.1 (0x00007ffc273ba000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b9c06b000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8b9c268000)

$ /lib/x86_64-linux-gnu/libc.so.6   # 查看 glibc 版本
GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.2) stable release version 2.31.

进程调度

应用程序以进程(process)方式运行在系统权限更低的级别。

Intel CPU 将特权级别分成 4 个等级:ring0、ring1、ring2、ring3。通常 ring0 操作系统内核,ring1/2 驱动程序,ring3 应用程序。CPU Rings 是一种计算机安全设计方式,分级保护。特权等级从高往低依次是:0、1、2、3。内层(比如 ring0)可以随时访问外层(ring3)资源,反之会被阻止。

CPU 资源由操作系统统一分配,每个进程按优先级获取一定量时间片(timeslice)。一旦进程执行时间超出时间片,就被操作系统暂停,转而交替执行其他进程。可以实现单核多进程并发执行,这种方式称做抢占式调度(preemptive)。

系统调用

普通进程无权访问内核数据和资源,操作系统内核通过中断为应用程序提供编程接口。

系统调用运行在内核态(kernal mode),通过中断(interrupt)从用户态(user mode)切换到内核态。中断由硬件或软件发出,要求 CPU 暂停当前工作,转而从中断向量表中查找指定中断号,并指定中断处理程序。

使用 strace 跟踪系统调用。使用 time 查看进程执行时间,其中包括内核态和用户态。

$ time command

real	0m0.002s     ; 命令执行耗时(wall clock)。
user	0m0.000s     ; 用户态(CPU clock,多核累计)。
sys	  0m0.002s     ; 内核态(CPU clock)。

Linux Syscall Table for X64

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文