操作系统:线程和进程、内存管理机制

《Python服务端工程师面试宝典-PegasusWang》学习笔记,第四章:常用命令、操作系统的线程和进程、内存管理机制。
258阅读 · 0评论 · 2020-5-31 15:37发布

4.1 常用linux命令

如何查询linux命令用法?

  • 使用man命令查询用法。示例:man echo
  • 使用工具自带的help。示例:pip --help
  • 工具推荐:tldr是第三方工具,提供了很多命令的示例,帮助文档比man更容易理解。

文件/目录相关操作命令

  • chown/chmod/chgrp
  • ls/rm/cd/cp/mv/touch/rename/ln(软连接:类似快捷方式和硬链接:inode不变)等
  • locate/find/grep定位查找和搜索

文件查看

  • 编辑器vi/nona
  • cat/head/tail查看文件
  • more/less交互式查看文件

进程操作命令

  • ps查看进程
  • kill杀死进程
  • top/htop监控进程

内存操作命令

  • free查看可用内存
  • 了解每一列的含义,排查内存泄露问题

网络操作命令

  • ifconfig 查看网卡信息
  • lsof/netstat查看端口信息
  • ssh/scp远程登录/复制
  • tcpdump抓包

用户/组操作

  • useradd/usermod
  • groupadd/groupmod

4.2 操作系统线程和进程

进程和线程的区别

  • 进程是对运行时程序的封装,是系统资源调度和分配的基本单位。
  • 线程是进程的子任务,cpu调度和分配的基本单位,实现进程内并发。
  • 一个进程可以包含多个线程,线程依赖进程存在,并共享进程内存。

什么是线程安全?

  • 多线程同时修改一个数据时可能会出现线程安全问题。
  • 线程安全是指一个操作可以在多线程环境中使用,获取正确的结果。
  • 线程安全的操作相当于顺序执行而不是并发执行。(例如i+=1是不安全的,因为它不是一步操作)
  • 一般如果涉及到写操作需要考虑如何让多个线程安全访问数据。

线程同步的方式

  • 互斥量(锁):通过互斥机制防止多个线程同时访问公共资源(获得锁之后才能操作)。
  • 信号量(Semphare):控制同一个时刻多个线程访问同一个资源的线程数。
  • 事件(信号):通过通知的方式保持多个线程同步。

进程间通信的方式

  • Inter-Process Communication进程间传递信号或者数据
  • 管道/匿名管道/有名管道(pipe)
  • 信号(Signal):比如用户使用ctrl+c产生SIGINT程序终止信号
  • 消息队列(Message):kafka等
  • 共享内存(share memory):不常用
  • 信号量(Semaphore):不常用
  • 套接字(socket):常用,web应用

python中如何使用多线程

  • threading.Thread类用来创建线程
  • start()方法启动线程
  • join()等待线程结束
  • 代码示例:

    import threading
    
      lock = threading.Lock()
    
      n = [0]
    
      def foo():
          with lock:
              n[0] = n[0]+1
              n[0] = n[0]+1
    
      threads = []
      for i in range(5000):
          t = threading.Thread(target=foo)
          threads.append(t)
    
      for t in threads:
          t.start()
    
      print(n)
    

pytho中如何使用多进程

  • multiprocessing多进程模块
  • Multiprocessing.Process类实现多进程
  • 代码示例:

    import multiprocessing
      def fib(n):
          if n <= 1:
              return 1
          return fib(n-1)+fib(n-2)
    
      def demo(n):
          r = fib(n)
          print(n,r)
    
      if __name__ == '__main__':
          jobs = []
          for i in range(10,20):  
              p = multiprocessing.Process(target=demo,args=(i,))
              jobs.append(p)
              p.start()
    

4.3 操作系统内存管理机制

什么是分页机制?

  • 程序的逻辑地址划分为固定大小的页(Page)。
  • 物理地址划分为同样大小的帧(Frame)。
  • 通过页表对应逻辑地址和物理地址。

什么是分段机制?

  • 分段是为了满足代码的一些逻辑需求。例如防止栈区和堆区互相影响。
  • 把一段数据共享、数据保护、动态链接等。
  • 通过段表实现逻辑地址和物理地址的映射关系。
  • 每个段内部是连续内存分配,段和段之间是离散分配的。
  • 通过段号、段长和起始地址。

分页和分段的区别

  • 页是出于内存利用率的角度提出的离散分配机制。
  • 段是出于用户角度,用户数据保护、数据隔离等用途的管理机制。
  • 页的大小是固定的,操作系统决定;段大小不确定,用户程序决定。

什么是虚拟内存?

  • 将内存中暂时不需要的内容放到硬盘上。
  • 局部性原理,程序运行的时候只有部分必要信息装入内存。
  • 系统提供了比实际内存大得多的容量,称之为虚拟内存。

什么是内存抖动(颠簸)?

  • 频繁的页调度,进程不断产生缺页中断。
  • 置换一个页,又不断再次需要这个页。
  • 运行程序太多;页面替换策略不好。解决方案:终止进程或者增加物理内存,编程时使用剔除策略(lru或者lfu)。

python的垃圾回收机制原理?

  • 引用计数为主+标记清除和分代回收为辅。
  • 引用计数:记录每次引用的数量。(缺点:循环引用无法解决)
  • 标记清除和分代回收:解决引用计数的缺点。

什么时候引用计数会增加或者减少?

增加:

  • 对象创建a=1
  • 对象被引用b=a
  • 对象作为参数传递func(a)
  • 对象存储在容器中 l=[a]

减少:

  • 显示使用del a
  • 引用指向了别的对象b=None
  • 离开对象的作用域(比如函数执行结束)
  • 从一个容器移除对象或者销毁容器

什么是标记清除?

  • 从垃圾回收的根对象开始,往下查找可达对象。
  • 对于不可达的点进行标记清除。

什么是分代回收?

  • python将对象的生命周期分为三代:0代、1代和2代。
  • 最开始创建的对象为0代。
  • 每隔一定时间对每一代进行标记回收。
  • 每代的对象经过一次标记回收之后,就会进入下一代。
  • gc.get_threshold()可以查看每一代的阈值(表示对应代有x对象时进行gc操作)。

共有0 条评论

暂无评论