设为首页 加入收藏

TOP

彻底理解进程(一)
2023-07-23 13:30:28 】 浏览:34
Tags:解进程

操作系统的"进程"很早就出现了,许多教科书上讲述这个概念总是晦涩难懂。计算机技术发展太快了,简单的概念经过无数次演化,也会变得复杂。我们追溯一下操作系统的发展历史,就能理解进程解决了什么问题、为什么这样设计。

1 操作系统的发展

1.2 手工操作阶段

第一代计算机使用真空管构成集成电路实现计算,采用磁鼓或者磁芯作为储存器,采用打孔卡片作为输入输出的介质,卡片上的孔洞位置代表机器指令或者数据。

程序员直接与硬件打交道,不需要操作系统。先将已穿孔的纸带装入输入机,然后启动输入机把程序和数据输入计算机内存,通过控制台开关启动计算程序。计算完毕,打印机输出计算结果。用户取走结果并卸下纸带后,才让下一个用户上机。这种手工操作方式有两个弊端:1. 用户独占全机,资源利用率低;2. CPU等待手工操作,利用不充分。

1.2 联机批处理系统

第二代计算机采用联机批处理系统,主机与输入机之间增加速度较快的磁带机,在监督程序的自动控制下,计算机先将用户作业读入磁带,再把磁带上的作业读入主机内存并输出计算结果。完成上一批作业后,监督程序又从输入机上输入另一批作业,按上述步骤重复处理。监督程序实现了作业到作业的自动转接,减少了手工操作时间,提高了计算机的利用率,可以看作操作系统的雏形。

在等待作业输入和结果输出时,主机的CPU仍处于空闲状态,系统利用率依然不高。

1.3 多道程序系统

第三代计算机采用晶体管逻辑元件及快速磁芯存储器,计算机速度从每秒几千次提高到几十万次,主存储器的存贮量,从几千提高到10万以上。1958年,IBM公司制成了第一台全部使用晶体管的计算机RCA501型。

此时的磁带、硬盘等IO设备,完全跟不上高速CPU的脚步,CPU利用率非常低。人们引入了多道程序设计技术。把多个程序放入内存,并允许它们在CPU中交替运行,共享系统中的各种软硬件资源。当一道程序因IO请求而暂停运行时,CPU便立即转去运行另一道程序。多道程序设计技术使CPU得到充分利用,提高了整个系统的资源利用率和吞吐量。出现了作业调度管理、处理机管理、存储器管理、外部设备管理、文件系统管理等功能,这标志着操作系统日趋成熟。

1.4 分时系统

第四代计算机允许多个用户同时联机使用计算机,分时系统应运而生,进一步提高系统整体利用率。

若一个用户的作业在分配的时间片内不能完成计算,则暂时中断该作业,把处理机让给另一作业使用,等待下一轮再继续其运行。计算机速度很快,作业运行轮转得很快,给每个用户独占了一台计算机的错觉。用户可以通过自己的终端向系统发出控制命令,在充分的人机交互情况下完成作业的运行。

1960年,麻省理工学院(MIT)开发了兼容分时系统(Compatible Time Sharing System),支持大型主机通过多个终端机来联机进行运算,并将结果从主机传输到终端机。此时终端机只具有输入输出的功能,本身不具任何运算或软件安装的能力。

为了强化大型主机的功能,让主机的资源让更多人来利用。1965年,由贝尔实验室(Bell)、麻省理工学院(MIT)及通用电器公司(GE)共同发起了MULTICS(多路信息计算系统)的计划,目标是让大型主机连接1000部终端机,支持300个用户同时使用。MULTICS项目是所有现代操作系统的鼻祖,并且首次提出了“进程”的概念。

进程就是用户独占计算机错觉的基础,每个用户的作业被包装成一个或者多个进程。进程是独立功能的程序的一次动态执行过程,也是系统资源分配的独立实体。

2 低速的IO设备

1928年,德国工程师Fritz Pfleumer发明了存储模拟信号的录音磁带。工作原理是将粉碎的磁性颗粒用胶水粘在纸条上,但是纸条比较脆弱,录音磁带无法实用化。

1932年,IBM公司的奥地利裔工程师Gustav Tauschek发明了磁鼓存储器,长度为16英寸,有40个磁道,每分钟可旋转12500转,仅可以存储10KB数据。在磁芯存储器出现之前广泛用于计算机内存,被认为是硬盘驱动器的前身。磁鼓的优点为实用可靠、经济实惠,而缺点是存储容量太小、利用率低。

1948年,美国哈佛大学实验室的王安博士发明了磁芯存储器,次年又实现了磁芯存储器“读后即写”的技术。原理是在铁氧体磁环里穿进一根导线,导线中流过不同方向的电流时,可使磁环按两种不同方向磁化,代表“1”或“0”的信息便以磁场形式储存下来。最初的磁芯存储器只有几百个字节的容量。在20世纪70年代被广泛用作计算机的主存储器,直到Intel的半导体DRAM内存批量生产。

1952年,IBM公司发布了计算机业内的第一款磁带机,需要人工手动操作,比如装载、卸载和归档。

1956年,IBM公司制造了世界上第一块硬盘350RAMAC。盘片直径为24英寸,盘片数为50片,重量则是上百公斤,相当于两个冰箱的体积,储存容量只有5MB。

从早期的磁鼓到固态硬盘,IO设备速度提升了万倍,依然追不上CPU,根本原因是计算和存储的目标不一样。CPU的最重要指标是速度快;而存储设备则要容量大,其次是速度快,最后是造价低廉,这三点不可兼得。就好比两个运动员,一个练短跑,一个练长跑,对身体素质的要求不一样。

3 进程详解

我们以Linux系统为例,了解一下进程的基本构成。

3.1 进程的分类
  • 交互进程:由一个shell启动的进程,优先级较高,交互进程既可以在前台运行,也可以在后台运行。
  • 批处理进程:这种进程和终端没有联系,是一个进程序列,负责按照顺序启动其它进程。
  • 守护进程:在后台运行且不受任何终端控制的特殊进程,用于执行特定的系统任务。它一般在Linux启动时开始执行,系统关闭时才结束。
3.2 进程的组成

Linux内核把进程称为task,task_struct结构体是操作系统的进程控制块,包含着一个进程的所有信息。task_struct结构体非常复杂,感兴趣的朋友可以查阅文件https://github.com/torvalds/linux/blob/master/include/linux/sched.h,以下列举了比较重要的字段:

  • 1)进程的标识

pid_t pid:进程的唯一标识
pid_t tgid:线程组的领头线程的pid成员的值

  • 2)进程调度信息

need_resched:调度标志
Nice:静态优先级
Counter:动态优先级;重新调度进程时会在run_queue中选出Counter值最大的进程。也代表该进程的时间片,运行中不断减少。
Policy:调度策略开始运行时被赋予的值。
rt_priority:实时优先级

  • 3)进程通信有关信息

unsigned long signal:进程接收到的信号。每位表示一种信号,共32种。
unsigned long blocked:进程所能接受信号的位掩码。
Spinlock_t sigmask_lock:信号掩码的自旋锁
Long blocked:信号掩码
Struct sem_undo *semundo:为避免死锁而在信号量上设置的取消操作
Struct sem_queue *semsleeping:与信号量操作相关的等待队列
struct signal_struct *sig:信号处理函数

  • 4)上下文信息

struct desc_struct *ldt:进程关于CPU段

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Rocky Linux8升级9随记 下一篇Linux—权限管理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目