0%

访问控制表是以文件建立的,访问权限表是以以用户建立的如何理解 ?

这个问题涉及操作系统中两种不同的权限管理方式:访问控制表(Access Control List, ACL)访问权限表(Access Rights Table)。理解两者的区别需要从权限管理的角度来看。

1. 访问控制表(ACL)——以文件为中心

  • 定义:访问控制表是以文件为单位维护的权限信息。每个文件对应一个访问控制表,记录了哪些用户或用户组对该文件具有何种权限。

  • 特点以文件为中心:每个文件都携带一张表,描述了能访问该文件的用户及其权限。权限细粒度高:可以精确地定义某个文件对不同用户或用户组的访问权限(如读取、写入、执行)。实现形式:每个文件通常附带一个 ACL,类似于下面的结构:

    1
    2
    3
    4
    文件 A 的访问控制表:
    用户 U1:读、写
    用户 U2:只读
    用户组 G1:读、写、执行
  • 适用场景:文件数量较少,用户数量较多时。每个文件可能有不同的访问权限设置。例如:Linux 文件系统的权限管理中,ls -l 显示的文件权限就类似于 ACL。

    2. 访问权限表(Access Rights Table)——以用户为中心

  • 定义:访问权限表是以用户为单位维护的权限信息。每个用户对应一个访问权限表,记录了该用户对哪些文件拥有何种权限。

  • 特点以用户为中心:每个用户都携带一张表,描述了他能访问的文件及权限。集中化管理:权限信息与用户绑定,更易于查询某个用户的权限。实现形式:每个用户通常附带一个权限表,类似于下面的结构:

    1
    2
    3
    4
    用户 U1 的访问权限表:
    文件 A:读、写
    文件 B:只读
    文件 C:执行
  • 适用场景:用户数量较少,文件数量较多时。权限管理需要以用户为核心。例如:在数据库管理系统中,用户权限管理通常以用户为中心,记录每个用户对数据库表的操作权限。

    理解方式

两种权限管理方式从管理视角和实现方式上有根本性的区别:

  1. 访问控制表(ACL) 是站在文件的角度,问“这个文件允许哪些用户访问?”
  • 假如有 100 个用户和 10 个文件,ACL 为每个文件维护一张表,总共有 10 张表,每张表可能包含多行用户信息。
  1. 访问权限表 是站在用户的角度,问“这个用户可以访问哪些文件?”
  • 假如有 100 个用户和 10 个文件,访问权限表为每个用户维护一张表,总共有 100 张表,每张表可能包含多行文件信息。

    举例对比

假设有 3 个文件(A、B、C)和 2 个用户(U1、U2):

访问控制表(ACL)

  • 文件 A 的 ACL:

    1
    2
    U1: 读、写
    U2: 读
  • 文件 B 的 ACL:

    1
    U1: 读
  • 文件 C 的 ACL:

    1
    U2: 写

    访问权限表

  • 用户 U1 的访问权限表:

    1
    2
    文件 A: 读、写
    文件 B:
  • 用户 U2 的访问权限表:

    1
    2
    文件 A: 
    文件 C:

    优缺点对比

方式 优点 缺点
访问控制表(ACL) 适合权限粒度精细的场景,便于按文件查看用户权限。 如果用户数量多,每个文件的 ACL 会很长,增加管理开销。
访问权限表 适合权限集中在用户上的场景,便于快速查询某个用户的所有权限。 如果文件数量多,每个用户的权限表会很长,增加管理开销。

总结

  • ACL 是以文件为中心的权限管理方式,关注的是“文件的用户权限”
  • 访问权限表是以用户为中心的权限管理方式,关注的是“用户的文件权限”。两种方式可以结合使用,根据具体场景选择最适合的方式进行权限管理。

1,Kiziqarliq, ha?

/ˈkɪzɪkɑːrlɪq/

有意思吧 ?

2,Men kitab yadalashqa barimen

Men 我 ;kitab 书 ;yadlash 背书 ;-qa 方向后缀; barimen 我要去

我要去背书了。

3,Yahşi mu siz 您好

4,Yahsi mu sah 你好

5,Yahxi mu ? 你好吗 ?

5,nimix kiliwatisiz 你在干什么 ?

进程的地址空间

地址空间的组成

