首页 > 编程语言 >《程序员的自我修养》- 第一章 - 温故而知新 - 笔记

《程序员的自我修养》- 第一章 - 温故而知新 - 笔记

时间:2023-06-15 15:57:50浏览次数:32  
标签:温故而知新 操作系统 接口 硬件 程序员 修养 线程 内存 CPU

1.1 从Hello World说起

介绍书本的目标读者

1.2 万变不离其宗

讨论范围:兼容x8632位CPU的PC

介绍硬件方面的内容,略

1.3 站得高,望得远

层次鸟瞰

应用软件->运行库->操作系统->硬件

接口鸟瞰(对应)

  • 应用程序编程接口(API
  • 系统调用接口(System call Interface)
  • 硬件接口(硬件规格,Hardware Specification)

1.4 操作系统做什么

  • 提供抽象接口
  • 管理硬件资源

1.4.1 不要让CPU打盹

  • 多道程序(Multiprogramming)
  • 分时系统(Time-sharing System)
  • 多任务系统(Multi-tasking)
    • 抢占式(Preemptive)

1.4.2 设备驱动

关系

  • 运行库应用程序
    • 请求统一接口
  • 操作系统
    • 提供统一接口硬件驱动模块负责)
    • 要求硬件符合接口框架
  • 硬件
    • 根据要求接口框架开发驱动

实例

  • 读取文件为例
  • 应用程序)使用read系统调用
  • 操作系统文件系统判断位置,向硬盘驱动请求部分逻辑扇区的信息
  • 硬件驱动)向硬盘发送命令(例如读写I/O端口寄存器)

1.5 内存不够怎么办

原始分配

  • 地址空间不隔离,易改写其它程序数据,不安全
  • 内存使用效率低,缺少有效内存管理,数据大量换入换出
  • 运行地址不确定,分配的空间地址不确定,不便于编写程序

1.5.1 关于隔离

  • 程序需要简单的执行环境,不介入复杂的存储器管理

1.5.2 分段

  • 机制:把一段程序所需空间大小虚拟空间映射到某个物理空间
    • 操作系统设置映射函数
    • 硬件完成地址转换
  • 优点:地址隔离物理地址透明
  • 缺点:内存使用效率低

1.5.3 分页

  • 机制
    • 地址空间划分为固定大小的页
      • 法一:页大小硬件决定
      • 法二:页大小操作系统决定,硬件支持多种大小(同一时刻,大小固定)
    • 虚拟地址划分后,得到虚拟页(VP,Virtual Page)
    • 常用数据和代码装入内存不常用的装入磁盘
    • 物理内存中的页是物理页(PP,Physical Page),页的所在空间决定
    • 磁盘中的页是磁盘页(DP,Disk Page),页的所在空间决定
  • 页错误
    • 过程
      • 硬件捕获
      • 操作系统接管
        • 读出DP装入内存
        • 内存页VP建立映射
    • 效果
      • 地址隔离
      • 内存使用率提升
      • 物理地址透明
  • MMU(Memory Management Unit)
    • 效果转换地址
    • 位置:一般集成在CPU

1.6 众人拾柴火焰高

1.6.1 线程基础

  • 线程
    • 亦称轻量级进程(Lightweight Process,LWP)
    • 程序执行流最小单位
  • 多线程优势
    • 利用等待时间
    • 避免因计算时间长而未响应
    • 逻辑要求并发
    • 充分利用CPU
    • 数据共享高效
  • 线程访问权限
    • 私有
      • 局部变量
      • 线程局部存储(Thread Local Storage,TLS)
      • 函数传入参数
  • 线程调度优先级
    • 线程调度:在处理器上切换不同的线程的行为
    • 时间片:线程可执行的时间
  • 调度算法
    • 优先级调度
    • 轮转
    • 设置线程优先级
      • Windows:SetThreadPriority函数
      • Linux:pthread库
    • IO密集型线程
    • CPU密集型线程
    • 饿死
    • 优先级改变
      • 用户指定
      • 等待的频繁程度
      • 饿死
  • 可抢占线程和不可抢占线程
    • 抢占:用尽时间片就剥夺继续执行的权力
    • Windows实现
      • 标准,有明确API
    • Linux实现
      • 贫乏,把执行实体都称为任务(Task)
      • 方法
        • fork复制当前进程
          • 本任务返回新任务pid新任务返回0
          • 共享一个写时复制(Copy on Write,COW)
        • exec:使用新可执行映像覆盖当前可执行映像
        • clone创建子进程,从指定位置开始执行
      • 使用
        • 产生新任务
          • fork创建一个新任务,新任务调用exec执行新的可执行文件
        • 产生新线程
          • clone产生一个可以共享当前内存空间文件等的任务实际就是线程

