计算机系统基础
1. 操作系统
1.1 并行和并发
- 并行是在同一时刻执行多个任务
- 并发是在相同的时间段内执行多个任务,任务可能交替执行,通过调度实现。
并⾏是指在同⼀时刻执⾏多个任务,这些任务可以同时进⾏,每个任务都在不同的处理单元(如多个CPU核⼼)上执⾏。在并⾏系统中,多个处理单元可以同时处理独⽴的⼦任务,从⽽加速整体任务的完成。 并发是指在相同的时间段内执⾏多个任务,这些任务可能不是同时发⽣的,⽽是交替执⾏,通过时间⽚轮转或者事件驱动的⽅式。并发通常与任务之间的交替执⾏和任务调度有关。
1.2 僵尸进程和孤儿进程
- 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么子进程将成为孤儿进程。孤儿进行将被init(进程号为)所收养,并由init进程对它们完成状态收集工作。
- 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
1.3 信号和信号量的区别
- 信号:一种处理异步事件的方式。信号是比较复杂的通信方式,用于通知接收进程由某种事件发生,除了用于进程外,还可以发送信号给进程本身。
- 信号量:进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施,它负责协调各个线程,以保证它们能够正确,合理的使用公共资源。
1.4 局部性原理
在⼀段时间内,程序倾向于多次访问相同的数据或接近的数据,⽽不是随机地访问内存中的各个位置。局部性原理通常分为两种类型:时间局部性和空间局部性。
- 时间局部性 如果⼀个数据被访问,那么在不久的将来它很可能会再次被访问。这意味着程序在短时间内倾向于反复使⽤相同的数据项,例如在循环中反复访问数组的元素。 通过利⽤时间局部性,程序可以将频繁使⽤的数据存储在缓存中,从⽽减少访问主内存的次数,提⾼程序的执⾏速度。
- 空间局部性 如果⼀个数据被访问,那么它附近的数据也很可能会被访问。这意味着程序在访问⼀个数据时,通常会在接近该数据的附近访问其他数据,例如遍历数组时,往往会访问相邻的元素。 ⽂件系统在磁盘上存储数据时,通常会将相关的数据块放在相邻的磁盘扇区上,以便在访问⼀个数据块时能够快速地访问相邻的数据块。
1.5 进程和线程
进程是系统进⾏资源分配和调度的基本单位。
线程是操作系统能够进⾏运算调度的最⼩单位,线程是进程的⼦任务,是进程内的执⾏单元。 ⼀个进程⾄少有⼀个线程,⼀个进程可以运⾏多个线程,这些线程共享同⼀块内存。
-
资源开销: 进程:由于每个进程都有独⽴的内存空间,创建和销毁进程的开销较⼤。进程间切换需要保存和恢复整个进程的状态,因此上下⽂切换的开销较⾼。 线程:线程共享相同的内存空间,创建和销毁线程的开销较⼩。线程间切换只需要保存和恢复少量的线程上下⽂,因此上下⽂切换的开销较⼩。
-
通信与同步: 进程:由于进程间相互隔离,进程之间的通信需要使⽤⼀些特殊机制,如管道、消息队列、共享内存等。
线程:由于线程共享相同的内存空间,它们之间可以直接访问共享数据,线程间通信更加⽅便。
-
安全性: 进程:由于进程间相互隔离,⼀个进程的崩溃不会直接影响其他进程的稳定性。 线程:由于线程共享相同的内存空间,⼀个线程的错误可能会影响整个进程的稳定性。