区域 功能
代码段(Text Segment) 存放可执行程序的代码(指令),通常是只读的,以防止程序错误修改自身代码。
数据段(Data Segment) 存放已初始化的全局变量和静态变量。
BSS 段(BSS Segment) 存放未初始化的全局变量和静态变量,初始化为 0。
堆(Heap) 动态内存分配区(如通过 malloc 或 new 分配的内存),从低地址向高地址扩展。
栈(Stack) 用于函数调用时保存局部变量、返回地址等,从高地址向低地址扩展。
内核空间(Kernel Space) 一部分地址空间通常被保留给内核,用于操作系统管理,用户进程无法直接访问。

地址空间布局

  • 操作系统通常为进程提供固定的地址空间布局,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
低地址
+--------------------+
| 代码段 |
+--------------------+
| 数据段 |
+--------------------+
| BSS 段 |
+--------------------+
| 堆 |
| (向高地址增长) |
+--------------------+
| 未使用空间 |
+--------------------+
| 栈 |
| (向低地址增长) |
+--------------------+
高地址

时间片轮转算法-RR-Round Robin 名称的由来

Round Robin(轮转调度) 这个名字来源于它的调度方式,**”Round”** 和 “Robin” 分别反映了该算法的两个特点:

1. Round(轮转)

  • “Round” 代表了一个循环的概念。在 Round Robin 调度算法中,系统将时间分配给每个进程一个固定的时间片(time slice 或 quantum)。每当一个进程的时间片耗尽后,操作系统就会将 CPU 从该进程切换到下一个等待的进程,直到所有进程都被执行完。

  • 这个过程是循环的,即每个进程轮流获得 CPU 时间。系统会按顺序循环地分配 CPU 给各个进程,保证每个进程都能公平地执行。

    2. Robin(罗宾)

  • “Robin” 的部分来自于 “Robin Hood” 的传统,传说中“Robin Hood”是一个公平的角色,他从富人那里“取走”财富,分给贫困的人。类似地,Round Robin 算法公平地为所有进程分配 CPU 时间片,不偏不倚地轮流执行每个进程。

  • 另外,这个名字也可能与早期一些编程实践中的名称约定或约定俗成的习惯有关,类似于“轮转”(round-robin)的一种组织方式。

    3. 总结

所以,Round Robin 这个名字强调了公平的、按顺序循环调度进程的思想。每个进程都轮流得到 CPU 时间,并且每次时间片耗尽后就被换到下一个进程,直到所有进程都完成任务。

这个名字形象地体现了调度算法的 “轮流” 特性和 公平性

为什么 FCFS 有利于CPU繁忙任务,不利于 IO 繁忙任务

FCFS(First-Come, First-Served)(先来先服务)是一种非常简单的调度算法,其中进程按提交的顺序依次执行。每个进程的执行时间由它自己所需要的 CPU 时间来决定,并且每个进程执行完后才会开始下一个进程。FCFS 在某些情况下对 CPU 繁忙任务有利,但对 IO 繁忙任务不太友好,原因如下:

1. CPU 繁忙任务

  • CPU 繁忙任务是指那些大多数时间都在进行计算和处理的任务,它们需要大量的 CPU 时间,较少依赖于 IO 操作(如磁盘读写、网络通信等)。

  • 在 FCFS 调度下,CPU 繁忙任务执行时,操作系统会把 CPU 时间分配给它,直到任务执行完成。这种情况下,由于进程不进行 IO 操作,它不会频繁地阻塞等待 IO 完成,从而不会造成上下文切换的浪费。因此,CPU 繁忙任务可以在一个较长的时间段内连续使用 CPU,避免了调度的延迟。

    2. IO 繁忙任务

  • IO 繁忙任务则是那些大部分时间都在等待 IO 操作(如磁盘读取、网络数据传输等)完成的任务。它们在等待 IO 操作期间不需要占用 CPU,因此存在着大量的 CPU 空闲时间。

  • 在 FCFS 算法中,IO 繁忙任务通常会等待其他进程完成其 CPU 计算任务。由于 FCFS 只是按提交顺序来调度进程,不考虑进程的 IO 状况,这会导致以下问题:阻塞其他进程:当一个 IO 繁忙任务开始执行时,可能会很快进入等待 IO 操作的状态,而 CPU 继续被该任务占用,直到它完成。这会导致 CPU 长时间空闲,而其他正在等待的进程无法得到执行机会。低效的资源利用:由于进程按顺序执行,并且没有考虑进程的 IO 特性,CPU 在 IO 繁忙进程等待时浪费了很多时间。而如果调度算法能动态考虑进程的状态,调度一个正在需要 CPU 的任务,就能更好地利用 CPU 资源。

    3. 举例说明