1.6.2 线程安全

  • 原子操作
    • API支持,如Interlocked API
  • 同步
    • 同步:一个线程访问数据未结束,其它线程不得访问该数据
    • :访问时获取锁,访问后释放
      • 二元信号量
        • 适合只能被唯一一个线程独占资源
        • 别人可以代替释放
      • 多元信号量(简称信号量
        • 允许多个线程并发访问
        • 别人可以代替释放
      • 互斥量
        • 适合只能被唯一一个线程独占资源
        • 别人不能代替释放
      • 临界区
        • 只可本进程使用,其他进程无法获取
        • 适合只能被唯一一个线程独占资源
        • 别人不能代替释放
      • 读写锁
        • 专用于:读取频繁但是偶尔写入
          • 前面的方法此时效率太低,因为不允许共同读取
        • 获取方式
          • 共享
          • 独占
        • 状态
          • 自由:共享和独占都行
          • 共享:只能以共享方式获取该锁
          • 独占:不能获取该锁
      • 条件变量
        • 操作
          • 等待:线程等待这个条件变量可能多个线程都在等待
          • 唤醒:所有等待这个条件变量线程都被唤醒
        • 作用
          • 让许多线程一起等待某个事件的发生
  • 可重入
    • 表示函数没有执行完成,一次进入该函数执行
    • 情况
      • 多个线程同时执行
      • 函数自身(可能多层调用后)调用自身
    • 特点
      • 不使用函数外的静态或全局非const变量
      • 不返回静态或全局非const变量指针
      • 仅依赖调用方提供的参数
      • 不依赖单个资源的锁
      • 不调用不可重入的函数
  • 过度优化
    • 使用volatile关键字阻止过度优化
      • 无法阻止CPU动态调度换序
    • barrier指令
      • 阻止CPU将该指令前的指令交换到barrier之后

1.6.3 多线程内部情况

  • 内核提供线程支持
    • 内核线程由多处理器或调度实现并发
  • 三种模型
    • 一对一模型
      • 用户线程和内核线程一一对应
      • 一般使用API系统调用创建的均为一对一的线程
    • 多对一模型
      • 多个用户线程映射到一个内核线程
      • 优点
        • 上下文切换快
        • 线程数量几乎无限
      • 缺点
        • 一个用户线程阻塞,则其它线程无法进行
    • 多对多模型
      • 多个用户线程映射到少数但不止一个内核线程
      • 结合前两者优点

1.7 本章小结

回顾了软硬件基本结构,如CPU和外围部件的连接,SMP和多核,软硬件层次结构,如何利用CPU与设备驱动,操作系统,虚拟空间,物理空间,页映射,线程等概念

标签:温故而知新,操作系统,接口,硬件,程序员,修养,线程,内存,CPU
From: https://www.cnblogs.com/Carykd/p/17483086.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:分割回文串
    题目:给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。回文串是正着读和反着读都一样的字符串。 示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]代码实现:classSolution{bo......
  • #yyds干货盘点# LeetCode程序员面试金典:被围绕的区域
    题目:给你一个mxn的矩阵board,由若干字符'X'和'O',找到所有被'X'围绕的区域,并将这些区域里所有的 'O'用'X'填充。 示例1:输入:board=[["X","X","X","X"],["X","O","O",&quo......
  • 业务程序员不建议造轮子
    不要问我是.net程序员还是java程序员,我是业务程序员。工作多年,我觉得业务程序员,不应该造轮子。多年以前,我就吃过造轮子的亏,有时,我工作大概60%的时间在造轮子、改轮子的BUG,40%的时间在写业务功能。为什么要造轮子呢,为了学技术,为了不认输。但是造轮子的代价很大,也影响工作,写着业......
  • 程序员35岁破局之路
    编者按:前段时间,LiveVideoStack采访了在音视频领域从业多年的技术人李天(化名)当35岁遇到裁员,他向我们讲述了在35岁遇到裁员时所面临的困境和感悟。这篇采访在音视频技术圈子里引起了一些反响。“程序员35岁危机”这个话题近几年来一直广受议论,LiveVideoStack最近又采访了三位音视频技......
  • 一位老程序员的忠告:别想着靠技术生存一辈子
    笔者目前是自己单干,但此前有多年在从事软件开发工作,回头想想自己,特别想对那些初学JAVA/DOT、NET技术的朋友说点心里话,希望我们的体会多少能给你们一些启发。 一、在一个地方工作8小时就是“穷” 在国内,你千万不要因为学习技术,就可以换来稳定的生活和高的薪水待遇......
  • 每个优秀程序员都应遵循的代码原则和规范
    什么是优秀的程序员?首先我们会先提出这个问题,如果你向10个人问这个问题,尽管可能答案不同,但是少有一点应该是一致的。而对我个人而言,一个优秀的程序员应该是一个能够充分理解需求,并能提出可行性解决方案通过团队协作向最终用户展示成果。而说到团队协作,就涉及到代码的可维护性,那么......
  • 程序员必备技能-怎样快速接手一个项目
    作为一个程序员,我们很少能从头到尾参与一个新项目的开发。如果你经常开发的是新项目,那你真是太幸福了。更多的情况是半路进入一个项目组进行开发,或者是有其他同事离职了,之前由他维护的系统转交给你维护。还有一种情况就是领导不知道从哪里弄过来一个系统和一堆文档,然后就直接就把系......
  • 美女程序员:仅有30天,该怎么准备?
    你好,我是田哥昨天,一个美女同学私信我,现在想下个月就去面试,现在该如何准备面试,如何快速复习。下面,我来说一下我的看法。了解情况第一步,肯定是要了解自己的情况,不能随便说说你怎么怎么快速复习。要结合自己的技术栈来。针对性得来安排,而不是一概而论。比如说,你在项目中用过Spring、S......
  • 程序员减少BUG的两个小妙招!
    原创:陶朱公Boy(微信公众号ID:taozhugongboy),欢迎分享,转载请保留出处。​点评:我们说衡量一个程序员水平的高低往往有很多因素,但有一个因素至关重要即代码质量。如果程序员写的功能在测试阶段就被频繁打回,上线了之后,用户反馈这里有问题那里有问题,大家可以想像这样的程序员水平能......
  • 程序员避免项目延期的四个小窍门!
    原创:陶朱公Boy(微信公众号ID:taozhugongboy),欢迎分享,转载请保留出处。点评:身为程序员的你,不知道在你身上曾经有没有发生过,因为种种原因,导致项目延期的情况?(约定某个时间点上线,结果拖到几天时间后)这里面我相信肯定有一些客观因素存在:比如就像上文最后一幅漫画图所描述的那样,市场......