早期的计算机一次只能运行一个程序,这种程序完全控制操作系统,并且访问操作系统所有硬件资源。相比之下,现代计算机允许加载多个程序到内存,以便并发执行,这种改进要求:对各种程序提供更严的控制和更好的划分。这种需求导致了进程(process)概念的产生,即进程为执行程序。
进程是现代操作系统的工作单元,进程需要一定的资源,如CPU时间、内存空间、文件存储空间、I/O设备等,以便执行任务。
操作系统会由一组进程组成:操作系统进程执行系统代码,而用户进程执行用户代码。通过CPU的多路复用,所有这些进程可以并发运行。
进程状态
新的:进程正在创建。
就绪:进程正在分配处理器。
运行:处理器正在执行指令。
终止:进程正在完成执行。
等待:进程正在等待发生某个事件(如I/O完成或收到信号)。
CPU密集型和I/O密集型
进程可分为CPU密集型进程和I/O密集型进程。CPU密集型进程很少产生I/O请求,而是将更多时间用在执行计算。I/O密集型进程执行I/O比执行计算需要花费更多时间。
操作系统主要分为 I/O等待队列 和 就绪队列。
如果所有进程都是 CPU密集型的,那么 I/O等待队列几乎为空。如果所有进程都是I/O密集型的,那么就绪队列几乎总是为空。为了使得性能最佳,系统需要 CPU密集型 和 I/O 密集型的进程组合。
进程的创建fork()、执行exec()、退出exit()、等待wait()
进程包括进程名称和唯一的进程标识符(process identifier,pid),pid是整数值。
父进程创建子进程,从而形成进程树(process tree)。
init作为所有进程的父进程或根进程,kthreadd和sshd作为init的两个子进程。
当一个进程创建子进程的时候,子进程需要一定的资源(CPU时间、内存空间、文件存储空间、I/O设备),子进程可以从操作系统那么直接获得资源,也可以只从父进程那里获得资源子集。
进程间通信
进程间通信可以通过调用原语 send() 和 receive() 来进行。实现这些原语有不同的设计方案。消息传递可以是 阻塞(blocking) 或 非阻塞(nonblocking),也称为 同步(synchronous) 或 异步(asynchronous)。
- 阻塞发送(blocking send):发送进程阻塞,直到消息由接收进程或邮箱所接收。
- 非阻塞发送(nonblocking send) :发送进程发送消息,并且恢复操作。
- 阻塞接收(blocking receive) :接收进程阻塞,直到有消息可用。
- 非阻塞接收(nonblocking receive) :接收进程收到一个有效消息或空消息。
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/linux/os/10091.html