假设有三个进程 A、B 和 C,其中:

  • A是 CPU 繁忙任务,执行时间为 10 秒。
  • B是 IO 繁忙任务,执行时间为 1 秒,之后会等待 IO 操作 5 秒,然后继续执行 1 秒。
  • C是 CPU 繁忙任务,执行时间为 8 秒。
    如果这些进程按 FCFS 排队:
  1. 进程 A先开始执行,执行 10 秒完成。
  2. 接下来,进程 B开始执行,执行 1 秒后进入 IO 等待状态(5 秒)。
  3. 然后是 进程 C,它会使用 CPU 完成它的计算。
    在此过程中,进程 B 在等待 IO 的 5 秒期间,CPU 是空闲的,但由于 FCFS,操作系统不会立即调度进程 C 来使用空闲的 CPU 时间,而是等到进程 B 完成等待后才继续执行。

4. 对比其他算法

相比之下,像 SJF(Shortest Job First)Round Robin(RR) 等调度算法会考虑到不同进程的特性:

  • SJF 优先执行 CPU 繁忙的任务,但即使对于 IO 繁忙任务,它也不会让其占用 CPU 过长时间。

  • Round Robin 会分配一个时间片,每个进程运行固定的时间,轮流使用 CPU 资源。这可以避免 IO 繁忙任务长期占用 CPU,从而提高 CPU 的利用率。

    总结

  • FCFS 对于 CPU 繁忙任务有利,因为这些任务能够充分利用 CPU,避免频繁的上下文切换。

  • FCFS 不利于 IO 繁忙任务,因为它不会在 IO 繁忙任务等待期间调度其他任务,从而导致 CPU 利用率低下,浪费了大量的空闲时间。

作业和进程的区别

作业(Job)和进程(Process)是操作系统中两个不同的概念,它们之间有一些关键区别:

1. 定义

  • 作业(Job):通常指的是用户提交给操作系统的一组任务或请求,它可以是一个或多个进程的集合。作业是操作系统调度和管理的单位,代表了用户的一次操作请求。例如,用户可能提交一个包含多个步骤的计算任务,操作系统将其作为一个作业来管理。

  • 进程(Process):是操作系统中正在执行的程序实例。进程是操作系统的基本调度单位,每个进程都有自己的独立内存空间、程序计数器、寄存器等。它是作业的一个组成部分。

    2. 生命周期

  • 作业:作业通常从提交到操作系统开始,直到任务执行完毕或被终止。作业可能包含多个进程,这些进程有自己的生命周期。

  • 进程:进程从创建开始,到执行结束(或者被中止、挂起等)为止。进程在内存中有独立的生命周期。

    3. 资源占用

  • 作业:作业的资源占用是相对较少的,它的资源管理通常由操作系统负责,作业的完成可能涉及到多个进程的执行。

  • 进程:进程占用操作系统资源(如内存、CPU时间等),并且进程的资源占用相对较高。每个进程都必须在操作系统中分配到一定的资源。

    4. 并发性

  • 作业:通常是一个大的任务或一组任务,可以包含多个进程,作业本身是一个较高层次的管理单元。

  • 进程:进程是操作系统调度的基本单位,进程可以并发执行。多个进程可以并发运行在同一个作业中。

    5. 控制

  • 作业:作业一般由用户提交,操作系统会调度和管理作业的执行。作业可能由多个进程并行或串行执行。

  • 进程:进程由操作系统管理和调度,操作系统通过进程控制块(PCB)来管理每个进程的状态和资源。

    总结

  • 作业是用户级别的任务单元,它包含一个或多个进程,代表了一个完整的工作。

  • 进程是操作系统中一个正在执行的程序实例,它有自己的资源和生命周期,是操作系统调度的基本单位。
    简而言之,作业是一个高层次的任务请求,进程是执行这些任务的具体实例。

进程通信机制

