进程与线程
进程
进程是对运行程序的封装,是系统进行资源调度和分配的基本单位,每个进程都有其独立的数据空间。一个程序至少有一个进程。
线程
线程是程序执行的最小单位。一个进程至少有一个线程,线程共享进程的数据空间。
进程调度策略
(1)FCFS(先来先服务)。先请求CPU的进程先分配CPU。
(2)SJF(最短作业优先调度)。平均等待时间最短的优先。
(3)优先级调度算法(可抢占)。优先级越高越优先,相同优先级按先来先服务顺序。
(4)时间片轮转调度(抢占式)。每个进程有其时间片,所有进程在一个循环队列中。当前进程在规定时间片内未运行完,强制放在队列末尾,让下一进程运行。
(5)多级队列调度算法。将多个进程分为不同队列,每个队列有其自己的调度算法,队列之间采用固定优先级抢占式调度。(是一种根据进程的属性分组的思想)
(6)多级反馈队列调度算法。设置多级就绪队列,各级队列优先级从高到低,时间片从小到大,新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。(是一种综合的算法)
进程通信方式
(1)管道。半双工通信方式,只能在具有亲缘关系之间的进程使用。(还有命名管道,也是半双工通信方式,但是支持非亲缘关系的进程使用)
(2)消息队列。可以认为是一种全局链表,每个结点存放一种数据报,由标识符标识,允许进程读取或写入某一队列中的信息。信息队列有最大长度的限制。
(3)信号量。实现计数器功能的数组,用来控制多个进程对共享资源的访问。PV操作(P:请求一个资源,V:释放一个资源)
(4)共享内存。将一块物理内存映射到不同进程的虚拟地址空间,让多个进程都可以访问。
(5)套接字(Socket)。相当于运输工具一样,将进程通信的资源运输。
注意:每种方式创建后都需要手动释放。
线程间通信方式
以java为例,可以通过以下方式实现线程通信
(1)设置全局变量。可以通过volatile关键字定义。
(2)使用消息机制。在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信sendMessage,postMessage
(3)使用事件CEvent类。Event对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作
(4)java中特有的类。例如Object类一谱wait(),notify()方法。
Linux
Linux可以使用绝对路径或者相对路径来查找或进入目标文件,此外,许多命令都有各种后缀,实现不同的功能。
对Linux的认知
Linux是一种类Unix操作系统,一般用作业务的服务器系统,Linux性能好,安全,开源,支持多种平台。企业常常应用到它。
swap机制
swap是一种交换分区的机制。由于Linux系统为了提高读写效率,常常将文件存储在内存的缓存中,会导致系统的可用物理内存变少。swap机制会设置一个swap分区,当系统的可用物理内存不够时,会将某些占用物理内存的数据存入swap,需要的时候再将其取出或者交换。
软链接与硬链接
(软链接类似快捷方式,硬链接是为了防误删)
xshell与shell
shell:是一个命令解释器,根据用户的命令,调用对应的命令解释器。
xshell:是一个功能强大的终端模拟器,通过远程连接,可以运行远程机器的shell程序。
文件管理命令
cd(进入指定目录)
ls (展示目录中的文件)
makdir (新建目录)
rm -rf (删除目录及其中所有文件)
find(搜索文件)
文本处理命令
cat (打开一个文本文件)
vim(编辑文本文件)
grep(在文本文件中查找关键字)
面试高频命令
kill(向进程发送控制信号)
awk(是一种数据处理命令,有格式化输出,打印,字符匹配功能)
查看系统内存命令(例如free)
查看网络状态命令(例如ifconfig)
五种IO模型
(1)同步阻塞IO(blocking IO)。最原始的模型,每次应用程序调用时,应用程序陷入堵塞状态,直到调用的模块完成,并将数据从内核复制到应用进程中,应用进程才继续运行。逻辑简单但性能差。
(2)同步非阻塞IO(nonblocking IO)。每次应用程序调用时,发起recvform系统调用,若此时调用模板的数据还未生成,先返回一个error,释放内核让它去完成其他任务,之后继续发起recvform直至数据准备好,内核继续执行应用程序。(优点:可以在等待任务中完成其他任务;缺点:由于内核要完成其他任务再发recvform请求,可能会有较大响应延迟)
(3)IO多路复用(IO multiplexing)。通过调用select,poll,epoll函数轮询被调用模块的状态,若数据准备好,则内核执行相应应用程序。(优点:减少CPU在recvform的时间;缺点:IO之间顺序不确定了)
(4)信号驱动式IO(signal-driven IO)。在socket中进行信号驱动IO,安装一个信号处理函数。当数据准备好时,在信号处理函数中调用IO操作。
(5)异步非阻塞IO(asynchronous IO)。内核接收到应用程序的调用申请后,先直接返回给应用进程,当socket数据准备好了,内核复制数据给进程,通知应用程序。
常问知识点
死锁的四个必要条件
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 - 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。