信号、管道、消息队列、共享内存。

线程通信必须借助系统调用吗 ?

对于同一进程内的线程通信,可以通过共享内存、同步原语等方式完成,而不必依赖系统调用。只有在跨进程通信时,才需要操作系统的支持和系统调用。

线程间通信的常见方式:

  1. 共享内存
    线程之间共享同一进程的内存空间,可以通过直接访问共享内存来交换信息,这是一种不依赖于系统调用的通信方式。常见的方式有通过全局变量或者某个共享的数据结构来传递数据。
    例如,在多线程中使用全局变量或线程局部存储(TLS)实现通信。

  2. 线程同步原语
    线程间常常使用同步原语(如互斥锁、条件变量、信号量、读写锁等)来协调共享资源的访问,并通过这些原语间接实现通信。
    比如使用互斥锁来保证对共享数据的独占访问,或使用条件变量来等待某个线程完成某个任务后再继续执行。

  3. 消息队列
    虽然线程可以通过消息队列与其他线程进行通信,但在同一进程内的线程间通信通常不需要操作系统的底层支持,使用共享内存或队列类库就可以实现。

  4. 信号和事件
    信号(如在Linux中使用pthread_cond_signal等)用于在不同线程之间传递通知。尽管有时信号需要操作系统支持,但在某些情况下(例如条件变量、信号量等),操作系统仅仅提供了一些底层的实现,实际的通信还是在线程级别进行的。

并发性和并行性的区别

并发性并行性 是操作系统和计算机领域中两个常见的概念,它们虽然听起来相似,但有本质区别:

1. 并发性(Concurrency)

  • 概念:并发指的是在同一时间段内,有多个任务在执行,但这些任务可能是交替执行的(并非同时进行)。

  • 特点:主要通过时间片轮转等方式在多个任务间快速切换,看起来像是“同时执行”。通常用于单核处理器,因为单核 CPU 在同一时刻只能执行一个任务,只是通过调度来实现任务的交替执行。并发强调的是任务之间的交替与协调,而不是“真正的同时进行”。

  • 例子:在操作系统中,同时打开多个程序,比如下载文件的同时浏览网页,CPU 在这些任务之间快速切换。多个线程在一个 CPU 核心上交替执行任务。

    2. 并行性(Parallelism)

  • 概念:并行指的是在同一时刻,有多个任务在真正地同时执行

  • 特点:需要多核处理器或多个物理 CPU 支持,每个任务可以被分配到不同的处理器核心上执行。并行强调的是真正的同时运行,不需要任务之间的时间片轮换。并行性可以显著提升计算效率。

  • 例子:在一台四核 CPU 的电脑上,有四个任务分别在四个核心上同时执行。在大数据计算中,将数据分成多个部分,由多个处理器同时进行计算。

    对比总结

比较点 并发性(Concurrency) 并行性(Parallelism)
概念 任务交替执行,看起来同时进行 任务真正同时执行
执行环境 单核处理器或时间片轮转 多核处理器或多个 CPU 支持
重点 任务之间的协调与交替 任务之间的同时执行
表现形式 虚假的“同时”,实际是交替执行 真正的物理层面“同时执行”
例子 单核 CPU 多线程切换任务 多核 CPU 多个线程同时执行

简单记忆

  • 并发:看起来同时(交替执行),单核可以实现。
  • 并行:真正在同时执行,依赖多核或多处理器。
    一句话总结并发是逻辑上的同时执行,并行是物理上的同时执行。

开学的时候就想准备六级了,一直就是拖拖拖。

找了个六级网课,就上了五六个小时的单词课。

记下来的单词还没背多少,背的考六级的时候也忘了。

六级前一两周开始做试卷,整理单词跟博客,感觉起了不小作用,起码学了很多单词。

听力就练了几个。

对了对答案,感觉听力应该在 200 分以上 ;写作的话,拿不准,感觉 180 - 220 都有可能 ;阅读没做好,最后一篇错了三个,恐怕成为伏笔了,估计也就 180 - 210 之间的水平了。

只要不出什么岔子(比如考号填错了),550 应该问题不大,算是达标了。其实我还挺想上 600 的,但是一两个星期就想提 100 分,感觉还是挺夸张的。

等结果吧,还早着呢,Let the bullets fly for a while.